3 //____________________________________________________________________
4 //////////////////////////////////////////////////////////////////////
6 // class AliHBTReaderESD //
8 // Reader for ALICE Event Summary Data (ESD). //
10 // Piotr.Skowronski@cern.ch //
12 //////////////////////////////////////////////////////////////////////
14 #include <Riostream.h>
18 #include <TObjString.h>
24 #include <AliESDtrack.h>
25 #include <AliKalmanTrack.h>
26 #include <AliJetEventParticles.h>
27 #include "AliJetParticlesReaderESD.h"
29 ClassImp(AliJetParticlesReaderESD)
31 AliJetParticlesReaderESD::AliJetParticlesReaderESD(Bool_t constrained,
32 const Char_t* esdfilename) :
33 AliJetParticlesReader(),
34 fConstrained(constrained),
35 fESDFileName(esdfilename),
40 fPassFlag(AliESDtrack::kTPCrefit)
45 /********************************************************************/
47 AliJetParticlesReaderESD::AliJetParticlesReaderESD(
50 const Char_t* esdfilename) :
51 AliJetParticlesReader(dirs),
52 fConstrained(constrained),
53 fESDFileName(esdfilename),
58 fPassFlag(AliESDtrack::kTPCrefit)
63 /********************************************************************/
65 AliJetParticlesReaderESD::~AliJetParticlesReaderESD()
69 if(fTree) delete fTree;
70 if(fKeyIterator) delete fKeyIterator;
71 if(fFile) delete fFile;
74 /**********************************************************/
76 Int_t AliJetParticlesReaderESD::ReadESD(AliESD* esd)
82 Error("ReadESD","ESD is NULL");
86 //TDatabasePDG* pdgdb = TDatabasePDG::Instance();
89 // Error("ReadESD","Can not get PDG Database Instance.");
93 Float_t mf = esd->GetMagneticField();
96 Error("ReadESD","Magnetic Field is 0. Skipping to next event.");
99 AliKalmanTrack::SetMagneticField(mf/10.);
101 Info("ReadESD","Reading Event %d",fCurrentDir*1000+fCurrentEvent);
102 if((!fOwner) || (fEventParticles==0))
103 fEventParticles = new AliJetEventParticles();
105 const Int_t kntr = esd->GetNumberOfTracks();
106 Info("ReadESD","Found %d tracks.",kntr);
107 fEventParticles->Reset(kntr);
111 headdesc+=esd->GetRunNumber();
113 headdesc+=esd->GetEventNumber();
114 fEventParticles->SetHeader(headdesc);
116 Double_t vertexpos[3];//vertex position
117 const AliESDVertex* kvertex = esd->GetVertex();
120 Info("ReadESD","ESD returned NULL pointer to vertex - assuming (0.0,0.0,0.0)");
127 kvertex->GetXYZ(vertexpos);
129 fEventParticles->SetVertex(vertexpos[0],vertexpos[1],vertexpos[2]);
132 for (Int_t i = 0;i<kntr; i++)
135 const AliESDtrack *kesdtrack = esd->GetTrack(i);
138 Error("ReadESD","Can't get track %d", i);
142 ULong_t cmptest=(kesdtrack->GetStatus() & fPassFlag);
143 if (cmptest!=fPassFlag)
145 //cout << i << " "; PrintESDtrack(kesdtrack); cout << endl;
146 Info("ReadNext","Particle %d skipped: %u.",i,kesdtrack->GetStatus());
150 Double_t mom[3]; //momentum
151 Double_t xyz[3]; //position
153 if (kesdtrack->GetConstrainedChi2() > 25) continue;
154 kesdtrack->GetConstrainedPxPyPz(mom);
155 kesdtrack->GetConstrainedXYZ(xyz);
157 kesdtrack->GetPxPyPz(mom);
158 kesdtrack->GetXYZ(xyz);
160 const Float_t kmass=kesdtrack->GetMass();
161 const Float_t kp2=mom[0]*mom[0]+mom[1]*mom[1]+mom[2]*mom[2];
162 const Float_t ketot=TMath::Sqrt(kmass*kmass+kp2);
163 const Float_t kpt=TMath::Sqrt(mom[0]*mom[0]+mom[1]*mom[1]);
164 const Float_t kp=TMath::Sqrt(kp2);
165 const Float_t keta=0.5*TMath::Log((kp+mom[2]+1e-30)/(kp-mom[2]+1e-30));
166 const Float_t kphi=TMath::Pi()+TMath::ATan2(-mom[1],-mom[0]);
167 //Double_t dx = xyz[0]-vertexpos[0];
168 //Double_t dy = xyz[1]-vertexpos[1];
169 //Float_t dca = TMath::Sqrt(dx*dx + dy*dy);
170 //Float_t dz = xyz[2]-vertexpos[2];
172 const Int_t kncl=kesdtrack->GetITSclusters(index)
173 +kesdtrack->GetTPCclusters(NULL)
174 +kesdtrack->GetTRDclusters(NULL);
175 if(IsAcceptedParticle(kpt,kphi,keta))
176 fEventParticles->AddParticle(mom[0],mom[1],mom[2],ketot,i,kesdtrack->GetLabel(),kncl,kpt,kphi,keta);
178 } // loop over tracks
183 /**********************************************************/
185 void AliJetParticlesReaderESD::Rewind()
189 if(fFile) delete fFile;
190 if(fKeyIterator) delete fKeyIterator;
197 /**********************************************************/
199 Int_t AliJetParticlesReaderESD::ReadNext()
201 //reads next event from fFile
203 do // is OK even if 0 dirs specified,
204 { // in that case we try to read from "./"
207 fFile = OpenFile(fCurrentDir);
210 Error("ReadNext","Can't get fFile for dir no. %d",fCurrentDir);
216 //fFile->GetListOfKeys()->Print();
218 if(fTree) delete fTree;
219 fTree = dynamic_cast<TTree*>(fFile->Get("esdTree"));
221 fTree->SetBranchAddress("ESD",&fESD);
223 fKeyIterator = new TIter(fFile->GetListOfKeys());
228 if(AliKalmanTrack::GetConvConst()<=0.)
229 AliKalmanTrack::SetMagneticField(0.5);
230 if(fCurrentEvent>=fTree->GetEntries())
239 fTree->GetEvent(fCurrentEvent);
242 { // "old" way via ESD objects stored in root file
243 TKey* key = (TKey*)fKeyIterator->Next();
249 delete fFile; //we have to assume there are no more ESD objects in the fFile
253 TString esdname = "ESD";
254 esdname+=fCurrentEvent;
255 if(fESD) delete fESD;
256 fESD = dynamic_cast<AliESD*>(fFile->Get(esdname));
259 Info("ReadNext","Can't find AliESD object named %s",esdname.Data());
263 delete fFile;//we have to assume there is no more ESD objects in the fFile
271 return kTRUE;//success -> read one event
272 } while(fCurrentDir < GetNumberOfDirs());
273 //end of loop over directories specified in fDirs Obj Array
274 return kFALSE; //no more directories to read
277 /**********************************************************/
279 TFile* AliJetParticlesReaderESD::OpenFile(Int_t n)
281 //opens fFile with kine tree
283 const TString& dirname = GetDirName(n);
286 Error("OpenFiles","Can't get directory name");
289 TString filename = dirname +"/"+ fESDFileName;
290 TFile *ret = TFile::Open(filename.Data());
293 Error("OpenFiles","Can't open fFile %s",filename.Data());
298 Error("OpenFiles","Can't open fFile %s",filename.Data());
305 /**********************************************************/
307 void AliJetParticlesReaderESD::PrintESDtrack(const AliESDtrack *kesdtrack) const
309 ULong_t status=kesdtrack->GetStatus();
310 cout << hex << status << dec << ": ";
311 if((status & AliESDtrack::kITSin) == AliESDtrack::kITSin) cout << "ITSin ";
312 if((status & AliESDtrack::kITSout) == AliESDtrack::kITSout) cout << "ITSout ";
313 if((status & AliESDtrack::kITSrefit) == AliESDtrack::kITSrefit) cout << "ITSrefit ";
314 if((status & AliESDtrack::kITSpid) == AliESDtrack::kITSpid) cout << "ITSpid ";
316 if((status & AliESDtrack::kTPCin) == AliESDtrack::kTPCin) cout << "TPCin ";
317 if((status & AliESDtrack::kTPCout) == AliESDtrack::kTPCout) cout << "TPCout ";
318 if((status & AliESDtrack::kTPCrefit) == AliESDtrack::kTPCrefit) cout << "TPCrefit ";
319 if((status & AliESDtrack::kTPCpid) == AliESDtrack::kTPCpid) cout << "TPCpid ";
321 if((status & AliESDtrack::kTRDin) == AliESDtrack::kTRDin) cout << "TRDin ";
322 if((status & AliESDtrack::kTRDout) == AliESDtrack::kTRDout) cout << "TRDout ";
323 if((status & AliESDtrack::kTRDrefit) == AliESDtrack::kTRDrefit) cout << "TRDrefit ";
324 if((status & AliESDtrack::kTRDpid) == AliESDtrack::kTRDpid) cout << "TRDpid ";
325 if((status & AliESDtrack::kTRDbackup) == AliESDtrack::kTRDbackup) cout << "TRDbackup ";
326 if((status & AliESDtrack::kTRDStop) == AliESDtrack::kTRDStop) cout << "TRDstop ";
328 if((status & AliESDtrack::kTOFin) == AliESDtrack::kTOFin) cout << "TOFin ";
329 if((status & AliESDtrack::kTOFout) == AliESDtrack::kTOFout) cout << "TOFout ";
330 if((status & AliESDtrack::kTOFrefit) == AliESDtrack::kTOFrefit) cout << "TOFrefit ";
331 if((status & AliESDtrack::kTOFpid) == AliESDtrack::kTOFpid) cout << "TOFpid ";
333 if((status & AliESDtrack::kPHOSpid) == AliESDtrack::kPHOSpid) cout << "PHOSpid ";
334 if((status & AliESDtrack::kRICHpid) == AliESDtrack::kRICHpid) cout << "RICHpid ";
335 if((status & AliESDtrack::kEMCALpid) == AliESDtrack::kEMCALpid) cout << "EMCALpid ";
336 if((status & AliESDtrack::kESDpid) == AliESDtrack::kESDpid) cout << "ESDpid ";
337 if((status & AliESDtrack::kTIME) == AliESDtrack::kTIME) cout << "TIME ";
340 cout << kesdtrack->GetConstrainedChi2()
341 << " " << kesdtrack->GetITSchi2()
342 << " " << kesdtrack->GetTPCchi2()
343 << " " << kesdtrack->GetTRDchi2()<< endl;