00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include <iostream>
00042 #include <math.h>
00043 #include <vector>
00044 #include <stdlib.h>
00045 #include <stdio.h>
00046 #include <algorithm>
00047 #include <iterator>
00048
00049 #include "StEventTypes.h"
00050 #include "Stypes.h"
00051 #include "StThreeVectorF.hh"
00052 #include "StMeasuredPoint.h"
00053 #include "StDedxPidTraits.h"
00054 #include "StTrackPidTraits.h"
00055 #include "StarClassLibrary/StParticleTypes.hh"
00056 #include "StarClassLibrary/StParticleDefinition.hh"
00057 #include "StMuDSTMaker/COMMON/StMuUtilities.h"
00058 #include "StMuDSTMaker/COMMON/StMuPrimaryVertex.h"
00059 #include "StHelix.hh"
00060 #include "StTrackGeometry.h"
00061 #include "StParticleTypes.hh"
00062 #include "StTpcDedxPidAlgorithm.h"
00063 #include "StHit.h"
00064 #include "StAssociationMaker/StTrackPairInfo.hh"
00065 #include "StEventUtilities/StuRefMult.hh"
00066 #include "PhysicalConstants.h"
00067 #include "StPhysicalHelixD.hh"
00068 #include "TTree.h"
00069 #include "TFile.h"
00070 #include "StMemoryInfo.hh"
00071 #include "StMessMgr.h"
00072 #include "StTimer.hh"
00073 #include "tables/St_pvpdStrobeDef_Table.h"
00074 #include "tables/St_g2t_vertex_Table.h"
00075 #include "tables/St_vertexSeed_Table.h"
00076
00077 #include "StTofUtil/tofPathLength.hh"
00078 #include "StTofUtil/StTofrGeometry.h"
00079 #include "StTofUtil/StTofrDaqMap.h"
00080 #include "StTofUtil/StTofCellCollection.h"
00081 #include "StTofUtil/StTofHitCollection.h"
00082 #include "StTofrNtupleMaker.h"
00083
00084
00085 ClassImp(StTofrNtupleMaker)
00086
00087
00089 StTofrNtupleMaker::StTofrNtupleMaker(const Char_t *name="tofrNtuple", const Char_t *outname="tofntuple.root") : StMaker(name) {
00090 mTupleFileName=outname;
00091
00092 doPrintMemoryInfo = kFALSE;
00093 doPrintCpuInfo = kFALSE;
00094 }
00095
00097 StTofrNtupleMaker::~StTofrNtupleMaker(){ }
00098
00099
00101 Int_t StTofrNtupleMaker::Init(){
00102
00103 if (mTupleFileName!="") bookNtuples();
00104
00105 mAcceptedEvents = 0;
00106 mPvpdEntries = 0;
00107 mTofrEvents = 0;
00108 mTofrEntries = 0;
00109
00110 return kStOK;
00111 }
00112
00113
00114 Int_t StTofrNtupleMaker::InitRun(int runnumber) {
00115
00116 if(mInitGeomFromOther) {
00117 TDataSet *geom = GetDataSet("tofrGeometry");
00118 mTofrGeom = (StTofrGeometry *)geom->GetObject();
00119 } else {
00120 mTofrGeom = new StTofrGeometry("tofrGeoNtuple","tofGeo in NtupleMaker");
00121 if(!mTofrGeom->IsInitDone()) {
00122 gMessMgr->Info("TofrGemetry initialization..." ,"OS");
00123 TVolume *starHall = (TVolume *)GetDataSet("HALL");
00124 mTofrGeom->Init(starHall);
00125 }
00126 }
00127
00128 gMessMgr->Info(" -- retrieving run parameters from Calibrations_tof","OS");
00129 TDataSet *mDbDataSet = GetDataBase("Calibrations/tof");
00130 if (!mDbDataSet){
00131 gMessMgr->Error("unable to get TOF run parameters","OS");
00132 assert(mDbDataSet);
00133 }
00134 St_pvpdStrobeDef* pvpdStrobeDef = static_cast<St_pvpdStrobeDef*>(mDbDataSet->Find("pvpdStrobeDef"));
00135 if (!pvpdStrobeDef){
00136 gMessMgr->Error("unable to find TOF run param table","OS");
00137 assert(pvpdStrobeDef);
00138 }
00139 pvpdStrobeDef_st *strobeDef = static_cast<pvpdStrobeDef_st*>(pvpdStrobeDef->GetArray());
00140 int numRows = pvpdStrobeDef->GetNRows();
00141 if (mNPVPD != numRows) gMessMgr->Warning("#tubes inconsistency in dbase");
00142 for (int i=0;i<mNPVPD;i++){
00143 int ii = strobeDef[i].id - 1;
00144 mStrobeTdcMin[ii] = strobeDef[i].strobeTdcMin;
00145 mStrobeTdcMax[ii] = strobeDef[i].strobeTdcMax;
00146 if (Debug())
00147 LOG_INFO << "tube " << strobeDef[i].id << " min:"<< strobeDef[i].strobeTdcMin
00148 <<" max:"<< strobeDef[i].strobeTdcMax<< endm;
00149 }
00150
00151
00152 double x0 = 0.;
00153 double y0 = 0.;
00154 double dxdz = 0.;
00155 double dydz = 0.;
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172 LOG_INFO<< " beamline is set by hand "<<endl;
00173
00174 LOG_INFO << "BeamLine Constraint: " << endm;
00175 LOG_INFO << "x(z) = " << x0 << " + " << dxdz << " * z" << endm;
00176 LOG_INFO << "y(z) = " << y0 << " + " << dydz << " * z" << endm;
00177
00178
00179
00180
00181
00182 StThreeVectorD origin(x0,y0,0.0);
00183 double pt = 88889999;
00184 double nxy=::sqrt(dxdz*dxdz + dydz*dydz);
00185 if(nxy<1.e-5){
00186 LOG_WARN << "StppLMVVertexFinder:: Beam line must be tilted!" << endm;
00187 nxy=dxdz=1.e-5;
00188 }
00189 double p0=pt/nxy;
00190 double px = p0*dxdz;
00191 double py = p0*dydz;
00192 double pz = p0;
00193 StThreeVectorD MomFstPt(px*GeV, py*GeV, pz*GeV);
00194 delete mBeamHelix;
00195 mBeamHelix = new StPhysicalHelixD(MomFstPt,origin,0.5*tesla,1.);
00196
00197 mBeamX = x0;
00198 mBeamY = y0;
00199
00200 return kStOK;
00201 }
00202
00203 Int_t StTofrNtupleMaker::FinishRun(int runnumber)
00204 {
00205 if(!mInitGeomFromOther) {
00206 if(mTofrGeom) delete mTofrGeom;
00207 }
00208 mTofrGeom = 0;
00209 delete mBeamHelix;
00210
00211 return kStOK;
00212 }
00213
00214
00216 Int_t StTofrNtupleMaker::Finish() {
00217
00218 if (!(mTupleFileName=="")){
00219 mTupleFile->Write();
00220 mTupleFile->Close();
00221 LOG_INFO << "StTofrNtupleMaker::Finish() ntuple file "
00222 << mTupleFileName << " closed." << endm;
00223 }
00224
00225
00226
00227
00228
00229 LOG_INFO << "StTofrNtupleMaker -- statistics" << endm;
00230 LOG_INFO << " accepted events : " << mAcceptedEvents << endm;
00231 LOG_INFO << " pVPD entries : " << mPvpdEntries << endm;
00232 LOG_INFO << " Tofr entries/events : " << mTofrEntries << "/" << mTofrEvents << endm;
00233 return kStOK;
00234 }
00235
00236
00237
00239 Int_t StTofrNtupleMaker::Make(){
00240 LOG_INFO << "StTofrNtupleMaker -- welcome" << endm;
00241
00242 StEvent *event = (StEvent *) GetInputDS("StEvent");
00243
00244
00245
00246 if (!event ||
00248 !event->tofCollection() ||
00250 !event->tofCollection()->rawdataPresent()){
00251 LOG_INFO << "StTofrNtupleMaker -- nothing to do ... bye-bye"<< endm;
00252 return kStOK;
00253 }
00254
00255 mAcceptedEvents++;
00256 StTimer timer;
00257 if (doPrintCpuInfo) timer.start();
00258 if (doPrintMemoryInfo) StMemoryInfo::instance()->snapshot();
00259
00260
00261 mYear2= (event->runId()<4000000);
00262 mYear3= (event->runId()>4000000&&event->runId()<5000000);
00263 mYear4= (event->runId()>5000000);
00264
00265
00266
00267
00268
00269
00270 cout<<"runId: "<<event->runId()<<" runnumber"<<event->id()<<endl;
00271 float xvtx = -999.;
00272
00273 float yvtx = -999.;
00274
00275 float zvtx = -999.;
00276
00277
00278 StL0Trigger* pTrigger = event->l0Trigger();
00279 unsigned int triggerWord = 0;
00280 if (pTrigger) triggerWord = pTrigger->triggerWord();
00281
00282
00283 mCellData.run = event->runId();
00284 mCellData.evt = event->id();
00285 mCellData.trgword = triggerWord;
00286 mCellData.vertexX = xvtx;
00287 mCellData.vertexY = yvtx;
00288 mCellData.vertexZ = zvtx;
00289
00290 if(Debug()){
00291 LOG_INFO << " vertexZ: "<<mCellData.vertexZ<<endm;
00292 }
00293
00294
00295
00296 StTofCollection *theTof = event->tofCollection();
00297 if (event->tofCollection()->cellsPresent()){
00298
00299 mTofrEvents++;
00300 int entriesThisEvent(0);
00301
00302
00303 for(int i=0;i<19;i++){
00304 mCellData.pvpdLeadingEdgeTimeEast[i] = 0;
00305 mCellData.pvpdTotEast[i] = 0;
00306 mCellData.pvpdLeadingEdgeTimeWest[i] = 0;
00307 mCellData.pvpdTotWest[i] = 0;
00308 }
00309
00310
00311 StSPtrVecTofCell& cellTofVec = theTof->tofCells();
00312 int ntofhits = 0;
00313 float tdcsumeast = 0., tdcsumwest = 0.;
00314 unsigned int vpdEast=0, vpdWest=0, nVpdEast=0, nVpdWest=0;
00315 for (size_t i = 0; i < cellTofVec.size(); i++) {
00316 StTofCell *thisCell = cellTofVec[i];
00317 int trayId = thisCell->trayIndex();
00318 if(Debug()) LOG_INFO << " tray ID: "<< trayId<<endm;
00319 if(trayId==122){
00320 int tubeId = thisCell->cellIndex()-1;
00321 vpdEast += 1<<tubeId;
00322 nVpdEast++;
00323
00324 mCellData.pvpdLeadingEdgeTimeEast[tubeId] = thisCell->leadingEdgeTime();
00325 mCellData.pvpdTotEast[tubeId] = thisCell->tot();
00326 cout<<" tray/tube "<< trayId<<"/"<<tubeId<<" letime/tot "<< thisCell->leadingEdgeTime()<<"/"<< thisCell->tot()<<endl;
00327 tdcsumeast += thisCell->leadingEdgeTime();
00328 mPvpdEntries++;
00329 }else if(trayId==121){
00330 int tubeId = thisCell->cellIndex()-1;
00331 vpdWest += 1<<tubeId;
00332 nVpdWest++;
00333 mCellData.pvpdLeadingEdgeTimeWest[tubeId] = thisCell->leadingEdgeTime();
00334 mCellData.pvpdTotWest[tubeId] = thisCell->tot();
00335
00336 tdcsumwest += thisCell->leadingEdgeTime();
00337 mPvpdEntries++;
00338 }else if(trayId<=120&&trayId>=0){
00339
00340 mCellData.tray[ntofhits] = trayId;
00341 mCellData.module[ntofhits] = thisCell->moduleIndex();
00342 mCellData.cell[ntofhits] = thisCell->cellIndex();
00343 mCellData.daq[ntofhits] = thisCell->daqIndex();
00344 mCellData.leadingEdgeTime[ntofhits] = thisCell->leadingEdgeTime();
00345
00346 mCellData.tot[ntofhits] = thisCell->tot();
00347
00348
00349
00350
00351
00352 if(Debug()) LOG_INFO << " trayID/moduleID/cellID/leadingEdgeTime/tot"<< trayId <<"/"<< mCellData.module[ntofhits]<<"/"<< mCellData.cell[ntofhits] << "/" << mCellData.leadingEdgeTime[ntofhits] << "/"<< mCellData.tot[ntofhits]<<"/"<<endm;
00353
00354 StThreeVectorD globalHit = thisCell->position();
00355 StTofrGeomSensor* sensor = mTofrGeom->GetGeomSensor(thisCell->moduleIndex(), thisCell->trayIndex());
00356 double local[3], globalp[3];
00357 globalp[0] = globalHit.x();
00358 globalp[1] = globalHit.y();
00359 globalp[2] = globalHit.z();
00360 sensor->Master2Local(&globalp[0], &local[0]);
00361 StThreeVectorD localHit(local[0], local[1], local[2]);
00362 float ycenter = (thisCell->cellIndex()-1)*3.45-8.625;
00363 delete sensor;
00364
00365 cout<<"zHit local = "<<local[2]<<" "<< thisCell->zHit()<<endl;
00366 mCellData.xlocal[ntofhits] = (Float_t) localHit.x();
00367 mCellData.ylocal[ntofhits] = (Float_t) localHit.y();
00368 mCellData.zlocal[ntofhits] = (Float_t) localHit.z();
00369 mCellData.deltay[ntofhits] = local[1] - ycenter;
00370
00371 if(Debug()){
00372 LOG_INFO <<" global:("<<globalp[0]<<", "<<globalp[1]<<", "<<globalp[2]<<")"
00373 <<"\n \t local:("<<localHit.x()<<", "<<localHit.y()<<", "<<localHit.z()<<")"<<endm;
00374 }
00375
00376
00377 StTrack *thisTrack = thisCell->associatedTrack();
00378 StTrack *globalTrack = thisTrack->node()->track(global);
00379
00380 StTrackGeometry *theTrackGeometry = thisTrack->geometry();
00381 const StThreeVectorF momentum = theTrackGeometry->momentum();
00382
00383 float dedx(0.), cherang(0), dedxerror(0);
00384 int dedx_np(0), cherang_nph(0);
00385 StSPtrVecTrackPidTraits& traits = thisTrack->pidTraits();
00386 for (unsigned int it=0;it<traits.size();it++){
00387 if (traits[it]->detector() == kTpcId){
00388 StDedxPidTraits *pid = dynamic_cast<StDedxPidTraits*>(traits[it]);
00389 if (pid && pid->method() ==kTruncatedMeanId){
00390 dedx = pid->mean()*1e6;
00391 dedx_np = pid->numberOfPoints();
00392 dedxerror = pid->errorOnMean()*1e6;
00393 }
00394 } else if (traits[it]->detector() == kRichId){
00395 StRichPidTraits *pid = dynamic_cast<StRichPidTraits*>(traits[it]);
00396 if (pid){
00397 StRichSpectra* pidinfo = pid->getRichSpectra();
00398 if (pidinfo && pidinfo->getCherenkovPhotons()>2){
00399 cherang = pidinfo->getCherenkovAngle();
00400 cherang_nph = pidinfo->getCherenkovPhotons();
00401 }
00402 }
00403 }
00404 }
00405
00406 StThreeVector<double> tofPos = theTrackGeometry->helix().at(theTrackGeometry->helix().pathLengths(*mBeamHelix).first);
00407 StThreeVector<double> dcatof = tofPos - mBeamHelix->at(theTrackGeometry->helix().pathLengths(*mBeamHelix).second);
00408
00409 float mNSigmaElectron;
00410 float mNSigmaPion;
00411 float mNSigmaKaon;
00412 float mNSigmaProton;
00413
00414 static StTpcDedxPidAlgorithm PidAlgorithm;
00415 static StElectron* Electron = StElectron::instance();
00416 static StPionPlus* Pion = StPionPlus::instance();
00417 static StKaonPlus* Kaon = StKaonPlus::instance();
00418 static StProton* Proton = StProton::instance();
00419 const StParticleDefinition* pd = thisTrack->pidTraits(PidAlgorithm);
00420
00421 if (pd) {
00422 mNSigmaElectron = fabsMin(PidAlgorithm.numberOfSigma(Electron), __SIGMA_SCALE__);
00423 mNSigmaPion = pack2Int( fabsMin(PidAlgorithm.numberOfSigma(Pion),__SIGMA_SCALE__), __SIGMA_SCALE__ );
00424 mNSigmaKaon = pack2Int( fabsMin(PidAlgorithm.numberOfSigma(Kaon),__SIGMA_SCALE__), __SIGMA_SCALE__ );
00425 mNSigmaProton = pack2Int( fabsMin(PidAlgorithm.numberOfSigma(Proton),__SIGMA_SCALE__), __SIGMA_SCALE__ );
00426 }
00427
00428 double pathLength = -999.;
00429
00430
00431
00432 pathLength = tofPathLength(&tofPos, &thisCell->position(), theTrackGeometry->helix().curvature());
00433 if(Debug()) LOG_INFO << "dca(x,y,z) = (" << dcatof.x() <<", " << dcatof.y()
00434 <<", " << dcatof.z() << "), tof pathLength = " << pathLength<<endm;
00435 mCellData.trackId[ntofhits] = (Int_t)thisTrack->key();
00436 mCellData.charge[ntofhits] = theTrackGeometry->charge();
00437 if(thisTrack->detectorInfo()) {
00438 mCellData.nHits[ntofhits] = thisTrack->detectorInfo()->numberOfPoints(kTpcId);
00439 } else {
00440 mCellData.nHits[ntofhits] = 0;
00441 }
00442 mCellData.nHitsFit[ntofhits] = thisTrack->fitTraits().numberOfFitPoints(kTpcId);
00443 mCellData.dcaX[ntofhits] = dcatof.x();
00444 mCellData.dcaY[ntofhits] = dcatof.y();
00445 mCellData.dcaZ[ntofhits] = tofPos.z();
00446
00447 mCellData.length[ntofhits] = (float)fabs(pathLength);
00448 mCellData.p[ntofhits] = momentum.mag();
00449 mCellData.pt[ntofhits] = momentum.perp();
00450 mCellData.px[ntofhits] = momentum.x();
00451 mCellData.py[ntofhits] = momentum.y();
00452 mCellData.pz[ntofhits] = momentum.z();
00453 mCellData.eta[ntofhits] = momentum.pseudoRapidity();
00454 mCellData.dedx[ntofhits] = dedx;
00455 mCellData.dedxError[ntofhits] = dedxerror;
00456 mCellData.nHitsDedx[ntofhits] = dedx_np;
00457 mCellData.cherenkovAngle[ntofhits] = cherang;
00458 mCellData.cherenkovPhotons[ntofhits] = cherang_nph;
00459 mCellData.nSigE[ntofhits] = mNSigmaElectron;
00460 mCellData.nSigPi[ntofhits] = mNSigmaPion;
00461 mCellData.nSigK[ntofhits] = mNSigmaKaon;
00462 mCellData.nSigP[ntofhits] = mNSigmaProton;
00463
00464
00465 mCellData.tofcorr[ntofhits] = -999.;
00466 mCellData.beta[ntofhits] = -999.;
00467 StSPtrVecTofHit& hitTofVec = theTof->tofHits();
00468 for(size_t ih=0;ih<hitTofVec.size();ih++) {
00469 StTofHit *aHit = (StTofHit *)hitTofVec[ih];
00470 if(!aHit) continue;
00471 if(aHit->trayIndex() == thisCell->trayIndex() &&
00472 aHit->moduleIndex() == thisCell->moduleIndex() &&
00473 aHit->cellIndex() == thisCell->cellIndex()) {
00474 mCellData.tofcorr[ntofhits] = aHit->timeOfFlight();
00475 mCellData.beta[ntofhits] = aHit->beta();
00476 }
00477
00478 }
00479
00480 ntofhits++;
00481 }
00482 }
00483 mCellData.vpdEast = vpdEast;
00484 mCellData.vpdWest = vpdWest;
00485 mCellData.numberOfVpdEast = nVpdEast;
00486 mCellData.numberOfVpdWest = nVpdWest;
00487 mCellData.tDiff = theTof->tdiff();
00488 mCellData.nTofHits = ntofhits;
00489 mPvpdTuple->Fill();
00490 mCellTuple->Fill();
00491 mTofrEntries = ntofhits;
00492 entriesThisEvent = ntofhits;
00493
00494 if(Debug()){
00495 LOG_INFO << " #vpd East: "<<mCellData.numberOfVpdEast
00496 << "\n \t #vpd West: "<<mCellData.numberOfVpdWest<<endm;
00497 }
00498 LOG_INFO << " Tofr update: " << entriesThisEvent << " entries" <<endm;
00499 }
00500
00501
00502
00503 if (doPrintMemoryInfo) {
00504 StMemoryInfo::instance()->snapshot();
00505 StMemoryInfo::instance()->print();
00506 }
00507 if (doPrintCpuInfo) {
00508 timer.stop();
00509 LOG_INFO << "CPU time for StEventMaker::Make(): "
00510 << timer.elapsedTime() << " sec\n" << endm;
00511 }
00512
00513 LOG_INFO << "StTofrNtupleMaker -- bye-bye" << endm;
00514 return kStOK;
00515 }
00516
00517
00518
00520 void StTofrNtupleMaker::bookNtuples(){
00521 mTupleFile = new TFile(mTupleFileName.c_str(), "RECREATE");
00522 LOG_INFO << "StTofrNtupleMaker::bookNtuples() file "
00523 << mTupleFileName << " opened" << endm;
00524
00525
00526 mPvpdTuple = new TTree("pvpd","tofr timing");
00527 mPvpdTuple->SetAutoSave(1000);
00528 mPvpdTuple->Branch("run",&mCellData.run,"run/I");
00529 mPvpdTuple->Branch("evt",&mCellData.evt,"evt/I");
00530 mPvpdTuple->Branch("trgword",&mCellData.trgword,"trgword/I");
00531 mPvpdTuple->Branch("vertexX",&mCellData.vertexX,"vertexX/F");
00532 mPvpdTuple->Branch("vertexY",&mCellData.vertexY,"vertexY/F");
00533 mPvpdTuple->Branch("vertexZ",&mCellData.vertexZ,"vertexZ/F");
00534 mPvpdTuple->Branch("vpdEast",&mCellData.vpdEast,"vpdEast/I");
00535 mPvpdTuple->Branch("vpdWest",&mCellData.vpdWest,"vpdWest/I");
00536 mPvpdTuple->Branch("numberOfVpdEast",&mCellData.numberOfVpdEast,"numberOfVpdEast/I");
00537 mPvpdTuple->Branch("numberOfVpdWest",&mCellData.numberOfVpdWest,"numberOfVpdWest/I");
00538 mPvpdTuple->Branch("tDiff",&mCellData.tDiff,"tDiff/F");
00539 mPvpdTuple->Branch("pvpdLeadingEdgeTimeEast",&mCellData.pvpdLeadingEdgeTimeEast,"pvpdLeadingEdgeTimeEast[19]/D");
00540 mPvpdTuple->Branch("pvpdLeadingEdgeTimeWest",&mCellData.pvpdLeadingEdgeTimeWest,"pvpdLeadingEdgeTimeWest[19]/D");
00541 mPvpdTuple->Branch("pvpdTotEast",&mCellData.pvpdTotEast,"pvpdTotEast[19]/D");
00542 mPvpdTuple->Branch("pvpdTotWest",&mCellData.pvpdTotWest,"pvpdTotWest[19]/D");
00543
00544
00545 mCellTuple = new TTree("tofr","Tofr cell data");
00546 mCellTuple->SetAutoSave(1000);
00547 mCellTuple->Branch("run",&mCellData.run,"run/I");
00548 mCellTuple->Branch("evt",&mCellData.evt,"evt/I");
00549 mCellTuple->Branch("trgword",&mCellData.trgword,"trgword/I");
00550 mCellTuple->Branch("vertexX",&mCellData.vertexX,"vertexX/F");
00551 mCellTuple->Branch("vertexY",&mCellData.vertexY,"vertexY/F");
00552 mCellTuple->Branch("vertexZ",&mCellData.vertexZ,"vertexZ/F");
00553 mCellTuple->Branch("vpdEast",&mCellData.vpdEast,"vpdEast/I");
00554 mCellTuple->Branch("vpdWest",&mCellData.vpdWest,"vpdWest/I");
00555 mCellTuple->Branch("numberOfVpdEast",&mCellData.numberOfVpdEast,"numberOfVpdEast/I");
00556 mCellTuple->Branch("numberOfVpdWest",&mCellData.numberOfVpdWest,"numberOfVpdWest/I");
00557 mCellTuple->Branch("tDiff",&mCellData.tDiff,"tDiff/F");
00558 mCellTuple->Branch("pvpdLeadingEdgeTimeEast",&mCellData.pvpdLeadingEdgeTimeEast,"pvpdLeadingEdgeTimeEast[19]/D");
00559 mCellTuple->Branch("pvpdLeadingEdgeTimeWest",&mCellData.pvpdLeadingEdgeTimeWest,"pvpdLeadingEdgeTimeWest[19]/D");
00560 mCellTuple->Branch("pvpdTotEast",&mCellData.pvpdTotEast,"pvpdTotEast[19]/D");
00561 mCellTuple->Branch("pvpdTotWest",&mCellData.pvpdTotWest,"pvpdTotWest[19]/D");
00562 mCellTuple->Branch("nTofHits",&mCellData.nTofHits,"nTofHits/I");
00563 mCellTuple->Branch("tray",&mCellData.tray,"tray[nTofHits]/I");
00564 mCellTuple->Branch("module",&mCellData.module,"module[nTofHits]/I");
00565 mCellTuple->Branch("cell",&mCellData.cell,"cell[nTofHits]/I");
00566 mCellTuple->Branch("daq",&mCellData.daq,"daq[nTofHits]/I");
00567 mCellTuple->Branch("leadingEdgeTime",&mCellData.leadingEdgeTime,"leadingEdgeTime[nTofHits]/D");
00568 mCellTuple->Branch("tot",&mCellData.tot,"tot[nTofHits]/D");
00569
00570 mCellTuple->Branch("xlocal",&mCellData.xlocal,"xlocal[nTofHits]/F");
00571 mCellTuple->Branch("ylocal",&mCellData.ylocal,"ylocal[nTofHits]/F");
00572 mCellTuple->Branch("zlocal",&mCellData.zlocal,"zlocal[nTofHits]/F");
00573 mCellTuple->Branch("deltay",&mCellData.deltay,"deltay[nTofHits]/F");
00574 mCellTuple->Branch("trackId",&mCellData.trackId,"trackId[nTofHits]/I");
00575 mCellTuple->Branch("charge",&mCellData.charge,"charge[nTofHits]/I");
00576 mCellTuple->Branch("p",&mCellData.p,"p[nTofHits]/F");
00577 mCellTuple->Branch("pt",&mCellData.pt,"pt[nTofHits]/F");
00578 mCellTuple->Branch("px",&mCellData.px,"px[nTofHits]/F");
00579 mCellTuple->Branch("py",&mCellData.py,"py[nTofHits]/F");
00580 mCellTuple->Branch("pz",&mCellData.pz,"pz[nTofHits]/F");
00581 mCellTuple->Branch("eta",&mCellData.eta,"eta[nTofHits]/F");
00582 mCellTuple->Branch("dcaX",&mCellData.dcaX,"dcaX[nTofHits]/F");
00583 mCellTuple->Branch("dcaY",&mCellData.dcaY,"dcaY[nTofHits]/F");
00584 mCellTuple->Branch("dcaZ",&mCellData.dcaZ,"dcaZ[nTofHits]/F");
00585 mCellTuple->Branch("length",&mCellData.length,"length[nTofHits]/F");
00586 mCellTuple->Branch("nHits",&mCellData.nHits,"nHits[nTofHits]/I");
00587 mCellTuple->Branch("nHitsFit",&mCellData.nHitsFit,"nHitsFit[nTofHits]/I");
00588 mCellTuple->Branch("nHitsDedx",&mCellData.nHitsDedx,"nHitsDedx[nTofHits]/I");
00589 mCellTuple->Branch("dedx",&mCellData.dedx,"dedx[nTofHits]/F");
00590 mCellTuple->Branch("dedxError",&mCellData.dedxError,"dedxError[nTofHits]/F");
00591 mCellTuple->Branch("cherenkovAngle",&mCellData.cherenkovAngle,"cherenkovAngle[nTofHits]/F");
00592 mCellTuple->Branch("cherenkovPhotons",&mCellData.cherenkovPhotons,"cherenkovPhotons[nTofHits]/I");
00593 mCellTuple->Branch("nSigE",&mCellData.nSigE,"nSigE[nTofHits]/F");
00594 mCellTuple->Branch("nSigPi",&mCellData.nSigPi,"nSigPi[nTofHits]/F");
00595 mCellTuple->Branch("nSigK",&mCellData.nSigK,"nSigK[nTofHits]/F");
00596 mCellTuple->Branch("nSigP",&mCellData.nSigP,"nSigP[nTofHits]/F");
00597 mCellTuple->Branch("tofcorr",&mCellData.tofcorr,"tofcorr[nTofHits]/F");
00598 mCellTuple->Branch("beta",&mCellData.beta,"beta[nTofHits]/F");
00599
00600 return;
00601 }
00602