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 <TInterpreter.h>
41 #include "AliESDEvent.h"
42 #include "AliESDfriend.h"
43 #include "AliESDVZERO.h"
44 #include "AliESDFMD.h"
46 #include "AliESDMuonTrack.h"
47 #include "AliESDPmdTrack.h"
48 #include "AliESDTrdTrack.h"
49 #include "AliESDVertex.h"
50 #include "AliESDcascade.h"
51 #include "AliESDPmdTrack.h"
52 #include "AliESDTrdTrack.h"
53 #include "AliESDTrdTracklet.h"
54 #include "AliESDVertex.h"
55 #include "AliVertexerTracks.h"
56 #include "AliESDcascade.h"
57 #include "AliESDkink.h"
58 #include "AliESDtrack.h"
59 #include "AliESDHLTtrack.h"
60 #include "AliESDCaloCluster.h"
61 #include "AliESDCaloCells.h"
63 #include "AliESDFMD.h"
64 #include "AliESDVZERO.h"
65 #include "AliMultiplicity.h"
66 #include "AliRawDataErrorLog.h"
68 #include "AliESDACORDE.h"
69 #include "AliESDHLTDecision.h"
70 #include "AliCentrality.h"
71 #include "AliEventplane.h"
77 // here we define the names, some classes are no TNamed, therefore the classnames
79 const char* AliESDEvent::fgkESDListName[kESDListN] = {"AliESDRun",
104 "AliRawDataErrorLogs",
108 //______________________________________________________________________________
109 AliESDEvent::AliESDEvent():
111 fESDObjects(new TList()),
125 fSPDPileupVertices(0),
126 fTrkPileupVertices(0),
136 fEMCALCells(0), fPHOSCells(0),
147 //______________________________________________________________________________
148 AliESDEvent::AliESDEvent(const AliESDEvent& esd):
150 fESDObjects(new TList()),
151 fESDRun(new AliESDRun(*esd.fESDRun)),
152 fHeader(new AliESDHeader(*esd.fHeader)),
153 fESDZDC(new AliESDZDC(*esd.fESDZDC)),
154 fESDFMD(new AliESDFMD(*esd.fESDFMD)),
155 fESDVZERO(new AliESDVZERO(*esd.fESDVZERO)),
156 fESDTZERO(new AliESDTZERO(*esd.fESDTZERO)),
157 fTPCVertex(new AliESDVertex(*esd.fTPCVertex)),
158 fSPDVertex(new AliESDVertex(*esd.fSPDVertex)),
159 fPrimaryVertex(new AliESDVertex(*esd.fPrimaryVertex)),
160 fSPDMult(new AliMultiplicity(*esd.fSPDMult)),
161 fPHOSTrigger(new AliESDCaloTrigger(*esd.fPHOSTrigger)),
162 fEMCALTrigger(new AliESDCaloTrigger(*esd.fEMCALTrigger)),
163 fESDACORDE(new AliESDACORDE(*esd.fESDACORDE)),
164 fSPDPileupVertices(new TClonesArray(*esd.fSPDPileupVertices)),
165 fTrkPileupVertices(new TClonesArray(*esd.fTrkPileupVertices)),
166 fTracks(new TClonesArray(*esd.fTracks)),
167 fMuonTracks(new TClonesArray(*esd.fMuonTracks)),
168 fPmdTracks(new TClonesArray(*esd.fPmdTracks)),
169 fTrdTracks(new TClonesArray(*esd.fTrdTracks)),
170 fTrdTracklets(new TClonesArray(*esd.fTrdTracklets)),
171 fV0s(new TClonesArray(*esd.fV0s)),
172 fCascades(new TClonesArray(*esd.fCascades)),
173 fKinks(new TClonesArray(*esd.fKinks)),
174 fCaloClusters(new TClonesArray(*esd.fCaloClusters)),
175 fEMCALCells(new AliESDCaloCells(*esd.fEMCALCells)),
176 fPHOSCells(new AliESDCaloCells(*esd.fPHOSCells)),
177 fErrorLogs(new TClonesArray(*esd.fErrorLogs)),
178 fESDOld(esd.fESDOld ? new AliESD(*esd.fESDOld) : 0),
179 fESDFriendOld(esd.fESDFriendOld ? new AliESDfriend(*esd.fESDFriendOld) : 0),
180 fConnected(esd.fConnected),
181 fUseOwnList(esd.fUseOwnList),
182 fTOFHeader(new AliTOFHeader(*esd.fTOFHeader)),
183 fCentrality(new AliCentrality(*esd.fCentrality)),
184 fEventplane(new AliEventplane(*esd.fEventplane))
186 // CKB init in the constructor list and only add here ...
191 AddObject(fESDVZERO);
192 AddObject(fESDTZERO);
193 AddObject(fTPCVertex);
194 AddObject(fSPDVertex);
195 AddObject(fPrimaryVertex);
197 AddObject(fPHOSTrigger);
198 AddObject(fEMCALTrigger);
199 AddObject(fSPDPileupVertices);
200 AddObject(fTrkPileupVertices);
202 AddObject(fMuonTracks);
203 AddObject(fPmdTracks);
204 AddObject(fTrdTracks);
205 AddObject(fTrdTracklets);
207 AddObject(fCascades);
209 AddObject(fCaloClusters);
210 AddObject(fEMCALCells);
211 AddObject(fPHOSCells);
212 AddObject(fErrorLogs);
213 AddObject(fESDACORDE);
214 AddObject(fTOFHeader);
220 //______________________________________________________________________________
221 AliESDEvent & AliESDEvent::operator=(const AliESDEvent& source) {
223 // Assignment operator
225 if(&source == this) return *this;
226 AliVEvent::operator=(source);
228 // This assumes that the list is already created
229 // and that the virtual void Copy(Tobject&) function
230 // is correctly implemented in the derived class
231 // otherwise only TObject::Copy() will be used
235 if((fESDObjects->GetSize()==0)&&(source.fESDObjects->GetSize()>=kESDListN)){
236 // We cover the case that we do not yet have the
237 // standard content but the source has it
241 TIter next(source.GetList());
244 while ((its = next())) {
245 name.Form("%s", its->GetName());
246 TObject *mine = fESDObjects->FindObject(name.Data());
248 TClass* pClass=TClass::GetClass(its->ClassName());
250 AliWarning(Form("Can not find class description for entry %s (%s)\n",
251 its->ClassName(), name.Data()));
255 mine=(TObject*)pClass->New();
257 // not in this: can be added to list
258 AliWarning(Form("%s:%d Could not find %s for copying \n",
259 (char*)__FILE__,__LINE__,name.Data()));
262 if(mine->InheritsFrom("TNamed")){
263 ((TNamed*)mine)->SetName(name);
265 else if(mine->InheritsFrom("TCollection")){
266 if(mine->InheritsFrom("TClonesArray")) {
267 TClonesArray* tcits = dynamic_cast<TClonesArray*>(its);
269 dynamic_cast<TClonesArray*>(mine)->SetClass(tcits->GetClass());
271 dynamic_cast<TCollection*>(mine)->SetName(name);
273 AliDebug(1, Form("adding object %s of type %s", mine->GetName(), mine->ClassName()));
277 if(!its->InheritsFrom("TCollection")){
281 else if(its->InheritsFrom("TClonesArray")){
282 // Create or expand the tclonesarray pointers
283 // so we can directly copy to the object
284 TClonesArray *its_tca = (TClonesArray*)its;
285 TClonesArray *mine_tca = (TClonesArray*)mine;
287 // this leaves the capacity of the TClonesArray the same
288 // except for a factor of 2 increase when size > capacity
289 // does not release any memory occupied by the tca
290 mine_tca->ExpandCreate(its_tca->GetEntriesFast());
291 for(int i = 0;i < its_tca->GetEntriesFast();++i){
293 TObject *mine_tca_obj = mine_tca->At(i);
294 TObject *its_tca_obj = its_tca->At(i);
295 // no need to delete first
296 // pointers within the class should be handled by Copy()...
297 // Can there be Empty slots?
298 its_tca_obj->Copy(*mine_tca_obj);
302 AliWarning(Form("%s:%d cannot copy TCollection \n",
303 (char*)__FILE__,__LINE__));
307 fCentrality = source.fCentrality;
308 fEventplane = source.fEventplane;
310 fConnected = source.fConnected;
311 fUseOwnList = source.fUseOwnList;
317 //______________________________________________________________________________
318 AliESDEvent::~AliESDEvent()
321 // Standard destructor
324 // everthing on the list gets deleted automatically
327 if(fESDObjects&&!fConnected)
332 if (fCentrality) delete fCentrality;
333 if (fEventplane) delete fEventplane;
337 void AliESDEvent::Copy(TObject &obj) const {
339 // interface to TOBject::Copy
340 // Copies the content of this into obj!
341 // bascially obj = *this
343 if(this==&obj)return;
344 AliESDEvent *robj = dynamic_cast<AliESDEvent*>(&obj);
345 if(!robj)return; // not an AliESEvent
350 //______________________________________________________________________________
351 void AliESDEvent::Reset()
355 // Std content + Non std content
357 // Reset the standard contents
360 // reset for the old data without AliESDEvent...
361 if(fESDOld)fESDOld->Reset();
363 fESDFriendOld->~AliESDfriend();
364 new (fESDFriendOld) AliESDfriend();
368 if(fESDObjects->GetSize()>kESDListN){
369 // we have non std content
370 // this also covers esdfriends
371 for(int i = kESDListN;i < fESDObjects->GetSize();++i){
372 TObject *pObject = fESDObjects->At(i);
374 if(pObject->InheritsFrom(TClonesArray::Class())){
375 ((TClonesArray*)pObject)->Delete();
377 else if(!pObject->InheritsFrom(TCollection::Class())){
378 TClass *pClass = TClass::GetClass(pObject->ClassName());
379 if (pClass && pClass->GetListOfMethods()->FindObject("Clear")) {
380 AliDebug(1, Form("Clear for object %s class %s", pObject->GetName(), pObject->ClassName()));
384 AliDebug(1, Form("ResetWithPlacementNew for object %s class %s", pObject->GetName(), pObject->ClassName()));
385 ResetWithPlacementNew(pObject);
389 AliWarning(Form("No reset for %s \n",
390 pObject->ClassName()));
397 Bool_t AliESDEvent::ResetWithPlacementNew(TObject *pObject){
398 Long_t dtoronly = TObject::GetDtorOnly();
399 TClass *pClass = TClass::GetClass(pObject->ClassName());
400 TObject::SetDtorOnly(pObject);
402 // Recreate with placement new
403 pClass->New(pObject);
404 // Restore the state.
405 TObject::SetDtorOnly((void*)dtoronly);
409 void AliESDEvent::ResetStdContent()
411 // Reset the standard contents
412 if(fESDRun) fESDRun->Reset();
413 if(fHeader) fHeader->Reset();
414 if(fCentrality) fCentrality->Reset();
415 if(fEventplane) fEventplane->Reset();
416 if(fESDZDC) fESDZDC->Reset();
421 // reset by callin d'to /c'tor keep the pointer
422 fESDVZERO->~AliESDVZERO();
423 new (fESDVZERO) AliESDVZERO();
426 fESDACORDE->~AliESDACORDE();
427 new (fESDACORDE) AliESDACORDE();
429 if(fESDTZERO) fESDTZERO->Reset();
430 // CKB no clear/reset implemented
432 fTPCVertex->~AliESDVertex();
433 new (fTPCVertex) AliESDVertex();
434 fTPCVertex->SetName(fgkESDListName[kTPCVertex]);
437 fSPDVertex->~AliESDVertex();
438 new (fSPDVertex) AliESDVertex();
439 fSPDVertex->SetName(fgkESDListName[kSPDVertex]);
442 fPrimaryVertex->~AliESDVertex();
443 new (fPrimaryVertex) AliESDVertex();
444 fPrimaryVertex->SetName(fgkESDListName[kPrimaryVertex]);
447 fSPDMult->~AliMultiplicity();
448 new (fSPDMult) AliMultiplicity();
451 fTOFHeader->~AliTOFHeader();
452 new (fTOFHeader) AliTOFHeader();
453 //fTOFHeader->SetName(fgkESDListName[kTOFHeader]);
455 if(fPHOSTrigger)fPHOSTrigger->DeAllocate();
456 if(fEMCALTrigger)fEMCALTrigger->DeAllocate();
457 if(fSPDPileupVertices)fSPDPileupVertices->Delete();
458 if(fTrkPileupVertices)fTrkPileupVertices->Delete();
459 if(fTracks)fTracks->Delete();
460 if(fMuonTracks)fMuonTracks->Delete();
461 if(fPmdTracks)fPmdTracks->Delete();
462 if(fTrdTracks)fTrdTracks->Delete();
463 if(fTrdTracklets)fTrdTracklets->Delete();
464 if(fV0s)fV0s->Delete();
465 if(fCascades)fCascades->Delete();
466 if(fKinks)fKinks->Delete();
467 if(fCaloClusters)fCaloClusters->Delete();
468 if(fPHOSCells)fPHOSCells->DeleteContainer();
469 if(fEMCALCells)fEMCALCells->DeleteContainer();
470 if(fErrorLogs) fErrorLogs->Delete();
472 // don't reset fconnected fConnected and the list
477 Int_t AliESDEvent::AddV0(const AliESDv0 *v) {
481 TClonesArray &fv = *fV0s;
482 Int_t idx=fV0s->GetEntriesFast();
483 new(fv[idx]) AliESDv0(*v);
487 //______________________________________________________________________________
488 void AliESDEvent::Print(Option_t *) const
491 // Print header information of the event
493 printf("ESD run information\n");
494 printf("Event # in file %d Bunch crossing # %d Orbit # %d Period # %d Run # %d Trigger %lld Magnetic field %f \n",
495 GetEventNumberInFile(),
496 GetBunchCrossNumber(),
501 GetMagneticField() );
503 printf("Vertex: (%.4f +- %.4f, %.4f +- %.4f, %.4f +- %.4f) cm\n",
504 fPrimaryVertex->GetXv(), fPrimaryVertex->GetXRes(),
505 fPrimaryVertex->GetYv(), fPrimaryVertex->GetYRes(),
506 fPrimaryVertex->GetZv(), fPrimaryVertex->GetZRes());
507 printf("Mean vertex in RUN: X=%.4f Y=%.4f Z=%.4f cm\n",
508 GetDiamondX(),GetDiamondY(),GetDiamondZ());
510 printf("SPD Multiplicity. Number of tracklets %d \n",
511 fSPDMult->GetNumberOfTracklets());
512 printf("Number of pileup primary vertices reconstructed with SPD %d\n",
513 GetNumberOfPileupVerticesSPD());
514 printf("Number of pileup primary vertices reconstructed using the tracks %d\n",
515 GetNumberOfPileupVerticesTracks());
516 printf("Number of tracks: \n");
517 printf(" charged %d\n", GetNumberOfTracks());
518 printf(" muon %d\n", GetNumberOfMuonTracks());
519 printf(" pmd %d\n", GetNumberOfPmdTracks());
520 printf(" trd %d\n", GetNumberOfTrdTracks());
521 printf(" trd trkl %d\n", GetNumberOfTrdTracklets());
522 printf(" v0 %d\n", GetNumberOfV0s());
523 printf(" cascades %d\n", GetNumberOfCascades());
524 printf(" kinks %d\n", GetNumberOfKinks());
525 if(fPHOSCells)printf(" PHOSCells %d\n", fPHOSCells->GetNumberOfCells());
526 else printf(" PHOSCells not in the Event\n");
527 if(fEMCALCells)printf(" EMCALCells %d\n", fEMCALCells->GetNumberOfCells());
528 else printf(" EMCALCells not in the Event\n");
529 printf(" CaloClusters %d\n", GetNumberOfCaloClusters());
530 printf(" FMD %s\n", (fESDFMD ? "yes" : "no"));
531 printf(" VZERO %s\n", (fESDVZERO ? "yes" : "no"));
532 TObject* pHLTDecision=GetHLTTriggerDecision();
533 printf("HLT trigger decision: %s\n", pHLTDecision?pHLTDecision->GetOption():"not available");
534 if (pHLTDecision) pHLTDecision->Print("compact");
539 void AliESDEvent::SetESDfriend(const AliESDfriend *ev) const {
541 // Attaches the complementary info to the ESD
545 // to be sure that we set the tracks also
546 // in case of old esds
547 // if(fESDOld)CopyFromOldESD();
549 Int_t ntrk=ev->GetNumberOfTracks();
551 for (Int_t i=0; i<ntrk; i++) {
552 const AliESDfriendTrack *f=ev->GetTrack(i);
553 GetTrack(i)->SetFriendTrack(f);
557 Bool_t AliESDEvent::RemoveKink(Int_t rm) const {
558 // ---------------------------------------------------------
559 // Remove a kink candidate and references to it from ESD,
560 // if this candidate does not come from a reconstructed decay
561 // Not yet implemented...
562 // ---------------------------------------------------------
563 Int_t last=GetNumberOfKinks()-1;
564 if ((rm<0)||(rm>last)) return kFALSE;
569 Bool_t AliESDEvent::RemoveV0(Int_t rm) const {
570 // ---------------------------------------------------------
571 // Remove a V0 candidate and references to it from ESD,
572 // if this candidate does not come from a reconstructed decay
573 // ---------------------------------------------------------
574 Int_t last=GetNumberOfV0s()-1;
575 if ((rm<0)||(rm>last)) return kFALSE;
577 AliESDv0 *v0=GetV0(rm);
578 Int_t idxP=v0->GetPindex(), idxN=v0->GetNindex();
581 Int_t lastIdxP=v0->GetPindex(), lastIdxN=v0->GetNindex();
585 // Check if this V0 comes from a reconstructed decay
586 Int_t ncs=GetNumberOfCascades();
587 for (Int_t n=0; n<ncs; n++) {
588 AliESDcascade *cs=GetCascade(n);
590 Int_t csIdxP=cs->GetPindex();
591 Int_t csIdxN=cs->GetNindex();
594 if (idxN==csIdxN) return kFALSE;
596 if (csIdxP==lastIdxP)
597 if (csIdxN==lastIdxN) used++;
600 //Replace the removed V0 with the last V0
601 TClonesArray &a=*fV0s;
602 delete a.RemoveAt(rm);
604 if (rm==last) return kTRUE;
606 //v0 is pointing to the last V0 candidate...
607 new (a[rm]) AliESDv0(*v0);
608 delete a.RemoveAt(last);
610 if (!used) return kTRUE;
613 // Remap the indices of the daughters of reconstructed decays
614 for (Int_t n=0; n<ncs; n++) {
615 AliESDcascade *cs=GetCascade(n);
618 Int_t csIdxP=cs->GetPindex();
619 Int_t csIdxN=cs->GetNindex();
621 if (csIdxP==lastIdxP)
622 if (csIdxN==lastIdxN) {
623 cs->AliESDv0::SetIndex(1,idxP);
624 cs->AliESDv0::SetIndex(0,idxN);
626 if (!used) return kTRUE;
633 Bool_t AliESDEvent::RemoveTrack(Int_t rm) const {
634 // ---------------------------------------------------------
635 // Remove a track and references to it from ESD,
636 // if this track does not come from a reconstructed decay
637 // ---------------------------------------------------------
638 Int_t last=GetNumberOfTracks()-1;
639 if ((rm<0)||(rm>last)) return kFALSE;
643 // Check if this track comes from the reconstructed primary vertices
644 if (fTPCVertex && fTPCVertex->GetStatus()) {
645 UShort_t *primIdx=fTPCVertex->GetIndices();
646 Int_t n=fTPCVertex->GetNIndices();
648 Int_t idx=Int_t(primIdx[n]);
649 if (rm==idx) return kFALSE;
650 if (idx==last) used++;
653 if (fPrimaryVertex && fPrimaryVertex->GetStatus()) {
654 UShort_t *primIdx=fPrimaryVertex->GetIndices();
655 Int_t n=fPrimaryVertex->GetNIndices();
657 Int_t idx=Int_t(primIdx[n]);
658 if (rm==idx) return kFALSE;
659 if (idx==last) used++;
663 // Check if this track comes from a reconstructed decay
664 Int_t nv0=GetNumberOfV0s();
665 for (Int_t n=0; n<nv0; n++) {
666 AliESDv0 *v0=GetV0(n);
668 Int_t idx=v0->GetNindex();
669 if (rm==idx) return kFALSE;
670 if (idx==last) used++;
673 if (rm==idx) return kFALSE;
674 if (idx==last) used++;
677 Int_t ncs=GetNumberOfCascades();
678 for (Int_t n=0; n<ncs; n++) {
679 AliESDcascade *cs=GetCascade(n);
681 Int_t idx=cs->GetIndex();
682 if (rm==idx) return kFALSE;
683 if (idx==last) used++;
687 if (rm==idx) return kFALSE;
688 if (idx==last) used++;
691 if (rm==idx) return kFALSE;
692 if (idx==last) used++;
695 Int_t nkn=GetNumberOfKinks();
696 for (Int_t n=0; n<nkn; n++) {
697 AliESDkink *kn=GetKink(n);
699 Int_t idx=kn->GetIndex(0);
700 if (rm==idx) return kFALSE;
701 if (idx==last) used++;
704 if (rm==idx) return kFALSE;
705 if (idx==last) used++;
708 // Check if this track is associated with a CaloCluster
709 Int_t ncl=GetNumberOfCaloClusters();
710 for (Int_t n=0; n<ncl; n++) {
711 AliESDCaloCluster *cluster=GetCaloCluster(n);
712 TArrayI *arr=cluster->GetTracksMatched();
713 Int_t s=arr->GetSize();
715 Int_t idx=arr->At(s);
716 if (rm==idx) return kFALSE;
717 if (idx==last) used++;
723 //Replace the removed track with the last track
724 TClonesArray &a=*fTracks;
725 delete a.RemoveAt(rm);
727 if (rm==last) return kTRUE;
729 AliESDtrack *t=GetTrack(last);
731 new (a[rm]) AliESDtrack(*t);
732 delete a.RemoveAt(last);
735 if (!used) return kTRUE;
738 // Remap the indices of the tracks used for the primary vertex reconstruction
739 if (fTPCVertex && fTPCVertex->GetStatus()) {
740 UShort_t *primIdx=fTPCVertex->GetIndices();
741 Int_t n=fTPCVertex->GetNIndices();
743 Int_t idx=Int_t(primIdx[n]);
745 primIdx[n]=Short_t(rm);
747 if (!used) return kTRUE;
751 if (fPrimaryVertex && fPrimaryVertex->GetStatus()) {
752 UShort_t *primIdx=fPrimaryVertex->GetIndices();
753 Int_t n=fPrimaryVertex->GetNIndices();
755 Int_t idx=Int_t(primIdx[n]);
757 primIdx[n]=Short_t(rm);
759 if (!used) return kTRUE;
764 // Remap the indices of the daughters of reconstructed decays
765 for (Int_t n=0; n<nv0; n++) {
766 AliESDv0 *v0=GetV0(n);
767 if (v0->GetIndex(0)==last) {
770 if (!used) return kTRUE;
772 if (v0->GetIndex(1)==last) {
775 if (!used) return kTRUE;
779 for (Int_t n=0; n<ncs; n++) {
780 AliESDcascade *cs=GetCascade(n);
781 if (cs->GetIndex()==last) {
784 if (!used) return kTRUE;
787 if (v0->GetIndex(0)==last) {
790 if (!used) return kTRUE;
792 if (v0->GetIndex(1)==last) {
795 if (!used) return kTRUE;
799 for (Int_t n=0; n<nkn; n++) {
800 AliESDkink *kn=GetKink(n);
801 if (kn->GetIndex(0)==last) {
804 if (!used) return kTRUE;
806 if (kn->GetIndex(1)==last) {
809 if (!used) return kTRUE;
813 // Remap the indices of the tracks accosicated with CaloClusters
814 for (Int_t n=0; n<ncl; n++) {
815 AliESDCaloCluster *cluster=GetCaloCluster(n);
816 TArrayI *arr=cluster->GetTracksMatched();
817 Int_t s=arr->GetSize();
819 Int_t idx=arr->At(s);
823 if (!used) return kTRUE;
832 Bool_t AliESDEvent::Clean(Float_t *cleanPars) {
834 // Remove the data which are not needed for the physics analysis.
836 // 1) Cleaning the V0 candidates
837 // ---------------------------
838 // If the cosine of the V0 pointing angle "csp" and
839 // the DCA between the daughter tracks "dca" does not satisfy
842 // csp > cleanPars[1] + dca/cleanPars[0]*(1.- cleanPars[1])
844 // an attempt to remove this V0 candidate from ESD is made.
846 // The V0 candidate gets removed if it does not belong to any
847 // recosntructed cascade decay
849 // 12.11.2007, optimal values: cleanPars[0]=0.5, cleanPars[1]=0.999
851 // 2) Cleaning the tracks
852 // ----------------------
853 // If track's transverse parameter is larger than cleanPars[2]
855 // track's longitudinal parameter is larger than cleanPars[3]
856 // an attempt to remove this track from ESD is made.
858 // The track gets removed if it does not come
859 // from a reconstructed decay
863 Float_t dcaMax=cleanPars[0];
864 Float_t cspMin=cleanPars[1];
866 Int_t nV0s=GetNumberOfV0s();
867 for (Int_t i=nV0s-1; i>=0; i--) {
868 AliESDv0 *v0=GetV0(i);
870 Float_t dca=v0->GetDcaV0Daughters();
871 Float_t csp=v0->GetV0CosineOfPointingAngle();
872 Float_t cspcut=cspMin + dca/dcaMax*(1.-cspMin);
873 if (csp > cspcut) continue;
874 if (RemoveV0(i)) rc=kTRUE;
878 Float_t dmax=cleanPars[2], zmax=cleanPars[3];
880 const AliESDVertex *vertex=GetPrimaryVertexSPD();
881 Bool_t vtxOK=vertex->GetStatus();
883 Int_t nTracks=GetNumberOfTracks();
884 for (Int_t i=nTracks-1; i>=0; i--) {
885 AliESDtrack *track=GetTrack(i);
886 Float_t xy,z; track->GetImpactParameters(xy,z);
887 if ((TMath::Abs(xy) > dmax) || (vtxOK && (TMath::Abs(z) > zmax))) {
888 if (RemoveTrack(i)) rc=kTRUE;
895 Char_t AliESDEvent::AddPileupVertexSPD(const AliESDVertex *vtx)
897 // Add a pileup primary vertex reconstructed with SPD
898 TClonesArray &ftr = *fSPDPileupVertices;
899 Char_t n=Char_t(ftr.GetEntriesFast());
900 AliESDVertex *vertex = new(ftr[n]) AliESDVertex(*vtx);
905 Char_t AliESDEvent::AddPileupVertexTracks(const AliESDVertex *vtx)
907 // Add a pileup primary vertex reconstructed with SPD
908 TClonesArray &ftr = *fTrkPileupVertices;
909 Char_t n=Char_t(ftr.GetEntriesFast());
910 AliESDVertex *vertex = new(ftr[n]) AliESDVertex(*vtx);
915 Int_t AliESDEvent::AddTrack(const AliESDtrack *t)
918 TClonesArray &ftr = *fTracks;
919 AliESDtrack * track = new(ftr[fTracks->GetEntriesFast()])AliESDtrack(*t);
920 track->SetID(fTracks->GetEntriesFast()-1);
921 return track->GetID();
924 AliESDtrack* AliESDEvent::NewTrack()
927 TClonesArray &ftr = *fTracks;
928 AliESDtrack * track = new(ftr[fTracks->GetEntriesFast()])AliESDtrack();
929 track->SetID(fTracks->GetEntriesFast()-1);
933 void AliESDEvent::AddMuonTrack(const AliESDMuonTrack *t)
935 TClonesArray &fmu = *fMuonTracks;
936 new(fmu[fMuonTracks->GetEntriesFast()]) AliESDMuonTrack(*t);
939 void AliESDEvent::AddPmdTrack(const AliESDPmdTrack *t)
941 TClonesArray &fpmd = *fPmdTracks;
942 new(fpmd[fPmdTracks->GetEntriesFast()]) AliESDPmdTrack(*t);
945 void AliESDEvent::AddTrdTrack(const AliESDTrdTrack *t)
947 TClonesArray &ftrd = *fTrdTracks;
948 new(ftrd[fTrdTracks->GetEntriesFast()]) AliESDTrdTrack(*t);
951 void AliESDEvent::AddTrdTracklet(const AliESDTrdTracklet *trkl)
953 new ((*fTrdTracklets)[fTrdTracklets->GetEntriesFast()]) AliESDTrdTracklet(*trkl);
956 Int_t AliESDEvent::AddKink(const AliESDkink *c)
959 TClonesArray &fk = *fKinks;
960 AliESDkink * kink = new(fk[fKinks->GetEntriesFast()]) AliESDkink(*c);
961 kink->SetID(fKinks->GetEntriesFast()); // CKB different from the other imps..
962 return fKinks->GetEntriesFast()-1;
966 void AliESDEvent::AddCascade(const AliESDcascade *c)
968 TClonesArray &fc = *fCascades;
969 new(fc[fCascades->GetEntriesFast()]) AliESDcascade(*c);
973 Int_t AliESDEvent::AddCaloCluster(const AliESDCaloCluster *c)
976 TClonesArray &fc = *fCaloClusters;
977 AliESDCaloCluster *clus = new(fc[fCaloClusters->GetEntriesFast()]) AliESDCaloCluster(*c);
978 clus->SetID(fCaloClusters->GetEntriesFast()-1);
979 return fCaloClusters->GetEntriesFast()-1;
983 void AliESDEvent::AddRawDataErrorLog(const AliRawDataErrorLog *log) const {
984 TClonesArray &errlogs = *fErrorLogs;
985 new(errlogs[errlogs.GetEntriesFast()]) AliRawDataErrorLog(*log);
988 void AliESDEvent::SetZDCData(AliESDZDC * obj)
990 // use already allocated space
995 void AliESDEvent::SetPrimaryVertexTPC(const AliESDVertex *vertex)
997 // Set the TPC vertex
998 // use already allocated space
1000 *fTPCVertex = *vertex;
1001 fTPCVertex->SetName(fgkESDListName[kTPCVertex]);
1005 void AliESDEvent::SetPrimaryVertexSPD(const AliESDVertex *vertex)
1007 // Set the SPD vertex
1008 // use already allocated space
1010 *fSPDVertex = *vertex;
1011 fSPDVertex->SetName(fgkESDListName[kSPDVertex]);
1015 void AliESDEvent::SetPrimaryVertexTracks(const AliESDVertex *vertex)
1017 // Set the primary vertex reconstructed using he ESD tracks.
1018 // use already allocated space
1020 *fPrimaryVertex = *vertex;
1021 fPrimaryVertex->SetName(fgkESDListName[kPrimaryVertex]);
1025 const AliESDVertex * AliESDEvent::GetPrimaryVertex() const
1028 // Get the "best" available reconstructed primary vertex.
1031 if (fPrimaryVertex->GetStatus()) return fPrimaryVertex;
1034 if (fSPDVertex->GetStatus()) return fSPDVertex;
1036 if(fTPCVertex) return fTPCVertex;
1038 AliWarning("No primary vertex available. Returning the \"default\"...");
1042 AliESDVertex * AliESDEvent::PrimaryVertexTracksUnconstrained() const
1045 // Removes diamond constraint from fPrimaryVertex (reconstructed with tracks)
1046 // Returns a AliESDVertex which has to be deleted by the user
1048 if(!fPrimaryVertex) {
1049 AliWarning("No primary vertex from tracks available.");
1052 if(!fPrimaryVertex->GetStatus()) {
1053 AliWarning("No primary vertex from tracks available.");
1057 AliVertexerTracks vertexer(GetMagneticField());
1058 Float_t diamondxyz[3]={(Float_t)GetDiamondX(),(Float_t)GetDiamondY(),0.};
1059 Float_t diamondcovxy[3]; GetDiamondCovXY(diamondcovxy);
1060 Float_t diamondcov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,7.};
1061 AliESDVertex *vertex =
1062 (AliESDVertex*)vertexer.RemoveConstraintFromVertex(fPrimaryVertex,diamondxyz,diamondcov);
1067 void AliESDEvent::SetMultiplicity(const AliMultiplicity *mul)
1069 // Set the SPD Multiplicity
1076 void AliESDEvent::SetFMDData(AliESDFMD * obj)
1078 // use already allocated space
1084 void AliESDEvent::SetVZEROData(AliESDVZERO * obj)
1086 // use already allocated space
1091 void AliESDEvent::SetTZEROData(AliESDTZERO * obj)
1093 // use already allocated space
1098 void AliESDEvent::SetACORDEData(AliESDACORDE * obj)
1105 void AliESDEvent::GetESDfriend(AliESDfriend *ev) const
1108 // Extracts the complementary info from the ESD
1112 Int_t ntrk=GetNumberOfTracks();
1114 for (Int_t i=0; i<ntrk; i++) {
1115 AliESDtrack *t=GetTrack(i);
1116 const AliESDfriendTrack *f=t->GetFriendTrack();
1119 t->ReleaseESDfriendTrack();// Not to have two copies of "friendTrack"
1123 AliESDfriend *fr = (AliESDfriend*)(const_cast<AliESDEvent*>(this)->FindListObject("AliESDfriend"));
1124 if (fr) ev->SetVZEROfriend(fr->GetVZEROfriend());
1127 void AliESDEvent::AddObject(TObject* obj)
1129 // Add an object to the list of object.
1130 // Please be aware that in order to increase performance you should
1131 // refrain from using TObjArrays (if possible). Use TClonesArrays, instead.
1132 fESDObjects->SetOwner(kTRUE);
1133 fESDObjects->AddLast(obj);
1137 void AliESDEvent::GetStdContent()
1139 // set pointers for standard content
1140 // get by name much safer and not a big overhead since not called very often
1142 fESDRun = (AliESDRun*)fESDObjects->FindObject(fgkESDListName[kESDRun]);
1143 fHeader = (AliESDHeader*)fESDObjects->FindObject(fgkESDListName[kHeader]);
1144 fESDZDC = (AliESDZDC*)fESDObjects->FindObject(fgkESDListName[kESDZDC]);
1145 fESDFMD = (AliESDFMD*)fESDObjects->FindObject(fgkESDListName[kESDFMD]);
1146 fESDVZERO = (AliESDVZERO*)fESDObjects->FindObject(fgkESDListName[kESDVZERO]);
1147 fESDTZERO = (AliESDTZERO*)fESDObjects->FindObject(fgkESDListName[kESDTZERO]);
1148 fTPCVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kTPCVertex]);
1149 fSPDVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kSPDVertex]);
1150 fPrimaryVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kPrimaryVertex]);
1151 fSPDMult = (AliMultiplicity*)fESDObjects->FindObject(fgkESDListName[kSPDMult]);
1152 fPHOSTrigger = (AliESDCaloTrigger*)fESDObjects->FindObject(fgkESDListName[kPHOSTrigger]);
1153 fEMCALTrigger = (AliESDCaloTrigger*)fESDObjects->FindObject(fgkESDListName[kEMCALTrigger]);
1154 fSPDPileupVertices = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kSPDPileupVertices]);
1155 fTrkPileupVertices = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTrkPileupVertices]);
1156 fTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTracks]);
1157 fMuonTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kMuonTracks]);
1158 fPmdTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kPmdTracks]);
1159 fTrdTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTrdTracks]);
1160 fTrdTracklets = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTrdTracklets]);
1161 fV0s = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kV0s]);
1162 fCascades = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kCascades]);
1163 fKinks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kKinks]);
1164 fCaloClusters = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kCaloClusters]);
1165 fEMCALCells = (AliESDCaloCells*)fESDObjects->FindObject(fgkESDListName[kEMCALCells]);
1166 fPHOSCells = (AliESDCaloCells*)fESDObjects->FindObject(fgkESDListName[kPHOSCells]);
1167 fErrorLogs = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kErrorLogs]);
1168 fESDACORDE = (AliESDACORDE*)fESDObjects->FindObject(fgkESDListName[kESDACORDE]);
1169 fTOFHeader = (AliTOFHeader*)fESDObjects->FindObject(fgkESDListName[kTOFHeader]);
1172 void AliESDEvent::SetStdNames(){
1173 // Set the names of the standard contents
1175 if(fESDObjects->GetEntries()>=kESDListN){
1176 for(int i = 0;i < fESDObjects->GetEntries() && i<kESDListN;i++){
1177 TObject *fObj = fESDObjects->At(i);
1178 if(fObj->InheritsFrom("TNamed")){
1179 ((TNamed*)fObj)->SetName(fgkESDListName[i]);
1181 else if(fObj->InheritsFrom("TClonesArray")){
1182 ((TClonesArray*)fObj)->SetName(fgkESDListName[i]);
1187 AliWarning("Std Entries missing");
1192 void AliESDEvent::CreateStdContent(Bool_t bUseThisList){
1193 fUseOwnList = bUseThisList;
1197 void AliESDEvent::CreateStdContent()
1199 // create the standard AOD content and set pointers
1201 // create standard objects and add them to the TList of objects
1202 AddObject(new AliESDRun());
1203 AddObject(new AliESDHeader());
1204 AddObject(new AliESDZDC());
1205 AddObject(new AliESDFMD());
1206 AddObject(new AliESDVZERO());
1207 AddObject(new AliESDTZERO());
1208 AddObject(new AliESDVertex());
1209 AddObject(new AliESDVertex());
1210 AddObject(new AliESDVertex());
1211 AddObject(new AliMultiplicity());
1212 AddObject(new AliESDCaloTrigger());
1213 AddObject(new AliESDCaloTrigger());
1214 AddObject(new TClonesArray("AliESDVertex",0));
1215 AddObject(new TClonesArray("AliESDVertex",0));
1216 AddObject(new TClonesArray("AliESDtrack",0));
1217 AddObject(new TClonesArray("AliESDMuonTrack",0));
1218 AddObject(new TClonesArray("AliESDPmdTrack",0));
1219 AddObject(new TClonesArray("AliESDTrdTrack",0));
1220 AddObject(new TClonesArray("AliESDTrdTracklet",0));
1221 AddObject(new TClonesArray("AliESDv0",0));
1222 AddObject(new TClonesArray("AliESDcascade",0));
1223 AddObject(new TClonesArray("AliESDkink",0));
1224 AddObject(new TClonesArray("AliESDCaloCluster",0));
1225 AddObject(new AliESDCaloCells());
1226 AddObject(new AliESDCaloCells());
1227 AddObject(new TClonesArray("AliRawDataErrorLog",0));
1228 AddObject(new AliESDACORDE());
1229 AddObject(new AliTOFHeader());
1231 // check the order of the indices against enum...
1235 // read back pointers
1239 TObject* AliESDEvent::FindListObject(const char *name) const {
1241 // Find object with name "name" in the list of branches
1244 return fESDObjects->FindObject(name);
1249 Int_t AliESDEvent::GetPHOSClusters(TRefArray *clusters) const
1251 // fills the provided TRefArray with all found phos clusters
1255 AliESDCaloCluster *cl = 0;
1256 for (Int_t i = 0; i < GetNumberOfCaloClusters(); i++) {
1258 if ( (cl = GetCaloCluster(i)) ) {
1261 AliDebug(1,Form("IsPHOS cluster %d Size: %d \n",i,clusters->GetEntriesFast()));
1265 return clusters->GetEntriesFast();
1268 Int_t AliESDEvent::GetEMCALClusters(TRefArray *clusters) const
1270 // fills the provided TRefArray with all found emcal clusters
1274 AliESDCaloCluster *cl = 0;
1275 for (Int_t i = 0; i < GetNumberOfCaloClusters(); i++) {
1277 if ( (cl = GetCaloCluster(i)) ) {
1280 AliDebug(1,Form("IsEMCAL cluster %d Size: %d \n",i,clusters->GetEntriesFast()));
1284 return clusters->GetEntriesFast();
1287 void AliESDEvent::WriteToTree(TTree* tree) const {
1288 // Book the branches as in TTree::Branch(TCollection*)
1289 // but add a "." at the end of top level branches which are
1290 // not a TClonesArray
1294 TIter next(fESDObjects);
1295 const Int_t kSplitlevel = 99; // default value in TTree::Branch()
1296 const Int_t kBufsize = 32000; // default value in TTree::Branch()
1299 while ((obj = next())) {
1300 branchname.Form("%s", obj->GetName());
1301 if(branchname.CompareTo("AliESDfriend")==0)branchname = "ESDfriend.";
1302 if ((kSplitlevel > 1) && !obj->InheritsFrom(TClonesArray::Class())) {
1303 if(!branchname.EndsWith("."))branchname += ".";
1305 if (!tree->FindBranch(branchname)) {
1306 // For the custom streamer to be called splitlevel
1307 // has to be negative, only needed for HLT
1308 Int_t splitLevel = (TString(obj->ClassName()) == "AliHLTGlobalTriggerDecision") ? -1 : kSplitlevel - 1;
1309 tree->Bronch(branchname, obj->ClassName(), fESDObjects->GetObjectRef(obj),kBufsize, splitLevel);
1315 void AliESDEvent::ReadFromTree(TTree *tree, Option_t* opt){
1317 // Connect the ESDEvent to a tree
1320 AliWarning("AliESDEvent::ReadFromTree() Zero Pointer to Tree \n");
1324 if(!tree->GetTree())tree->LoadTree(0);
1326 // if we find the "ESD" branch on the tree we do have the old structure
1327 if(tree->GetBranch("ESD")) {
1328 char ** address = (char **)(tree->GetBranch("ESD")->GetAddress());
1329 // do we have the friend branch
1330 TBranch * esdFB = tree->GetBranch("ESDfriend.");
1331 char ** addressF = 0;
1332 if(esdFB)addressF = (char **)(esdFB->GetAddress());
1334 AliInfo("AliESDEvent::ReadFromTree() Reading old Tree");
1335 tree->SetBranchAddress("ESD", &fESDOld);
1337 tree->SetBranchAddress("ESDfriend.",&fESDFriendOld);
1340 AliInfo("AliESDEvent::ReadFromTree() Reading old Tree");
1341 AliInfo("Branch already connected. Using existing branch address.");
1342 fESDOld = (AliESD*) (*address);
1343 // addressF can still be 0, since branch needs to switched on
1344 if(addressF)fESDFriendOld = (AliESDfriend*) (*addressF);
1347 // have already connected the old ESD structure... ?
1348 // reuse also the pointer of the AlliESDEvent
1349 // otherwise create new ones
1350 TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("ESDObjectsConnectedToTree"));
1353 // If connected use the connected list of objects
1354 if(fESDObjects!= connectedList){
1355 // protect when called twice
1356 fESDObjects->Delete();
1357 fESDObjects = connectedList;
1362 // The pointer to the friend changes when called twice via InitIO
1363 // since AliESDEvent is deleted
1364 TObject* oldf = FindListObject("AliESDfriend");
1367 newf = (TObject*)*addressF;
1369 if(newf!=0&&oldf!=newf){
1370 // remove the old reference
1371 // Should we also delete it? Or is this handled in TTree I/O
1372 // since it is created by the first SetBranchAddress
1373 fESDObjects->Remove(oldf);
1375 fESDObjects->Add(newf);
1382 CreateStdContent(); // create for copy
1383 // if we have the esdfriend add it, so we always can access it via the userinfo
1384 if(fESDFriendOld)AddObject(fESDFriendOld);
1385 // we are not owner of the list objects
1386 // must not delete it
1387 fESDObjects->SetOwner(kTRUE);
1388 fESDObjects->SetName("ESDObjectsConnectedToTree");
1389 tree->GetUserInfo()->Add(fESDObjects);
1397 // Try to find AliESDEvent
1398 AliESDEvent *esdEvent = 0;
1399 esdEvent = (AliESDEvent*)tree->GetTree()->GetUserInfo()->FindObject("AliESDEvent");
1401 // Check if already connected to tree
1403 TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("ESDObjectsConnectedToTree"));
1406 if (connectedList && (strcmp(opt, "reconnect"))) {
1407 // If connected use the connected list if objects
1408 fESDObjects->Delete();
1409 fESDObjects = connectedList;
1416 // prevent a memory leak when reading back the TList
1417 // if (!(strcmp(opt, "reconnect"))) fESDObjects->Delete();
1420 // create a new TList from the UserInfo TList...
1421 // copy constructor does not work...
1422 fESDObjects = (TList*)(esdEvent->GetList()->Clone());
1423 fESDObjects->SetOwner(kTRUE);
1425 else if ( fESDObjects->GetEntries()==0){
1426 // at least create the std content if we want to read to our list
1431 // we only need new things in the list if we do no already have it..
1432 // TODO just add new entries
1434 if(fESDObjects->GetEntries()<kESDListN){
1435 AliWarning(Form("AliESDEvent::ReadFromTree() TList contains less than the standard contents %d < %d \n",
1436 fESDObjects->GetEntries(),kESDListN));
1438 // set the branch addresses
1439 TIter next(fESDObjects);
1441 while((el=(TNamed*)next())){
1442 TString bname(el->GetName());
1443 if(bname.CompareTo("AliESDfriend")==0)
1445 // AliESDfriend does not have a name ...
1446 TBranch *br = tree->GetBranch("ESDfriend.");
1447 if (br) tree->SetBranchAddress("ESDfriend.",fESDObjects->GetObjectRef(el));
1450 // check if branch exists under this Name
1451 TBranch *br = tree->GetBranch(bname.Data());
1453 tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));
1456 br = tree->GetBranch(Form("%s.",bname.Data()));
1458 tree->SetBranchAddress(Form("%s.",bname.Data()),fESDObjects->GetObjectRef(el));
1461 AliWarning(Form("AliESDEvent::ReadFromTree() No Branch found with Name %s or %s.",bname.Data(),bname.Data()));
1468 // when reading back we are not owner of the list
1469 // must not delete it
1470 fESDObjects->SetOwner(kTRUE);
1471 fESDObjects->SetName("ESDObjectsConnectedToTree");
1472 // we are not owner of the list objects
1473 // must not delete it
1474 tree->GetUserInfo()->Add(fESDObjects);
1475 tree->GetUserInfo()->SetOwner(kFALSE);
1479 // we can't get the list from the user data, create standard content
1480 // and set it by hand (no ESDfriend at the moment
1482 TIter next(fESDObjects);
1484 while((el=(TNamed*)next())){
1485 TString bname(el->GetName());
1486 TBranch *br = tree->GetBranch(bname.Data());
1488 tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));
1491 br = tree->GetBranch(Form("%s.",bname.Data()));
1493 tree->SetBranchAddress(Form("%s.",bname.Data()),fESDObjects->GetObjectRef(el));
1498 // when reading back we are not owner of the list
1499 // must not delete it
1500 fESDObjects->SetOwner(kTRUE);
1505 void AliESDEvent::CopyFromOldESD()
1507 // Method which copies over everthing from the old esd structure to the
1512 SetRunNumber(fESDOld->GetRunNumber());
1513 SetPeriodNumber(fESDOld->GetPeriodNumber());
1514 SetMagneticField(fESDOld->GetMagneticField());
1516 // leave out diamond ...
1517 // SetDiamond(const AliESDVertex *vertex) { fESDRun->SetDiamond(vertex);}
1520 SetTriggerMask(fESDOld->GetTriggerMask());
1521 SetOrbitNumber(fESDOld->GetOrbitNumber());
1522 SetTimeStamp(fESDOld->GetTimeStamp());
1523 SetEventType(fESDOld->GetEventType());
1524 SetEventNumberInFile(fESDOld->GetEventNumberInFile());
1525 SetBunchCrossNumber(fESDOld->GetBunchCrossNumber());
1526 SetTriggerCluster(fESDOld->GetTriggerCluster());
1530 SetZDC(fESDOld->GetZDCN1Energy(),
1531 fESDOld->GetZDCP1Energy(),
1532 fESDOld->GetZDCEMEnergy(),
1534 fESDOld->GetZDCN2Energy(),
1535 fESDOld->GetZDCP2Energy(),
1536 fESDOld->GetZDCParticipants(),
1546 if(fESDOld->GetFMDData())SetFMDData(fESDOld->GetFMDData());
1550 SetT0zVertex(fESDOld->GetT0zVertex());
1551 SetT0(fESDOld->GetT0());
1555 if (fESDOld->GetVZEROData()) SetVZEROData(fESDOld->GetVZEROData());
1557 if(fESDOld->GetVertex())SetPrimaryVertexSPD(fESDOld->GetVertex());
1559 if(fESDOld->GetPrimaryVertex())SetPrimaryVertexTracks(fESDOld->GetPrimaryVertex());
1561 if(fESDOld->GetMultiplicity())SetMultiplicity(fESDOld->GetMultiplicity());
1563 for(int i = 0;i<fESDOld->GetNumberOfTracks();i++){
1564 AddTrack(fESDOld->GetTrack(i));
1567 for(int i = 0;i<fESDOld->GetNumberOfMuonTracks();i++){
1568 AddMuonTrack(fESDOld->GetMuonTrack(i));
1571 for(int i = 0;i<fESDOld->GetNumberOfPmdTracks();i++){
1572 AddPmdTrack(fESDOld->GetPmdTrack(i));
1575 for(int i = 0;i<fESDOld->GetNumberOfTrdTracks();i++){
1576 AddTrdTrack(fESDOld->GetTrdTrack(i));
1579 for(int i = 0;i<fESDOld->GetNumberOfV0s();i++){
1580 AddV0(fESDOld->GetV0(i));
1583 for(int i = 0;i<fESDOld->GetNumberOfCascades();i++){
1584 AddCascade(fESDOld->GetCascade(i));
1587 for(int i = 0;i<fESDOld->GetNumberOfKinks();i++){
1588 AddKink(fESDOld->GetKink(i));
1592 for(int i = 0;i<fESDOld->GetNumberOfCaloClusters();i++){
1593 AddCaloCluster(fESDOld->GetCaloCluster(i));
1599 Bool_t AliESDEvent::IsEventSelected(const char *trigExpr) const
1601 // Check if the event satisfies the trigger
1602 // selection expression trigExpr.
1603 // trigExpr can be any logical expression
1604 // of the trigger classes defined in AliESDRun
1605 // In case of wrong syntax return kTRUE.
1607 TString expr(trigExpr);
1608 if (expr.IsNull()) return kTRUE;
1610 ULong64_t mask = GetTriggerMask();
1611 for(Int_t itrig = 0; itrig < AliESDRun::kNTriggerClasses; itrig++) {
1612 if (mask & (1ull << itrig)) {
1613 expr.ReplaceAll(GetESDRun()->GetTriggerClass(itrig),"1");
1616 expr.ReplaceAll(GetESDRun()->GetTriggerClass(itrig),"0");
1621 if ((gROOT->ProcessLineFast(expr.Data(),&error) == 0) &&
1622 (error == TInterpreter::kNoError)) {
1630 TObject* AliESDEvent::GetHLTTriggerDecision() const
1632 // get the HLT trigger decission object
1634 // cast away const'nes because the FindListObject method
1636 AliESDEvent* pNonConst=const_cast<AliESDEvent*>(this);
1637 return pNonConst->FindListObject("HLTGlobalTrigger");
1640 TString AliESDEvent::GetHLTTriggerDescription() const
1642 // get the HLT trigger decission description
1643 TString description;
1644 TObject* pDecision=GetHLTTriggerDecision();
1646 description=pDecision->GetTitle();
1652 Bool_t AliESDEvent::IsHLTTriggerFired(const char* name) const
1654 // get the HLT trigger decission description
1655 TObject* pDecision=GetHLTTriggerDecision();
1656 if (!pDecision) return kFALSE;
1658 Option_t* option=pDecision->GetOption();
1659 if (option==NULL || *option!='1') return kFALSE;
1662 TString description=GetHLTTriggerDescription();
1663 Int_t index=description.Index(name);
1664 if (index<0) return kFALSE;
1665 index+=strlen(name);
1666 if (index>=description.Length()) return kFALSE;
1667 if (description[index]!=0 && description[index]!=' ') return kFALSE;
1672 //______________________________________________________________________________
1673 Bool_t AliESDEvent::IsPileupFromSPD(Int_t minContributors,
1675 Double_t nSigmaZdist,
1676 Double_t nSigmaDiamXY,
1677 Double_t nSigmaDiamZ) const{
1679 // This function checks if there was a pile up
1680 // reconstructed with SPD
1682 Int_t nc1=fSPDVertex->GetNContributors();
1683 if(nc1<1) return kFALSE;
1684 Int_t nPileVert=GetNumberOfPileupVerticesSPD();
1685 if(nPileVert==0) return kFALSE;
1687 for(Int_t i=0; i<nPileVert;i++){
1688 const AliESDVertex* pv=GetPileupVertexSPD(i);
1689 Int_t nc2=pv->GetNContributors();
1690 if(nc2>=minContributors){
1691 Double_t z1=fSPDVertex->GetZ();
1692 Double_t z2=pv->GetZ();
1693 Double_t distZ=TMath::Abs(z2-z1);
1694 Double_t distZdiam=TMath::Abs(z2-GetDiamondZ());
1695 Double_t cutZdiam=nSigmaDiamZ*TMath::Sqrt(GetSigma2DiamondZ());
1696 if(GetSigma2DiamondZ()<0.0001)cutZdiam=99999.; //protection for missing z diamond information
1697 if(distZ>minZdist && distZdiam<cutZdiam){
1698 Double_t x2=pv->GetX();
1699 Double_t y2=pv->GetY();
1700 Double_t distXdiam=TMath::Abs(x2-GetDiamondX());
1701 Double_t distYdiam=TMath::Abs(y2-GetDiamondY());
1702 Double_t cov1[6],cov2[6];
1703 fSPDVertex->GetCovarianceMatrix(cov1);
1704 pv->GetCovarianceMatrix(cov2);
1705 Double_t errxDist=TMath::Sqrt(cov2[0]+GetSigma2DiamondX());
1706 Double_t erryDist=TMath::Sqrt(cov2[2]+GetSigma2DiamondY());
1707 Double_t errzDist=TMath::Sqrt(cov1[5]+cov2[5]);
1708 Double_t cutXdiam=nSigmaDiamXY*errxDist;
1709 if(GetSigma2DiamondX()<0.0001)cutXdiam=99999.; //protection for missing diamond information
1710 Double_t cutYdiam=nSigmaDiamXY*erryDist;
1711 if(GetSigma2DiamondY()<0.0001)cutYdiam=99999.; //protection for missing diamond information
1712 if( (distXdiam<cutXdiam) && (distYdiam<cutYdiam) && (distZ>nSigmaZdist*errzDist) ){
1721 //______________________________________________________________________________
1722 void AliESDEvent::EstimateMultiplicity(Int_t &tracklets, Int_t &trITSTPC, Int_t &trITSSApure, Double_t eta, Bool_t useDCAFlag,Bool_t useV0Flag) const
1725 // calculates 3 estimators for the multiplicity in the -eta:eta range
1726 // tracklets : using SPD tracklets only
1727 // trITSTPC : using TPC/ITS + complementary ITS SA tracks + tracklets from clusters not used by tracks
1728 // trITSSApure : using ITS standalone tracks + tracklets from clusters not used by tracks
1729 // if useDCAFlag is true: account for the ESDtrack flag marking the tracks with large DCA
1730 // if useV0Flag is true: account for the ESDtrack flag marking conversion and K0's V0s
1731 tracklets = trITSSApure = trITSTPC = 0;
1732 int ntr = fSPDMult ? fSPDMult->GetNumberOfTracklets() : 0;
1735 for (int itr=ntr;itr--;) {
1736 if (TMath::Abs(fSPDMult->GetEta(itr))>eta) continue;
1738 if (fSPDMult->FreeClustersTracklet(itr,0)) trITSTPC++; // not used in ITS/TPC or ITS_SA track
1739 if (fSPDMult->FreeClustersTracklet(itr,1)) trITSSApure++; // not used in ITS_SA_Pure track
1742 // count real tracks
1743 ntr = GetNumberOfTracks();
1744 for (int itr=ntr;itr--;) {
1745 AliESDtrack *t = GetTrack(itr);
1746 if (TMath::Abs(t->Eta())>eta) continue;
1747 if (!t->IsOn(AliESDtrack::kITSin)) continue;
1748 if (useDCAFlag && t->IsOn(AliESDtrack::kMultSec)) continue;
1749 if (useV0Flag && t->IsOn(AliESDtrack::kMultInV0)) continue;
1750 if (t->IsOn(AliESDtrack::kITSpureSA)) trITSSApure++;
1756 Bool_t AliESDEvent::IsPileupFromSPDInMultBins() const {
1757 Int_t nTracklets=GetMultiplicity()->GetNumberOfTracklets();
1758 if(nTracklets<20) return IsPileupFromSPD(3,0.8);
1759 else if(nTracklets<50) return IsPileupFromSPD(4,0.8);
1760 else return IsPileupFromSPD(5,0.8);
1763 void AliESDEvent::SetTOFHeader(const AliTOFHeader *header)
1766 // Set the TOF event_time
1770 *fTOFHeader=*header;
1771 //fTOFHeader->SetName(fgkESDListName[kTOFHeader]);
1774 // for analysis of reconstructed events
1775 // when this information is not avaliable
1776 fTOFHeader = new AliTOFHeader(*header);
1777 //AddObject(fTOFHeader);
1782 AliCentrality* AliESDEvent::GetCentrality()
1784 if (!fCentrality) fCentrality = new AliCentrality();
1788 AliEventplane* AliESDEvent::GetEventplane()
1790 if (!fEventplane) fEventplane = new AliEventplane();