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"
57 #include "AliESDCaloCells.h"
59 #include "AliESDFMD.h"
60 #include "AliESDVZERO.h"
61 #include "AliMultiplicity.h"
62 #include "AliRawDataErrorLog.h"
69 // here we define the names, some classes are no TNamed, therefore the classnames
71 const char* AliESDEvent::fgkESDListName[kESDListN] = {"AliESDRun",
92 "AliRawDataErrorLogs"};
93 //______________________________________________________________________________
94 AliESDEvent::AliESDEvent():
96 fESDObjects(new TList()),
116 fEMCALCells(0), fPHOSCells(0),
122 fFirstEMCALCluster(-1),
124 fFirstPHOSCluster(-1)
127 //______________________________________________________________________________
128 AliESDEvent::AliESDEvent(const AliESDEvent& esd):
130 fESDObjects(new TList()),
131 fESDRun(new AliESDRun(*esd.fESDRun)),
132 fHeader(new AliESDHeader(*esd.fHeader)),
133 fESDZDC(new AliESDZDC(*esd.fESDZDC)),
134 fESDFMD(new AliESDFMD(*esd.fESDFMD)),
135 fESDVZERO(new AliESDVZERO(*esd.fESDVZERO)),
136 fESDTZERO(new AliESDTZERO(*esd.fESDTZERO)),
137 fSPDVertex(new AliESDVertex(*esd.fSPDVertex)),
138 fPrimaryVertex(new AliESDVertex(*esd.fPrimaryVertex)),
139 fSPDMult(new AliMultiplicity(*esd.fSPDMult)),
140 fPHOSTrigger(new AliESDCaloTrigger(*esd.fPHOSTrigger)),
141 fEMCALTrigger(new AliESDCaloTrigger(*esd.fEMCALTrigger)),
142 fTracks(new TClonesArray(*esd.fTracks)),
143 fMuonTracks(new TClonesArray(*esd.fMuonTracks)),
144 fPmdTracks(new TClonesArray(*esd.fPmdTracks)),
145 fTrdTracks(new TClonesArray(*esd.fTrdTracks)),
146 fV0s(new TClonesArray(*esd.fV0s)),
147 fCascades(new TClonesArray(*esd.fCascades)),
148 fKinks(new TClonesArray(*esd.fKinks)),
149 fCaloClusters(new TClonesArray(*esd.fCaloClusters)),
150 fEMCALCells(new AliESDCaloCells(*esd.fEMCALCells)),
151 fPHOSCells(new AliESDCaloCells(*esd.fPHOSCells)),
152 fErrorLogs(new TClonesArray(*esd.fErrorLogs)),
153 fESDOld(new AliESD(*esd.fESDOld)),
154 fESDFriendOld(new AliESDfriend(*esd.fESDFriendOld)),
155 fConnected(esd.fConnected),
156 fEMCALClusters(esd.fEMCALClusters),
157 fFirstEMCALCluster(esd.fFirstEMCALCluster),
158 fPHOSClusters(esd.fPHOSClusters),
159 fFirstPHOSCluster(esd.fFirstPHOSCluster)
162 // CKB init in the constructor list and only add here ...
167 AddObject(fESDVZERO);
168 AddObject(fESDTZERO);
169 AddObject(fSPDVertex);
170 AddObject(fPrimaryVertex);
172 AddObject(fPHOSTrigger);
173 AddObject(fEMCALTrigger);
175 AddObject(fMuonTracks);
176 AddObject(fPmdTracks);
177 AddObject(fTrdTracks);
179 AddObject(fCascades);
181 AddObject(fCaloClusters);
182 AddObject(fEMCALCells);
183 AddObject(fPHOSCells);
184 AddObject(fErrorLogs);
190 //______________________________________________________________________________
191 AliESDEvent & AliESDEvent::operator=(const AliESDEvent& source) {
193 // Assignment operator
195 if(&source == this) return *this;
196 AliVEvent::operator=(source);
198 fESDRun = new AliESDRun(*source.fESDRun);
199 fHeader = new AliESDHeader(*source.fHeader);
200 fESDZDC = new AliESDZDC(*source.fESDZDC);
201 fESDFMD = new AliESDFMD(*source.fESDFMD);
202 fESDVZERO = new AliESDVZERO(*source.fESDVZERO);
203 fESDTZERO = new AliESDTZERO(*source.fESDTZERO);
204 fSPDVertex = new AliESDVertex(*source.fSPDVertex);
205 fPrimaryVertex = new AliESDVertex(*source.fPrimaryVertex);
206 fSPDMult = new AliMultiplicity(*source.fSPDMult);
207 fPHOSTrigger = new AliESDCaloTrigger(*source.fPHOSTrigger);
208 fEMCALTrigger = new AliESDCaloTrigger(*source.fEMCALTrigger);
209 fTracks = new TClonesArray(*source.fTracks);
210 fMuonTracks = new TClonesArray(*source.fMuonTracks);
211 fPmdTracks = new TClonesArray(*source.fPmdTracks);
212 fTrdTracks = new TClonesArray(*source.fTrdTracks);
213 fV0s = new TClonesArray(*source.fV0s);
214 fCascades = new TClonesArray(*source.fCascades);
215 fKinks = new TClonesArray(*source.fKinks);
216 fCaloClusters = new TClonesArray(*source.fCaloClusters);
217 fEMCALCells = new AliESDCaloCells(*source.fEMCALCells);
218 fPHOSCells = new AliESDCaloCells(*source.fPHOSCells);
219 fErrorLogs = new TClonesArray(*source.fErrorLogs);
220 fESDOld = new AliESD(*source.fESDOld);
221 fESDFriendOld = new AliESDfriend(*source.fESDFriendOld);
223 // or AddObject( fESDZDC = new AliESDZDC(*source.fESDZDC));
225 fESDObjects = new TList();
230 AddObject(fESDVZERO);
231 AddObject(fESDTZERO);
232 AddObject(fSPDVertex);
233 AddObject(fPrimaryVertex);
235 AddObject(fPHOSTrigger);
236 AddObject(fEMCALTrigger);
238 AddObject(fMuonTracks);
239 AddObject(fPmdTracks);
240 AddObject(fTrdTracks);
242 AddObject(fCascades);
244 AddObject(fCaloClusters);
245 AddObject(fEMCALCells);
246 AddObject(fPHOSCells);
247 AddObject(fErrorLogs);
249 fConnected = source.fConnected;
250 fEMCALClusters = source.fEMCALClusters;
251 fFirstEMCALCluster = source.fFirstEMCALCluster;
252 fPHOSClusters = source.fPHOSClusters;
253 fFirstPHOSCluster = source.fFirstPHOSCluster;
262 //______________________________________________________________________________
263 AliESDEvent::~AliESDEvent()
266 // Standard destructor
269 // everthing on the list gets deleted automatically
272 if(fESDObjects&&!fConnected)
281 //______________________________________________________________________________
282 void AliESDEvent::Reset()
286 // Reset the standard contents
288 if(fESDOld)fESDOld->Reset();
289 // reset for the friends...
291 fESDFriendOld->~AliESDfriend();
292 new (fESDFriendOld) AliESDfriend();
294 // for new data we have to fetch the Pointer from the list
295 AliESDfriend *fr = (AliESDfriend*)FindListObject("AliESDfriend");
297 // delete the content
299 // make a new valid ESDfriend at the same place
300 new (fr) AliESDfriend();
303 // call reset for user supplied data?
306 void AliESDEvent::ResetStdContent()
308 // Reset the standard contents
309 if(fESDRun) fESDRun->Reset();
310 if(fHeader) fHeader->Reset();
311 if(fESDZDC) fESDZDC->Reset();
312 if(fESDFMD) fESDFMD->Clear(); // why clear.... need consistend names
314 // reset by callin d'to /c'tor keep the pointer
315 fESDVZERO->~AliESDVZERO();
316 new (fESDVZERO) AliESDVZERO();
318 if(fESDTZERO) fESDTZERO->Reset();
319 // CKB no clear/reset implemented
321 fSPDVertex->~AliESDVertex();
322 new (fSPDVertex) AliESDVertex();
323 fSPDVertex->SetName(fgkESDListName[kSPDVertex]);
326 fPrimaryVertex->~AliESDVertex();
327 new (fPrimaryVertex) AliESDVertex();
328 fPrimaryVertex->SetName(fgkESDListName[kPrimaryVertex]);
331 fSPDMult->~AliMultiplicity();
332 new (fSPDMult) AliMultiplicity();
334 if(fPHOSTrigger)fPHOSTrigger->Reset();
335 if(fEMCALTrigger)fEMCALTrigger->Reset();
336 if(fTracks)fTracks->Delete();
337 if(fMuonTracks)fMuonTracks->Delete();
338 if(fPmdTracks)fPmdTracks->Delete();
339 if(fTrdTracks)fTrdTracks->Delete();
340 if(fV0s)fV0s->Delete();
341 if(fCascades)fCascades->Delete();
342 if(fKinks)fKinks->Delete();
343 if(fCaloClusters)fCaloClusters->Delete();
344 if(fPHOSCells)fPHOSCells->DeleteContainer();
345 if(fEMCALCells)fEMCALCells->DeleteContainer();
346 if(fErrorLogs) fErrorLogs->Delete();
348 // don't reset fconnected fConnected and the list
351 fFirstEMCALCluster=-1;
353 fFirstPHOSCluster=-1;
357 Int_t AliESDEvent::AddV0(const AliESDv0 *v) {
361 TClonesArray &fv = *fV0s;
362 Int_t idx=fV0s->GetEntriesFast();
363 new(fv[idx]) AliESDv0(*v);
367 //______________________________________________________________________________
368 void AliESDEvent::Print(Option_t *) const
371 // Print header information of the event
373 printf("ESD run information\n");
374 printf("Event # in file %d Bunch crossing # %d Orbit # %d Period # %d Run # %d Trigger %lld Magnetic field %f \n",
375 GetEventNumberInFile(),
376 GetBunchCrossNumber(),
381 GetMagneticField() );
382 printf("Vertex: (%.4f +- %.4f, %.4f +- %.4f, %.4f +- %.4f) cm\n",
383 fPrimaryVertex->GetXv(), fPrimaryVertex->GetXRes(),
384 fPrimaryVertex->GetYv(), fPrimaryVertex->GetYRes(),
385 fPrimaryVertex->GetZv(), fPrimaryVertex->GetZRes());
386 printf("Mean vertex in RUN: X=%.4f Y=%.4f cm\n",
387 GetDiamondX(),GetDiamondY());
388 printf("SPD Multiplicity. Number of tracklets %d \n",
389 fSPDMult->GetNumberOfTracklets());
390 printf("Number of tracks: \n");
391 printf(" charged %d\n", GetNumberOfTracks());
392 printf(" muon %d\n", GetNumberOfMuonTracks());
393 printf(" pmd %d\n", GetNumberOfPmdTracks());
394 printf(" trd %d\n", GetNumberOfTrdTracks());
395 printf(" v0 %d\n", GetNumberOfV0s());
396 printf(" cascades %d\n", GetNumberOfCascades());
397 printf(" kinks %d\n", GetNumberOfKinks());
398 printf(" PHOSCells %d\n", fPHOSCells->GetNumberOfCells());
399 printf(" EMCALCells %d\n", fEMCALCells->GetNumberOfCells());
400 printf(" CaloClusters %d\n", GetNumberOfCaloClusters());
401 printf(" phos %d\n", GetNumberOfPHOSClusters());
402 printf(" emcal %d\n", GetNumberOfEMCALClusters());
403 printf(" FMD %s\n", (fESDFMD ? "yes" : "no"));
404 printf(" VZERO %s\n", (fESDVZERO ? "yes" : "no"));
409 void AliESDEvent::SetESDfriend(const AliESDfriend *ev) {
411 // Attaches the complementary info to the ESD
415 // to be sure that we set the tracks also
416 // in case of old esds
417 // if(fESDOld)CopyFromOldESD();
419 Int_t ntrk=ev->GetNumberOfTracks();
421 for (Int_t i=0; i<ntrk; i++) {
422 const AliESDfriendTrack *f=ev->GetTrack(i);
423 GetTrack(i)->SetFriendTrack(f);
427 Bool_t AliESDEvent::RemoveKink(Int_t rm) {
428 // ---------------------------------------------------------
429 // Remove a kink candidate and references to it from ESD,
430 // if this candidate does not come from a reconstructed decay
431 // Not yet implemented...
432 // ---------------------------------------------------------
433 Int_t last=GetNumberOfKinks()-1;
434 if ((rm<0)||(rm>last)) return kFALSE;
439 Bool_t AliESDEvent::RemoveV0(Int_t rm) {
440 // ---------------------------------------------------------
441 // Remove a V0 candidate and references to it from ESD,
442 // if this candidate does not come from a reconstructed decay
443 // ---------------------------------------------------------
444 Int_t last=GetNumberOfV0s()-1;
445 if ((rm<0)||(rm>last)) return kFALSE;
447 AliESDv0 *v0=GetV0(rm);
448 Int_t idxP=v0->GetPindex(), idxN=v0->GetNindex();
451 Int_t lastIdxP=v0->GetPindex(), lastIdxN=v0->GetNindex();
455 // Check if this V0 comes from a reconstructed decay
456 Int_t ncs=GetNumberOfCascades();
457 for (Int_t n=0; n<ncs; n++) {
458 AliESDcascade *cs=GetCascade(n);
460 Int_t csIdxP=cs->GetPindex();
461 Int_t csIdxN=cs->GetNindex();
464 if (idxN==csIdxN) return kFALSE;
466 if (csIdxP==lastIdxP)
467 if (csIdxN==lastIdxN) used++;
470 //Replace the removed V0 with the last V0
471 TClonesArray &a=*fV0s;
472 delete a.RemoveAt(rm);
474 if (rm==last) return kTRUE;
476 //v0 is pointing to the last V0 candidate...
477 new (a[rm]) AliESDv0(*v0);
478 delete a.RemoveAt(last);
480 if (!used) return kTRUE;
483 // Remap the indices of the daughters of reconstructed decays
484 for (Int_t n=0; n<ncs; n++) {
485 AliESDcascade *cs=GetCascade(n);
488 Int_t csIdxP=cs->GetPindex();
489 Int_t csIdxN=cs->GetNindex();
491 if (csIdxP==lastIdxP)
492 if (csIdxN==lastIdxN) {
493 cs->AliESDv0::SetIndex(1,idxP);
494 cs->AliESDv0::SetIndex(0,idxN);
496 if (!used) return kTRUE;
503 Bool_t AliESDEvent::RemoveTrack(Int_t rm) {
504 // ---------------------------------------------------------
505 // Remove a track and references to it from ESD,
506 // if this track does not come from a reconstructed decay
507 // ---------------------------------------------------------
508 Int_t last=GetNumberOfTracks()-1;
509 if ((rm<0)||(rm>last)) return kFALSE;
513 // Check if this track comes from a reconstructed decay
514 Int_t nv0=GetNumberOfV0s();
515 for (Int_t n=0; n<nv0; n++) {
516 AliESDv0 *v0=GetV0(n);
518 Int_t idx=v0->GetNindex();
519 if (rm==idx) return kFALSE;
520 if (idx==last) used++;
523 if (rm==idx) return kFALSE;
524 if (idx==last) used++;
527 Int_t ncs=GetNumberOfCascades();
528 for (Int_t n=0; n<ncs; n++) {
529 AliESDcascade *cs=GetCascade(n);
531 Int_t idx=cs->GetIndex();
532 if (rm==idx) return kFALSE;
533 if (idx==last) used++;
536 Int_t nkn=GetNumberOfKinks();
537 for (Int_t n=0; n<nkn; n++) {
538 AliESDkink *kn=GetKink(n);
540 Int_t idx=kn->GetIndex(0);
541 if (rm==idx) return kFALSE;
542 if (idx==last) used++;
545 if (rm==idx) return kFALSE;
546 if (idx==last) used++;
550 //Replace the removed track with the last track
551 TClonesArray &a=*fTracks;
552 delete a.RemoveAt(rm);
554 if (rm==last) return kTRUE;
556 AliESDtrack *t=GetTrack(last);
558 new (a[rm]) AliESDtrack(*t);
559 delete a.RemoveAt(last);
561 if (!used) return kTRUE;
564 // Remap the indices of the daughters of reconstructed decays
565 for (Int_t n=0; n<nv0; n++) {
566 AliESDv0 *v0=GetV0(n);
567 if (v0->GetIndex(0)==last) {
570 if (!used) return kTRUE;
572 if (v0->GetIndex(1)==last) {
575 if (!used) return kTRUE;
579 for (Int_t n=0; n<ncs; n++) {
580 AliESDcascade *cs=GetCascade(n);
581 if (cs->GetIndex()==last) {
584 if (!used) return kTRUE;
588 for (Int_t n=0; n<nkn; n++) {
589 AliESDkink *kn=GetKink(n);
590 if (kn->GetIndex(0)==last) {
593 if (!used) return kTRUE;
595 if (kn->GetIndex(1)==last) {
598 if (!used) return kTRUE;
606 Bool_t AliESDEvent::Clean(Float_t *cleanPars) {
608 // Remove the data which are not needed for the physics analysis.
610 // 1) Cleaning the V0 candidates
611 // ---------------------------
612 // If the cosine of the V0 pointing angle "csp" and
613 // the DCA between the daughter tracks "dca" does not satisfy
616 // csp > cleanPars[1] + dca/cleanPars[0]*(1.- cleanPars[1])
618 // an attempt to remove this V0 candidate from ESD is made.
620 // The V0 candidate gets removed if it does not belong to any
621 // recosntructed cascade decay
623 // 12.11.2007, optimal values: cleanPars[0]=0.5, cleanPars[1]=0.999
625 // 2) Cleaning the tracks
626 // ----------------------
627 // If track's transverse parameter is larger than cleanPars[2]
629 // track's longitudinal parameter is larger than cleanPars[3]
630 // an attempt to remove this track from ESD is made.
632 // The track gets removed if it does not come
633 // from a reconstructed decay
637 Float_t dcaMax=cleanPars[0];
638 Float_t cspMin=cleanPars[1];
640 Int_t nV0s=GetNumberOfV0s();
641 for (Int_t i=nV0s-1; i>=0; i--) {
642 AliESDv0 *v0=GetV0(i);
644 Float_t dca=v0->GetDcaV0Daughters();
645 Float_t csp=v0->GetV0CosineOfPointingAngle();
646 Float_t cspcut=cspMin + dca/dcaMax*(1.-cspMin);
647 if (csp > cspcut) continue;
649 if (RemoveV0(i)) rc=kTRUE;
653 Float_t dmax=cleanPars[2], zmax=cleanPars[3];
655 const AliESDVertex *vertex=GetVertex();
656 Bool_t vtxOK=vertex->GetStatus();
658 Int_t nTracks=GetNumberOfTracks();
659 for (Int_t i=nTracks-1; i>=0; i--) {
660 AliESDtrack *track=GetTrack(i);
661 Float_t xy,z; track->GetImpactParameters(xy,z);
662 if ((TMath::Abs(xy) > dmax) || (vtxOK && (TMath::Abs(z) > zmax))) {
663 if (RemoveTrack(i)) rc=kTRUE;
670 Int_t AliESDEvent::AddTrack(const AliESDtrack *t)
673 TClonesArray &ftr = *fTracks;
674 AliESDtrack * track = new(ftr[fTracks->GetEntriesFast()])AliESDtrack(*t);
675 track->SetID(fTracks->GetEntriesFast()-1);
676 return track->GetID();
679 void AliESDEvent::AddMuonTrack(const AliESDMuonTrack *t)
681 TClonesArray &fmu = *fMuonTracks;
682 new(fmu[fMuonTracks->GetEntriesFast()]) AliESDMuonTrack(*t);
685 void AliESDEvent::AddPmdTrack(const AliESDPmdTrack *t)
687 TClonesArray &fpmd = *fPmdTracks;
688 new(fpmd[fPmdTracks->GetEntriesFast()]) AliESDPmdTrack(*t);
691 void AliESDEvent::AddTrdTrack(const AliESDTrdTrack *t)
693 TClonesArray &ftrd = *fTrdTracks;
694 new(ftrd[fTrdTracks->GetEntriesFast()]) AliESDTrdTrack(*t);
700 Int_t AliESDEvent::AddKink(const AliESDkink *c)
703 TClonesArray &fk = *fKinks;
704 AliESDkink * kink = new(fk[fKinks->GetEntriesFast()]) AliESDkink(*c);
705 kink->SetID(fKinks->GetEntriesFast()); // CKB different from the other imps..
706 return fKinks->GetEntriesFast()-1;
710 void AliESDEvent::AddCascade(const AliESDcascade *c)
712 TClonesArray &fc = *fCascades;
713 new(fc[fCascades->GetEntriesFast()]) AliESDcascade(*c);
717 Int_t AliESDEvent::AddCaloCluster(const AliESDCaloCluster *c)
720 TClonesArray &fc = *fCaloClusters;
721 AliESDCaloCluster *clus = new(fc[fCaloClusters->GetEntriesFast()]) AliESDCaloCluster(*c);
722 clus->SetID(fCaloClusters->GetEntriesFast()-1);
723 return fCaloClusters->GetEntriesFast()-1;
727 void AliESDEvent::AddRawDataErrorLog(const AliRawDataErrorLog *log) {
728 TClonesArray &errlogs = *fErrorLogs;
729 new(errlogs[errlogs.GetEntriesFast()]) AliRawDataErrorLog(*log);
732 void AliESDEvent::SetVertex(const AliESDVertex *vertex)
734 // Set the SPD vertex
735 // use already allocated space
737 *fSPDVertex = *vertex;
738 fSPDVertex->SetName(fgkESDListName[kSPDVertex]);
742 void AliESDEvent::SetPrimaryVertex(const AliESDVertex *vertex)
744 // Set the primary vertex
745 // use already allocated space
747 *fPrimaryVertex = *vertex;
748 fPrimaryVertex->SetName(fgkESDListName[kPrimaryVertex]);
752 void AliESDEvent::SetMultiplicity(const AliMultiplicity *mul)
754 // Set the SPD Multiplicity
761 void AliESDEvent::SetFMDData(AliESDFMD * obj)
763 // use already allocated space
769 void AliESDEvent::SetVZEROData(AliESDVZERO * obj)
771 // use already allocated space
776 void AliESDEvent::GetESDfriend(AliESDfriend *ev) const
779 // Extracts the complementary info from the ESD
783 Int_t ntrk=GetNumberOfTracks();
785 for (Int_t i=0; i<ntrk; i++) {
786 AliESDtrack *t=GetTrack(i);
787 const AliESDfriendTrack *f=t->GetFriendTrack();
790 t->ReleaseESDfriendTrack();// Not to have two copies of "friendTrack"
796 void AliESDEvent::AddObject(TObject* obj)
798 // Add an object to the list of object.
799 // Please be aware that in order to increase performance you should
800 // refrain from using TObjArrays (if possible). Use TClonesArrays, instead.
801 fESDObjects->SetOwner(kTRUE);
802 fESDObjects->AddLast(obj);
806 void AliESDEvent::GetStdContent()
808 // set pointers for standard content
809 // get by name much safer and not a big overhead since not called very often
811 fESDRun = (AliESDRun*)fESDObjects->FindObject(fgkESDListName[kESDRun]);
812 fHeader = (AliESDHeader*)fESDObjects->FindObject(fgkESDListName[kHeader]);
813 fESDZDC = (AliESDZDC*)fESDObjects->FindObject(fgkESDListName[kESDZDC]);
814 fESDFMD = (AliESDFMD*)fESDObjects->FindObject(fgkESDListName[kESDFMD]);
815 fESDVZERO = (AliESDVZERO*)fESDObjects->FindObject(fgkESDListName[kESDVZERO]);
816 fESDTZERO = (AliESDTZERO*)fESDObjects->FindObject(fgkESDListName[kESDTZERO]);
817 fSPDVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kSPDVertex]);
818 fPrimaryVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kPrimaryVertex]);
819 fSPDMult = (AliMultiplicity*)fESDObjects->FindObject(fgkESDListName[kSPDMult]);
820 fPHOSTrigger = (AliESDCaloTrigger*)fESDObjects->FindObject(fgkESDListName[kPHOSTrigger]);
821 fEMCALTrigger = (AliESDCaloTrigger*)fESDObjects->FindObject(fgkESDListName[kEMCALTrigger]);
822 fTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTracks]);
823 fMuonTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kMuonTracks]);
824 fPmdTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kPmdTracks]);
825 fTrdTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTrdTracks]);
826 fV0s = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kV0s]);
827 fCascades = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kCascades]);
828 fKinks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kKinks]);
829 fCaloClusters = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kCaloClusters]);
830 fEMCALCells = (AliESDCaloCells*)fESDObjects->FindObject(fgkESDListName[kEMCALCells]);
831 fPHOSCells = (AliESDCaloCells*)fESDObjects->FindObject(fgkESDListName[kPHOSCells]);
832 fErrorLogs = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kErrorLogs]);
836 void AliESDEvent::SetStdNames(){
837 // Set the names of the standard contents
839 if(fESDObjects->GetEntries()==kESDListN){
840 for(int i = 0;i < fESDObjects->GetEntries();i++){
841 TObject *fObj = fESDObjects->At(i);
842 if(fObj->InheritsFrom("TNamed")){
843 ((TNamed*)fObj)->SetName(fgkESDListName[i]);
845 else if(fObj->InheritsFrom("TClonesArray")){
846 ((TClonesArray*)fObj)->SetName(fgkESDListName[i]);
851 printf("%s:%d SetStdNames() Wrong number of Std Entries \n",(char*)__FILE__,__LINE__);
855 void AliESDEvent::CreateStdContent()
857 // create the standard AOD content and set pointers
859 // create standard objects and add them to the TList of objects
860 AddObject(new AliESDRun());
861 AddObject(new AliESDHeader());
862 AddObject(new AliESDZDC());
863 AddObject(new AliESDFMD());
864 AddObject(new AliESDVZERO());
865 AddObject(new AliESDTZERO());
866 AddObject(new AliESDVertex());
867 AddObject(new AliESDVertex());
868 AddObject(new AliMultiplicity());
869 AddObject(new AliESDCaloTrigger());
870 AddObject(new AliESDCaloTrigger());
871 AddObject(new TClonesArray("AliESDtrack",0));
872 AddObject(new TClonesArray("AliESDMuonTrack",0));
873 AddObject(new TClonesArray("AliESDPmdTrack",0));
874 AddObject(new TClonesArray("AliESDTrdTrack",0));
875 AddObject(new TClonesArray("AliESDv0",0));
876 AddObject(new TClonesArray("AliESDcascade",0));
877 AddObject(new TClonesArray("AliESDkink",0));
878 AddObject(new TClonesArray("AliESDCaloCluster",0));
879 AddObject(new AliESDCaloCells());
880 AddObject(new AliESDCaloCells());
881 AddObject(new TClonesArray("AliRawDataErrorLog",0));
883 // check the order of the indices against enum...
887 // read back pointers
891 TObject* AliESDEvent::FindListObject(const char *name){
893 return fESDObjects->FindObject(name);
898 Int_t AliESDEvent::GetPHOSClusters(TRefArray *clusters) const
900 // fills the provided TRefArray with all found phos clusters
904 AliESDCaloCluster *cl = 0;
905 for (Int_t i = 0; i < GetNumberOfCaloClusters(); i++) {
907 if ( (cl = GetCaloCluster(i)) ) {
910 AliDebug(1,Form("IsPHOS cluster %d Size: %d \n",i,clusters->GetEntriesFast()));
914 return clusters->GetEntriesFast();
917 Int_t AliESDEvent::GetEMCALClusters(TRefArray *clusters) const
919 // fills the provided TRefArray with all found emcal clusters
923 AliESDCaloCluster *cl = 0;
924 for (Int_t i = 0; i < GetNumberOfCaloClusters(); i++) {
926 if ( (cl = GetCaloCluster(i)) ) {
929 AliDebug(1,Form("IsEMCAL cluster %d Size: %d \n",i,clusters->GetEntriesFast()));
933 return clusters->GetEntriesFast();
937 void AliESDEvent::ReadFromTree(TTree *tree){
940 Printf("%s %d AliESDEvent::ReadFromTree() Zero Pointer to Tree \n",(char*)__FILE__,__LINE__);
944 if(!tree->GetTree())tree->LoadTree(0);
946 // if we find the "ESD" branch on the tree we do have the old structure
947 if(tree->GetBranch("ESD")) {
948 char ** address = (char **)(tree->GetBranch("ESD")->GetAddress());
949 // do we have the friend branch
950 TBranch * esdFB = tree->GetBranch("ESDfriend.");
951 char ** addressF = 0;
952 if(esdFB)addressF = (char **)(esdFB->GetAddress());
954 printf("%s %d AliESDEvent::ReadFromTree() Reading old Tree \n",(char*)__FILE__,__LINE__);
955 tree->SetBranchAddress("ESD", &fESDOld);
957 tree->SetBranchAddress("ESDfriend.",&fESDFriendOld);
960 printf("%s %d AliESDEvent::ReadFromTree() Reading old Tree \n",(char*)__FILE__,__LINE__);
961 printf("%s %d Branch already connected. Using existing branch address. \n",(char*)__FILE__,__LINE__);
962 fESDOld = (AliESD*) (*address);
963 // addressF can still be 0, since branch needs to switched on
964 if(addressF)fESDFriendOld = (AliESDfriend*) (*addressF);
967 // have already connected the old ESD structure... ?
968 // reuse also the pointer of the AlliESDEvent
969 // otherwise create new ones
970 TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("ESDObjectsConnectedToTree"));
973 // If connected use the connected list of objects
974 if(fESDObjects!= connectedList){
975 // protect when called twice
976 fESDObjects->Delete();
977 fESDObjects = connectedList;
982 // The pointer to the friend changes when called twice via InitIO
983 // since AliESDEvent is deleted
984 TObject* oldf = FindListObject("AliESDfriend");
987 newf = (TObject*)*addressF;
989 if(newf!=0&&oldf!=newf){
990 // remove the old reference
991 // Should we also delete it? Or is this handled in TTree I/O
992 // since it is created by the first SetBranchAddress
993 fESDObjects->Remove(oldf);
995 fESDObjects->Add(newf);
1002 CreateStdContent(); // create for copy
1003 // if we have the esdfriend add it, so we always can access it via the userinfo
1004 if(fESDFriendOld)AddObject(fESDFriendOld);
1005 // we are not owner of the list objects
1006 // must not delete it
1007 fESDObjects->SetOwner(kFALSE);
1008 fESDObjects->SetName("ESDObjectsConnectedToTree");
1009 tree->GetUserInfo()->Add(fESDObjects);
1016 // Try to find AliESDEvent
1017 AliESDEvent *esdEvent = 0;
1018 esdEvent = (AliESDEvent*)tree->GetTree()->GetUserInfo()->FindObject("AliESDEvent");
1020 // Check if already connected to tree
1021 TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("ESDObjectsConnectedToTree"));
1022 if (connectedList) {
1023 // If connected use the connected list if objects
1024 fESDObjects->Delete();
1025 fESDObjects = connectedList;
1031 // prevent a memory leak when reading back the TList
1034 // create a new TList from the UserInfo TList...
1035 // copy constructor does not work...
1036 fESDObjects = (TList*)(esdEvent->GetList()->Clone());
1037 fESDObjects->SetOwner(kFALSE);
1038 if(fESDObjects->GetEntries()<kESDListN){
1039 printf("%s %d AliESDEvent::ReadFromTree() TList contains less than the standard contents %d < %d \n",
1040 (char*)__FILE__,__LINE__,fESDObjects->GetEntries(),kESDListN);
1042 // set the branch addresses
1043 TIter next(fESDObjects);
1045 while((el=(TNamed*)next())){
1046 TString bname(el->GetName());
1047 if(bname.CompareTo("AliESDfriend")==0)
1049 // AliESDfriend does not have a name ...
1050 tree->SetBranchAddress("ESDfriend.",fESDObjects->GetObjectRef(el));
1053 tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));
1057 // when reading back we are not owner of the list
1058 // must not delete it
1059 fESDObjects->SetOwner(kFALSE);
1060 fESDObjects->SetName("ESDObjectsConnectedToTree");
1061 // we are not owner of the list objects
1062 // must not delete it
1063 tree->GetUserInfo()->Add(fESDObjects);
1067 // we can't get the list from the user data, create standard content
1068 // and set it by hand (no ESDfriend at the moment
1070 TIter next(fESDObjects);
1072 while((el=(TNamed*)next())){
1073 TString bname(el->GetName());
1074 tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));
1077 // when reading back we are not owner of the list
1078 // must not delete it
1079 fESDObjects->SetOwner(kFALSE);
1084 void AliESDEvent::CopyFromOldESD()
1086 // Method which copies over everthing from the old esd structure to the
1091 SetRunNumber(fESDOld->GetRunNumber());
1092 SetPeriodNumber(fESDOld->GetPeriodNumber());
1093 SetMagneticField(fESDOld->GetMagneticField());
1095 // leave out diamond ...
1096 // SetDiamond(const AliESDVertex *vertex) { fESDRun->SetDiamond(vertex);}
1099 SetTriggerMask(fESDOld->GetTriggerMask());
1100 SetOrbitNumber(fESDOld->GetOrbitNumber());
1101 SetTimeStamp(fESDOld->GetTimeStamp());
1102 SetEventType(fESDOld->GetEventType());
1103 SetEventNumberInFile(fESDOld->GetEventNumberInFile());
1104 SetBunchCrossNumber(fESDOld->GetBunchCrossNumber());
1105 SetTriggerCluster(fESDOld->GetTriggerCluster());
1109 SetZDC(fESDOld->GetZDCN1Energy(),
1110 fESDOld->GetZDCP1Energy(),
1111 fESDOld->GetZDCEMEnergy(),
1113 fESDOld->GetZDCN2Energy(),
1114 fESDOld->GetZDCP2Energy(),
1115 fESDOld->GetZDCParticipants());
1119 if(fESDOld->GetFMDData())SetFMDData(fESDOld->GetFMDData());
1123 SetT0zVertex(fESDOld->GetT0zVertex());
1124 SetT0(fESDOld->GetT0());
1128 if (fESDOld->GetVZEROData()) SetVZEROData(fESDOld->GetVZEROData());
1130 if(fESDOld->GetVertex())SetVertex(fESDOld->GetVertex());
1132 if(fESDOld->GetPrimaryVertex())SetPrimaryVertex(fESDOld->GetPrimaryVertex());
1134 if(fESDOld->GetMultiplicity())SetMultiplicity(fESDOld->GetMultiplicity());
1136 for(int i = 0;i<fESDOld->GetNumberOfTracks();i++){
1137 AddTrack(fESDOld->GetTrack(i));
1140 for(int i = 0;i<fESDOld->GetNumberOfMuonTracks();i++){
1141 AddMuonTrack(fESDOld->GetMuonTrack(i));
1144 for(int i = 0;i<fESDOld->GetNumberOfPmdTracks();i++){
1145 AddPmdTrack(fESDOld->GetPmdTrack(i));
1148 for(int i = 0;i<fESDOld->GetNumberOfTrdTracks();i++){
1149 AddTrdTrack(fESDOld->GetTrdTrack(i));
1152 for(int i = 0;i<fESDOld->GetNumberOfV0s();i++){
1153 AddV0(fESDOld->GetV0(i));
1156 for(int i = 0;i<fESDOld->GetNumberOfCascades();i++){
1157 AddCascade(fESDOld->GetCascade(i));
1160 for(int i = 0;i<fESDOld->GetNumberOfKinks();i++){
1161 AddKink(fESDOld->GetKink(i));
1165 for(int i = 0;i<fESDOld->GetNumberOfCaloClusters();i++){
1166 AddCaloCluster(fESDOld->GetCaloCluster(i));