1 ////////////////////////////////////////////////////////////////////////////////
3 /// AliFemtoEventReaderESDChain - the reader class for the Alice ESD ///
4 /// tailored for the Task framework ///
5 /// Reads in AliESDfriend to create shared hit/quality information ///
6 /// Authors: Adam Kisiel kisiel@mps.ohio-state.edu ///
8 ////////////////////////////////////////////////////////////////////////////////
9 #include "AliFemtoEventReaderESDChain.h"
13 #include "AliESDEvent.h"
14 #include "AliESDtrack.h"
15 #include "AliESDVertex.h"
17 #include "AliFmPhysicalHelixD.h"
18 #include "AliFmThreeVectorF.h"
20 #include "SystemOfUnits.h"
22 #include "AliFemtoEvent.h"
23 #include "AliFemtoModelHiddenInfo.h"
25 ClassImp(AliFemtoEventReaderESDChain)
27 #if !(ST_NO_NAMESPACES)
28 using namespace units;
32 //____________________________
33 AliFemtoEventReaderESDChain::AliFemtoEventReaderESDChain():
43 //constructor with 0 parameters , look at default settings
44 // fClusterPerPadrow = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
45 // for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
46 // fClusterPerPadrow[tPad] = new list<Int_t>();
48 // fSharedList = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
49 // for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
50 // fSharedList[tPad] = new list<Int_t>();
55 AliFemtoEventReaderESDChain::AliFemtoEventReaderESDChain(const AliFemtoEventReaderESDChain& aReader):
56 AliFemtoEventReader(aReader),
67 fConstrained = aReader.fConstrained;
68 fReadInner = aReader.fReadInner;
69 fUseTPCOnly = aReader.fUseTPCOnly;
70 fNumberofEvent = aReader.fNumberofEvent;
71 fCurEvent = aReader.fCurEvent;
72 fCurFile = aReader.fCurFile;
73 // fEvent = new AliESD(*aReader.fEvent);
74 fEvent = new AliESDEvent();
75 // fEventFriend = aReader.fEventFriend;
76 // fClusterPerPadrow = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
77 // for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
78 // fClusterPerPadrow[tPad] = new list<Int_t>();
79 // list<Int_t>::iterator iter;
80 // for (iter=aReader.fClusterPerPadrow[tPad]->begin(); iter!=aReader.fClusterPerPadrow[tPad]->end(); iter++) {
81 // fClusterPerPadrow[tPad]->push_back(*iter);
84 // fSharedList = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
85 // for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
86 // fSharedList[tPad] = new list<Int_t>();
87 // list<Int_t>::iterator iter;
88 // for (iter=aReader.fSharedList[tPad]->begin(); iter!=aReader.fSharedList[tPad]->end(); iter++) {
89 // fSharedList[tPad]->push_back(*iter);
94 AliFemtoEventReaderESDChain::~AliFemtoEventReaderESDChain()
99 // for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
100 // fClusterPerPadrow[tPad]->clear();
101 // delete fClusterPerPadrow[tPad];
103 // delete [] fClusterPerPadrow;
104 // for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
105 // fSharedList[tPad]->clear();
106 // delete fSharedList[tPad];
108 // delete [] fSharedList;
112 AliFemtoEventReaderESDChain& AliFemtoEventReaderESDChain::operator=(const AliFemtoEventReaderESDChain& aReader)
114 // Assignment operator
115 if (this == &aReader)
118 fConstrained = aReader.fConstrained;
119 fReadInner = aReader.fReadInner;
120 fUseTPCOnly = aReader.fUseTPCOnly;
121 fNumberofEvent = aReader.fNumberofEvent;
122 fCurEvent = aReader.fCurEvent;
123 fCurFile = aReader.fCurFile;
124 if (fEvent) delete fEvent;
125 fEvent = new AliESDEvent();
127 // fEventFriend = aReader.fEventFriend;
129 // if (fClusterPerPadrow) {
130 // for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
131 // fClusterPerPadrow[tPad]->clear();
132 // delete fClusterPerPadrow[tPad];
134 // delete [] fClusterPerPadrow;
137 // if (fSharedList) {
138 // for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
139 // fSharedList[tPad]->clear();
140 // delete fSharedList[tPad];
142 // delete [] fSharedList;
145 // fClusterPerPadrow = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
146 // for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
147 // fClusterPerPadrow[tPad] = new list<Int_t>();
148 // list<Int_t>::iterator iter;
149 // for (iter=aReader.fClusterPerPadrow[tPad]->begin(); iter!=aReader.fClusterPerPadrow[tPad]->end(); iter++) {
150 // fClusterPerPadrow[tPad]->push_back(*iter);
153 // fSharedList = (list<Int_t> **) malloc(sizeof(list<Int_t> *) * AliESDfriendTrack::kMaxTPCcluster);
154 // for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
155 // fSharedList[tPad] = new list<Int_t>();
156 // list<Int_t>::iterator iter;
157 // for (iter=aReader.fSharedList[tPad]->begin(); iter!=aReader.fSharedList[tPad]->end(); iter++) {
158 // fSharedList[tPad]->push_back(*iter);
166 AliFemtoString AliFemtoEventReaderESDChain::Report()
168 AliFemtoString temp = "\n This is the AliFemtoEventReaderESDChain\n";
173 void AliFemtoEventReaderESDChain::SetConstrained(const bool constrained)
175 // Select whether to read constrained or not constrained momentum
176 fConstrained=constrained;
179 bool AliFemtoEventReaderESDChain::GetConstrained() const
181 // Check whether we read constrained or not constrained momentum
185 void AliFemtoEventReaderESDChain::SetReadTPCInner(const bool readinner)
187 fReadInner=readinner;
190 bool AliFemtoEventReaderESDChain::GetReadTPCInner() const
196 void AliFemtoEventReaderESDChain::SetUseTPCOnly(const bool usetpconly)
198 fUseTPCOnly=usetpconly;
201 bool AliFemtoEventReaderESDChain::GetUseTPCOnly() const
206 AliFemtoEvent* AliFemtoEventReaderESDChain::ReturnHbtEvent()
208 // Get the event, read all the relevant information
209 // and fill the AliFemtoEvent class
210 // Returns a valid AliFemtoEvent
211 AliFemtoEvent *hbtEvent = 0;
212 string tFriendFileName;
214 // Get the friend information
215 cout<<"starting to read event "<<fCurEvent<<endl;
216 // fEvent->SetESDfriend(fEventFriend);
218 hbtEvent = new AliFemtoEvent;
219 //setting basic things
220 // hbtEvent->SetEventNumber(fEvent->GetEventNumber());
221 hbtEvent->SetRunNumber(fEvent->GetRunNumber());
222 //hbtEvent->SetNumberOfTracks(fEvent->GetNumberOfTracks());
223 hbtEvent->SetMagneticField(fEvent->GetMagneticField()*kilogauss);//to check if here is ok
224 hbtEvent->SetZDCN1Energy(fEvent->GetZDCN1Energy());
225 hbtEvent->SetZDCP1Energy(fEvent->GetZDCP1Energy());
226 hbtEvent->SetZDCN2Energy(fEvent->GetZDCN2Energy());
227 hbtEvent->SetZDCP2Energy(fEvent->GetZDCP2Energy());
228 hbtEvent->SetZDCEMEnergy(fEvent->GetZDCEMEnergy());
229 hbtEvent->SetZDCParticipants(fEvent->GetZDCParticipants());
230 hbtEvent->SetTriggerMask(fEvent->GetTriggerMask());
231 hbtEvent->SetTriggerCluster(fEvent->GetTriggerCluster());
236 fEvent->GetPrimaryVertexTPC()->GetXYZ(fV1);
239 fEvent->GetPrimaryVertex()->GetXYZ(fV1);
242 AliFmThreeVectorF vertex(fV1[0],fV1[1],fV1[2]);
243 hbtEvent->SetPrimVertPos(vertex);
245 //starting to reading tracks
246 int nofTracks=0; //number of reconstructed tracks in event
247 nofTracks=fEvent->GetNumberOfTracks();
248 int realnofTracks=0;//number of track which we use ina analysis
250 // // Clear the shared cluster list
251 // for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
252 // fClusterPerPadrow[tPad]->clear();
254 // for (int tPad=0; tPad<AliESDfriendTrack::kMaxTPCcluster; tPad++) {
255 // fSharedList[tPad]->clear();
259 // for (int i=0;i<nofTracks;i++) {
260 // const AliESDtrack *esdtrack=fEvent->GetTrack(i);//getting next track
262 // list<Int_t>::iterator tClustIter;
264 // Int_t tTrackIndices[AliESDfriendTrack::kMaxTPCcluster];
265 // Int_t tNClusters = esdtrack->GetTPCclusters(tTrackIndices);
266 // for (int tNcl=0; tNcl<AliESDfriendTrack::kMaxTPCcluster; tNcl++) {
267 // if (tTrackIndices[tNcl] >= 0) {
268 // tClustIter = find(fClusterPerPadrow[tNcl]->begin(), fClusterPerPadrow[tNcl]->end(), tTrackIndices[tNcl]);
269 // if (tClustIter == fClusterPerPadrow[tNcl]->end()) {
270 // fClusterPerPadrow[tNcl]->push_back(tTrackIndices[tNcl]);
273 // fSharedList[tNcl]->push_back(tTrackIndices[tNcl]);
280 for (int i=0;i<nofTracks;i++)
282 bool tGoodMomentum=true; //flaga to chcek if we can read momentum of this track
284 AliFemtoTrack* trackCopy = new AliFemtoTrack();
285 const AliESDtrack *esdtrack=fEvent->GetTrack(i);//getting next track
286 // const AliESDfriendTrack *tESDfriendTrack = esdtrack->GetFriendTrack();
288 trackCopy->SetCharge((short)esdtrack->GetSign());
290 //in aliroot we have AliPID
291 //0-electron 1-muon 2-pion 3-kaon 4-proton 5-photon 6-pi0 7-neutron 8-kaon0 9-eleCon
292 //we use only 5 first
294 esdtrack->GetESDpid(esdpid);
295 trackCopy->SetPidProbElectron(esdpid[0]);
296 trackCopy->SetPidProbMuon(esdpid[1]);
297 trackCopy->SetPidProbPion(esdpid[2]);
298 trackCopy->SetPidProbKaon(esdpid[3]);
299 trackCopy->SetPidProbProton(esdpid[4]);
307 if (!esdtrack->GetTPCInnerParam()) {
313 AliExternalTrackParam *param = new AliExternalTrackParam(*esdtrack->GetTPCInnerParam());
315 param->PropagateToDCA(fEvent->GetPrimaryVertexTPC(), (fEvent->GetMagneticField()), 10000, impact, covimpact);
316 param->GetPxPyPz(pxyz);//reading noconstarined momentum
318 if (fReadInner == true) {
319 AliFemtoModelHiddenInfo *tInfo = new AliFemtoModelHiddenInfo();
320 tInfo->SetPDGPid(211);
321 tInfo->SetTrueMomentum(pxyz[0], pxyz[1], pxyz[2]);
322 tInfo->SetMass(0.13957);
323 // tInfo->SetEmissionPoint(rxyz[0], rxyz[1], rxyz[2], 0.0);
324 // tInfo->SetEmissionPoint(fV1[0], fV1[1], fV1[2], 0.0);
325 tInfo->SetEmissionPoint(rxyz[0]-fV1[0], rxyz[1]-fV1[1], rxyz[2]-fV1[2], 0.0);
326 trackCopy->SetHiddenInfo(tInfo);
329 AliFemtoThreeVector v(pxyz[0],pxyz[1],pxyz[2]);
330 if (v.mag() < 0.0001) {
331 // cout << "Found 0 momentum ???? " <<endl;
335 trackCopy->SetP(v);//setting momentum
336 trackCopy->SetPt(sqrt(pxyz[0]*pxyz[0]+pxyz[1]*pxyz[1]));
338 const AliFmThreeVectorD kP(pxyz[0],pxyz[1],pxyz[2]);
339 const AliFmThreeVectorD kOrigin(fV1[0],fV1[1],fV1[2]);
340 //setting helix I do not if it is ok
341 AliFmPhysicalHelixD helix(kP,kOrigin,(double)(fEvent->GetMagneticField())*kilogauss,(double)(trackCopy->Charge()));
342 trackCopy->SetHelix(helix);
344 //some stuff which could be useful
345 trackCopy->SetImpactD(impact[0]);
346 trackCopy->SetImpactZ(impact[1]);
347 trackCopy->SetCdd(covimpact[0]);
348 trackCopy->SetCdz(covimpact[1]);
349 trackCopy->SetCzz(covimpact[2]);
350 trackCopy->SetSigmaToVertex(GetSigmaToVertex(impact, covimpact));
355 if (fReadInner == true) {
357 if (esdtrack->GetTPCInnerParam()) {
358 AliExternalTrackParam *param = new AliExternalTrackParam(*esdtrack->GetTPCInnerParam());
360 param->PropagateToDCA(fEvent->GetPrimaryVertex(), (fEvent->GetMagneticField()), 10000);
361 param->GetPxPyPz(pxyz);//reading noconstarined momentum
364 AliFemtoModelHiddenInfo *tInfo = new AliFemtoModelHiddenInfo();
365 tInfo->SetPDGPid(211);
366 tInfo->SetTrueMomentum(pxyz[0], pxyz[1], pxyz[2]);
367 tInfo->SetMass(0.13957);
368 // tInfo->SetEmissionPoint(rxyz[0], rxyz[1], rxyz[2], 0.0);
369 //tInfo->SetEmissionPoint(fV1[0], fV1[1], fV1[2], 0.0);
370 tInfo->SetEmissionPoint(rxyz[0]-fV1[0], rxyz[1]-fV1[1], rxyz[2]-fV1[2], 0.0);
371 trackCopy->SetHiddenInfo(tInfo);
374 if (fConstrained==true)
375 tGoodMomentum=esdtrack->GetConstrainedPxPyPz(pxyz); //reading constrained momentum
377 tGoodMomentum=esdtrack->GetPxPyPz(pxyz);//reading noconstarined momentum
379 AliFemtoThreeVector v(pxyz[0],pxyz[1],pxyz[2]);
380 if (v.mag() < 0.0001) {
381 // cout << "Found 0 momentum ???? " <<endl;
385 trackCopy->SetP(v);//setting momentum
386 trackCopy->SetPt(sqrt(pxyz[0]*pxyz[0]+pxyz[1]*pxyz[1]));
387 const AliFmThreeVectorD kP(pxyz[0],pxyz[1],pxyz[2]);
388 const AliFmThreeVectorD kOrigin(fV1[0],fV1[1],fV1[2]);
389 //setting helix I do not if it is ok
390 AliFmPhysicalHelixD helix(kP,kOrigin,(double)(fEvent->GetMagneticField())*kilogauss,(double)(trackCopy->Charge()));
391 trackCopy->SetHelix(helix);
393 //some stuff which could be useful
396 esdtrack->GetImpactParameters(imp,cim);
400 covimpact[0] = cim[0];
401 covimpact[1] = cim[1];
402 covimpact[2] = cim[2];
404 trackCopy->SetImpactD(impact[0]);
405 trackCopy->SetImpactZ(impact[1]);
406 trackCopy->SetCdd(covimpact[0]);
407 trackCopy->SetCdz(covimpact[1]);
408 trackCopy->SetCzz(covimpact[2]);
409 trackCopy->SetSigmaToVertex(GetSigmaToVertex(impact,covimpact));
412 trackCopy->SetTrackId(esdtrack->GetID());
413 trackCopy->SetFlags(esdtrack->GetStatus());
414 trackCopy->SetLabel(esdtrack->GetLabel());
416 trackCopy->SetITSchi2(esdtrack->GetITSchi2());
417 trackCopy->SetITSncls(esdtrack->GetNcls(0));
418 trackCopy->SetTPCchi2(esdtrack->GetTPCchi2());
419 trackCopy->SetTPCncls(esdtrack->GetTPCNcls());
420 trackCopy->SetTPCnclsF(esdtrack->GetTPCNclsF());
421 trackCopy->SetTPCsignalN((short)esdtrack->GetTPCsignalN()); //due to bug in aliesdtrack class
422 trackCopy->SetTPCsignalS(esdtrack->GetTPCsignalSigma());
424 trackCopy->SetTPCClusterMap(esdtrack->GetTPCClusterMap());
425 trackCopy->SetTPCSharedMap(esdtrack->GetTPCSharedMap());
428 esdtrack->GetInnerXYZ(xtpc);
430 trackCopy->SetNominalTPCEntrancePoint(xtpc);
432 esdtrack->GetOuterXYZ(xtpc);
434 trackCopy->SetNominalTPCExitPoint(xtpc);
437 for (int ik=0; ik<3; ik++) {
438 indexes[ik] = esdtrack->GetKinkIndex(ik);
440 trackCopy->SetKinkIndexes(indexes);
441 //decision if we want this track
442 //if we using diffrent labels we want that this label was use for first time
443 //if we use hidden info we want to have match between sim data and ESD
444 if (tGoodMomentum==true)
446 hbtEvent->TrackCollection()->push_back(trackCopy);//adding track to analysis
447 realnofTracks++;//real number of tracks
457 hbtEvent->SetNumberOfTracks(realnofTracks);//setting number of track which we read in event
459 cout<<"end of reading nt "<<nofTracks<<" real number "<<realnofTracks<<endl;
462 //___________________
463 void AliFemtoEventReaderESDChain::SetESDSource(AliESDEvent *aESD)
465 // The chain loads the ESD for us
466 // You must provide the address where it can be found
469 //___________________
470 // void AliFemtoEventReaderESDChain::SetESDfriendSource(AliESDfriend *aFriend)
472 // // We need the ESD tree to obtain
473 // // information about the friend file location
474 // fEventFriend = aFriend;
477 //____________________________________________________________________
478 Float_t AliFemtoEventReaderESDChain::GetSigmaToVertex(double *impact, double *covar)
480 // Calculates the number of sigma to the vertex.
492 bRes[0] = TMath::Sqrt(bCov[0]);
493 bRes[1] = TMath::Sqrt(bCov[2]);
495 // -----------------------------------
496 // How to get to a n-sigma cut?
498 // The accumulated statistics from 0 to d is
500 // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
501 // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
503 // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-x**2)/2)
504 // Can this be expressed in a different way?
506 if (bRes[0] == 0 || bRes[1] ==0)
509 Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
511 // stupid rounding problem screws up everything:
512 // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
513 if (TMath::Exp(-d * d / 2) < 1e-10)
516 d = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);