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.4 2007/04/27 07:28:34 akisiel
15 *Remove event number reading due to interface changes
17 *Revision 1.3 2007/04/27 07:25:16 akisiel
18 *Make revisions needed for compilation from the main AliRoot tree
20 *Revision 1.1.1.1 2007/04/25 15:38:41 panos
21 *Importing the HBT code dir
25 #include "AliFemtoEventReaderESD.h"
30 #include "AliESDtrack.h"
32 //#include "TSystem.h"
34 #include "Infrastructure/AliFmPhysicalHelixD.h"
35 #include "Infrastructure/AliFmThreeVectorF.h"
37 #include "Base/SystemOfUnits.h"
39 #include "Infrastructure/AliFemtoEvent.h"
41 ClassImp(AliFemtoEventReaderESD)
43 #if !(ST_NO_NAMESPACES)
44 using namespace units;
48 //____________________________
49 //constructor with 0 parameters , look at default settings
50 AliFemtoEventReaderESD::AliFemtoEventReaderESD():
63 fClusterPerPadrow(0x0)
65 fClusterPerPadrow = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
66 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
67 fClusterPerPadrow[tPad] = new list<Int_t>();
69 fSharedList = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
70 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
71 fSharedList[tPad] = new list<Int_t>();
75 AliFemtoEventReaderESD::AliFemtoEventReaderESD(const AliFemtoEventReaderESD &aReader) :
88 fClusterPerPadrow(0x0)
90 fInputFile = aReader.fInputFile;
91 fFileName = aReader.fFileName;
92 fConstrained = aReader.fConstrained;
93 fNumberofEvent = aReader.fNumberofEvent;
94 fCurEvent = aReader.fCurEvent;
95 fCurFile = aReader.fCurFile;
96 fTree = aReader.fTree->CloneTree();
97 fEvent = new AliESD(*aReader.fEvent);
98 fEsdFile = new TFile(aReader.fEsdFile->GetName());
99 fEventFriend = aReader.fEventFriend;
100 fClusterPerPadrow = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
101 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
102 fClusterPerPadrow[tPad] = new list<Int_t>();
103 list<Int_t>::iterator iter;
104 for (iter=aReader.fClusterPerPadrow[tPad]->begin(); iter!=aReader.fClusterPerPadrow[tPad]->end(); iter++) {
105 fClusterPerPadrow[tPad]->push_back(*iter);
108 fSharedList = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
109 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
110 fSharedList[tPad] = new list<Int_t>();
111 list<Int_t>::iterator iter;
112 for (iter=aReader.fSharedList[tPad]->begin(); iter!=aReader.fSharedList[tPad]->end(); iter++) {
113 fSharedList[tPad]->push_back(*iter);
116 for (unsigned int veciter = 0; veciter<aReader.fListOfFiles.size(); veciter++)
117 fListOfFiles.push_back(aReader.fListOfFiles[veciter]);
121 AliFemtoEventReaderESD::~AliFemtoEventReaderESD()
123 //delete fListOfFiles;
128 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
129 fClusterPerPadrow[tPad]->clear();
130 delete fClusterPerPadrow[tPad];
132 delete [] fClusterPerPadrow;
133 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
134 fSharedList[tPad]->clear();
135 delete fSharedList[tPad];
137 delete [] fSharedList;
141 AliFemtoEventReaderESD& AliFemtoEventReaderESD::operator=(const AliFemtoEventReaderESD& aReader)
143 if (this == &aReader)
146 fInputFile = aReader.fInputFile;
147 fFileName = aReader.fFileName;
148 fConstrained = aReader.fConstrained;
149 fNumberofEvent = aReader.fNumberofEvent;
150 fCurEvent = aReader.fCurEvent;
151 fCurFile = aReader.fCurFile;
152 if (fTree) delete fTree;
153 fTree = aReader.fTree->CloneTree();
154 if (fEvent) delete fEvent;
155 fEvent = new AliESD(*aReader.fEvent);
156 if (fEsdFile) delete fEsdFile;
157 fEsdFile = new TFile(aReader.fEsdFile->GetName());
159 fEventFriend = aReader.fEventFriend;
161 if (fClusterPerPadrow) {
162 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
163 fClusterPerPadrow[tPad]->clear();
164 delete fClusterPerPadrow[tPad];
166 delete [] fClusterPerPadrow;
170 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
171 fSharedList[tPad]->clear();
172 delete fSharedList[tPad];
174 delete [] fSharedList;
177 fClusterPerPadrow = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
178 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
179 fClusterPerPadrow[tPad] = new list<Int_t>();
180 list<Int_t>::iterator iter;
181 for (iter=aReader.fClusterPerPadrow[tPad]->begin(); iter!=aReader.fClusterPerPadrow[tPad]->end(); iter++) {
182 fClusterPerPadrow[tPad]->push_back(*iter);
185 fSharedList = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
186 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
187 fSharedList[tPad] = new list<Int_t>();
188 list<Int_t>::iterator iter;
189 for (iter=aReader.fSharedList[tPad]->begin(); iter!=aReader.fSharedList[tPad]->end(); iter++) {
190 fSharedList[tPad]->push_back(*iter);
193 for (unsigned int veciter = 0; veciter<aReader.fListOfFiles.size(); veciter++)
194 fListOfFiles.push_back(aReader.fListOfFiles[veciter]);
199 AliFemtoString AliFemtoEventReaderESD::Report()
201 AliFemtoString temp = "\n This is the AliFemtoEventReaderESD\n";
206 //setting the name of file where names of ESD file are written
207 //it takes only this files which have good trees
208 void AliFemtoEventReaderESD::SetInputFile(const char* inputFile)
211 fInputFile=string(inputFile);
212 cout<<"Input File set on "<<fInputFile<<endl;
213 ifstream infile(inputFile);
214 if(infile.good()==true)
216 //checking if all give files have good tree inside
217 while (infile.eof()==false)
219 infile.getline(buffer,256);
220 //ifstream test_file(buffer);
221 TFile *esdFile=TFile::Open(buffer,"READ");
224 TTree* tree = (TTree*) esdFile->Get("esdTree");
227 cout<<"putting file "<<string(buffer)<<" into analysis"<<endl;
228 fListOfFiles.push_back(string(buffer));
238 //setting the next file to read
239 bool AliFemtoEventReaderESD::GetNextFile()
241 if (fCurFile>=fListOfFiles.size())
243 fFileName=fListOfFiles.at(fCurFile);
244 cout<<"FileName set on "<<fFileName<<" "<<fCurFile<<endl;
249 void AliFemtoEventReaderESD::SetConstrained(const bool constrained)
251 fConstrained=constrained;
254 bool AliFemtoEventReaderESD::GetConstrained() const
259 AliFemtoEvent* AliFemtoEventReaderESD::ReturnHbtEvent()
261 AliFemtoEvent *hbtEvent = 0;
262 string tFriendFileName;
264 if (fCurEvent==fNumberofEvent)//open next file
266 cout<<"next file"<<endl;
271 delete fEvent;//added 1.04.2007
278 fEsdFile=TFile::Open(fFileName.c_str(),"READ");
279 fTree = (TTree*) fEsdFile->Get("esdTree");
280 fTree->SetBranchAddress("ESD", &fEvent);
282 // Attach the friend tree with additional information
283 tFriendFileName = fFileName;
284 tFriendFileName.insert(tFriendFileName.find("s.root"),"friend");
285 cout << "Reading friend " << tFriendFileName.c_str() << endl;;
286 fTree->AddFriend("esdFriendTree",tFriendFileName.c_str());
287 fTree->SetBranchAddress("ESDfriend",&fEventFriend);
289 // chain->SetBranchStatus("*",0);
290 // chain->SetBranchStatus("fUniqueID",1);
291 // chain->SetBranchStatus("fTracks",1);
292 // chain->SetBranchStatus("fTracks.*",1);
293 // chain->SetBranchStatus("fTracks.fTPCindex[160]",1);
294 fTree->SetBranchStatus("fTracks.fCalibContainer",0);
297 fNumberofEvent=fTree->GetEntries();
298 cout<<"Number of Entries in file "<<fNumberofEvent<<endl;
302 else //no more data to read
304 cout<<"no more files "<<hbtEvent<<endl;
309 cout<<"starting to read event "<<fCurEvent<<endl;
310 fTree->GetEvent(fCurEvent);//getting next event
311 fEvent->SetESDfriend(fEventFriend);
312 vector<int> label_table;//to check labels
314 hbtEvent = new AliFemtoEvent;
315 //setting basic things
316 // hbtEvent->SetEventNumber(fEvent->GetEventNumber());
317 hbtEvent->SetRunNumber(fEvent->GetRunNumber());
318 //hbtEvent->SetNumberOfTracks(fEvent->GetNumberOfTracks());
319 hbtEvent->SetMagneticField(fEvent->GetMagneticField()*kilogauss);//to check if here is ok
320 hbtEvent->SetZDCN1Energy(fEvent->GetZDCN1Energy());
321 hbtEvent->SetZDCP1Energy(fEvent->GetZDCP1Energy());
322 hbtEvent->SetZDCN2Energy(fEvent->GetZDCN2Energy());
323 hbtEvent->SetZDCP2Energy(fEvent->GetZDCP2Energy());
324 hbtEvent->SetZDCEMEnergy(fEvent->GetZDCEMEnergy());
325 hbtEvent->SetZDCParticipants(fEvent->GetZDCParticipants());
326 hbtEvent->SetTriggerMask(fEvent->GetTriggerMask());
327 hbtEvent->SetTriggerCluster(fEvent->GetTriggerCluster());
331 fEvent->GetVertex()->GetXYZ(fV1);
333 AliFmThreeVectorF vertex(fV1[0],fV1[1],fV1[2]);
334 hbtEvent->SetPrimVertPos(vertex);
336 //starting to reading tracks
337 int nofTracks=0; //number of reconstructed tracks in event
338 nofTracks=fEvent->GetNumberOfTracks();
339 int realnofTracks=0;//number of track which we use ina analysis
341 // Clear the shared cluster list
342 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
343 fClusterPerPadrow[tPad]->clear();
345 for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
346 fSharedList[tPad]->clear();
350 for (int i=0;i<nofTracks;i++) {
351 const AliESDtrack *esdtrack=fEvent->GetTrack(i);//getting next track
353 list<Int_t>::iterator tClustIter;
355 Int_t tTrackIndices[AliESDfriendTrack::kMaxTPCcluster];
356 Int_t tNClusters = esdtrack->GetTPCclusters(tTrackIndices);
357 for (int tNcl=0; tNcl<AliESDfriendTrack::kMaxTPCcluster; tNcl++) {
358 if (tTrackIndices[tNcl] >= 0) {
359 tClustIter = find(fClusterPerPadrow[tNcl]->begin(), fClusterPerPadrow[tNcl]->end(), tTrackIndices[tNcl]);
360 if (tClustIter == fClusterPerPadrow[tNcl]->end()) {
361 fClusterPerPadrow[tNcl]->push_back(tTrackIndices[tNcl]);
364 fSharedList[tNcl]->push_back(tTrackIndices[tNcl]);
371 for (int i=0;i<nofTracks;i++)
373 bool good_momentum=true; //flaga to chcek if we can read momentum of this track
375 AliFemtoTrack* trackCopy = new AliFemtoTrack();
376 const AliESDtrack *esdtrack=fEvent->GetTrack(i);//getting next track
377 // const AliESDfriendTrack *tESDfriendTrack = esdtrack->GetFriendTrack();
379 trackCopy->SetCharge((short)esdtrack->GetSign());
381 //in aliroot we have AliPID
382 //0-electron 1-muon 2-pion 3-kaon 4-proton 5-photon 6-pi0 7-neutron 8-kaon0 9-eleCon
383 //we use only 5 first
385 esdtrack->GetESDpid(esdpid);
386 trackCopy->SetPidProbElectron(esdpid[0]);
387 trackCopy->SetPidProbMuon(esdpid[1]);
388 trackCopy->SetPidProbPion(esdpid[2]);
389 trackCopy->SetPidProbKaon(esdpid[3]);
390 trackCopy->SetPidProbProton(esdpid[4]);
393 if (fConstrained==true)
394 good_momentum=esdtrack->GetConstrainedPxPyPz(pxyz); //reading constrained momentum
396 good_momentum=esdtrack->GetPxPyPz(pxyz);//reading noconstarined momentum
397 AliFemtoThreeVector v(pxyz[0],pxyz[1],pxyz[2]);
398 trackCopy->SetP(v);//setting momentum
399 trackCopy->SetPt(sqrt(pxyz[0]*pxyz[0]+pxyz[1]*pxyz[1]));
400 const AliFmThreeVectorD p(pxyz[0],pxyz[1],pxyz[2]);
405 const AliFmThreeVectorD origin(fV1[0],fV1[1],fV1[2]);
406 //setting helix I do not if it is ok
407 AliFmPhysicalHelixD helix(p,origin,(double)(fEvent->GetMagneticField())*kilogauss,(double)(trackCopy->Charge()));
408 trackCopy->SetHelix(helix);
410 trackCopy->SetTrackId(esdtrack->GetID());
411 trackCopy->SetFlags(esdtrack->GetStatus());
412 //trackCopy->SetLabel(esdtrack->GetLabel());
414 //some stuff which could be useful
417 esdtrack->GetImpactParameters(impact,covimpact);
418 trackCopy->SetImpactD(impact[0]);
419 trackCopy->SetImpactZ(impact[1]);
420 trackCopy->SetCdd(covimpact[0]);
421 trackCopy->SetCdz(covimpact[1]);
422 trackCopy->SetCzz(covimpact[2]);
423 trackCopy->SetITSchi2(esdtrack->GetITSchi2());
424 trackCopy->SetITSncls(esdtrack->GetNcls(0));
425 trackCopy->SetTPCchi2(esdtrack->GetTPCchi2());
426 trackCopy->SetTPCncls(esdtrack->GetTPCNcls());
427 trackCopy->SetTPCnclsF(esdtrack->GetTPCNclsF());
428 trackCopy->SetTPCsignalN((short)esdtrack->GetTPCsignalN()); //due to bug in aliesdtrack class
429 trackCopy->SetTPCsignalS(esdtrack->GetTPCsignalSigma());
431 // Fill cluster per padrow information
432 Int_t tTrackIndices[AliESDfriendTrack::kMaxTPCcluster];
433 Int_t tNClusters = esdtrack->GetTPCclusters(tTrackIndices);
434 for (int tNcl=0; tNcl<AliESDfriendTrack::kMaxTPCcluster; tNcl++) {
435 if (tTrackIndices[tNcl] > 0)
436 trackCopy->SetTPCcluster(tNcl, 1);
438 trackCopy->SetTPCcluster(tNcl, 0);
441 // Fill shared cluster information
442 list<Int_t>::iterator tClustIter;
444 for (int tNcl=0; tNcl<AliESDfriendTrack::kMaxTPCcluster; tNcl++) {
445 if (tTrackIndices[tNcl] > 0) {
446 tClustIter = find(fSharedList[tNcl]->begin(), fSharedList[tNcl]->end(), tTrackIndices[tNcl]);
447 if (tClustIter != fSharedList[tNcl]->end()) {
448 trackCopy->SetTPCshared(tNcl, 1);
449 cout << "Event next" << endl;
450 cout << "Track: " << i << endl;
451 cout << "Shared cluster: " << tNcl << " " << tTrackIndices[tNcl] << endl;
454 trackCopy->SetTPCshared(tNcl, 0);
459 //decision if we want this track
460 //if we using diffrent labels we want that this label was use for first time
461 //if we use hidden info we want to have match between sim data and ESD
462 if (good_momentum==true)
464 hbtEvent->TrackCollection()->push_back(trackCopy);//adding track to analysis
465 realnofTracks++;//real number of tracks
474 hbtEvent->SetNumberOfTracks(realnofTracks);//setting number of track which we read in event
476 cout<<"end of reading nt "<<nofTracks<<" real number "<<realnofTracks<<endl;
477 if (fCurEvent== fNumberofEvent)//if end of current file close all