1 ////////////////////////////////////////////////////////////////////////////////
3 /// AliFemtoEventReaderESD - the reader class for the Alice ESD ///
4 /// Reads in ESD information and converts it into internal AliFemtoEvent ///
5 /// Reads in AliESDfriend to create shared hit/quality information ///
6 /// Authors: Marek Chojnacki mchojnacki@knf.pw.edu.pl ///
7 /// Adam Kisiel kisiel@mps.ohio-state.edu ///
9 ////////////////////////////////////////////////////////////////////////////////
14 *Revision 1.5 2007/05/03 09:45:20 akisiel
15 *Fixing Effective C++ warnings
17 *Revision 1.4 2007/04/27 07:28:34 akisiel
18 *Remove event number reading due to interface changes
20 *Revision 1.3 2007/04/27 07:25:16 akisiel
21 *Make revisions needed for compilation from the main AliRoot tree
23 *Revision 1.1.1.1 2007/04/25 15:38:41 panos
24 *Importing the HBT code dir
28 #include "AliFemtoEventReaderESD.h"
33 #include "AliESDtrack.h"
35 //#include "TSystem.h"
37 #include "AliFmPhysicalHelixD.h"
38 #include "AliFmThreeVectorF.h"
40 #include "SystemOfUnits.h"
42 #include "AliFemtoEvent.h"
44 ClassImp(AliFemtoEventReaderESD)
46 #if !(ST_NO_NAMESPACES)
47 using namespace units;
51 //____________________________
52 //constructor with 0 parameters , look at default settings
53 AliFemtoEventReaderESD::AliFemtoEventReaderESD():
66 fClusterPerPadrow(0x0)
68 // default constructor
69 fClusterPerPadrow = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
70 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
71 fClusterPerPadrow[tPad] = new list<Int_t>();
73 fSharedList = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
74 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
75 fSharedList[tPad] = new list<Int_t>();
79 AliFemtoEventReaderESD::AliFemtoEventReaderESD(const AliFemtoEventReaderESD &aReader) :
92 fClusterPerPadrow(0x0)
95 fInputFile = aReader.fInputFile;
96 fFileName = aReader.fFileName;
97 fConstrained = aReader.fConstrained;
98 fNumberofEvent = aReader.fNumberofEvent;
99 fCurEvent = aReader.fCurEvent;
100 fCurFile = aReader.fCurFile;
101 fTree = aReader.fTree->CloneTree();
102 // fEvent = new AliESD(*aReader.fEvent);
103 fEvent = new AliESD();
104 fEsdFile = new TFile(aReader.fEsdFile->GetName());
105 fEventFriend = aReader.fEventFriend;
106 fClusterPerPadrow = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
107 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
108 fClusterPerPadrow[tPad] = new list<Int_t>();
109 list<Int_t>::iterator iter;
110 for (iter=aReader.fClusterPerPadrow[tPad]->begin(); iter!=aReader.fClusterPerPadrow[tPad]->end(); iter++) {
111 fClusterPerPadrow[tPad]->push_back(*iter);
114 fSharedList = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
115 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
116 fSharedList[tPad] = new list<Int_t>();
117 list<Int_t>::iterator iter;
118 for (iter=aReader.fSharedList[tPad]->begin(); iter!=aReader.fSharedList[tPad]->end(); iter++) {
119 fSharedList[tPad]->push_back(*iter);
122 for (unsigned int veciter = 0; veciter<aReader.fListOfFiles.size(); veciter++)
123 fListOfFiles.push_back(aReader.fListOfFiles[veciter]);
127 AliFemtoEventReaderESD::~AliFemtoEventReaderESD()
130 //delete fListOfFiles;
135 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
136 fClusterPerPadrow[tPad]->clear();
137 delete fClusterPerPadrow[tPad];
139 delete [] fClusterPerPadrow;
140 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
141 fSharedList[tPad]->clear();
142 delete fSharedList[tPad];
144 delete [] fSharedList;
148 AliFemtoEventReaderESD& AliFemtoEventReaderESD::operator=(const AliFemtoEventReaderESD& aReader)
150 // assignment operator
151 if (this == &aReader)
154 fInputFile = aReader.fInputFile;
155 fFileName = aReader.fFileName;
156 fConstrained = aReader.fConstrained;
157 fNumberofEvent = aReader.fNumberofEvent;
158 fCurEvent = aReader.fCurEvent;
159 fCurFile = aReader.fCurFile;
160 if (fTree) delete fTree;
161 fTree = aReader.fTree->CloneTree();
162 if (fEvent) delete fEvent;
163 fEvent = new AliESD();
164 if (fEsdFile) delete fEsdFile;
165 fEsdFile = new TFile(aReader.fEsdFile->GetName());
167 fEventFriend = aReader.fEventFriend;
169 if (fClusterPerPadrow) {
170 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
171 fClusterPerPadrow[tPad]->clear();
172 delete fClusterPerPadrow[tPad];
174 delete [] fClusterPerPadrow;
178 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
179 fSharedList[tPad]->clear();
180 delete fSharedList[tPad];
182 delete [] fSharedList;
185 fClusterPerPadrow = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
186 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
187 fClusterPerPadrow[tPad] = new list<Int_t>();
188 list<Int_t>::iterator iter;
189 for (iter=aReader.fClusterPerPadrow[tPad]->begin(); iter!=aReader.fClusterPerPadrow[tPad]->end(); iter++) {
190 fClusterPerPadrow[tPad]->push_back(*iter);
193 fSharedList = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
194 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
195 fSharedList[tPad] = new list<Int_t>();
196 list<Int_t>::iterator iter;
197 for (iter=aReader.fSharedList[tPad]->begin(); iter!=aReader.fSharedList[tPad]->end(); iter++) {
198 fSharedList[tPad]->push_back(*iter);
201 for (unsigned int veciter = 0; veciter<aReader.fListOfFiles.size(); veciter++)
202 fListOfFiles.push_back(aReader.fListOfFiles[veciter]);
207 AliFemtoString AliFemtoEventReaderESD::Report()
209 // create reader report
210 AliFemtoString temp = "\n This is the AliFemtoEventReaderESD\n";
215 void AliFemtoEventReaderESD::SetInputFile(const char* inputFile)
217 //setting the name of file where names of ESD file are written
218 //it takes only this files which have good trees
220 fInputFile=string(inputFile);
221 cout<<"Input File set on "<<fInputFile<<endl;
222 ifstream infile(inputFile);
223 if(infile.good()==true)
225 //checking if all give files have good tree inside
226 while (infile.eof()==false)
228 infile.getline(buffer,256);
229 //ifstream test_file(buffer);
230 TFile *esdFile=TFile::Open(buffer,"READ");
233 TTree* tree = (TTree*) esdFile->Get("esdTree");
236 cout<<"putting file "<<string(buffer)<<" into analysis"<<endl;
237 fListOfFiles.push_back(string(buffer));
247 //setting the next file to read
248 bool AliFemtoEventReaderESD::GetNextFile()
250 if (fCurFile>=fListOfFiles.size())
252 fFileName=fListOfFiles.at(fCurFile);
253 cout<<"FileName set on "<<fFileName<<" "<<fCurFile<<endl;
258 void AliFemtoEventReaderESD::SetConstrained(const bool constrained)
260 fConstrained=constrained;
263 bool AliFemtoEventReaderESD::GetConstrained() const
268 AliFemtoEvent* AliFemtoEventReaderESD::ReturnHbtEvent()
270 // read in a next hbt event from the chain
271 // convert it to AliFemtoEvent and return
272 // for further analysis
273 AliFemtoEvent *hbtEvent = 0;
274 string tFriendFileName;
276 if (fCurEvent==fNumberofEvent)//open next file
278 cout<<"next file"<<endl;
283 delete fEvent;//added 1.04.2007
290 fEsdFile=TFile::Open(fFileName.c_str(),"READ");
291 fTree = (TTree*) fEsdFile->Get("esdTree");
292 fTree->SetBranchAddress("ESD", &fEvent);
294 // Attach the friend tree with additional information
295 tFriendFileName = fFileName;
296 tFriendFileName.insert(tFriendFileName.find("s.root"),"friend");
297 cout << "Reading friend " << tFriendFileName.c_str() << endl;;
298 fTree->AddFriend("esdFriendTree",tFriendFileName.c_str());
299 fTree->SetBranchAddress("ESDfriend",&fEventFriend);
301 // chain->SetBranchStatus("*",0);
302 // chain->SetBranchStatus("fUniqueID",1);
303 // chain->SetBranchStatus("fTracks",1);
304 // chain->SetBranchStatus("fTracks.*",1);
305 // chain->SetBranchStatus("fTracks.fTPCindex[160]",1);
306 fTree->SetBranchStatus("fTracks.fCalibContainer",0);
309 fNumberofEvent=fTree->GetEntries();
310 cout<<"Number of Entries in file "<<fNumberofEvent<<endl;
314 else //no more data to read
316 cout<<"no more files "<<hbtEvent<<endl;
321 cout<<"starting to read event "<<fCurEvent<<endl;
322 fTree->GetEvent(fCurEvent);//getting next event
323 fEvent->SetESDfriend(fEventFriend);
324 // vector<int> tLabelTable;//to check labels
326 hbtEvent = new AliFemtoEvent;
327 //setting basic things
328 // hbtEvent->SetEventNumber(fEvent->GetEventNumber());
329 hbtEvent->SetRunNumber(fEvent->GetRunNumber());
330 //hbtEvent->SetNumberOfTracks(fEvent->GetNumberOfTracks());
331 hbtEvent->SetMagneticField(fEvent->GetMagneticField()*kilogauss);//to check if here is ok
332 hbtEvent->SetZDCN1Energy(fEvent->GetZDCN1Energy());
333 hbtEvent->SetZDCP1Energy(fEvent->GetZDCP1Energy());
334 hbtEvent->SetZDCN2Energy(fEvent->GetZDCN2Energy());
335 hbtEvent->SetZDCP2Energy(fEvent->GetZDCP2Energy());
336 hbtEvent->SetZDCEMEnergy(fEvent->GetZDCEMEnergy());
337 hbtEvent->SetZDCParticipants(fEvent->GetZDCParticipants());
338 hbtEvent->SetTriggerMask(fEvent->GetTriggerMask());
339 hbtEvent->SetTriggerCluster(fEvent->GetTriggerCluster());
343 fEvent->GetVertex()->GetXYZ(fV1);
345 AliFmThreeVectorF vertex(fV1[0],fV1[1],fV1[2]);
346 hbtEvent->SetPrimVertPos(vertex);
348 //starting to reading tracks
349 int nofTracks=0; //number of reconstructed tracks in event
350 nofTracks=fEvent->GetNumberOfTracks();
351 int realnofTracks=0;//number of track which we use ina analysis
353 // Clear the shared cluster list
354 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
355 fClusterPerPadrow[tPad]->clear();
357 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
358 fSharedList[tPad]->clear();
362 for (int i=0;i<nofTracks;i++) {
363 const AliESDtrack *esdtrack=fEvent->GetTrack(i);//getting next track
365 list<Int_t>::iterator tClustIter;
367 Int_t tTrackIndices[AliESDfriendTrack::kMaxTPCcluster];
368 Int_t tNClusters = esdtrack->GetTPCclusters(tTrackIndices);
369 for (int tNcl=0; tNcl<AliESDfriendTrack::kMaxTPCcluster; tNcl++) {
370 if (tTrackIndices[tNcl] >= 0) {
371 tClustIter = find(fClusterPerPadrow[tNcl]->begin(), fClusterPerPadrow[tNcl]->end(), tTrackIndices[tNcl]);
372 if (tClustIter == fClusterPerPadrow[tNcl]->end()) {
373 fClusterPerPadrow[tNcl]->push_back(tTrackIndices[tNcl]);
376 fSharedList[tNcl]->push_back(tTrackIndices[tNcl]);
383 for (int i=0;i<nofTracks;i++)
385 bool tGoodMomentum=true; //flaga to chcek if we can read momentum of this track
387 AliFemtoTrack* trackCopy = new AliFemtoTrack();
388 const AliESDtrack *esdtrack=fEvent->GetTrack(i);//getting next track
389 // const AliESDfriendTrack *tESDfriendTrack = esdtrack->GetFriendTrack();
391 trackCopy->SetCharge((short)esdtrack->GetSign());
393 //in aliroot we have AliPID
394 //0-electron 1-muon 2-pion 3-kaon 4-proton 5-photon 6-pi0 7-neutron 8-kaon0 9-eleCon
395 //we use only 5 first
397 esdtrack->GetESDpid(esdpid);
398 trackCopy->SetPidProbElectron(esdpid[0]);
399 trackCopy->SetPidProbMuon(esdpid[1]);
400 trackCopy->SetPidProbPion(esdpid[2]);
401 trackCopy->SetPidProbKaon(esdpid[3]);
402 trackCopy->SetPidProbProton(esdpid[4]);
405 if (fConstrained==true)
406 tGoodMomentum=esdtrack->GetConstrainedPxPyPz(pxyz); //reading constrained momentum
408 tGoodMomentum=esdtrack->GetPxPyPz(pxyz);//reading noconstarined momentum
409 AliFemtoThreeVector v(pxyz[0],pxyz[1],pxyz[2]);
410 trackCopy->SetP(v);//setting momentum
411 trackCopy->SetPt(sqrt(pxyz[0]*pxyz[0]+pxyz[1]*pxyz[1]));
412 const AliFmThreeVectorD ktP(pxyz[0],pxyz[1],pxyz[2]);
413 if (ktP.mag() == 0) {
417 const AliFmThreeVectorD origin(fV1[0],fV1[1],fV1[2]);
418 //setting helix I do not if it is ok
419 AliFmPhysicalHelixD helix(ktP,origin,(double)(fEvent->GetMagneticField())*kilogauss,(double)(trackCopy->Charge()));
420 trackCopy->SetHelix(helix);
422 trackCopy->SetTrackId(esdtrack->GetID());
423 trackCopy->SetFlags(esdtrack->GetStatus());
424 //trackCopy->SetLabel(esdtrack->GetLabel());
426 //some stuff which could be useful
429 esdtrack->GetImpactParameters(impact,covimpact);
430 trackCopy->SetImpactD(impact[0]);
431 trackCopy->SetImpactZ(impact[1]);
432 trackCopy->SetCdd(covimpact[0]);
433 trackCopy->SetCdz(covimpact[1]);
434 trackCopy->SetCzz(covimpact[2]);
435 trackCopy->SetITSchi2(esdtrack->GetITSchi2());
436 trackCopy->SetITSncls(esdtrack->GetNcls(0));
437 trackCopy->SetTPCchi2(esdtrack->GetTPCchi2());
438 trackCopy->SetTPCncls(esdtrack->GetTPCNcls());
439 trackCopy->SetTPCnclsF(esdtrack->GetTPCNclsF());
440 trackCopy->SetTPCsignalN((short)esdtrack->GetTPCsignalN()); //due to bug in aliesdtrack class
441 trackCopy->SetTPCsignalS(esdtrack->GetTPCsignalSigma());
443 // Fill cluster per padrow information
444 Int_t tTrackIndices[AliESDfriendTrack::kMaxTPCcluster];
445 Int_t tNClusters = esdtrack->GetTPCclusters(tTrackIndices);
446 for (int tNcl=0; tNcl<AliESDfriendTrack::kMaxTPCcluster; tNcl++) {
447 if (tTrackIndices[tNcl] > 0)
448 trackCopy->SetTPCcluster(tNcl, 1);
450 trackCopy->SetTPCcluster(tNcl, 0);
453 // Fill shared cluster information
454 list<Int_t>::iterator tClustIter;
456 for (int tNcl=0; tNcl<AliESDfriendTrack::kMaxTPCcluster; tNcl++) {
457 if (tTrackIndices[tNcl] > 0) {
458 tClustIter = find(fSharedList[tNcl]->begin(), fSharedList[tNcl]->end(), tTrackIndices[tNcl]);
459 if (tClustIter != fSharedList[tNcl]->end()) {
460 trackCopy->SetTPCshared(tNcl, 1);
461 cout << "Event next" << endl;
462 cout << "Track: " << i << endl;
463 cout << "Shared cluster: " << tNcl << " " << tTrackIndices[tNcl] << endl;
466 trackCopy->SetTPCshared(tNcl, 0);
471 //decision if we want this track
472 //if we using diffrent labels we want that this label was use for first time
473 //if we use hidden info we want to have match between sim data and ESD
474 if (tGoodMomentum==true)
476 hbtEvent->TrackCollection()->push_back(trackCopy);//adding track to analysis
477 realnofTracks++;//real number of tracks
486 hbtEvent->SetNumberOfTracks(realnofTracks);//setting number of track which we read in event
488 cout<<"end of reading nt "<<nofTracks<<" real number "<<realnofTracks<<endl;
489 if (fCurEvent== fNumberofEvent)//if end of current file close all