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"
64 #include "AliESDACORDE.h"
69 // here we define the names, some classes are no TNamed, therefore the classnames
71 const char* AliESDEvent::fgkESDListName[kESDListN] = {"AliESDRun",
93 "AliRawDataErrorLogs",
96 //______________________________________________________________________________
97 AliESDEvent::AliESDEvent():
99 fESDObjects(new TList()),
121 fEMCALCells(0), fPHOSCells(0),
128 fFirstEMCALCluster(-1),
130 fFirstPHOSCluster(-1)
133 //______________________________________________________________________________
134 AliESDEvent::AliESDEvent(const AliESDEvent& esd):
136 fESDObjects(new TList()),
137 fESDRun(new AliESDRun(*esd.fESDRun)),
138 fHeader(new AliESDHeader(*esd.fHeader)),
139 fESDZDC(new AliESDZDC(*esd.fESDZDC)),
140 fESDFMD(new AliESDFMD(*esd.fESDFMD)),
141 fESDVZERO(new AliESDVZERO(*esd.fESDVZERO)),
142 fESDTZERO(new AliESDTZERO(*esd.fESDTZERO)),
143 fTPCVertex(new AliESDVertex(*esd.fTPCVertex)),
144 fSPDVertex(new AliESDVertex(*esd.fSPDVertex)),
145 fPrimaryVertex(new AliESDVertex(*esd.fPrimaryVertex)),
146 fSPDMult(new AliMultiplicity(*esd.fSPDMult)),
147 fPHOSTrigger(new AliESDCaloTrigger(*esd.fPHOSTrigger)),
148 fEMCALTrigger(new AliESDCaloTrigger(*esd.fEMCALTrigger)),
149 fESDACORDE(new AliESDACORDE(*esd.fESDACORDE)),
150 fTracks(new TClonesArray(*esd.fTracks)),
151 fMuonTracks(new TClonesArray(*esd.fMuonTracks)),
152 fPmdTracks(new TClonesArray(*esd.fPmdTracks)),
153 fTrdTracks(new TClonesArray(*esd.fTrdTracks)),
154 fV0s(new TClonesArray(*esd.fV0s)),
155 fCascades(new TClonesArray(*esd.fCascades)),
156 fKinks(new TClonesArray(*esd.fKinks)),
157 fCaloClusters(new TClonesArray(*esd.fCaloClusters)),
158 fEMCALCells(new AliESDCaloCells(*esd.fEMCALCells)),
159 fPHOSCells(new AliESDCaloCells(*esd.fPHOSCells)),
160 fErrorLogs(new TClonesArray(*esd.fErrorLogs)),
161 fESDOld(new AliESD(*esd.fESDOld)),
162 fESDFriendOld(new AliESDfriend(*esd.fESDFriendOld)),
163 fConnected(esd.fConnected),
164 fUseOwnList(esd.fUseOwnList),
165 fEMCALClusters(esd.fEMCALClusters),
166 fFirstEMCALCluster(esd.fFirstEMCALCluster),
167 fPHOSClusters(esd.fPHOSClusters),
168 fFirstPHOSCluster(esd.fFirstPHOSCluster)
171 // CKB init in the constructor list and only add here ...
176 AddObject(fESDVZERO);
177 AddObject(fESDTZERO);
178 AddObject(fTPCVertex);
179 AddObject(fSPDVertex);
180 AddObject(fPrimaryVertex);
182 AddObject(fPHOSTrigger);
183 AddObject(fEMCALTrigger);
185 AddObject(fMuonTracks);
186 AddObject(fPmdTracks);
187 AddObject(fTrdTracks);
189 AddObject(fCascades);
191 AddObject(fCaloClusters);
192 AddObject(fEMCALCells);
193 AddObject(fPHOSCells);
194 AddObject(fErrorLogs);
195 AddObject(fESDACORDE);
201 //______________________________________________________________________________
202 AliESDEvent & AliESDEvent::operator=(const AliESDEvent& source) {
204 // Assignment operator
206 if(&source == this) return *this;
207 AliVEvent::operator=(source);
209 // This assumes that the list is already created
210 // and that the virtual void Copy(Tobject&) function
211 // is correctly implemented in the derived class
212 // otherwise only TObject::Copy() will be used
216 if((fESDObjects->GetSize()==0)&&(source.fESDObjects->GetSize()>=kESDListN)){
217 // We cover the case that we do not yet have the
218 // standard content but the source has it
222 TIter next(source.GetList());
225 while ((its = next())) {
226 name.Form("%s", its->GetName());
227 TObject *mine = fESDObjects->FindObject(name.Data());
229 TClass* pClass=TClass::GetClass(its->ClassName());
231 AliWarning(Form("Can not find class description for entry %s (%s)\n",
232 its->ClassName(), name.Data()));
236 mine=(TObject*)pClass->New();
238 // not in this: can be added to list
239 AliWarning(Form("%s:%d Could not find %s for copying \n",
240 (char*)__FILE__,__LINE__,name.Data()));
243 if(mine->InheritsFrom("TNamed")){
244 ((TNamed*)mine)->SetName(name);
246 else if(mine->InheritsFrom("TCollection")){
247 if(mine->InheritsFrom("TClonesArray"))
248 dynamic_cast<TClonesArray*>(mine)->SetClass(dynamic_cast<TClonesArray*>(its)->GetClass());
249 dynamic_cast<TCollection*>(mine)->SetName(name);
251 AliDebug(1, Form("adding object %s of type %s", mine->GetName(), mine->ClassName()));
255 if(!its->InheritsFrom("TCollection")){
259 else if(its->InheritsFrom("TClonesArray")){
260 // Create or expand the tclonesarray pointers
261 // so we can directly copy to the object
262 TClonesArray *its_tca = (TClonesArray*)its;
263 TClonesArray *mine_tca = (TClonesArray*)mine;
265 // this leaves the capacity of the TClonesArray the same
266 // except for a factor of 2 increase when size > capacity
267 // does not release any memory occupied by the tca
268 mine_tca->ExpandCreate(its_tca->GetEntriesFast());
269 for(int i = 0;i < its_tca->GetEntriesFast();++i){
271 TObject *mine_tca_obj = mine_tca->At(i);
272 TObject *its_tca_obj = its_tca->At(i);
273 // no need to delete first
274 // pointers within the class should be handled by Copy()...
275 // Can there be Empty slots?
276 its_tca_obj->Copy(*mine_tca_obj);
280 AliWarning(Form("%s:%d cannot copy TCollection \n",
281 (char*)__FILE__,__LINE__));
285 fConnected = source.fConnected;
286 fUseOwnList = source.fUseOwnList;
287 fEMCALClusters = source.fEMCALClusters;
288 fFirstEMCALCluster = source.fFirstEMCALCluster;
289 fPHOSClusters = source.fPHOSClusters;
290 fFirstPHOSCluster = source.fFirstPHOSCluster;
298 //______________________________________________________________________________
299 AliESDEvent::~AliESDEvent()
302 // Standard destructor
305 // everthing on the list gets deleted automatically
308 if(fESDObjects&&!fConnected)
317 void AliESDEvent::Copy(TObject &obj) const {
319 // interface to TOBject::Copy
320 // Copies the content of this into obj!
321 // bascially obj = *this
323 if(this==&obj)return;
324 AliESDEvent *robj = dynamic_cast<AliESDEvent*>(&obj);
325 if(!robj)return; // not an AliESEvent
330 //______________________________________________________________________________
331 void AliESDEvent::Reset()
335 // Std content + Non std content
337 // Reset the standard contents
340 // reset for the old data without AliESDEvent...
341 if(fESDOld)fESDOld->Reset();
343 fESDFriendOld->~AliESDfriend();
344 new (fESDFriendOld) AliESDfriend();
348 if(fESDObjects->GetSize()>kESDListN){
349 // we have non std content
350 // this also covers esdfriends
351 for(int i = kESDListN;i < fESDObjects->GetSize();++i){
352 TObject *pObject = fESDObjects->At(i);
354 if(pObject->InheritsFrom(TClonesArray::Class())){
355 ((TClonesArray*)pObject)->Delete();
357 else if(!pObject->InheritsFrom(TCollection::Class())){
358 ResetWithPlacementNew(pObject);
361 AliWarning(Form("No reset for %s (%s)\n",
362 pObject->ClassName()));
369 Bool_t AliESDEvent::ResetWithPlacementNew(TObject *pObject){
370 Long_t dtoronly = TObject::GetDtorOnly();
371 TClass *pClass = TClass::GetClass(pObject->ClassName());
372 TObject::SetDtorOnly(pObject);
374 // Recreate with placement new
375 pClass->New(pObject);
376 // Restore the state.
377 TObject::SetDtorOnly((void*)dtoronly);
381 void AliESDEvent::ResetStdContent()
383 // Reset the standard contents
384 if(fESDRun) fESDRun->Reset();
385 if(fHeader) fHeader->Reset();
386 if(fESDZDC) fESDZDC->Reset();
391 // reset by callin d'to /c'tor keep the pointer
392 fESDVZERO->~AliESDVZERO();
393 new (fESDVZERO) AliESDVZERO();
396 fESDACORDE->~AliESDACORDE();
397 new (fESDACORDE) AliESDACORDE();
399 if(fESDTZERO) fESDTZERO->Reset();
400 // CKB no clear/reset implemented
402 fTPCVertex->~AliESDVertex();
403 new (fTPCVertex) AliESDVertex();
404 fTPCVertex->SetName(fgkESDListName[kTPCVertex]);
407 fSPDVertex->~AliESDVertex();
408 new (fSPDVertex) AliESDVertex();
409 fSPDVertex->SetName(fgkESDListName[kSPDVertex]);
412 fPrimaryVertex->~AliESDVertex();
413 new (fPrimaryVertex) AliESDVertex();
414 fPrimaryVertex->SetName(fgkESDListName[kPrimaryVertex]);
417 fSPDMult->~AliMultiplicity();
418 new (fSPDMult) AliMultiplicity();
420 if(fPHOSTrigger)fPHOSTrigger->Reset();
421 if(fEMCALTrigger)fEMCALTrigger->Reset();
422 if(fTracks)fTracks->Delete();
423 if(fMuonTracks)fMuonTracks->Delete();
424 if(fPmdTracks)fPmdTracks->Delete();
425 if(fTrdTracks)fTrdTracks->Delete();
426 if(fV0s)fV0s->Delete();
427 if(fCascades)fCascades->Delete();
428 if(fKinks)fKinks->Delete();
429 if(fCaloClusters)fCaloClusters->Delete();
430 if(fPHOSCells)fPHOSCells->DeleteContainer();
431 if(fEMCALCells)fEMCALCells->DeleteContainer();
432 if(fErrorLogs) fErrorLogs->Delete();
434 // don't reset fconnected fConnected and the list
437 fFirstEMCALCluster=-1;
439 fFirstPHOSCluster=-1;
443 Int_t AliESDEvent::AddV0(const AliESDv0 *v) {
447 TClonesArray &fv = *fV0s;
448 Int_t idx=fV0s->GetEntriesFast();
449 new(fv[idx]) AliESDv0(*v);
453 //______________________________________________________________________________
454 void AliESDEvent::Print(Option_t *) const
457 // Print header information of the event
459 printf("ESD run information\n");
460 printf("Event # in file %d Bunch crossing # %d Orbit # %d Period # %d Run # %d Trigger %lld Magnetic field %f \n",
461 GetEventNumberInFile(),
462 GetBunchCrossNumber(),
467 GetMagneticField() );
468 printf("Vertex: (%.4f +- %.4f, %.4f +- %.4f, %.4f +- %.4f) cm\n",
469 fPrimaryVertex->GetXv(), fPrimaryVertex->GetXRes(),
470 fPrimaryVertex->GetYv(), fPrimaryVertex->GetYRes(),
471 fPrimaryVertex->GetZv(), fPrimaryVertex->GetZRes());
472 printf("Mean vertex in RUN: X=%.4f Y=%.4f cm\n",
473 GetDiamondX(),GetDiamondY());
474 printf("SPD Multiplicity. Number of tracklets %d \n",
475 fSPDMult->GetNumberOfTracklets());
476 printf("Number of tracks: \n");
477 printf(" charged %d\n", GetNumberOfTracks());
478 printf(" muon %d\n", GetNumberOfMuonTracks());
479 printf(" pmd %d\n", GetNumberOfPmdTracks());
480 printf(" trd %d\n", GetNumberOfTrdTracks());
481 printf(" v0 %d\n", GetNumberOfV0s());
482 printf(" cascades %d\n", GetNumberOfCascades());
483 printf(" kinks %d\n", GetNumberOfKinks());
484 if(fPHOSCells)printf(" PHOSCells %d\n", fPHOSCells->GetNumberOfCells());
485 else printf(" PHOSCells not in the Event\n");
486 if(fEMCALCells)printf(" EMCALCells %d\n", fEMCALCells->GetNumberOfCells());
487 else printf(" EMCALCells not in the Event\n");
488 printf(" CaloClusters %d\n", GetNumberOfCaloClusters());
489 printf(" phos %d\n", GetNumberOfPHOSClusters());
490 printf(" emcal %d\n", GetNumberOfEMCALClusters());
491 printf(" FMD %s\n", (fESDFMD ? "yes" : "no"));
492 printf(" VZERO %s\n", (fESDVZERO ? "yes" : "no"));
497 void AliESDEvent::SetESDfriend(const AliESDfriend *ev) const {
499 // Attaches the complementary info to the ESD
503 // to be sure that we set the tracks also
504 // in case of old esds
505 // if(fESDOld)CopyFromOldESD();
507 Int_t ntrk=ev->GetNumberOfTracks();
509 for (Int_t i=0; i<ntrk; i++) {
510 const AliESDfriendTrack *f=ev->GetTrack(i);
511 GetTrack(i)->SetFriendTrack(f);
515 Bool_t AliESDEvent::RemoveKink(Int_t rm) const {
516 // ---------------------------------------------------------
517 // Remove a kink candidate and references to it from ESD,
518 // if this candidate does not come from a reconstructed decay
519 // Not yet implemented...
520 // ---------------------------------------------------------
521 Int_t last=GetNumberOfKinks()-1;
522 if ((rm<0)||(rm>last)) return kFALSE;
527 Bool_t AliESDEvent::RemoveV0(Int_t rm) const {
528 // ---------------------------------------------------------
529 // Remove a V0 candidate and references to it from ESD,
530 // if this candidate does not come from a reconstructed decay
531 // ---------------------------------------------------------
532 Int_t last=GetNumberOfV0s()-1;
533 if ((rm<0)||(rm>last)) return kFALSE;
535 AliESDv0 *v0=GetV0(rm);
536 Int_t idxP=v0->GetPindex(), idxN=v0->GetNindex();
539 Int_t lastIdxP=v0->GetPindex(), lastIdxN=v0->GetNindex();
543 // Check if this V0 comes from a reconstructed decay
544 Int_t ncs=GetNumberOfCascades();
545 for (Int_t n=0; n<ncs; n++) {
546 AliESDcascade *cs=GetCascade(n);
548 Int_t csIdxP=cs->GetPindex();
549 Int_t csIdxN=cs->GetNindex();
552 if (idxN==csIdxN) return kFALSE;
554 if (csIdxP==lastIdxP)
555 if (csIdxN==lastIdxN) used++;
558 //Replace the removed V0 with the last V0
559 TClonesArray &a=*fV0s;
560 delete a.RemoveAt(rm);
562 if (rm==last) return kTRUE;
564 //v0 is pointing to the last V0 candidate...
565 new (a[rm]) AliESDv0(*v0);
566 delete a.RemoveAt(last);
568 if (!used) return kTRUE;
571 // Remap the indices of the daughters of reconstructed decays
572 for (Int_t n=0; n<ncs; n++) {
573 AliESDcascade *cs=GetCascade(n);
576 Int_t csIdxP=cs->GetPindex();
577 Int_t csIdxN=cs->GetNindex();
579 if (csIdxP==lastIdxP)
580 if (csIdxN==lastIdxN) {
581 cs->AliESDv0::SetIndex(1,idxP);
582 cs->AliESDv0::SetIndex(0,idxN);
584 if (!used) return kTRUE;
591 Bool_t AliESDEvent::RemoveTrack(Int_t rm) const {
592 // ---------------------------------------------------------
593 // Remove a track and references to it from ESD,
594 // if this track does not come from a reconstructed decay
595 // ---------------------------------------------------------
596 Int_t last=GetNumberOfTracks()-1;
597 if ((rm<0)||(rm>last)) return kFALSE;
601 // Check if this track comes from the reconstructed primary vertices
602 if (fTPCVertex && fTPCVertex->GetStatus()) {
603 UShort_t *primIdx=fTPCVertex->GetIndices();
604 Int_t n=fTPCVertex->GetNIndices();
606 Int_t idx=Int_t(primIdx[n]);
607 if (rm==idx) return kFALSE;
608 if (idx==last) used++;
611 if (fPrimaryVertex && fPrimaryVertex->GetStatus()) {
612 UShort_t *primIdx=fPrimaryVertex->GetIndices();
613 Int_t n=fPrimaryVertex->GetNIndices();
615 Int_t idx=Int_t(primIdx[n]);
616 if (rm==idx) return kFALSE;
617 if (idx==last) used++;
621 // Check if this track comes from a reconstructed decay
622 Int_t nv0=GetNumberOfV0s();
623 for (Int_t n=0; n<nv0; n++) {
624 AliESDv0 *v0=GetV0(n);
626 Int_t idx=v0->GetNindex();
627 if (rm==idx) return kFALSE;
628 if (idx==last) used++;
631 if (rm==idx) return kFALSE;
632 if (idx==last) used++;
635 Int_t ncs=GetNumberOfCascades();
636 for (Int_t n=0; n<ncs; n++) {
637 AliESDcascade *cs=GetCascade(n);
639 Int_t idx=cs->GetIndex();
640 if (rm==idx) return kFALSE;
641 if (idx==last) used++;
645 if (rm==idx) return kFALSE;
646 if (idx==last) used++;
649 if (rm==idx) return kFALSE;
650 if (idx==last) used++;
653 Int_t nkn=GetNumberOfKinks();
654 for (Int_t n=0; n<nkn; n++) {
655 AliESDkink *kn=GetKink(n);
657 Int_t idx=kn->GetIndex(0);
658 if (rm==idx) return kFALSE;
659 if (idx==last) used++;
662 if (rm==idx) return kFALSE;
663 if (idx==last) used++;
667 //Replace the removed track with the last track
668 TClonesArray &a=*fTracks;
669 delete a.RemoveAt(rm);
671 if (rm==last) return kTRUE;
673 AliESDtrack *t=GetTrack(last);
675 new (a[rm]) AliESDtrack(*t);
676 delete a.RemoveAt(last);
679 if (!used) return kTRUE;
682 // Remap the indices of the tracks used for the primary vertex reconstruction
683 if (fTPCVertex && fTPCVertex->GetStatus()) {
684 UShort_t *primIdx=fTPCVertex->GetIndices();
685 Int_t n=fTPCVertex->GetNIndices();
687 Int_t idx=Int_t(primIdx[n]);
689 primIdx[n]=Short_t(rm);
691 if (!used) return kTRUE;
695 if (fPrimaryVertex && fPrimaryVertex->GetStatus()) {
696 UShort_t *primIdx=fPrimaryVertex->GetIndices();
697 Int_t n=fPrimaryVertex->GetNIndices();
699 Int_t idx=Int_t(primIdx[n]);
701 primIdx[n]=Short_t(rm);
703 if (!used) return kTRUE;
708 // Remap the indices of the daughters of reconstructed decays
709 for (Int_t n=0; n<nv0; n++) {
710 AliESDv0 *v0=GetV0(n);
711 if (v0->GetIndex(0)==last) {
714 if (!used) return kTRUE;
716 if (v0->GetIndex(1)==last) {
719 if (!used) return kTRUE;
723 for (Int_t n=0; n<ncs; n++) {
724 AliESDcascade *cs=GetCascade(n);
725 if (cs->GetIndex()==last) {
728 if (!used) return kTRUE;
731 if (v0->GetIndex(0)==last) {
734 if (!used) return kTRUE;
736 if (v0->GetIndex(1)==last) {
739 if (!used) return kTRUE;
743 for (Int_t n=0; n<nkn; n++) {
744 AliESDkink *kn=GetKink(n);
745 if (kn->GetIndex(0)==last) {
748 if (!used) return kTRUE;
750 if (kn->GetIndex(1)==last) {
753 if (!used) return kTRUE;
761 Bool_t AliESDEvent::Clean(Float_t *cleanPars) {
763 // Remove the data which are not needed for the physics analysis.
765 // 1) Cleaning the V0 candidates
766 // ---------------------------
767 // If the cosine of the V0 pointing angle "csp" and
768 // the DCA between the daughter tracks "dca" does not satisfy
771 // csp > cleanPars[1] + dca/cleanPars[0]*(1.- cleanPars[1])
773 // an attempt to remove this V0 candidate from ESD is made.
775 // The V0 candidate gets removed if it does not belong to any
776 // recosntructed cascade decay
778 // 12.11.2007, optimal values: cleanPars[0]=0.5, cleanPars[1]=0.999
780 // 2) Cleaning the tracks
781 // ----------------------
782 // If track's transverse parameter is larger than cleanPars[2]
784 // track's longitudinal parameter is larger than cleanPars[3]
785 // an attempt to remove this track from ESD is made.
787 // The track gets removed if it does not come
788 // from a reconstructed decay
792 Float_t dcaMax=cleanPars[0];
793 Float_t cspMin=cleanPars[1];
795 Int_t nV0s=GetNumberOfV0s();
796 for (Int_t i=nV0s-1; i>=0; i--) {
797 AliESDv0 *v0=GetV0(i);
799 Float_t dca=v0->GetDcaV0Daughters();
800 Float_t csp=v0->GetV0CosineOfPointingAngle();
801 Float_t cspcut=cspMin + dca/dcaMax*(1.-cspMin);
802 if (csp > cspcut) continue;
803 if (RemoveV0(i)) rc=kTRUE;
807 Float_t dmax=cleanPars[2], zmax=cleanPars[3];
809 const AliESDVertex *vertex=GetPrimaryVertexSPD();
810 Bool_t vtxOK=vertex->GetStatus();
812 Int_t nTracks=GetNumberOfTracks();
813 for (Int_t i=nTracks-1; i>=0; i--) {
814 AliESDtrack *track=GetTrack(i);
815 Float_t xy,z; track->GetImpactParameters(xy,z);
816 if ((TMath::Abs(xy) > dmax) || (vtxOK && (TMath::Abs(z) > zmax))) {
817 if (RemoveTrack(i)) rc=kTRUE;
824 Int_t AliESDEvent::AddTrack(const AliESDtrack *t)
827 TClonesArray &ftr = *fTracks;
828 AliESDtrack * track = new(ftr[fTracks->GetEntriesFast()])AliESDtrack(*t);
829 track->SetID(fTracks->GetEntriesFast()-1);
830 return track->GetID();
833 void AliESDEvent::AddMuonTrack(const AliESDMuonTrack *t)
835 TClonesArray &fmu = *fMuonTracks;
836 new(fmu[fMuonTracks->GetEntriesFast()]) AliESDMuonTrack(*t);
839 void AliESDEvent::AddPmdTrack(const AliESDPmdTrack *t)
841 TClonesArray &fpmd = *fPmdTracks;
842 new(fpmd[fPmdTracks->GetEntriesFast()]) AliESDPmdTrack(*t);
845 void AliESDEvent::AddTrdTrack(const AliESDTrdTrack *t)
847 TClonesArray &ftrd = *fTrdTracks;
848 new(ftrd[fTrdTracks->GetEntriesFast()]) AliESDTrdTrack(*t);
854 Int_t AliESDEvent::AddKink(const AliESDkink *c)
857 TClonesArray &fk = *fKinks;
858 AliESDkink * kink = new(fk[fKinks->GetEntriesFast()]) AliESDkink(*c);
859 kink->SetID(fKinks->GetEntriesFast()); // CKB different from the other imps..
860 return fKinks->GetEntriesFast()-1;
864 void AliESDEvent::AddCascade(const AliESDcascade *c)
866 TClonesArray &fc = *fCascades;
867 new(fc[fCascades->GetEntriesFast()]) AliESDcascade(*c);
871 Int_t AliESDEvent::AddCaloCluster(const AliESDCaloCluster *c)
874 TClonesArray &fc = *fCaloClusters;
875 AliESDCaloCluster *clus = new(fc[fCaloClusters->GetEntriesFast()]) AliESDCaloCluster(*c);
876 clus->SetID(fCaloClusters->GetEntriesFast()-1);
877 return fCaloClusters->GetEntriesFast()-1;
881 void AliESDEvent::AddRawDataErrorLog(const AliRawDataErrorLog *log) const {
882 TClonesArray &errlogs = *fErrorLogs;
883 new(errlogs[errlogs.GetEntriesFast()]) AliRawDataErrorLog(*log);
886 void AliESDEvent::SetPrimaryVertexTPC(const AliESDVertex *vertex)
888 // Set the TPC vertex
889 // use already allocated space
891 *fTPCVertex = *vertex;
892 fTPCVertex->SetName(fgkESDListName[kTPCVertex]);
896 void AliESDEvent::SetPrimaryVertexSPD(const AliESDVertex *vertex)
898 // Set the SPD vertex
899 // use already allocated space
901 *fSPDVertex = *vertex;
902 fSPDVertex->SetName(fgkESDListName[kSPDVertex]);
906 void AliESDEvent::SetPrimaryVertexTracks(const AliESDVertex *vertex)
908 // Set the primary vertex reconstructed using he ESD tracks.
909 // use already allocated space
911 *fPrimaryVertex = *vertex;
912 fPrimaryVertex->SetName(fgkESDListName[kPrimaryVertex]);
916 const AliESDVertex * AliESDEvent::GetPrimaryVertex() const
919 // Get the "best" available reconstructed primary vertex.
922 if (fPrimaryVertex->GetStatus()) return fPrimaryVertex;
925 if (fSPDVertex->GetStatus()) return fSPDVertex;
927 if(fTPCVertex) return fTPCVertex;
929 AliWarning("No primary vertex available. Returning the \"default\"...");
933 void AliESDEvent::SetMultiplicity(const AliMultiplicity *mul)
935 // Set the SPD Multiplicity
942 void AliESDEvent::SetFMDData(AliESDFMD * obj)
944 // use already allocated space
950 void AliESDEvent::SetVZEROData(AliESDVZERO * obj)
952 // use already allocated space
957 void AliESDEvent::SetACORDEData(AliESDACORDE * obj)
964 void AliESDEvent::GetESDfriend(AliESDfriend *ev) const
967 // Extracts the complementary info from the ESD
971 Int_t ntrk=GetNumberOfTracks();
973 for (Int_t i=0; i<ntrk; i++) {
974 AliESDtrack *t=GetTrack(i);
975 const AliESDfriendTrack *f=t->GetFriendTrack();
978 t->ReleaseESDfriendTrack();// Not to have two copies of "friendTrack"
982 AliESDfriend *fr = (AliESDfriend*)(const_cast<AliESDEvent*>(this)->FindListObject("AliESDfriend"));
983 if (fr) ev->SetVZEROfriend(fr->GetVZEROfriend());
986 void AliESDEvent::AddObject(TObject* obj)
988 // Add an object to the list of object.
989 // Please be aware that in order to increase performance you should
990 // refrain from using TObjArrays (if possible). Use TClonesArrays, instead.
991 fESDObjects->SetOwner(kTRUE);
992 fESDObjects->AddLast(obj);
996 void AliESDEvent::GetStdContent()
998 // set pointers for standard content
999 // get by name much safer and not a big overhead since not called very often
1001 fESDRun = (AliESDRun*)fESDObjects->FindObject(fgkESDListName[kESDRun]);
1002 fHeader = (AliESDHeader*)fESDObjects->FindObject(fgkESDListName[kHeader]);
1003 fESDZDC = (AliESDZDC*)fESDObjects->FindObject(fgkESDListName[kESDZDC]);
1004 fESDFMD = (AliESDFMD*)fESDObjects->FindObject(fgkESDListName[kESDFMD]);
1005 fESDVZERO = (AliESDVZERO*)fESDObjects->FindObject(fgkESDListName[kESDVZERO]);
1006 fESDTZERO = (AliESDTZERO*)fESDObjects->FindObject(fgkESDListName[kESDTZERO]);
1007 fTPCVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kTPCVertex]);
1008 fSPDVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kSPDVertex]);
1009 fPrimaryVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kPrimaryVertex]);
1010 fSPDMult = (AliMultiplicity*)fESDObjects->FindObject(fgkESDListName[kSPDMult]);
1011 fPHOSTrigger = (AliESDCaloTrigger*)fESDObjects->FindObject(fgkESDListName[kPHOSTrigger]);
1012 fEMCALTrigger = (AliESDCaloTrigger*)fESDObjects->FindObject(fgkESDListName[kEMCALTrigger]);
1013 fTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTracks]);
1014 fMuonTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kMuonTracks]);
1015 fPmdTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kPmdTracks]);
1016 fTrdTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTrdTracks]);
1017 fV0s = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kV0s]);
1018 fCascades = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kCascades]);
1019 fKinks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kKinks]);
1020 fCaloClusters = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kCaloClusters]);
1021 fEMCALCells = (AliESDCaloCells*)fESDObjects->FindObject(fgkESDListName[kEMCALCells]);
1022 fPHOSCells = (AliESDCaloCells*)fESDObjects->FindObject(fgkESDListName[kPHOSCells]);
1023 fErrorLogs = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kErrorLogs]);
1024 fESDACORDE = (AliESDACORDE*)fESDObjects->FindObject(fgkESDListName[kESDACORDE]);
1028 void AliESDEvent::SetStdNames(){
1029 // Set the names of the standard contents
1031 if(fESDObjects->GetEntries()>=kESDListN){
1032 for(int i = 0;i < fESDObjects->GetEntries() && i<kESDListN;i++){
1033 TObject *fObj = fESDObjects->At(i);
1034 if(fObj->InheritsFrom("TNamed")){
1035 ((TNamed*)fObj)->SetName(fgkESDListName[i]);
1037 else if(fObj->InheritsFrom("TClonesArray")){
1038 ((TClonesArray*)fObj)->SetName(fgkESDListName[i]);
1043 AliWarning("Std Entries missing");
1048 void AliESDEvent::CreateStdContent(Bool_t bUseThisList){
1049 fUseOwnList = bUseThisList;
1053 void AliESDEvent::CreateStdContent()
1055 // create the standard AOD content and set pointers
1057 // create standard objects and add them to the TList of objects
1058 AddObject(new AliESDRun());
1059 AddObject(new AliESDHeader());
1060 AddObject(new AliESDZDC());
1061 AddObject(new AliESDFMD());
1062 AddObject(new AliESDVZERO());
1063 AddObject(new AliESDTZERO());
1064 AddObject(new AliESDVertex());
1065 AddObject(new AliESDVertex());
1066 AddObject(new AliESDVertex());
1067 AddObject(new AliMultiplicity());
1068 AddObject(new AliESDCaloTrigger());
1069 AddObject(new AliESDCaloTrigger());
1070 AddObject(new TClonesArray("AliESDtrack",0));
1071 AddObject(new TClonesArray("AliESDMuonTrack",0));
1072 AddObject(new TClonesArray("AliESDPmdTrack",0));
1073 AddObject(new TClonesArray("AliESDTrdTrack",0));
1074 AddObject(new TClonesArray("AliESDv0",0));
1075 AddObject(new TClonesArray("AliESDcascade",0));
1076 AddObject(new TClonesArray("AliESDkink",0));
1077 AddObject(new TClonesArray("AliESDCaloCluster",0));
1078 AddObject(new AliESDCaloCells());
1079 AddObject(new AliESDCaloCells());
1080 AddObject(new TClonesArray("AliRawDataErrorLog",0));
1081 AddObject(new AliESDACORDE());
1083 // check the order of the indices against enum...
1087 // read back pointers
1091 TObject* AliESDEvent::FindListObject(const char *name){
1093 // Find object with name "name" in the list of branches
1096 return fESDObjects->FindObject(name);
1101 Int_t AliESDEvent::GetPHOSClusters(TRefArray *clusters) const
1103 // fills the provided TRefArray with all found phos clusters
1107 AliESDCaloCluster *cl = 0;
1108 for (Int_t i = 0; i < GetNumberOfCaloClusters(); i++) {
1110 if ( (cl = GetCaloCluster(i)) ) {
1113 AliDebug(1,Form("IsPHOS cluster %d Size: %d \n",i,clusters->GetEntriesFast()));
1117 return clusters->GetEntriesFast();
1120 Int_t AliESDEvent::GetEMCALClusters(TRefArray *clusters) const
1122 // fills the provided TRefArray with all found emcal clusters
1126 AliESDCaloCluster *cl = 0;
1127 for (Int_t i = 0; i < GetNumberOfCaloClusters(); i++) {
1129 if ( (cl = GetCaloCluster(i)) ) {
1132 AliDebug(1,Form("IsEMCAL cluster %d Size: %d \n",i,clusters->GetEntriesFast()));
1136 return clusters->GetEntriesFast();
1139 void AliESDEvent::WriteToTree(TTree* tree) const {
1140 // Book the branches as in TTree::Branch(TCollection*)
1141 // but add a "." at the end of top level branches which are
1142 // not a TClonesArray
1146 TIter next(fESDObjects);
1147 const Int_t kSplitlevel = 99; // default value in TTree::Branch()
1148 const Int_t kBufsize = 32000; // default value in TTree::Branch()
1151 while ((obj = next())) {
1152 branchname.Form("%s", obj->GetName());
1153 if(branchname.CompareTo("AliESDfriend")==0)branchname = "ESDfriend.";
1154 if ((kSplitlevel > 1) && !obj->InheritsFrom(TClonesArray::Class())) {
1155 if(!branchname.EndsWith("."))branchname += ".";
1157 if (!tree->FindBranch(branchname)) {
1158 tree->Bronch(branchname, obj->ClassName(), fESDObjects->GetObjectRef(obj),
1159 kBufsize, kSplitlevel - 1);
1165 void AliESDEvent::ReadFromTree(TTree *tree, Option_t* /*opt*/){
1167 // Connect the ESDEvent to a tree
1170 AliWarning("AliESDEvent::ReadFromTree() Zero Pointer to Tree \n");
1174 if(!tree->GetTree())tree->LoadTree(0);
1176 // if we find the "ESD" branch on the tree we do have the old structure
1177 if(tree->GetBranch("ESD")) {
1178 char ** address = (char **)(tree->GetBranch("ESD")->GetAddress());
1179 // do we have the friend branch
1180 TBranch * esdFB = tree->GetBranch("ESDfriend.");
1181 char ** addressF = 0;
1182 if(esdFB)addressF = (char **)(esdFB->GetAddress());
1184 AliInfo("AliESDEvent::ReadFromTree() Reading old Tree");
1185 tree->SetBranchAddress("ESD", &fESDOld);
1187 tree->SetBranchAddress("ESDfriend.",&fESDFriendOld);
1190 AliInfo("AliESDEvent::ReadFromTree() Reading old Tree");
1191 AliInfo("Branch already connected. Using existing branch address.");
1192 fESDOld = (AliESD*) (*address);
1193 // addressF can still be 0, since branch needs to switched on
1194 if(addressF)fESDFriendOld = (AliESDfriend*) (*addressF);
1197 // have already connected the old ESD structure... ?
1198 // reuse also the pointer of the AlliESDEvent
1199 // otherwise create new ones
1200 TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("ESDObjectsConnectedToTree"));
1203 // If connected use the connected list of objects
1204 if(fESDObjects!= connectedList){
1205 // protect when called twice
1206 fESDObjects->Delete();
1207 fESDObjects = connectedList;
1212 // The pointer to the friend changes when called twice via InitIO
1213 // since AliESDEvent is deleted
1214 TObject* oldf = FindListObject("AliESDfriend");
1217 newf = (TObject*)*addressF;
1219 if(newf!=0&&oldf!=newf){
1220 // remove the old reference
1221 // Should we also delete it? Or is this handled in TTree I/O
1222 // since it is created by the first SetBranchAddress
1223 fESDObjects->Remove(oldf);
1225 fESDObjects->Add(newf);
1232 CreateStdContent(); // create for copy
1233 // if we have the esdfriend add it, so we always can access it via the userinfo
1234 if(fESDFriendOld)AddObject(fESDFriendOld);
1235 // we are not owner of the list objects
1236 // must not delete it
1237 fESDObjects->SetOwner(kFALSE);
1238 fESDObjects->SetName("ESDObjectsConnectedToTree");
1239 tree->GetUserInfo()->Add(fESDObjects);
1247 // Try to find AliESDEvent
1248 AliESDEvent *esdEvent = 0;
1249 esdEvent = (AliESDEvent*)tree->GetTree()->GetUserInfo()->FindObject("AliESDEvent");
1251 // Check if already connected to tree
1252 TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("ESDObjectsConnectedToTree"));
1253 if (connectedList) {
1254 // If connected use the connected list if objects
1255 fESDObjects->Delete();
1256 fESDObjects = connectedList;
1263 // prevent a memory leak when reading back the TList
1268 // create a new TList from the UserInfo TList...
1269 // copy constructor does not work...
1270 fESDObjects = (TList*)(esdEvent->GetList()->Clone());
1271 fESDObjects->SetOwner(kFALSE);
1273 else if ( fESDObjects->GetEntries()==0){
1274 // at least create the std content if we want to read to our list
1279 // we only need new things in the list if we do no already have it..
1280 // TODO just add new entries
1282 if(fESDObjects->GetEntries()<kESDListN){
1283 AliWarning(Form("AliESDEvent::ReadFromTree() TList contains less than the standard contents %d < %d \n",
1284 fESDObjects->GetEntries(),kESDListN));
1286 // set the branch addresses
1287 TIter next(fESDObjects);
1289 while((el=(TNamed*)next())){
1290 TString bname(el->GetName());
1291 if(bname.CompareTo("AliESDfriend")==0)
1293 // AliESDfriend does not have a name ...
1294 tree->SetBranchAddress("ESDfriend.",fESDObjects->GetObjectRef(el));
1297 // check if branch exists under this Name
1298 TBranch *br = tree->GetBranch(bname.Data());
1300 tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));
1303 br = tree->GetBranch(Form("%s.",bname.Data()));
1305 tree->SetBranchAddress(Form("%s.",bname.Data()),fESDObjects->GetObjectRef(el));
1308 AliWarning(Form("AliESDEvent::ReadFromTree() No Branch found with Name %s or %s.",bname.Data(),bname.Data()));
1315 // when reading back we are not owner of the list
1316 // must not delete it
1317 fESDObjects->SetOwner(kFALSE);
1318 fESDObjects->SetName("ESDObjectsConnectedToTree");
1319 // we are not owner of the list objects
1320 // must not delete it
1321 tree->GetUserInfo()->Add(fESDObjects);
1325 // we can't get the list from the user data, create standard content
1326 // and set it by hand (no ESDfriend at the moment
1328 TIter next(fESDObjects);
1330 while((el=(TNamed*)next())){
1331 TString bname(el->GetName());
1332 TBranch *br = tree->GetBranch(bname.Data());
1334 tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));
1337 br = tree->GetBranch(Form("%s.",bname.Data()));
1339 tree->SetBranchAddress(Form("%s.",bname.Data()),fESDObjects->GetObjectRef(el));
1344 // when reading back we are not owner of the list
1345 // must not delete it
1346 fESDObjects->SetOwner(kFALSE);
1351 void AliESDEvent::CopyFromOldESD()
1353 // Method which copies over everthing from the old esd structure to the
1358 SetRunNumber(fESDOld->GetRunNumber());
1359 SetPeriodNumber(fESDOld->GetPeriodNumber());
1360 SetMagneticField(fESDOld->GetMagneticField());
1362 // leave out diamond ...
1363 // SetDiamond(const AliESDVertex *vertex) { fESDRun->SetDiamond(vertex);}
1366 SetTriggerMask(fESDOld->GetTriggerMask());
1367 SetOrbitNumber(fESDOld->GetOrbitNumber());
1368 SetTimeStamp(fESDOld->GetTimeStamp());
1369 SetEventType(fESDOld->GetEventType());
1370 SetEventNumberInFile(fESDOld->GetEventNumberInFile());
1371 SetBunchCrossNumber(fESDOld->GetBunchCrossNumber());
1372 SetTriggerCluster(fESDOld->GetTriggerCluster());
1376 SetZDC(fESDOld->GetZDCN1Energy(),
1377 fESDOld->GetZDCP1Energy(),
1378 fESDOld->GetZDCEMEnergy(),
1380 fESDOld->GetZDCN2Energy(),
1381 fESDOld->GetZDCP2Energy(),
1382 fESDOld->GetZDCParticipants(),
1387 if(fESDOld->GetFMDData())SetFMDData(fESDOld->GetFMDData());
1391 SetT0zVertex(fESDOld->GetT0zVertex());
1392 SetT0(fESDOld->GetT0());
1396 if (fESDOld->GetVZEROData()) SetVZEROData(fESDOld->GetVZEROData());
1398 if(fESDOld->GetVertex())SetPrimaryVertexSPD(fESDOld->GetVertex());
1400 if(fESDOld->GetPrimaryVertex())SetPrimaryVertexTracks(fESDOld->GetPrimaryVertex());
1402 if(fESDOld->GetMultiplicity())SetMultiplicity(fESDOld->GetMultiplicity());
1404 for(int i = 0;i<fESDOld->GetNumberOfTracks();i++){
1405 AddTrack(fESDOld->GetTrack(i));
1408 for(int i = 0;i<fESDOld->GetNumberOfMuonTracks();i++){
1409 AddMuonTrack(fESDOld->GetMuonTrack(i));
1412 for(int i = 0;i<fESDOld->GetNumberOfPmdTracks();i++){
1413 AddPmdTrack(fESDOld->GetPmdTrack(i));
1416 for(int i = 0;i<fESDOld->GetNumberOfTrdTracks();i++){
1417 AddTrdTrack(fESDOld->GetTrdTrack(i));
1420 for(int i = 0;i<fESDOld->GetNumberOfV0s();i++){
1421 AddV0(fESDOld->GetV0(i));
1424 for(int i = 0;i<fESDOld->GetNumberOfCascades();i++){
1425 AddCascade(fESDOld->GetCascade(i));
1428 for(int i = 0;i<fESDOld->GetNumberOfKinks();i++){
1429 AddKink(fESDOld->GetKink(i));
1433 for(int i = 0;i<fESDOld->GetNumberOfCaloClusters();i++){
1434 AddCaloCluster(fESDOld->GetCaloCluster(i));