1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 //-----------------------------------------------------------------
19 // Implementation of the AliESDEvent class
20 // This is the class to deal with during the physics analysis of data.
21 // It also ensures the backward compatibility with the old ESD format.
23 AliESDEvent *ev= new AliESDEvent();
24 ev->ReadFromTree(esdTree);
26 for (Int_t i=0; i<nev; i++) {
28 if(ev->GetAliESDOld())ev->CopyFromOldESD();
30 // The AliESDInputHAndler does this automatically for you
32 // Origin: Christian Klein-Boesing, CERN, Christian.Klein-Boesing@cern.ch
33 //-----------------------------------------------------------------
36 #include "TRefArray.h"
39 #include "AliESDEvent.h"
40 #include "AliESDfriend.h"
41 #include "AliESDVZERO.h"
42 #include "AliESDFMD.h"
44 #include "AliESDMuonTrack.h"
45 #include "AliESDPmdTrack.h"
46 #include "AliESDTrdTrack.h"
47 #include "AliESDVertex.h"
48 #include "AliESDcascade.h"
49 #include "AliESDPmdTrack.h"
50 #include "AliESDTrdTrack.h"
51 #include "AliESDVertex.h"
52 #include "AliESDcascade.h"
53 #include "AliESDkink.h"
54 #include "AliESDtrack.h"
55 #include "AliESDHLTtrack.h"
56 #include "AliESDCaloCluster.h"
58 #include "AliESDFMD.h"
59 #include "AliESDVZERO.h"
60 #include "AliMultiplicity.h"
61 #include "AliRawDataErrorLog.h"
68 // here we define the names, some classes are no TNamed, therefore the classnames
70 const char* AliESDEvent::fgkESDListName[kESDListN] = {"AliESDRun",
89 "AliRawDataErrorLogs"};
90 //______________________________________________________________________________
91 AliESDEvent::AliESDEvent():
93 fESDObjects(new TList()),
118 fFirstEMCALCluster(-1),
120 fFirstPHOSCluster(-1)
123 //______________________________________________________________________________
124 AliESDEvent::AliESDEvent(const AliESDEvent& esd):
126 fESDObjects(new TList()),
127 fESDRun(new AliESDRun(*esd.fESDRun)),
128 fHeader(new AliESDHeader(*esd.fHeader)),
129 fESDZDC(new AliESDZDC(*esd.fESDZDC)),
130 fESDFMD(new AliESDFMD(*esd.fESDFMD)),
131 fESDVZERO(new AliESDVZERO(*esd.fESDVZERO)),
132 fESDTZERO(new AliESDTZERO(*esd.fESDTZERO)),
133 fSPDVertex(new AliESDVertex(*esd.fSPDVertex)),
134 fPrimaryVertex(new AliESDVertex(*esd.fPrimaryVertex)),
135 fSPDMult(new AliMultiplicity(*esd.fSPDMult)),
136 fPHOSTrigger(new AliESDCaloTrigger(*esd.fPHOSTrigger)),
137 fEMCALTrigger(new AliESDCaloTrigger(*esd.fEMCALTrigger)),
138 fTracks(new TClonesArray(*esd.fTracks)),
139 fMuonTracks(new TClonesArray(*esd.fMuonTracks)),
140 fPmdTracks(new TClonesArray(*esd.fPmdTracks)),
141 fTrdTracks(new TClonesArray(*esd.fTrdTracks)),
142 fV0s(new TClonesArray(*esd.fV0s)),
143 fCascades(new TClonesArray(*esd.fCascades)),
144 fKinks(new TClonesArray(*esd.fKinks)),
145 fCaloClusters(new TClonesArray(*esd.fCaloClusters)),
146 fErrorLogs(new TClonesArray(*esd.fErrorLogs)),
147 fESDOld(new AliESD(*esd.fESDOld)),
148 fESDFriendOld(new AliESDfriend(*esd.fESDFriendOld)),
149 fConnected(esd.fConnected),
150 fEMCALClusters(esd.fEMCALClusters),
151 fFirstEMCALCluster(esd.fFirstEMCALCluster),
152 fPHOSClusters(esd.fPHOSClusters),
153 fFirstPHOSCluster(esd.fFirstPHOSCluster)
156 // CKB init in the constructor list and only add here ...
161 AddObject(fESDVZERO);
162 AddObject(fESDTZERO);
163 AddObject(fSPDVertex);
164 AddObject(fPrimaryVertex);
166 AddObject(fPHOSTrigger);
167 AddObject(fEMCALTrigger);
169 AddObject(fMuonTracks);
170 AddObject(fPmdTracks);
171 AddObject(fTrdTracks);
173 AddObject(fCascades);
175 AddObject(fCaloClusters);
176 AddObject(fErrorLogs);
182 //______________________________________________________________________________
183 AliESDEvent & AliESDEvent::operator=(const AliESDEvent& source) {
185 // Assignment operator
187 if(&source == this) return *this;
188 AliVEvent::operator=(source);
190 fESDRun = new AliESDRun(*source.fESDRun);
191 fHeader = new AliESDHeader(*source.fHeader);
192 fESDZDC = new AliESDZDC(*source.fESDZDC);
193 fESDFMD = new AliESDFMD(*source.fESDFMD);
194 fESDVZERO = new AliESDVZERO(*source.fESDVZERO);
195 fESDTZERO = new AliESDTZERO(*source.fESDTZERO);
196 fSPDVertex = new AliESDVertex(*source.fSPDVertex);
197 fPrimaryVertex = new AliESDVertex(*source.fPrimaryVertex);
198 fSPDMult = new AliMultiplicity(*source.fSPDMult);
199 fPHOSTrigger = new AliESDCaloTrigger(*source.fPHOSTrigger);
200 fEMCALTrigger = new AliESDCaloTrigger(*source.fEMCALTrigger);
201 fTracks = new TClonesArray(*source.fTracks);
202 fMuonTracks = new TClonesArray(*source.fMuonTracks);
203 fPmdTracks = new TClonesArray(*source.fPmdTracks);
204 fTrdTracks = new TClonesArray(*source.fTrdTracks);
205 fV0s = new TClonesArray(*source.fV0s);
206 fCascades = new TClonesArray(*source.fCascades);
207 fKinks = new TClonesArray(*source.fKinks);
208 fCaloClusters = new TClonesArray(*source.fCaloClusters);
209 fErrorLogs = new TClonesArray(*source.fErrorLogs);
210 fESDOld = new AliESD(*source.fESDOld);
211 fESDFriendOld = new AliESDfriend(*source.fESDFriendOld);
213 // or AddObject( fESDZDC = new AliESDZDC(*source.fESDZDC));
215 fESDObjects = new TList();
220 AddObject(fESDVZERO);
221 AddObject(fESDTZERO);
222 AddObject(fSPDVertex);
223 AddObject(fPrimaryVertex);
225 AddObject(fPHOSTrigger);
226 AddObject(fEMCALTrigger);
228 AddObject(fMuonTracks);
229 AddObject(fPmdTracks);
230 AddObject(fTrdTracks);
232 AddObject(fCascades);
234 AddObject(fCaloClusters);
235 AddObject(fErrorLogs);
237 fConnected = source.fConnected;
238 fEMCALClusters = source.fEMCALClusters;
239 fFirstEMCALCluster = source.fFirstEMCALCluster;
240 fPHOSClusters = source.fPHOSClusters;
241 fFirstPHOSCluster = source.fFirstPHOSCluster;
250 //______________________________________________________________________________
251 AliESDEvent::~AliESDEvent()
254 // Standard destructor
257 // everthing on the list gets deleted automatically
260 if(fESDObjects&&!fConnected)
269 //______________________________________________________________________________
270 void AliESDEvent::Reset()
274 // Reset the standard contents
276 if(fESDOld)fESDOld->Reset();
277 // call reset for user supplied data?
280 void AliESDEvent::ResetStdContent()
282 // Reset the standard contents
283 if(fESDRun) fESDRun->Reset();
284 if(fHeader) fHeader->Reset();
285 if(fESDZDC) fESDZDC->Reset();
286 if(fESDFMD) fESDFMD->Clear(); // why clear.... need consistend names
288 // reset by callin d'to /c'tor keep the pointer
289 fESDVZERO->~AliESDVZERO();
290 new (fESDVZERO) AliESDVZERO();
292 if(fESDTZERO) fESDTZERO->Reset();
293 // CKB no clear/reset implemented
295 fSPDVertex->~AliESDVertex();
296 new (fSPDVertex) AliESDVertex();
297 fSPDVertex->SetName(fgkESDListName[kSPDVertex]);
300 fPrimaryVertex->~AliESDVertex();
301 new (fPrimaryVertex) AliESDVertex();
302 fPrimaryVertex->SetName(fgkESDListName[kPrimaryVertex]);
305 fSPDMult->~AliMultiplicity();
306 new (fSPDMult) AliMultiplicity();
308 if(fPHOSTrigger)fPHOSTrigger->Reset();
309 if(fEMCALTrigger)fEMCALTrigger->Reset();
310 if(fTracks)fTracks->Delete();
311 if(fMuonTracks)fMuonTracks->Delete();
312 if(fPmdTracks)fPmdTracks->Delete();
313 if(fTrdTracks)fTrdTracks->Delete();
314 if(fV0s)fV0s->Delete();
315 if(fCascades)fCascades->Delete();
316 if(fKinks)fKinks->Delete();
317 if(fCaloClusters)fCaloClusters->Delete();
318 if(fErrorLogs) fErrorLogs->Delete();
320 // don't reset fconnected fConnected ;
323 fFirstEMCALCluster=-1;
325 fFirstPHOSCluster=-1;
329 Int_t AliESDEvent::AddV0(const AliESDv0 *v) {
333 TClonesArray &fv = *fV0s;
334 Int_t idx=fV0s->GetEntriesFast();
335 new(fv[idx]) AliESDv0(*v);
339 //______________________________________________________________________________
340 void AliESDEvent::Print(Option_t *) const
343 // Print header information of the event
345 printf("ESD run information\n");
346 printf("Event # in file %d Bunch crossing # %d Orbit # %d Period # %d Run # %d Trigger %lld Magnetic field %f \n",
347 GetEventNumberInFile(),
348 GetBunchCrossNumber(),
353 GetMagneticField() );
354 printf("Vertex: (%.4f +- %.4f, %.4f +- %.4f, %.4f +- %.4f) cm\n",
355 fPrimaryVertex->GetXv(), fPrimaryVertex->GetXRes(),
356 fPrimaryVertex->GetYv(), fPrimaryVertex->GetYRes(),
357 fPrimaryVertex->GetZv(), fPrimaryVertex->GetZRes());
358 printf("Mean vertex in RUN: X=%.4f Y=%.4f cm\n",
359 GetDiamondX(),GetDiamondY());
360 printf("SPD Multiplicity. Number of tracklets %d \n",
361 fSPDMult->GetNumberOfTracklets());
362 printf("Number of tracks: \n");
363 printf(" charged %d\n", GetNumberOfTracks());
364 printf(" muon %d\n", GetNumberOfMuonTracks());
365 printf(" pmd %d\n", GetNumberOfPmdTracks());
366 printf(" trd %d\n", GetNumberOfTrdTracks());
367 printf(" v0 %d\n", GetNumberOfV0s());
368 printf(" cascades %d\n", GetNumberOfCascades());
369 printf(" kinks %d\n", GetNumberOfKinks());
370 printf(" CaloClusters %d\n", GetNumberOfCaloClusters());
371 printf(" phos %d\n", GetNumberOfPHOSClusters());
372 printf(" emcal %d\n", GetNumberOfEMCALClusters());
373 printf(" FMD %s\n", (fESDFMD ? "yes" : "no"));
374 printf(" VZERO %s\n", (fESDVZERO ? "yes" : "no"));
379 void AliESDEvent::SetESDfriend(const AliESDfriend *ev) {
381 // Attaches the complementary info to the ESD
385 // to be sure that we set the tracks also
386 // in case of old esds
387 // if(fESDOld)CopyFromOldESD();
389 Int_t ntrk=ev->GetNumberOfTracks();
391 for (Int_t i=0; i<ntrk; i++) {
392 const AliESDfriendTrack *f=ev->GetTrack(i);
393 GetTrack(i)->SetFriendTrack(f);
397 Bool_t AliESDEvent::RemoveKink(Int_t rm) {
398 // ---------------------------------------------------------
399 // Remove a kink candidate and references to it from ESD,
400 // if this candidate does not come from a reconstructed decay
401 // Not yet implemented...
402 // ---------------------------------------------------------
403 Int_t last=GetNumberOfKinks()-1;
404 if ((rm<0)||(rm>last)) return kFALSE;
409 Bool_t AliESDEvent::RemoveV0(Int_t rm) {
410 // ---------------------------------------------------------
411 // Remove a V0 candidate and references to it from ESD,
412 // if this candidate does not come from a reconstructed decay
413 // ---------------------------------------------------------
414 Int_t last=GetNumberOfV0s()-1;
415 if ((rm<0)||(rm>last)) return kFALSE;
417 AliESDv0 *v0=GetV0(rm);
418 Int_t idxP=v0->GetPindex(), idxN=v0->GetNindex();
421 Int_t lastIdxP=v0->GetPindex(), lastIdxN=v0->GetNindex();
425 // Check if this V0 comes from a reconstructed decay
426 Int_t ncs=GetNumberOfCascades();
427 for (Int_t n=0; n<ncs; n++) {
428 AliESDcascade *cs=GetCascade(n);
430 Int_t csIdxP=cs->GetPindex();
431 Int_t csIdxN=cs->GetNindex();
434 if (idxN==csIdxN) return kFALSE;
436 if (csIdxP==lastIdxP)
437 if (csIdxN==lastIdxN) used++;
440 //Replace the removed V0 with the last V0
441 TClonesArray &a=*fV0s;
442 delete a.RemoveAt(rm);
444 if (rm==last) return kTRUE;
446 //v0 is pointing to the last V0 candidate...
447 new (a[rm]) AliESDv0(*v0);
448 delete a.RemoveAt(last);
450 if (!used) return kTRUE;
453 // Remap the indices of the daughters of reconstructed decays
454 for (Int_t n=0; n<ncs; n++) {
455 AliESDcascade *cs=GetCascade(n);
458 Int_t csIdxP=cs->GetPindex();
459 Int_t csIdxN=cs->GetNindex();
461 if (csIdxP==lastIdxP)
462 if (csIdxN==lastIdxN) {
463 cs->AliESDv0::SetIndex(1,idxP);
464 cs->AliESDv0::SetIndex(0,idxN);
466 if (!used) return kTRUE;
473 Bool_t AliESDEvent::RemoveTrack(Int_t rm) {
474 // ---------------------------------------------------------
475 // Remove a track and references to it from ESD,
476 // if this track does not come from a reconstructed decay
477 // ---------------------------------------------------------
478 Int_t last=GetNumberOfTracks()-1;
479 if ((rm<0)||(rm>last)) return kFALSE;
483 // Check if this track comes from a reconstructed decay
484 Int_t nv0=GetNumberOfV0s();
485 for (Int_t n=0; n<nv0; n++) {
486 AliESDv0 *v0=GetV0(n);
488 Int_t idx=v0->GetNindex();
489 if (rm==idx) return kFALSE;
490 if (idx==last) used++;
493 if (rm==idx) return kFALSE;
494 if (idx==last) used++;
497 Int_t ncs=GetNumberOfCascades();
498 for (Int_t n=0; n<ncs; n++) {
499 AliESDcascade *cs=GetCascade(n);
501 Int_t idx=cs->GetIndex();
502 if (rm==idx) return kFALSE;
503 if (idx==last) used++;
506 Int_t nkn=GetNumberOfKinks();
507 for (Int_t n=0; n<nkn; n++) {
508 AliESDkink *kn=GetKink(n);
510 Int_t idx=kn->GetIndex(0);
511 if (rm==idx) return kFALSE;
512 if (idx==last) used++;
515 if (rm==idx) return kFALSE;
516 if (idx==last) used++;
520 //Replace the removed track with the last track
521 TClonesArray &a=*fTracks;
522 delete a.RemoveAt(rm);
524 if (rm==last) return kTRUE;
526 AliESDtrack *t=GetTrack(last);
528 new (a[rm]) AliESDtrack(*t);
529 delete a.RemoveAt(last);
531 if (!used) return kTRUE;
534 // Remap the indices of the daughters of reconstructed decays
535 for (Int_t n=0; n<nv0; n++) {
536 AliESDv0 *v0=GetV0(n);
537 if (v0->GetIndex(0)==last) {
540 if (!used) return kTRUE;
542 if (v0->GetIndex(1)==last) {
545 if (!used) return kTRUE;
549 for (Int_t n=0; n<ncs; n++) {
550 AliESDcascade *cs=GetCascade(n);
551 if (cs->GetIndex()==last) {
554 if (!used) return kTRUE;
558 for (Int_t n=0; n<nkn; n++) {
559 AliESDkink *kn=GetKink(n);
560 if (kn->GetIndex(0)==last) {
563 if (!used) return kTRUE;
565 if (kn->GetIndex(1)==last) {
568 if (!used) return kTRUE;
576 Bool_t AliESDEvent::Clean(Float_t *cleanPars) {
578 // Remove the data which are not needed for the physics analysis.
580 // 1) Cleaning the V0 candidates
581 // ---------------------------
582 // If the cosine of the V0 pointing angle "csp" and
583 // the DCA between the daughter tracks "dca" does not satisfy
586 // csp > cleanPars[1] + dca/cleanPars[0]*(1.- cleanPars[1])
588 // an attempt to remove this V0 candidate from ESD is made.
590 // The V0 candidate gets removed if it does not belong to any
591 // recosntructed cascade decay
593 // 12.11.2007, optimal values: cleanPars[0]=0.5, cleanPars[1]=0.999
595 // 2) Cleaning the tracks
596 // ----------------------
597 // If track's transverse parameter is larger than cleanPars[2]
599 // track's longitudinal parameter is larger than cleanPars[3]
600 // an attempt to remove this track from ESD is made.
602 // The track gets removed if it does not come
603 // from a reconstructed decay
607 Float_t dcaMax=cleanPars[0];
608 Float_t cspMin=cleanPars[1];
610 Int_t nV0s=GetNumberOfV0s();
611 for (Int_t i=nV0s-1; i>=0; i--) {
612 AliESDv0 *v0=GetV0(i);
614 Float_t dca=v0->GetDcaV0Daughters();
615 Float_t csp=v0->GetV0CosineOfPointingAngle();
616 Float_t cspcut=cspMin + dca/dcaMax*(1.-cspMin);
617 if (csp > cspcut) continue;
619 if (RemoveV0(i)) rc=kTRUE;
623 Float_t dmax=cleanPars[2], zmax=cleanPars[3];
625 const AliESDVertex *vertex=GetVertex();
626 Bool_t vtxOK=vertex->GetStatus();
628 Int_t nTracks=GetNumberOfTracks();
629 for (Int_t i=nTracks-1; i>=0; i--) {
630 AliESDtrack *track=GetTrack(i);
631 Float_t xy,z; track->GetImpactParameters(xy,z);
632 if ((TMath::Abs(xy) > dmax) || (vtxOK && (TMath::Abs(z) > zmax))) {
633 if (RemoveTrack(i)) rc=kTRUE;
640 Int_t AliESDEvent::AddTrack(const AliESDtrack *t)
643 TClonesArray &ftr = *fTracks;
644 AliESDtrack * track = new(ftr[fTracks->GetEntriesFast()])AliESDtrack(*t);
645 track->SetID(fTracks->GetEntriesFast()-1);
646 return track->GetID();
649 void AliESDEvent::AddMuonTrack(const AliESDMuonTrack *t)
651 TClonesArray &fmu = *fMuonTracks;
652 new(fmu[fMuonTracks->GetEntriesFast()]) AliESDMuonTrack(*t);
655 void AliESDEvent::AddPmdTrack(const AliESDPmdTrack *t)
657 TClonesArray &fpmd = *fPmdTracks;
658 new(fpmd[fPmdTracks->GetEntriesFast()]) AliESDPmdTrack(*t);
661 void AliESDEvent::AddTrdTrack(const AliESDTrdTrack *t)
663 TClonesArray &ftrd = *fTrdTracks;
664 new(ftrd[fTrdTracks->GetEntriesFast()]) AliESDTrdTrack(*t);
670 Int_t AliESDEvent::AddKink(const AliESDkink *c)
673 TClonesArray &fk = *fKinks;
674 AliESDkink * kink = new(fk[fKinks->GetEntriesFast()]) AliESDkink(*c);
675 kink->SetID(fKinks->GetEntriesFast()); // CKB different from the other imps..
676 return fKinks->GetEntriesFast()-1;
680 void AliESDEvent::AddCascade(const AliESDcascade *c)
682 TClonesArray &fc = *fCascades;
683 new(fc[fCascades->GetEntriesFast()]) AliESDcascade(*c);
687 Int_t AliESDEvent::AddCaloCluster(const AliESDCaloCluster *c)
690 TClonesArray &fc = *fCaloClusters;
691 AliESDCaloCluster *clus = new(fc[fCaloClusters->GetEntriesFast()]) AliESDCaloCluster(*c);
692 clus->SetID(fCaloClusters->GetEntriesFast()-1);
693 return fCaloClusters->GetEntriesFast()-1;
697 void AliESDEvent::AddRawDataErrorLog(const AliRawDataErrorLog *log) {
698 TClonesArray &errlogs = *fErrorLogs;
699 new(errlogs[errlogs.GetEntriesFast()]) AliRawDataErrorLog(*log);
702 void AliESDEvent::SetVertex(const AliESDVertex *vertex)
704 // Set the SPD vertex
705 // use already allocated space
707 *fSPDVertex = *vertex;
708 fSPDVertex->SetName(fgkESDListName[kSPDVertex]);
712 void AliESDEvent::SetPrimaryVertex(const AliESDVertex *vertex)
714 // Set the primary vertex
715 // use already allocated space
717 *fPrimaryVertex = *vertex;
718 fPrimaryVertex->SetName(fgkESDListName[kPrimaryVertex]);
722 void AliESDEvent::SetMultiplicity(const AliMultiplicity *mul)
724 // Set the SPD Multiplicity
731 void AliESDEvent::SetFMDData(AliESDFMD * obj)
733 // use already allocated space
739 void AliESDEvent::SetVZEROData(AliESDVZERO * obj)
741 // use already allocated space
746 void AliESDEvent::GetESDfriend(AliESDfriend *ev) const
749 // Extracts the complementary info from the ESD
753 Int_t ntrk=GetNumberOfTracks();
755 for (Int_t i=0; i<ntrk; i++) {
756 AliESDtrack *t=GetTrack(i);
757 const AliESDfriendTrack *f=t->GetFriendTrack();
760 t->ReleaseESDfriendTrack();// Not to have two copies of "friendTrack"
766 void AliESDEvent::AddObject(TObject* obj)
768 // Add an object to the list of object.
769 // Please be aware that in order to increase performance you should
770 // refrain from using TObjArrays (if possible). Use TClonesArrays, instead.
771 fESDObjects->SetOwner(kTRUE);
772 fESDObjects->AddLast(obj);
776 void AliESDEvent::GetStdContent()
778 // set pointers for standard content
779 // get by name much safer and not a big overhead since not called very often
781 fESDRun = (AliESDRun*)fESDObjects->FindObject(fgkESDListName[kESDRun]);
782 fHeader = (AliESDHeader*)fESDObjects->FindObject(fgkESDListName[kHeader]);
783 fESDZDC = (AliESDZDC*)fESDObjects->FindObject(fgkESDListName[kESDZDC]);
784 fESDFMD = (AliESDFMD*)fESDObjects->FindObject(fgkESDListName[kESDFMD]);
785 fESDVZERO = (AliESDVZERO*)fESDObjects->FindObject(fgkESDListName[kESDVZERO]);
786 fESDTZERO = (AliESDTZERO*)fESDObjects->FindObject(fgkESDListName[kESDTZERO]);
787 fSPDVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kSPDVertex]);
788 fPrimaryVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kPrimaryVertex]);
789 fSPDMult = (AliMultiplicity*)fESDObjects->FindObject(fgkESDListName[kSPDMult]);
790 fPHOSTrigger = (AliESDCaloTrigger*)fESDObjects->FindObject(fgkESDListName[kPHOSTrigger]);
791 fEMCALTrigger = (AliESDCaloTrigger*)fESDObjects->FindObject(fgkESDListName[kEMCALTrigger]);
792 fTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTracks]);
793 fMuonTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kMuonTracks]);
794 fPmdTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kPmdTracks]);
795 fTrdTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTrdTracks]);
796 fV0s = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kV0s]);
797 fCascades = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kCascades]);
798 fKinks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kKinks]);
799 fCaloClusters = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kCaloClusters]);
800 fErrorLogs = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kErrorLogs]);
804 void AliESDEvent::SetStdNames(){
805 // Set the names of the standard contents
807 if(fESDObjects->GetEntries()==kESDListN){
808 for(int i = 0;i < fESDObjects->GetEntries();i++){
809 TObject *fObj = fESDObjects->At(i);
810 if(fObj->InheritsFrom("TNamed")){
811 ((TNamed*)fObj)->SetName(fgkESDListName[i]);
813 else if(fObj->InheritsFrom("TClonesArray")){
814 ((TClonesArray*)fObj)->SetName(fgkESDListName[i]);
819 printf("%s:%d SetStdNames() Wrong number of Std Entries \n",(char*)__FILE__,__LINE__);
823 void AliESDEvent::CreateStdContent()
825 // create the standard AOD content and set pointers
827 // create standard objects and add them to the TList of objects
828 AddObject(new AliESDRun());
829 AddObject(new AliESDHeader());
830 AddObject(new AliESDZDC());
831 AddObject(new AliESDFMD());
832 AddObject(new AliESDVZERO());
833 AddObject(new AliESDTZERO());
834 AddObject(new AliESDVertex());
835 AddObject(new AliESDVertex());
836 AddObject(new AliMultiplicity());
837 AddObject(new AliESDCaloTrigger());
838 AddObject(new AliESDCaloTrigger());
839 AddObject(new TClonesArray("AliESDtrack",0));
840 AddObject(new TClonesArray("AliESDMuonTrack",0));
841 AddObject(new TClonesArray("AliESDPmdTrack",0));
842 AddObject(new TClonesArray("AliESDTrdTrack",0));
843 AddObject(new TClonesArray("AliESDv0",0));
844 AddObject(new TClonesArray("AliESDcascade",0));
845 AddObject(new TClonesArray("AliESDkink",0));
846 AddObject(new TClonesArray("AliESDCaloCluster",0));
847 AddObject(new TClonesArray("AliRawDataErrorLog",0));
849 // check the order of the indices against enum...
853 // read back pointers
857 TObject* AliESDEvent::FindListObject(const char *name){
858 if(fESDObjects)return fESDObjects->FindObject(name);
862 Int_t AliESDEvent::GetPHOSClusters(TRefArray *clusters) const
864 // fills the provided TRefArray with all found phos clusters
868 AliESDCaloCluster *cl = 0;
869 for (Int_t i = 0; i < GetNumberOfCaloClusters(); i++) {
871 if ( (cl = GetCaloCluster(i))) {
874 printf("IsPHOS %d Size: %d \n",i,clusters->GetEntriesFast());
878 return clusters->GetEntriesFast();
881 Int_t AliESDEvent::GetEMCALClusters(TRefArray *clusters) const
883 // fills the provided TRefArray with all found phos clusters
887 AliESDCaloCluster *cl = 0;
888 for (Int_t i = 0; i < GetNumberOfCaloClusters(); i++) {
890 if ( (cl = GetCaloCluster(i))) {
893 printf("IsEMCAL %d Size: %d \n",i,clusters->GetEntriesFast());
897 return clusters->GetEntriesFast();
901 void AliESDEvent::ReadFromTree(TTree *tree){
904 Printf("%s %d AliESDEvent::ReadFromTree() Zero Pointer to Tree \n",(char*)__FILE__,__LINE__);
909 if(!tree->GetTree())tree->LoadTree(0);
911 // if we find the "ESD" branch on the tree we do have the old structure
912 if(tree->GetBranch("ESD")) {
913 char ** address = (char **)(tree->GetBranch("ESD")->GetAddress());
914 // do we have the friend branch
915 TBranch * esdFB = tree->GetBranch("ESDfriend.");
916 char ** addressF = 0;
917 if(esdFB)addressF = (char **)(esdFB->GetAddress());
919 printf("%s %d AliESDEvent::ReadFromTree() Reading old Tree \n",(char*)__FILE__,__LINE__);
920 tree->SetBranchAddress("ESD", &fESDOld);
922 tree->SetBranchAddress("ESDfriend.",&fESDFriendOld);
925 printf("%s %d AliESDEvent::ReadFromTree() Reading old Tree \n",(char*)__FILE__,__LINE__);
926 printf("%s %d Branch already connected. Using existing branch address. \n",(char*)__FILE__,__LINE__);
927 fESDOld = (AliESD*) (*address);
928 // addressF can still be 0, since branch needs to switched on
929 if(addressF)fESDFriendOld = (AliESDfriend*) (*addressF);
932 // have already connected the old ESD structure... ?
933 // reuse also the pointer of the AlliESDEvent
934 // otherwise create new ones
936 TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("ESDObjectsConnectedToTree"));
939 // If connected use the connected list of objects
940 if(fESDObjects!= connectedList){
941 // protect when called twice
942 fESDObjects->Delete();
943 fESDObjects = connectedList;
947 // The pointer to the friend changes when called twice via InitIO. Is this connected to
948 // the change TChain -> TTree
950 TObject* oldf = FindListObject("AliESDfriend");
953 newf = (TObject*)*addressF;
955 if(newf!=0&&oldf!=newf){
956 // remove the old reference
957 // Should we also delete it? Or is this handled in TTree I/O
958 // since it is created by the first SetBranchAddress
959 fESDObjects->Remove(oldf);
961 fESDObjects->Add(newf);
968 CreateStdContent(); // create for copy
969 // if we have the esdfriend add it, so we always can access it via the userinfo
970 if(fESDFriendOld)AddObject(fESDFriendOld);
971 // we are not owner of the list objects
972 // must not delete it
973 fESDObjects->SetOwner(kFALSE);
974 fESDObjects->SetName("ESDObjectsConnectedToTree");
975 tree->GetUserInfo()->Add(fESDObjects);
982 // Try to find AliESDEvent
983 AliESDEvent *esdEvent = 0;
984 esdEvent = (AliESDEvent*)tree->GetTree()->GetUserInfo()->FindObject("AliESDEvent");
986 // Check if already connected to tree
987 TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("ESDObjectsConnectedToTree"));
989 // If connected use the connected list if objects
990 fESDObjects->Delete();
991 fESDObjects = connectedList;
997 // prevent a memory leak when reading back the TList
1000 // create a new TList from the UserInfo TList...
1001 // copy constructor does not work...
1002 fESDObjects = (TList*)(esdEvent->GetList()->Clone());
1003 fESDObjects->SetOwner(kFALSE);
1004 if(fESDObjects->GetEntries()<kESDListN){
1005 printf("%s %d AliESDEvent::ReadFromTree() TList contains less than the standard contents %d < %d \n",
1006 (char*)__FILE__,__LINE__,fESDObjects->GetEntries(),kESDListN);
1008 // set the branch addresses
1009 TIter next(fESDObjects);
1011 while((el=(TNamed*)next())){
1012 TString bname(el->GetName());
1013 if(bname.CompareTo("AliESDfriend")==0)
1015 // AliESDfriend does not have a name ...
1016 tree->SetBranchAddress("ESDfriend.",fESDObjects->GetObjectRef(el));
1019 tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));
1023 // when reading back we are not owner of the list
1024 // must not delete it
1025 fESDObjects->SetOwner(kFALSE);
1026 fESDObjects->SetName("ESDObjectsConnectedToTree");
1027 // we are not owner of the list objects
1028 // must not delete it
1029 tree->GetUserInfo()->Add(fESDObjects);
1033 // we can't get the list from the user data, create standard content
1034 // and set it by hand (no ESDfriend at the moment
1036 TIter next(fESDObjects);
1038 while((el=(TNamed*)next())){
1039 TString bname(el->GetName());
1040 tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));
1043 // when reading back we are not owner of the list
1044 // must not delete it
1045 fESDObjects->SetOwner(kFALSE);
1050 void AliESDEvent::CopyFromOldESD()
1052 // Method which copies over everthing from the old esd structure to the
1057 SetRunNumber(fESDOld->GetRunNumber());
1058 SetPeriodNumber(fESDOld->GetPeriodNumber());
1059 SetMagneticField(fESDOld->GetMagneticField());
1061 // leave out diamond ...
1062 // SetDiamond(const AliESDVertex *vertex) { fESDRun->SetDiamond(vertex);}
1065 SetTriggerMask(fESDOld->GetTriggerMask());
1066 SetOrbitNumber(fESDOld->GetOrbitNumber());
1067 SetTimeStamp(fESDOld->GetTimeStamp());
1068 SetEventType(fESDOld->GetEventType());
1069 SetEventNumberInFile(fESDOld->GetEventNumberInFile());
1070 SetBunchCrossNumber(fESDOld->GetBunchCrossNumber());
1071 SetTriggerCluster(fESDOld->GetTriggerCluster());
1075 SetZDC(fESDOld->GetZDCN1Energy(),
1076 fESDOld->GetZDCP1Energy(),
1077 fESDOld->GetZDCEMEnergy(),
1079 fESDOld->GetZDCN2Energy(),
1080 fESDOld->GetZDCP2Energy(),
1081 fESDOld->GetZDCParticipants());
1085 if(fESDOld->GetFMDData())SetFMDData(fESDOld->GetFMDData());
1089 SetT0zVertex(fESDOld->GetT0zVertex());
1090 SetT0(fESDOld->GetT0());
1094 if (fESDOld->GetVZEROData()) SetVZEROData(fESDOld->GetVZEROData());
1096 if(fESDOld->GetVertex())SetVertex(fESDOld->GetVertex());
1098 if(fESDOld->GetPrimaryVertex())SetPrimaryVertex(fESDOld->GetPrimaryVertex());
1100 if(fESDOld->GetMultiplicity())SetMultiplicity(fESDOld->GetMultiplicity());
1102 for(int i = 0;i<fESDOld->GetNumberOfTracks();i++){
1103 AddTrack(fESDOld->GetTrack(i));
1106 for(int i = 0;i<fESDOld->GetNumberOfMuonTracks();i++){
1107 AddMuonTrack(fESDOld->GetMuonTrack(i));
1110 for(int i = 0;i<fESDOld->GetNumberOfPmdTracks();i++){
1111 AddPmdTrack(fESDOld->GetPmdTrack(i));
1114 for(int i = 0;i<fESDOld->GetNumberOfTrdTracks();i++){
1115 AddTrdTrack(fESDOld->GetTrdTrack(i));
1118 for(int i = 0;i<fESDOld->GetNumberOfV0s();i++){
1119 AddV0(fESDOld->GetV0(i));
1122 for(int i = 0;i<fESDOld->GetNumberOfCascades();i++){
1123 AddCascade(fESDOld->GetCascade(i));
1126 for(int i = 0;i<fESDOld->GetNumberOfKinks();i++){
1127 AddKink(fESDOld->GetKink(i));
1131 for(int i = 0;i<fESDOld->GetNumberOfCaloClusters();i++){
1132 AddCaloCluster(fESDOld->GetCaloCluster(i));