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 **************************************************************************/
16 /* $Id: AliESDEvent.cxx 64008 2013-08-28 13:09:59Z hristov $ */
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 "AliESDMuonCluster.h"
48 #include "AliESDMuonPad.h"
49 #include "AliESDMuonGlobalTrack.h" // AU
50 #include "AliESDPmdTrack.h"
51 #include "AliESDTrdTrack.h"
52 #include "AliESDVertex.h"
53 #include "AliESDcascade.h"
54 #include "AliESDPmdTrack.h"
55 #include "AliESDTrdTrigger.h"
56 #include "AliESDTrdTrack.h"
57 #include "AliESDTrdTracklet.h"
58 #include "AliESDVertex.h"
59 #include "AliVertexerTracks.h"
60 #include "AliESDcascade.h"
61 #include "AliESDkink.h"
62 #include "AliESDtrack.h"
63 #include "AliESDHLTtrack.h"
64 #include "AliESDCaloCluster.h"
65 #include "AliESDCaloCells.h"
67 #include "AliESDFMD.h"
68 #include "AliESDVZERO.h"
69 #include "AliMultiplicity.h"
70 #include "AliRawDataErrorLog.h"
72 #include "AliESDACORDE.h"
74 #include "AliESDHLTDecision.h"
75 #include "AliCentrality.h"
76 #include "AliESDCosmicTrack.h"
77 #include "AliTriggerConfiguration.h"
78 #include "AliTriggerClass.h"
79 #include "AliTriggerCluster.h"
80 #include "AliEventplane.h"
84 // here we define the names, some classes are no TNamed, therefore the classnames
86 const char* AliESDEvent::fgkESDListName[kESDListN] = {"AliESDRun",
104 "MuonGlobalTracks", // AU
115 "AliRawDataErrorLogs",
125 //______________________________________________________________________________
126 AliESDEvent::AliESDEvent():
128 fESDObjects(new TList()),
144 fSPDPileupVertices(0),
145 fTrkPileupVertices(0),
150 fMuonGlobalTracks(0), // AU
158 fEMCALCells(0), fPHOSCells(0),
164 fOldMuonStructure(kFALSE),
169 fTracksConnected(kFALSE),
173 fDetectorStatus(0xFFFFFFFF),
174 fDAQDetectorPattern(0xFFFF),
175 fDAQAttributes(0xFFFF)
178 //______________________________________________________________________________
179 AliESDEvent::AliESDEvent(const AliESDEvent& esd):
181 fESDObjects(new TList()),
182 fESDRun(new AliESDRun(*esd.fESDRun)),
183 fHeader(new AliESDHeader(*esd.fHeader)),
184 fESDZDC(new AliESDZDC(*esd.fESDZDC)),
185 fESDFMD(new AliESDFMD(*esd.fESDFMD)),
186 fESDVZERO(new AliESDVZERO(*esd.fESDVZERO)),
187 fESDTZERO(new AliESDTZERO(*esd.fESDTZERO)),
188 fTPCVertex(new AliESDVertex(*esd.fTPCVertex)),
189 fSPDVertex(new AliESDVertex(*esd.fSPDVertex)),
190 fPrimaryVertex(new AliESDVertex(*esd.fPrimaryVertex)),
191 fSPDMult(new AliMultiplicity(*esd.fSPDMult)),
192 fPHOSTrigger(new AliESDCaloTrigger(*esd.fPHOSTrigger)),
193 fEMCALTrigger(new AliESDCaloTrigger(*esd.fEMCALTrigger)),
194 fESDACORDE(new AliESDACORDE(*esd.fESDACORDE)),
195 fESDAD(new AliESDAD(*esd.fESDAD)),
196 fTrdTrigger(new AliESDTrdTrigger(*esd.fTrdTrigger)),
197 fSPDPileupVertices(new TClonesArray(*esd.fSPDPileupVertices)),
198 fTrkPileupVertices(new TClonesArray(*esd.fTrkPileupVertices)),
199 fTracks(new TClonesArray(*esd.fTracks)),
200 fMuonTracks(new TClonesArray(*esd.fMuonTracks)),
201 fMuonClusters(new TClonesArray(*esd.fMuonClusters)),
202 fMuonPads(new TClonesArray(*esd.fMuonPads)),
203 fMuonGlobalTracks(new TClonesArray(*esd.fMuonGlobalTracks)), // AU
204 fPmdTracks(new TClonesArray(*esd.fPmdTracks)),
205 fTrdTracks(new TClonesArray(*esd.fTrdTracks)),
206 fTrdTracklets(new TClonesArray(*esd.fTrdTracklets)),
207 fV0s(new TClonesArray(*esd.fV0s)),
208 fCascades(new TClonesArray(*esd.fCascades)),
209 fKinks(new TClonesArray(*esd.fKinks)),
210 fCaloClusters(new TClonesArray(*esd.fCaloClusters)),
211 fEMCALCells(new AliESDCaloCells(*esd.fEMCALCells)),
212 fPHOSCells(new AliESDCaloCells(*esd.fPHOSCells)),
213 fCosmicTracks(new TClonesArray(*esd.fCosmicTracks)),
214 fESDTOFClusters(esd.fESDTOFClusters ? new TClonesArray(*esd.fESDTOFClusters) : 0),
215 fESDTOFHits(esd.fESDTOFHits ? new TClonesArray(*esd.fESDTOFHits) : 0),
216 fESDTOFMatches(esd.fESDTOFMatches ? new TClonesArray(*esd.fESDTOFMatches) : 0),
217 fErrorLogs(new TClonesArray(*esd.fErrorLogs)),
218 fOldMuonStructure(esd.fOldMuonStructure),
219 fESDOld(esd.fESDOld ? new AliESD(*esd.fESDOld) : 0),
220 fESDFriendOld(esd.fESDFriendOld ? new AliESDfriend(*esd.fESDFriendOld) : 0),
221 fConnected(esd.fConnected),
222 fUseOwnList(esd.fUseOwnList),
223 fTracksConnected(kFALSE),
224 fTOFHeader(new AliTOFHeader(*esd.fTOFHeader)),
225 fCentrality(new AliCentrality(*esd.fCentrality)),
226 fEventplane(new AliEventplane(*esd.fEventplane)),
227 fDetectorStatus(esd.fDetectorStatus),
228 fDAQDetectorPattern(esd.fDAQDetectorPattern),
229 fDAQAttributes(esd.fDAQAttributes)
231 printf("copying ESD event...\n"); // AU
232 // CKB init in the constructor list and only add here ...
237 AddObject(fESDVZERO);
238 AddObject(fESDTZERO);
239 AddObject(fTPCVertex);
240 AddObject(fSPDVertex);
241 AddObject(fPrimaryVertex);
243 AddObject(fPHOSTrigger);
244 AddObject(fEMCALTrigger);
245 AddObject(fTrdTrigger);
246 AddObject(fSPDPileupVertices);
247 AddObject(fTrkPileupVertices);
249 AddObject(fMuonTracks);
250 AddObject(fMuonGlobalTracks); // AU
251 AddObject(fPmdTracks);
252 AddObject(fTrdTracks);
253 AddObject(fTrdTracklets);
255 AddObject(fCascades);
257 AddObject(fCaloClusters);
258 AddObject(fEMCALCells);
259 AddObject(fPHOSCells);
260 AddObject(fCosmicTracks);
261 AddObject(fESDTOFClusters);
262 AddObject(fESDTOFHits);
263 AddObject(fESDTOFMatches);
264 AddObject(fErrorLogs);
265 AddObject(fESDACORDE);
267 AddObject(fTOFHeader);
268 AddObject(fMuonClusters);
269 AddObject(fMuonPads);
274 //______________________________________________________________________________
275 AliESDEvent & AliESDEvent::operator=(const AliESDEvent& source) {
277 // Assignment operator
278 printf("operator = ESD\n");
279 if(&source == this) return *this;
280 AliVEvent::operator=(source);
282 // This assumes that the list is already created
283 // and that the virtual void Copy(Tobject&) function
284 // is correctly implemented in the derived class
285 // otherwise only TObject::Copy() will be used
289 if((fESDObjects->GetSize()==0)&&(source.fESDObjects->GetSize()>=kESDListN)){
290 // We cover the case that we do not yet have the
291 // standard content but the source has it
295 TIter next(source.GetList());
298 while ((its = next())) {
299 name.Form("%s", its->GetName());
300 TObject *mine = fESDObjects->FindObject(name.Data());
302 TClass* pClass=TClass::GetClass(its->ClassName());
304 AliWarning(Form("Can not find class description for entry %s (%s)\n",
305 its->ClassName(), name.Data()));
309 mine=(TObject*)pClass->New();
311 // not in this: can be added to list
312 AliWarning(Form("%s:%d Could not find %s for copying \n",
313 (char*)__FILE__,__LINE__,name.Data()));
316 if(mine->InheritsFrom("TNamed")){
317 ((TNamed*)mine)->SetName(name);
319 else if(mine->InheritsFrom("TCollection")){
320 if(mine->InheritsFrom("TClonesArray")) {
321 TClonesArray* tcits = dynamic_cast<TClonesArray*>(its);
323 dynamic_cast<TClonesArray*>(mine)->SetClass(tcits->GetClass());
325 dynamic_cast<TCollection*>(mine)->SetName(name);
327 AliDebug(1, Form("adding object %s of type %s", mine->GetName(), mine->ClassName()));
331 if(!its->InheritsFrom("TCollection")){
335 else if(its->InheritsFrom("TClonesArray")){
336 // Create or expand the tclonesarray pointers
337 // so we can directly copy to the object
338 TClonesArray *itstca = (TClonesArray*)its;
339 TClonesArray *minetca = (TClonesArray*)mine;
341 // this leaves the capacity of the TClonesArray the same
342 // except for a factor of 2 increase when size > capacity
343 // does not release any memory occupied by the tca
344 minetca->ExpandCreate(itstca->GetEntriesFast());
345 for(int i = 0;i < itstca->GetEntriesFast();++i){
347 TObject *minetcaobj = minetca->At(i);
348 TObject *itstcaobj = itstca->At(i);
349 // no need to delete first
350 // pointers within the class should be handled by Copy()...
351 // Can there be Empty slots?
352 itstcaobj->Copy(*minetcaobj);
356 AliWarning(Form("%s:%d cannot copy TCollection \n",
357 (char*)__FILE__,__LINE__));
361 fOldMuonStructure = source.fOldMuonStructure;
363 fCentrality = source.fCentrality;
364 fEventplane = source.fEventplane;
366 fConnected = source.fConnected;
367 fUseOwnList = source.fUseOwnList;
369 fDetectorStatus = source.fDetectorStatus;
370 fDAQDetectorPattern = source.fDAQDetectorPattern;
371 fDAQAttributes = source.fDAQAttributes;
373 fTracksConnected = kFALSE;
379 //______________________________________________________________________________
380 AliESDEvent::~AliESDEvent()
383 // Standard destructor
386 // everthing on the list gets deleted automatically
389 if(fESDObjects&&!fConnected)
394 if (fCentrality) delete fCentrality;
395 if (fEventplane) delete fEventplane;
400 void AliESDEvent::Copy(TObject &obj) const {
402 // interface to TOBject::Copy
403 // Copies the content of this into obj!
404 // bascially obj = *this
406 if(this==&obj)return;
407 AliESDEvent *robj = dynamic_cast<AliESDEvent*>(&obj);
408 if(!robj)return; // not an AliESEvent
413 //______________________________________________________________________________
414 void AliESDEvent::Reset()
418 // Std content + Non std content
420 // Reset the standard contents
422 fDetectorStatus = 0xFFFFFFFF;
423 fDAQDetectorPattern = 0xFFFF;
424 fDAQAttributes = 0xFFFF;
425 // reset for the old data without AliESDEvent...
426 if(fESDOld)fESDOld->Reset();
428 fESDFriendOld->~AliESDfriend();
429 new (fESDFriendOld) AliESDfriend();
433 if(fESDObjects->GetSize()>kESDListN){
434 // we have non std content
435 // this also covers esdfriends
436 for(int i = kESDListN;i < fESDObjects->GetSize();++i){
437 TObject *pObject = fESDObjects->At(i);
439 if(pObject->InheritsFrom(TClonesArray::Class())){
440 ((TClonesArray*)pObject)->Delete();
442 else if(!pObject->InheritsFrom(TCollection::Class())){
443 TClass *pClass = TClass::GetClass(pObject->ClassName());
444 if (pClass && pClass->GetListOfMethods()->FindObject("Clear")) {
445 AliDebug(1, Form("Clear for object %s class %s", pObject->GetName(), pObject->ClassName()));
449 AliDebug(1, Form("ResetWithPlacementNew for object %s class %s", pObject->GetName(), pObject->ClassName()));
450 ResetWithPlacementNew(pObject);
454 AliWarning(Form("No reset for %s \n",
455 pObject->ClassName()));
462 //______________________________________________________________________________
463 Bool_t AliESDEvent::ResetWithPlacementNew(TObject *pObject){
465 // funtion to reset using the already allocated space
467 Long_t dtoronly = TObject::GetDtorOnly();
468 TClass *pClass = TClass::GetClass(pObject->ClassName());
469 TObject::SetDtorOnly(pObject);
471 // Recreate with placement new
472 pClass->New(pObject);
473 // Restore the state.
474 TObject::SetDtorOnly((void*)dtoronly);
478 //______________________________________________________________________________
479 void AliESDEvent::ResetStdContent()
481 // Reset the standard contents
482 if(fESDRun) fESDRun->Reset();
483 if(fHeader) fHeader->Reset();
484 if(fCentrality) fCentrality->Reset();
485 if(fEventplane) fEventplane->Reset();
486 if(fESDZDC) fESDZDC->Reset();
491 // reset by callin d'to /c'tor keep the pointer
492 fESDVZERO->~AliESDVZERO();
493 new (fESDVZERO) AliESDVZERO();
496 fESDACORDE->~AliESDACORDE();
497 new (fESDACORDE) AliESDACORDE();
502 new (fESDAD) AliESDAD();
506 if(fESDTZERO) fESDTZERO->Reset();
507 // CKB no clear/reset implemented
509 fTPCVertex->~AliESDVertex();
510 new (fTPCVertex) AliESDVertex();
511 fTPCVertex->SetName(fgkESDListName[kTPCVertex]);
514 fSPDVertex->~AliESDVertex();
515 new (fSPDVertex) AliESDVertex();
516 fSPDVertex->SetName(fgkESDListName[kSPDVertex]);
519 fPrimaryVertex->~AliESDVertex();
520 new (fPrimaryVertex) AliESDVertex();
521 fPrimaryVertex->SetName(fgkESDListName[kPrimaryVertex]);
524 fSPDMult->~AliMultiplicity();
525 new (fSPDMult) AliMultiplicity();
528 fTOFHeader->~AliTOFHeader();
529 new (fTOFHeader) AliTOFHeader();
530 //fTOFHeader->SetName(fgkESDListName[kTOFHeader]);
533 fTrdTrigger->~AliESDTrdTrigger();
534 new (fTrdTrigger) AliESDTrdTrigger();
537 if(fPHOSTrigger)fPHOSTrigger->DeAllocate();
538 if(fEMCALTrigger)fEMCALTrigger->DeAllocate();
539 if(fSPDPileupVertices)fSPDPileupVertices->Delete();
540 if(fTrkPileupVertices)fTrkPileupVertices->Delete();
541 fTracksConnected = kFALSE;
542 if(fTracks)fTracks->Delete();
543 if(fMuonTracks)fMuonTracks->Clear("C");
544 if(fMuonClusters)fMuonClusters->Clear("C");
545 if(fMuonPads)fMuonPads->Clear("C");
546 if(fMuonGlobalTracks)fMuonGlobalTracks->Clear("C"); // AU
547 if(fPmdTracks)fPmdTracks->Delete();
548 if(fTrdTracks)fTrdTracks->Delete();
549 if(fTrdTracklets)fTrdTracklets->Delete();
550 if(fV0s)fV0s->Delete();
551 if(fCascades)fCascades->Delete();
552 if(fKinks)fKinks->Delete();
553 if(fCaloClusters)fCaloClusters->Delete();
554 if(fPHOSCells)fPHOSCells->DeleteContainer();
555 if(fEMCALCells)fEMCALCells->DeleteContainer();
556 if(fCosmicTracks)fCosmicTracks->Delete();
557 if(fESDTOFClusters)fESDTOFClusters->Clear();
558 if(fESDTOFHits)fESDTOFHits->Clear();
559 if(fESDTOFMatches)fESDTOFMatches->Clear();
560 if(fErrorLogs) fErrorLogs->Delete();
562 // don't reset fconnected fConnected and the list
567 //______________________________________________________________________________
568 Int_t AliESDEvent::AddV0(const AliESDv0 *v) {
572 TClonesArray &fv = *fV0s;
573 Int_t idx=fV0s->GetEntriesFast();
574 new(fv[idx]) AliESDv0(*v);
578 //______________________________________________________________________________
579 Bool_t AliESDEvent::IsDetectorInTriggerCluster(TString detector, AliTriggerConfiguration* trigConf) const {
580 // Check if a given detector was read-out in the analyzed event
581 const TObjArray& classesArray=trigConf->GetClasses();
582 ULong64_t trigMask=GetTriggerMask();
583 ULong64_t trigMaskNext50=GetTriggerMaskNext50();
584 Int_t nclasses = classesArray.GetEntriesFast();
585 for(Int_t iclass=0; iclass < nclasses; iclass++ ) {
586 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
587 ULong64_t classMask=trclass->GetMask();
588 ULong64_t classMaskNext50=trclass->GetMaskNext50();
589 if(trigMask & classMask){
590 TString detList=trclass->GetCluster()->GetDetectorsInCluster();
591 if(detList.Contains(detector.Data())){
595 if(trigMaskNext50 & classMaskNext50){
596 TString detList=trclass->GetCluster()->GetDetectorsInCluster();
597 if(detList.Contains(detector.Data())){
604 //______________________________________________________________________________
605 void AliESDEvent::Print(Option_t *) const
608 // Print header information of the event
610 printf("ESD run information\n");
611 printf("Event # in file %d Bunch crossing # %d Orbit # %d Period # %d Run # %d Trigger %lld %lld Magnetic field %f \n",
612 GetEventNumberInFile(),
613 GetBunchCrossNumber(),
618 GetTriggerMaskNext50(),
619 GetMagneticField() );
621 printf("Vertex: (%.4f +- %.4f, %.4f +- %.4f, %.4f +- %.4f) cm\n",
622 fPrimaryVertex->GetX(), fPrimaryVertex->GetXRes(),
623 fPrimaryVertex->GetY(), fPrimaryVertex->GetYRes(),
624 fPrimaryVertex->GetZ(), fPrimaryVertex->GetZRes());
625 printf("Mean vertex in RUN: X=%.4f Y=%.4f Z=%.4f cm\n",
626 GetDiamondX(),GetDiamondY(),GetDiamondZ());
628 printf("SPD Multiplicity. Number of tracklets %d \n",
629 fSPDMult->GetNumberOfTracklets());
630 printf("Number of pileup primary vertices reconstructed with SPD %d\n",
631 GetNumberOfPileupVerticesSPD());
632 printf("Number of pileup primary vertices reconstructed using the tracks %d\n",
633 GetNumberOfPileupVerticesTracks());
634 printf("Number of tracks: \n");
635 printf(" charged %d\n", GetNumberOfTracks());
636 printf(" muon %d\n", GetNumberOfMuonTracks());
637 printf(" glob muon %d\n", GetNumberOfMuonGlobalTracks()); // AU
638 printf(" pmd %d\n", GetNumberOfPmdTracks());
639 printf(" trd %d\n", GetNumberOfTrdTracks());
640 printf(" trd trkl %d\n", GetNumberOfTrdTracklets());
641 printf(" v0 %d\n", GetNumberOfV0s());
642 printf(" cascades %d\n", GetNumberOfCascades());
643 printf(" kinks %d\n", GetNumberOfKinks());
644 if(fPHOSCells)printf(" PHOSCells %d\n", fPHOSCells->GetNumberOfCells());
645 else printf(" PHOSCells not in the Event\n");
646 if(fEMCALCells)printf(" EMCALCells %d\n", fEMCALCells->GetNumberOfCells());
647 else printf(" EMCALCells not in the Event\n");
648 printf(" CaloClusters %d\n", GetNumberOfCaloClusters());
649 printf(" FMD %s\n", (fESDFMD ? "yes" : "no"));
650 printf(" VZERO %s\n", (fESDVZERO ? "yes" : "no"));
651 printf(" muClusters %d\n", fMuonClusters ? fMuonClusters->GetEntriesFast() : 0);
652 printf(" muPad %d\n", fMuonPads ? fMuonPads->GetEntriesFast() : 0);
653 if (fCosmicTracks) printf(" Cosmics %d\n", GetNumberOfCosmicTracks());
655 TObject* pHLTDecision=GetHLTTriggerDecision();
656 printf("HLT trigger decision: %s\n", pHLTDecision?pHLTDecision->GetOption():"not available");
657 if (pHLTDecision) pHLTDecision->Print("compact");
662 //______________________________________________________________________________
663 void AliESDEvent::SetESDfriend(const AliESDfriend *ev) const
666 // Attaches the complementary info to the ESD
670 // to be sure that we set the tracks also
671 // in case of old esds
672 // if(fESDOld)CopyFromOldESD();
674 Int_t ntrk=ev->GetNumberOfTracks();
676 for (Int_t i=0; i<ntrk; i++) {
677 const AliESDfriendTrack *f=ev->GetTrack(i);
678 if (!f) {AliFatal(Form("NULL pointer for ESD track %d",i));}
679 GetTrack(i)->SetFriendTrack(f);
683 //______________________________________________________________________________
684 Bool_t AliESDEvent::RemoveKink(Int_t rm) const
686 // ---------------------------------------------------------
687 // Remove a kink candidate and references to it from ESD,
688 // if this candidate does not come from a reconstructed decay
689 // Not yet implemented...
690 // ---------------------------------------------------------
691 Int_t last=GetNumberOfKinks()-1;
692 if ((rm<0)||(rm>last)) return kFALSE;
697 //______________________________________________________________________________
698 Bool_t AliESDEvent::RemoveV0(Int_t rm) const
700 // ---------------------------------------------------------
701 // Remove a V0 candidate and references to it from ESD,
702 // if this candidate does not come from a reconstructed decay
703 // ---------------------------------------------------------
704 Int_t last=GetNumberOfV0s()-1;
705 if ((rm<0)||(rm>last)) return kFALSE;
707 AliESDv0 *v0=GetV0(rm);
708 Int_t idxP=v0->GetPindex(), idxN=v0->GetNindex();
711 Int_t lastIdxP=v0->GetPindex(), lastIdxN=v0->GetNindex();
715 // Check if this V0 comes from a reconstructed decay
716 Int_t ncs=GetNumberOfCascades();
717 for (Int_t n=0; n<ncs; n++) {
718 AliESDcascade *cs=GetCascade(n);
720 Int_t csIdxP=cs->GetPindex();
721 Int_t csIdxN=cs->GetNindex();
724 if (idxN==csIdxN) return kFALSE;
726 if (csIdxP==lastIdxP)
727 if (csIdxN==lastIdxN) used++;
730 //Replace the removed V0 with the last V0
731 TClonesArray &a=*fV0s;
732 delete a.RemoveAt(rm);
734 if (rm==last) return kTRUE;
736 //v0 is pointing to the last V0 candidate...
737 new (a[rm]) AliESDv0(*v0);
738 delete a.RemoveAt(last);
740 if (!used) return kTRUE;
743 // Remap the indices of the daughters of reconstructed decays
744 for (Int_t n=0; n<ncs; n++) {
745 AliESDcascade *cs=GetCascade(n);
748 Int_t csIdxP=cs->GetPindex();
749 Int_t csIdxN=cs->GetNindex();
751 if (csIdxP==lastIdxP)
752 if (csIdxN==lastIdxN) {
753 cs->AliESDv0::SetIndex(1,idxP);
754 cs->AliESDv0::SetIndex(0,idxN);
756 if (!used) return kTRUE;
763 //______________________________________________________________________________
764 Bool_t AliESDEvent::RemoveTrack(Int_t rm) const
766 // ---------------------------------------------------------
767 // Remove a track and references to it from ESD,
768 // if this track does not come from a reconstructed decay
769 // ---------------------------------------------------------
770 Int_t last=GetNumberOfTracks()-1;
771 if ((rm<0)||(rm>last)) return kFALSE;
775 // Check if this track comes from the reconstructed primary vertices
776 if (fTPCVertex && fTPCVertex->GetStatus()) {
777 UShort_t *primIdx=fTPCVertex->GetIndices();
778 Int_t n=fTPCVertex->GetNIndices();
780 Int_t idx=Int_t(primIdx[n]);
781 if (rm==idx) return kFALSE;
782 if (idx==last) used++;
785 if (fPrimaryVertex && fPrimaryVertex->GetStatus()) {
786 UShort_t *primIdx=fPrimaryVertex->GetIndices();
787 Int_t n=fPrimaryVertex->GetNIndices();
789 Int_t idx=Int_t(primIdx[n]);
790 if (rm==idx) return kFALSE;
791 if (idx==last) used++;
795 // Check if this track comes from a reconstructed decay
796 Int_t nv0=GetNumberOfV0s();
797 for (Int_t n=0; n<nv0; n++) {
798 AliESDv0 *v0=GetV0(n);
800 Int_t idx=v0->GetNindex();
801 if (rm==idx) return kFALSE;
802 if (idx==last) used++;
805 if (rm==idx) return kFALSE;
806 if (idx==last) used++;
809 Int_t ncs=GetNumberOfCascades();
810 for (Int_t n=0; n<ncs; n++) {
811 AliESDcascade *cs=GetCascade(n);
813 Int_t idx=cs->GetIndex();
814 if (rm==idx) return kFALSE;
815 if (idx==last) used++;
819 if (rm==idx) return kFALSE;
820 if (idx==last) used++;
823 if (rm==idx) return kFALSE;
824 if (idx==last) used++;
827 Int_t nkn=GetNumberOfKinks();
828 for (Int_t n=0; n<nkn; n++) {
829 AliESDkink *kn=GetKink(n);
831 Int_t idx=kn->GetIndex(0);
832 if (rm==idx) return kFALSE;
833 if (idx==last) used++;
836 if (rm==idx) return kFALSE;
837 if (idx==last) used++;
840 // Check if this track is associated with a CaloCluster
841 Int_t ncl=GetNumberOfCaloClusters();
842 for (Int_t n=0; n<ncl; n++) {
843 AliESDCaloCluster *cluster=GetCaloCluster(n);
844 TArrayI *arr=cluster->GetTracksMatched();
845 Int_t s=arr->GetSize();
847 Int_t idx=arr->At(s);
848 if (rm==idx) return kFALSE;
849 if (idx==last) used++;
853 // from here on we remove the track
855 //Replace the removed track with the last track
856 TClonesArray &a=*fTracks;
857 AliESDtrack* trm = GetTrack(rm);
858 trm->SuppressTOFMatches(); // remove reference to this track from stored TOF clusters
859 delete a.RemoveAt(rm);
861 if (rm==last) return kTRUE;
863 AliESDtrack *t=GetTrack(last);
864 if (!t) {AliFatal(Form("NULL pointer for ESD track %d",last));}
866 new (a[rm]) AliESDtrack(*t);
867 delete a.RemoveAt(last);
869 if (!used) return kTRUE;
872 // Remap the indices of the tracks used for the primary vertex reconstruction
873 if (fTPCVertex && fTPCVertex->GetStatus()) {
874 UShort_t *primIdx=fTPCVertex->GetIndices();
875 Int_t n=fTPCVertex->GetNIndices();
877 Int_t idx=Int_t(primIdx[n]);
879 primIdx[n]=Short_t(rm);
881 if (!used) return kTRUE;
885 if (fPrimaryVertex && fPrimaryVertex->GetStatus()) {
886 UShort_t *primIdx=fPrimaryVertex->GetIndices();
887 Int_t n=fPrimaryVertex->GetNIndices();
889 Int_t idx=Int_t(primIdx[n]);
891 primIdx[n]=Short_t(rm);
893 if (!used) return kTRUE;
898 // Remap the indices of the daughters of reconstructed decays
899 for (Int_t n=0; n<nv0; n++) {
900 AliESDv0 *v0=GetV0(n);
901 if (v0->GetIndex(0)==last) {
904 if (!used) return kTRUE;
906 if (v0->GetIndex(1)==last) {
909 if (!used) return kTRUE;
913 for (Int_t n=0; n<ncs; n++) {
914 AliESDcascade *cs=GetCascade(n);
915 if (cs->GetIndex()==last) {
918 if (!used) return kTRUE;
921 if (v0->GetIndex(0)==last) {
924 if (!used) return kTRUE;
926 if (v0->GetIndex(1)==last) {
929 if (!used) return kTRUE;
933 for (Int_t n=0; n<nkn; n++) {
934 AliESDkink *kn=GetKink(n);
935 if (kn->GetIndex(0)==last) {
938 if (!used) return kTRUE;
940 if (kn->GetIndex(1)==last) {
943 if (!used) return kTRUE;
947 // Remap the indices of the tracks accosicated with CaloClusters
948 for (Int_t n=0; n<ncl; n++) {
949 AliESDCaloCluster *cluster=GetCaloCluster(n);
950 TArrayI *arr=cluster->GetTracksMatched();
951 Int_t s=arr->GetSize();
953 Int_t idx=arr->At(s);
957 if (!used) return kTRUE;
965 //______________________________________________________________________________
966 Bool_t AliESDEvent::Clean(Float_t *cleanPars)
969 // Remove the data which are not needed for the physics analysis.
971 // 1) Cleaning the V0 candidates
972 // ---------------------------
973 // If the cosine of the V0 pointing angle "csp" and
974 // the DCA between the daughter tracks "dca" does not satisfy
977 // csp > cleanPars[1] + dca/cleanPars[0]*(1.- cleanPars[1])
979 // an attempt to remove this V0 candidate from ESD is made.
981 // The V0 candidate gets removed if it does not belong to any
982 // recosntructed cascade decay
984 // 12.11.2007, optimal values: cleanPars[0]=0.5, cleanPars[1]=0.999
986 // 2) Cleaning the tracks
987 // ----------------------
988 // If track's transverse parameter is larger than cleanPars[2]
990 // track's longitudinal parameter is larger than cleanPars[3]
991 // an attempt to remove this track from ESD is made.
993 // The track gets removed if it does not come
994 // from a reconstructed decay
998 Float_t dcaMax=cleanPars[0];
999 Float_t cspMin=cleanPars[1];
1001 Int_t nV0s=GetNumberOfV0s();
1002 for (Int_t i=nV0s-1; i>=0; i--) {
1003 AliESDv0 *v0=GetV0(i);
1005 Float_t dca=v0->GetDcaV0Daughters();
1006 Float_t csp=v0->GetV0CosineOfPointingAngle();
1007 Float_t cspcut=cspMin + dca/dcaMax*(1.-cspMin);
1008 if (csp > cspcut) continue;
1009 if (RemoveV0(i)) rc=kTRUE;
1013 Float_t dmax=cleanPars[2], zmax=cleanPars[3];
1015 const AliESDVertex *vertex=GetPrimaryVertexSPD();
1016 Bool_t vtxOK=vertex->GetStatus();
1018 Int_t nTracks=GetNumberOfTracks();
1019 for (Int_t i=nTracks-1; i>=0; i--) {
1020 AliESDtrack *track=GetTrack(i);
1021 if (!track) {AliFatal(Form("NULL pointer for ESD track %d",i));}
1022 Float_t xy,z; track->GetImpactParameters(xy,z);
1023 if ((TMath::Abs(xy) > dmax) || (vtxOK && (TMath::Abs(z) > zmax))) {
1024 if (RemoveTrack(i)) rc=kTRUE;
1031 //______________________________________________________________________________
1032 Char_t AliESDEvent::AddPileupVertexSPD(const AliESDVertex *vtx)
1034 // Add a pileup primary vertex reconstructed with SPD
1035 TClonesArray &ftr = *fSPDPileupVertices;
1036 Char_t n=Char_t(ftr.GetEntriesFast());
1037 AliESDVertex *vertex = new(ftr[n]) AliESDVertex(*vtx);
1042 //______________________________________________________________________________
1043 Char_t AliESDEvent::AddPileupVertexTracks(const AliESDVertex *vtx)
1045 // Add a pileup primary vertex reconstructed with SPD
1046 TClonesArray &ftr = *fTrkPileupVertices;
1047 Char_t n=Char_t(ftr.GetEntriesFast());
1048 AliESDVertex *vertex = new(ftr[n]) AliESDVertex(*vtx);
1053 //______________________________________________________________________________
1054 Int_t AliESDEvent::AddTrack(const AliESDtrack *t)
1057 TClonesArray &ftr = *fTracks;
1058 AliESDtrack * track = new(ftr[fTracks->GetEntriesFast()])AliESDtrack(*t);
1059 track->SetID(fTracks->GetEntriesFast()-1);
1060 track->SetESDEvent(this);
1061 return track->GetID();
1064 //______________________________________________________________________________
1065 AliESDtrack* AliESDEvent::NewTrack()
1068 TClonesArray &ftr = *fTracks;
1069 AliESDtrack * track = new(ftr[fTracks->GetEntriesFast()])AliESDtrack();
1070 track->SetID(fTracks->GetEntriesFast()-1);
1071 track->SetESDEvent(this);
1075 //______________________________________________________________________________
1076 Bool_t AliESDEvent::MoveMuonObjects()
1078 // move MUON clusters and pads to the new ESD structure in needed.
1079 // to ensure backward compatibility
1081 if (!fOldMuonStructure) return kTRUE;
1083 if (!fMuonTracks || !fMuonClusters || !fMuonPads) return kFALSE;
1085 Bool_t reset = kTRUE;
1086 Bool_t containTrackerData = kFALSE;
1087 for (Int_t i = 0; i < fMuonTracks->GetEntriesFast(); i++) {
1089 AliESDMuonTrack *track = (AliESDMuonTrack*) fMuonTracks->UncheckedAt(i);
1091 if (track->ContainTrackerData()) containTrackerData = kTRUE;
1094 if (!track->IsOldTrack()) continue;
1096 // remove objects connected to previous event if needed
1098 if (fMuonClusters->GetEntriesFast() > 0) fMuonClusters->Clear("C");
1099 if (fMuonPads->GetEntriesFast() > 0) fMuonPads->Clear("C");
1103 track->MoveClustersToESD(*this);
1107 // remove objects connected to previous event if needed
1108 if (!containTrackerData) {
1109 if (fMuonClusters->GetEntriesFast() > 0) fMuonClusters->Clear("C");
1110 if (fMuonPads->GetEntriesFast() > 0) fMuonPads->Clear("C");
1116 //______________________________________________________________________________
1117 AliESDMuonTrack* AliESDEvent::GetMuonTrack(Int_t i)
1119 // get the MUON track at the position i in the internal array of track
1120 if (!fMuonTracks) return 0x0;
1121 if (!MoveMuonObjects()) return 0x0;
1122 AliESDMuonTrack *track = (AliESDMuonTrack*) fMuonTracks->UncheckedAt(i);
1123 track->SetESDEvent(this);
1127 //______________________________________________________________________________
1128 AliESDMuonGlobalTrack* AliESDEvent::GetMuonGlobalTrack(Int_t i) // AU
1130 // get the MUON+MFT track at the position i in the internal array of track
1131 if (!fMuonGlobalTracks) return 0x0;
1132 AliESDMuonGlobalTrack *track = (AliESDMuonGlobalTrack*) fMuonGlobalTracks->UncheckedAt(i);
1133 track->SetESDEvent(this);
1137 //______________________________________________________________________________
1138 void AliESDEvent::AddMuonTrack(const AliESDMuonTrack *t)
1141 TClonesArray &fmu = *fMuonTracks;
1142 AliESDMuonTrack *track = new(fmu[fMuonTracks->GetEntriesFast()]) AliESDMuonTrack(*t);
1143 track->MoveClustersToESD(*this);
1146 //______________________________________________________________________________
1147 void AliESDEvent::AddMuonGlobalTrack(const AliESDMuonGlobalTrack *t) // AU
1149 // add a MUON+MFT track
1150 TClonesArray &fmu = *fMuonGlobalTracks;
1151 new (fmu[fMuonGlobalTracks->GetEntriesFast()]) AliESDMuonGlobalTrack(*t);
1154 //______________________________________________________________________________
1156 AliESDMuonTrack* AliESDEvent::NewMuonTrack()
1158 // create a new MUON track at the end of the internal array of track
1159 TClonesArray &fmu = *fMuonTracks;
1160 return new(fmu[fMuonTracks->GetEntriesFast()]) AliESDMuonTrack();
1163 //______________________________________________________________________________
1164 AliESDMuonGlobalTrack* AliESDEvent::NewMuonGlobalTrack() // AU
1166 // create a new MUON+MFT track at the end of the internal array of track
1167 TClonesArray &fmu = *fMuonGlobalTracks;
1168 return new(fmu[fMuonGlobalTracks->GetEntriesFast()]) AliESDMuonGlobalTrack();
1171 //______________________________________________________________________________
1172 Int_t AliESDEvent::GetNumberOfMuonClusters()
1174 // get the number of MUON clusters
1175 if (!fMuonClusters) return 0;
1176 if (!MoveMuonObjects()) return 0;
1177 return fMuonClusters->GetEntriesFast();
1180 //______________________________________________________________________________
1181 AliESDMuonCluster* AliESDEvent::GetMuonCluster(Int_t i)
1183 // get the MUON cluster at the position i in the internal array of cluster
1184 if (!fMuonClusters) return 0x0;
1185 if (!MoveMuonObjects()) return 0x0;
1186 return (AliESDMuonCluster*) fMuonClusters->UncheckedAt(i);
1189 //______________________________________________________________________________
1190 AliESDMuonCluster* AliESDEvent::FindMuonCluster(UInt_t clusterId)
1192 // find the MUON cluster with this Id in the internal array of cluster
1193 if (!fMuonClusters) return 0x0;
1194 if (!MoveMuonObjects()) return 0x0;
1195 for (Int_t i = 0; i < fMuonClusters->GetEntriesFast(); i++) {
1196 AliESDMuonCluster *cluster = (AliESDMuonCluster*) fMuonClusters->UncheckedAt(i);
1197 if (cluster->GetUniqueID() == clusterId) return cluster;
1202 //______________________________________________________________________________
1203 AliESDMuonCluster* AliESDEvent::NewMuonCluster()
1205 // create a new MUON cluster at the end of the internal array of cluster
1206 TClonesArray &fmu = *fMuonClusters;
1207 return new(fmu[fMuonClusters->GetEntriesFast()]) AliESDMuonCluster();
1210 //______________________________________________________________________________
1211 Int_t AliESDEvent::GetNumberOfMuonPads()
1213 // get the number of MUON pads
1214 if (!fMuonPads) return 0;
1215 if (!MoveMuonObjects()) return 0;
1216 return fMuonPads->GetEntriesFast();
1219 //______________________________________________________________________________
1220 AliESDMuonPad* AliESDEvent::GetMuonPad(Int_t i)
1222 // get the MUON pad at the position i in the internal array of pad
1223 if (!fMuonPads) return 0x0;
1224 if (!MoveMuonObjects()) return 0x0;
1225 return (AliESDMuonPad*) fMuonPads->UncheckedAt(i);
1228 //______________________________________________________________________________
1229 AliESDMuonPad* AliESDEvent::FindMuonPad(UInt_t padId)
1231 // find the MUON pad with this Id in the internal array of pad
1232 if (!fMuonPads) return 0x0;
1233 if (!MoveMuonObjects()) return 0x0;
1234 for (Int_t i = 0; i < fMuonPads->GetEntriesFast(); i++) {
1235 AliESDMuonPad *pad = (AliESDMuonPad*) fMuonPads->UncheckedAt(i);
1236 if (pad->GetUniqueID() == padId) return pad;
1241 //______________________________________________________________________________
1242 AliESDMuonPad* AliESDEvent::NewMuonPad()
1244 // create a new MUON pad at the end of the internal array of pad
1245 TClonesArray &fmu = *fMuonPads;
1246 return new(fmu[fMuonPads->GetEntriesFast()]) AliESDMuonPad();
1249 //______________________________________________________________________________
1250 void AliESDEvent::AddPmdTrack(const AliESDPmdTrack *t)
1252 TClonesArray &fpmd = *fPmdTracks;
1253 new(fpmd[fPmdTracks->GetEntriesFast()]) AliESDPmdTrack(*t);
1256 //______________________________________________________________________________
1257 void AliESDEvent::SetTrdTrigger(const AliESDTrdTrigger *t)
1262 //______________________________________________________________________________
1263 void AliESDEvent::AddTrdTrack(const AliESDTrdTrack *t)
1265 TClonesArray &ftrd = *fTrdTracks;
1266 new(ftrd[fTrdTracks->GetEntriesFast()]) AliESDTrdTrack(*t);
1269 //______________________________________________________________________________
1270 void AliESDEvent::AddTrdTracklet(const AliESDTrdTracklet *trkl)
1272 new ((*fTrdTracklets)[fTrdTracklets->GetEntriesFast()]) AliESDTrdTracklet(*trkl);
1275 //______________________________________________________________________________
1276 void AliESDEvent::AddTrdTracklet(UInt_t trackletWord, Short_t hcid, Int_t label)
1278 new ((*fTrdTracklets)[fTrdTracklets->GetEntriesFast()]) AliESDTrdTracklet(trackletWord, hcid, label);
1281 //______________________________________________________________________________
1282 Int_t AliESDEvent::AddKink(const AliESDkink *c)
1285 TClonesArray &fk = *fKinks;
1286 AliESDkink * kink = new(fk[fKinks->GetEntriesFast()]) AliESDkink(*c);
1287 kink->SetID(fKinks->GetEntriesFast()); // CKB different from the other imps..
1288 return fKinks->GetEntriesFast()-1;
1292 //______________________________________________________________________________
1293 void AliESDEvent::AddCascade(const AliESDcascade *c)
1295 TClonesArray &fc = *fCascades;
1296 new(fc[fCascades->GetEntriesFast()]) AliESDcascade(*c);
1299 //______________________________________________________________________________
1300 void AliESDEvent::AddCosmicTrack(const AliESDCosmicTrack *t)
1302 TClonesArray &ft = *fCosmicTracks;
1303 new(ft[fCosmicTracks->GetEntriesFast()]) AliESDCosmicTrack(*t);
1307 //______________________________________________________________________________
1308 Int_t AliESDEvent::AddCaloCluster(const AliESDCaloCluster *c)
1311 TClonesArray &fc = *fCaloClusters;
1312 AliESDCaloCluster *clus = new(fc[fCaloClusters->GetEntriesFast()]) AliESDCaloCluster(*c);
1313 clus->SetID(fCaloClusters->GetEntriesFast()-1);
1314 return fCaloClusters->GetEntriesFast()-1;
1318 //______________________________________________________________________________
1319 void AliESDEvent::AddRawDataErrorLog(const AliRawDataErrorLog *log) const {
1320 TClonesArray &errlogs = *fErrorLogs;
1321 new(errlogs[errlogs.GetEntriesFast()]) AliRawDataErrorLog(*log);
1324 //______________________________________________________________________________
1325 void AliESDEvent::SetZDCData(const AliESDZDC * obj)
1327 // use already allocated space
1332 //______________________________________________________________________________
1333 void AliESDEvent::SetPrimaryVertexTPC(const AliESDVertex *vertex)
1335 // Set the TPC vertex
1336 // use already allocated space
1338 *fTPCVertex = *vertex;
1339 fTPCVertex->SetName(fgkESDListName[kTPCVertex]);
1343 //______________________________________________________________________________
1344 void AliESDEvent::SetPrimaryVertexSPD(const AliESDVertex *vertex)
1346 // Set the SPD vertex
1347 // use already allocated space
1349 *fSPDVertex = *vertex;
1350 fSPDVertex->SetName(fgkESDListName[kSPDVertex]);
1354 //______________________________________________________________________________
1355 void AliESDEvent::SetPrimaryVertexTracks(const AliESDVertex *vertex)
1357 // Set the primary vertex reconstructed using he ESD tracks.
1358 // use already allocated space
1360 *fPrimaryVertex = *vertex;
1361 fPrimaryVertex->SetName(fgkESDListName[kPrimaryVertex]);
1365 //______________________________________________________________________________
1366 const AliESDVertex * AliESDEvent::GetPrimaryVertex() const
1369 // Get the "best" available reconstructed primary vertex.
1372 if (fPrimaryVertex->GetStatus()) return fPrimaryVertex;
1375 if (fSPDVertex->GetStatus()) return fSPDVertex;
1377 if(fTPCVertex) return fTPCVertex;
1379 AliWarning("No primary vertex available. Returning the \"default\"...");
1383 //______________________________________________________________________________
1384 AliESDVertex * AliESDEvent::PrimaryVertexTracksUnconstrained() const
1387 // Removes diamond constraint from fPrimaryVertex (reconstructed with tracks)
1388 // Returns a AliESDVertex which has to be deleted by the user
1390 if(!fPrimaryVertex) {
1391 AliWarning("No primary vertex from tracks available.");
1394 if(!fPrimaryVertex->GetStatus()) {
1395 AliWarning("No primary vertex from tracks available.");
1399 AliVertexerTracks vertexer(GetMagneticField());
1400 Float_t diamondxyz[3]={(Float_t)GetDiamondX(),(Float_t)GetDiamondY(),0.};
1401 Float_t diamondcovxy[3]; GetDiamondCovXY(diamondcovxy);
1402 Float_t diamondcov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,7.};
1403 AliESDVertex *vertex =
1404 (AliESDVertex*)vertexer.RemoveConstraintFromVertex(fPrimaryVertex,diamondxyz,diamondcov);
1409 //______________________________________________________________________________
1410 void AliESDEvent::SetMultiplicity(const AliMultiplicity *mul)
1412 // Set the SPD Multiplicity
1419 //______________________________________________________________________________
1420 void AliESDEvent::SetFMDData(AliESDFMD * obj)
1422 // use already allocated space
1428 //______________________________________________________________________________
1429 void AliESDEvent::SetVZEROData(const AliESDVZERO * obj)
1431 // use already allocated space
1436 //______________________________________________________________________________
1437 void AliESDEvent::SetTZEROData(const AliESDTZERO * obj)
1439 // use already allocated space
1445 //______________________________________________________________________________
1446 void AliESDEvent::SetACORDEData(AliESDACORDE * obj)
1452 //______________________________________________________________________________
1453 void AliESDEvent::SetADData(AliESDAD * obj)
1459 //______________________________________________________________________________
1460 void AliESDEvent::GetESDfriend(AliESDfriend *ev) const
1463 // Extracts the complementary info from the ESD
1467 Int_t ntrk=GetNumberOfTracks();
1469 for (Int_t i=0; i<ntrk; i++) {
1470 AliESDtrack *t=GetTrack(i);
1471 if (!t) {AliFatal(Form("NULL pointer for ESD track %d",i));}
1472 const AliESDfriendTrack *f=t->GetFriendTrack();
1475 t->ReleaseESDfriendTrack();// Not to have two copies of "friendTrack"
1479 AliESDfriend *fr = (AliESDfriend*)(const_cast<AliESDEvent*>(this)->FindFriend());
1480 if (fr) ev->SetVZEROfriend(fr->GetVZEROfriend());
1483 //______________________________________________________________________________
1484 void AliESDEvent::AddObject(TObject* obj)
1486 // Add an object to the list of object.
1487 // Please be aware that in order to increase performance you should
1488 // refrain from using TObjArrays (if possible). Use TClonesArrays, instead.
1489 fESDObjects->SetOwner(kTRUE);
1490 fESDObjects->AddLast(obj);
1493 //______________________________________________________________________________
1494 void AliESDEvent::GetStdContent()
1496 // set pointers for standard content
1497 // get by name much safer and not a big overhead since not called very often
1499 fESDRun = (AliESDRun*)fESDObjects->FindObject(fgkESDListName[kESDRun]);
1500 fHeader = (AliESDHeader*)fESDObjects->FindObject(fgkESDListName[kHeader]);
1501 fESDZDC = (AliESDZDC*)fESDObjects->FindObject(fgkESDListName[kESDZDC]);
1502 fESDFMD = (AliESDFMD*)fESDObjects->FindObject(fgkESDListName[kESDFMD]);
1503 fESDVZERO = (AliESDVZERO*)fESDObjects->FindObject(fgkESDListName[kESDVZERO]);
1504 fESDTZERO = (AliESDTZERO*)fESDObjects->FindObject(fgkESDListName[kESDTZERO]);
1505 fTPCVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kTPCVertex]);
1506 fSPDVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kSPDVertex]);
1507 fPrimaryVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kPrimaryVertex]);
1508 fSPDMult = (AliMultiplicity*)fESDObjects->FindObject(fgkESDListName[kSPDMult]);
1509 fPHOSTrigger = (AliESDCaloTrigger*)fESDObjects->FindObject(fgkESDListName[kPHOSTrigger]);
1510 fEMCALTrigger = (AliESDCaloTrigger*)fESDObjects->FindObject(fgkESDListName[kEMCALTrigger]);
1511 fSPDPileupVertices = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kSPDPileupVertices]);
1512 fTrkPileupVertices = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTrkPileupVertices]);
1513 fTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTracks]);
1514 fMuonTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kMuonTracks]);
1515 fMuonClusters = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kMuonClusters]);
1516 fMuonPads = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kMuonPads]);
1517 fMuonGlobalTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kMuonGlobalTracks]); // AU
1518 fPmdTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kPmdTracks]);
1519 fTrdTrigger = (AliESDTrdTrigger*)fESDObjects->FindObject(fgkESDListName[kTrdTrigger]);
1520 fTrdTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTrdTracks]);
1521 fTrdTracklets = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTrdTracklets]);
1522 fV0s = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kV0s]);
1523 fCascades = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kCascades]);
1524 fKinks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kKinks]);
1525 fCaloClusters = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kCaloClusters]);
1526 fEMCALCells = (AliESDCaloCells*)fESDObjects->FindObject(fgkESDListName[kEMCALCells]);
1527 fPHOSCells = (AliESDCaloCells*)fESDObjects->FindObject(fgkESDListName[kPHOSCells]);
1528 fErrorLogs = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kErrorLogs]);
1529 fESDACORDE = (AliESDACORDE*)fESDObjects->FindObject(fgkESDListName[kESDACORDE]);
1530 fESDAD = (AliESDAD*)fESDObjects->FindObject(fgkESDListName[kESDAD]);
1531 fTOFHeader = (AliTOFHeader*)fESDObjects->FindObject(fgkESDListName[kTOFHeader]);
1532 fCosmicTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kCosmicTracks]);
1533 fESDTOFClusters = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTOFclusters]);
1534 fESDTOFHits = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTOFhit]);
1535 fESDTOFMatches = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTOFmatch]);
1538 //______________________________________________________________________________
1539 void AliESDEvent::SetStdNames(){
1540 // Set the names of the standard contents
1542 if(fESDObjects->GetEntries()>=kESDListN){
1543 for(int i = 0;i < fESDObjects->GetEntries() && i<kESDListN;i++){
1544 TObject *fObj = fESDObjects->At(i);
1545 if(fObj->InheritsFrom("TNamed")){
1546 ((TNamed*)fObj)->SetName(fgkESDListName[i]);
1548 else if(fObj->InheritsFrom("TClonesArray")){
1549 ((TClonesArray*)fObj)->SetName(fgkESDListName[i]);
1554 AliWarning("Std Entries missing");
1558 //______________________________________________________________________________
1559 void AliESDEvent::CreateStdContent(Bool_t bUseThisList){
1560 fUseOwnList = bUseThisList;
1564 //______________________________________________________________________________
1565 void AliESDEvent::CreateStdContent()
1567 // create the standard AOD content and set pointers
1569 // create standard objects and add them to the TList of objects
1570 AddObject(new AliESDRun());
1571 AddObject(new AliESDHeader());
1572 AddObject(new AliESDZDC());
1573 AddObject(new AliESDFMD());
1574 AddObject(new AliESDVZERO());
1575 AddObject(new AliESDTZERO());
1576 AddObject(new AliESDVertex());
1577 AddObject(new AliESDVertex());
1578 AddObject(new AliESDVertex());
1579 AddObject(new AliMultiplicity());
1580 AddObject(new AliESDCaloTrigger());
1581 AddObject(new AliESDCaloTrigger());
1582 AddObject(new TClonesArray("AliESDVertex",0));
1583 AddObject(new TClonesArray("AliESDVertex",0));
1584 AddObject(new TClonesArray("AliESDtrack",0));
1585 AddObject(new TClonesArray("AliESDMuonTrack",0));
1586 AddObject(new TClonesArray("AliESDMuonCluster",0));
1587 AddObject(new TClonesArray("AliESDMuonPad",0));
1588 AddObject(new TClonesArray("AliESDMuonGlobalTrack",0)); // AU
1589 AddObject(new TClonesArray("AliESDPmdTrack",0));
1590 AddObject(new AliESDTrdTrigger());
1591 AddObject(new TClonesArray("AliESDTrdTrack",0));
1592 AddObject(new TClonesArray("AliESDTrdTracklet",0));
1593 AddObject(new TClonesArray("AliESDv0",0));
1594 AddObject(new TClonesArray("AliESDcascade",0));
1595 AddObject(new TClonesArray("AliESDkink",0));
1596 AddObject(new TClonesArray("AliESDCaloCluster",0));
1597 AddObject(new AliESDCaloCells());
1598 AddObject(new AliESDCaloCells());
1599 AddObject(new TClonesArray("AliRawDataErrorLog",0));
1600 AddObject(new AliESDACORDE());
1601 AddObject(new AliESDAD());
1602 AddObject(new AliTOFHeader());
1603 AddObject(new TClonesArray("AliESDCosmicTrack",0));
1604 AddObject(new TClonesArray("AliESDTOFCluster",0));
1605 AddObject(new TClonesArray("AliESDTOFHit",0));
1606 AddObject(new TClonesArray("AliESDTOFMatch",0));
1608 // check the order of the indices against enum...
1612 // read back pointers
1616 //______________________________________________________________________________
1617 void AliESDEvent::CompleteStdContent()
1619 // Create missing standard objects and add them to the TList of objects
1621 // Add cosmic tracks for cases where esd files were created
1622 // before adding them to the std content
1623 if (!fESDObjects->FindObject(fgkESDListName[kCosmicTracks])) {
1624 TClonesArray* cosmics = new TClonesArray("AliESDCosmicTrack",0);
1625 fESDObjects->AddAt(cosmics, kCosmicTracks);
1626 fESDObjects->SetOwner(kTRUE);
1628 // Add new MUON containers if missing (for backward compatibility)
1629 if (!fESDObjects->FindObject(fgkESDListName[kMuonClusters])) {
1630 TClonesArray* muonClusters = new TClonesArray("AliESDMuonCluster",0);
1631 muonClusters->SetName(fgkESDListName[kMuonClusters]);
1632 fESDObjects->AddAt(muonClusters, kMuonClusters);
1633 fESDObjects->SetOwner(kTRUE);
1635 if (!fESDObjects->FindObject(fgkESDListName[kMuonPads])) {
1636 TClonesArray* muonPads = new TClonesArray("AliESDMuonPad",0);
1637 muonPads->SetName(fgkESDListName[kMuonPads]);
1638 fESDObjects->AddAt(muonPads, kMuonPads);
1639 fESDObjects->SetOwner(kTRUE);
1643 //______________________________________________________________________________
1644 TObject* AliESDEvent::FindListObject(const char *name) const {
1646 // Find object with name "name" in the list of branches
1649 return fESDObjects->FindObject(name);
1654 //______________________________________________________________________________
1655 Int_t AliESDEvent::GetPHOSClusters(TRefArray *clusters) const
1657 // fills the provided TRefArray with all found phos clusters
1661 AliESDCaloCluster *cl = 0;
1662 for (Int_t i = 0; i < GetNumberOfCaloClusters(); i++) {
1664 if ( (cl = GetCaloCluster(i)) ) {
1667 AliDebug(1,Form("IsPHOS cluster %d Size: %d \n",i,clusters->GetEntriesFast()));
1671 return clusters->GetEntriesFast();
1674 //______________________________________________________________________________
1675 Int_t AliESDEvent::GetEMCALClusters(TRefArray *clusters) const
1677 // fills the provided TRefArray with all found emcal clusters
1681 AliESDCaloCluster *cl = 0;
1682 for (Int_t i = 0; i < GetNumberOfCaloClusters(); i++) {
1684 if ( (cl = GetCaloCluster(i)) ) {
1687 AliDebug(1,Form("IsEMCAL cluster %d Size: %d \n",i,clusters->GetEntriesFast()));
1691 return clusters->GetEntriesFast();
1694 //______________________________________________________________________________
1695 void AliESDEvent::WriteToTree(TTree* tree) const {
1696 // Book the branches as in TTree::Branch(TCollection*)
1697 // but add a "." at the end of top level branches which are
1698 // not a TClonesArray
1702 TIter next(fESDObjects);
1703 const Int_t kSplitlevel = 99; // default value in TTree::Branch()
1704 const Int_t kBufsize = 32000; // default value in TTree::Branch()
1707 while ((obj = next())) {
1708 branchname.Form("%s", obj->GetName());
1709 if(branchname.CompareTo("AliESDfriend")==0)branchname = "ESDfriend.";
1710 if ((kSplitlevel > 1) && !obj->InheritsFrom(TClonesArray::Class())) {
1711 if(!branchname.EndsWith("."))branchname += ".";
1713 if (!tree->FindBranch(branchname)) {
1714 // For the custom streamer to be called splitlevel
1715 // has to be negative, only needed for HLT
1716 Int_t splitLevel = (TString(obj->ClassName()) == "AliHLTGlobalTriggerDecision") ? -1 : kSplitlevel - 1;
1717 tree->Bronch(branchname, obj->ClassName(), fESDObjects->GetObjectRef(obj),kBufsize, splitLevel);
1721 tree->Branch("fDetectorStatus",(void*)&fDetectorStatus,"fDetectorStatus/l");
1722 tree->Branch("fDAQDetectorPattern",(void*)&fDAQDetectorPattern,"fDAQDetectorPattern/i");
1723 tree->Branch("fDAQAttributes",(void*)&fDAQAttributes,"fDAQAttributes/i");
1726 //______________________________________________________________________________
1727 void AliESDEvent::ReadFromTree(TTree *tree, Option_t* opt){
1729 // Connect the ESDEvent to a tree
1732 AliWarning("AliESDEvent::ReadFromTree() Zero Pointer to Tree \n");
1736 if(!tree->GetTree())tree->LoadTree(0);
1738 // if we find the "ESD" branch on the tree we do have the old structure
1739 if(tree->GetBranch("ESD")) {
1740 fOldMuonStructure = kFALSE;
1741 char ** address = (char **)(tree->GetBranch("ESD")->GetAddress());
1742 // do we have the friend branch
1743 TBranch * esdFB = tree->GetBranch("ESDfriend.");
1744 char ** addressF = 0;
1745 if(esdFB)addressF = (char **)(esdFB->GetAddress());
1747 AliInfo("AliESDEvent::ReadFromTree() Reading old Tree");
1748 tree->SetBranchAddress("ESD", &fESDOld);
1750 tree->SetBranchAddress("ESDfriend.",&fESDFriendOld);
1753 AliInfo("AliESDEvent::ReadFromTree() Reading old Tree");
1754 AliInfo("Branch already connected. Using existing branch address.");
1755 fESDOld = (AliESD*) (*address);
1756 // addressF can still be 0, since branch needs to switched on
1757 if(addressF)fESDFriendOld = (AliESDfriend*) (*addressF);
1760 // have already connected the old ESD structure... ?
1761 // reuse also the pointer of the AlliESDEvent
1762 // otherwise create new ones
1763 TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("ESDObjectsConnectedToTree"));
1766 // If connected use the connected list of objects
1767 if(fESDObjects!= connectedList){
1768 // protect when called twice
1769 fESDObjects->Delete();
1770 fESDObjects = connectedList;
1775 // The pointer to the friend changes when called twice via InitIO
1776 // since AliESDEvent is deleted
1777 TObject* oldf = FindListObject("AliESDfriend");
1780 newf = (TObject*)*addressF;
1782 if(newf!=0&&oldf!=newf){
1783 // remove the old reference
1784 // Should we also delete it? Or is this handled in TTree I/O
1785 // since it is created by the first SetBranchAddress
1786 fESDObjects->Remove(oldf);
1788 fESDObjects->Add(newf);
1795 CreateStdContent(); // create for copy
1796 // if we have the esdfriend add it, so we always can access it via the userinfo
1797 if(fESDFriendOld)AddObject(fESDFriendOld);
1798 // we are not owner of the list objects
1799 // must not delete it
1800 fESDObjects->SetOwner(kTRUE);
1801 fESDObjects->SetName("ESDObjectsConnectedToTree");
1802 tree->GetUserInfo()->Add(fESDObjects);
1810 // Try to find AliESDEvent
1811 AliESDEvent *esdEvent = 0;
1812 esdEvent = (AliESDEvent*)tree->GetTree()->GetUserInfo()->FindObject("AliESDEvent");
1814 // Check if already connected to tree
1816 TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("ESDObjectsConnectedToTree"));
1819 if (connectedList && (strcmp(opt, "reconnect"))) {
1820 // If connected use the connected list if objects
1821 fESDObjects->Delete();
1822 fESDObjects = connectedList;
1823 tree->SetBranchAddress("fDetectorStatus",&fDetectorStatus); //PH probably redundant
1824 tree->SetBranchAddress("fDAQDetectorPattern",&fDAQDetectorPattern);
1825 tree->SetBranchAddress("fDAQAttributes",&fDAQAttributes);
1827 fOldMuonStructure = fESDObjects->TestBit(BIT(23));
1833 // prevent a memory leak when reading back the TList
1834 // if (!(strcmp(opt, "reconnect"))) fESDObjects->Delete();
1837 // create a new TList from the UserInfo TList...
1838 // copy constructor does not work...
1839 fESDObjects = (TList*)(esdEvent->GetList()->Clone());
1840 fESDObjects->SetOwner(kTRUE);
1842 else if ( fESDObjects->GetEntries()==0){
1843 // at least create the std content if we want to read to our list
1848 // we only need new things in the list if we do no already have it..
1849 // TODO just add new entries
1850 CompleteStdContent();
1852 if(fESDObjects->GetEntries()<kESDListN){
1853 AliWarning(Form("AliESDEvent::ReadFromTree() TList contains less than the standard contents %d < %d \n",
1854 fESDObjects->GetEntries(),kESDListN));
1856 // set the branch addresses
1857 fOldMuonStructure = kFALSE;
1858 TIter next(fESDObjects);
1860 while((el=(TNamed*)next())){
1861 TString bname(el->GetName());
1862 if(bname.CompareTo("AliESDfriend")==0)
1864 // AliESDfriend does not have a name ...
1865 TBranch *br = tree->GetBranch("ESDfriend.");
1866 if (br) tree->SetBranchAddress("ESDfriend.",fESDObjects->GetObjectRef(el));
1869 // check if branch exists under this Name
1870 TBranch *br = tree->GetBranch(bname.Data());
1872 tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));
1875 br = tree->GetBranch(Form("%s.",bname.Data()));
1877 tree->SetBranchAddress(Form("%s.",bname.Data()),fESDObjects->GetObjectRef(el));
1880 AliWarning(Form("AliESDEvent::ReadFromTree() No Branch found with Name %s or %s.",bname.Data(),bname.Data()));
1881 if (bname == fgkESDListName[kMuonClusters]) {
1882 fOldMuonStructure = kTRUE;
1889 tree->SetBranchAddress("fDetectorStatus",&fDetectorStatus);
1890 tree->SetBranchAddress("fDAQDetectorPattern",&fDAQDetectorPattern);
1891 tree->SetBranchAddress("fDAQAttributes",&fDAQAttributes);
1894 // when reading back we are not owner of the list
1895 // must not delete it
1896 fESDObjects->SetOwner(kTRUE);
1897 fESDObjects->SetName("ESDObjectsConnectedToTree");
1898 fESDObjects->SetBit(BIT(23), fOldMuonStructure);
1899 // we are not owner of the list objects
1900 // must not delete it
1901 tree->GetUserInfo()->Add(fESDObjects);
1902 tree->GetUserInfo()->SetOwner(kFALSE);
1906 // we can't get the list from the user data, create standard content
1907 // and set it by hand (no ESDfriend at the moment
1909 fOldMuonStructure = kFALSE;
1910 TIter next(fESDObjects);
1912 while((el=(TNamed*)next())){
1913 TString bname(el->GetName());
1914 TBranch *br = tree->GetBranch(bname.Data());
1916 tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));
1919 br = tree->GetBranch(Form("%s.",bname.Data()));
1921 tree->SetBranchAddress(Form("%s.",bname.Data()),fESDObjects->GetObjectRef(el));
1923 else if (bname == fgkESDListName[kMuonClusters]) {
1924 fOldMuonStructure = kTRUE;
1928 tree->SetBranchAddress("fDetectorStatus",&fDetectorStatus);
1929 tree->SetBranchAddress("fDAQDetectorPattern",&fDAQDetectorPattern);
1930 tree->SetBranchAddress("fDAQAttributes",&fDAQAttributes);
1933 // when reading back we are not owner of the list
1934 // must not delete it
1935 fESDObjects->SetOwner(kTRUE);
1939 //______________________________________________________________________________
1940 void AliESDEvent::CopyFromOldESD()
1942 // Method which copies over everthing from the old esd structure to the
1947 SetRunNumber(fESDOld->GetRunNumber());
1948 SetPeriodNumber(fESDOld->GetPeriodNumber());
1949 SetMagneticField(fESDOld->GetMagneticField());
1951 // leave out diamond ...
1952 // SetDiamond(const AliESDVertex *vertex) { fESDRun->SetDiamond(vertex);}
1955 SetTriggerMask(fESDOld->GetTriggerMask());
1956 SetOrbitNumber(fESDOld->GetOrbitNumber());
1957 SetTimeStamp(fESDOld->GetTimeStamp());
1958 SetEventType(fESDOld->GetEventType());
1959 SetEventNumberInFile(fESDOld->GetEventNumberInFile());
1960 SetBunchCrossNumber(fESDOld->GetBunchCrossNumber());
1961 SetTriggerCluster(fESDOld->GetTriggerCluster());
1965 SetZDC(fESDOld->GetZDCN1Energy(),
1966 fESDOld->GetZDCP1Energy(),
1967 fESDOld->GetZDCEMEnergy(),
1969 fESDOld->GetZDCN2Energy(),
1970 fESDOld->GetZDCP2Energy(),
1971 fESDOld->GetZDCParticipants(),
1981 if(fESDOld->GetFMDData())SetFMDData(fESDOld->GetFMDData());
1985 SetT0zVertex(fESDOld->GetT0zVertex());
1986 SetT0(fESDOld->GetT0());
1990 if (fESDOld->GetVZEROData()) SetVZEROData(fESDOld->GetVZEROData());
1992 if(fESDOld->GetVertex())SetPrimaryVertexSPD(fESDOld->GetVertex());
1994 if(fESDOld->GetPrimaryVertex())SetPrimaryVertexTracks(fESDOld->GetPrimaryVertex());
1996 if(fESDOld->GetMultiplicity())SetMultiplicity(fESDOld->GetMultiplicity());
1998 for(int i = 0;i<fESDOld->GetNumberOfTracks();i++){
1999 AddTrack(fESDOld->GetTrack(i));
2002 for(int i = 0;i<fESDOld->GetNumberOfMuonTracks();i++){
2003 AddMuonTrack(fESDOld->GetMuonTrack(i));
2006 for(int i = 0;i<fESDOld->GetNumberOfPmdTracks();i++){
2007 AddPmdTrack(fESDOld->GetPmdTrack(i));
2010 for(int i = 0;i<fESDOld->GetNumberOfTrdTracks();i++){
2011 AddTrdTrack(fESDOld->GetTrdTrack(i));
2014 for(int i = 0;i<fESDOld->GetNumberOfV0s();i++){
2015 AddV0(fESDOld->GetV0(i));
2018 for(int i = 0;i<fESDOld->GetNumberOfCascades();i++){
2019 AddCascade(fESDOld->GetCascade(i));
2022 for(int i = 0;i<fESDOld->GetNumberOfKinks();i++){
2023 AddKink(fESDOld->GetKink(i));
2027 for(int i = 0;i<fESDOld->GetNumberOfCaloClusters();i++){
2028 AddCaloCluster(fESDOld->GetCaloCluster(i));
2034 //______________________________________________________________________________
2035 Bool_t AliESDEvent::IsEventSelected(const char *trigExpr) const
2037 // Check if the event satisfies the trigger
2038 // selection expression trigExpr.
2039 // trigExpr can be any logical expression
2040 // of the trigger classes defined in AliESDRun
2041 // In case of wrong syntax return kTRUE.
2042 // Modified by rl for 100 classes - to be tested
2044 TString expr(trigExpr);
2045 if (expr.IsNull()) return kTRUE;
2047 ULong64_t mask = GetTriggerMask();
2048 for(Int_t itrig = 0; itrig < AliESDRun::kNTriggerClasses/2; itrig++) {
2049 if (mask & (1ull << itrig)) {
2050 expr.ReplaceAll(GetESDRun()->GetTriggerClass(itrig),"1");
2053 expr.ReplaceAll(GetESDRun()->GetTriggerClass(itrig),"0");
2056 ULong64_t maskNext50 = GetTriggerMaskNext50();
2057 for(Int_t itrig = 0; itrig < AliESDRun::kNTriggerClasses/2; itrig++) {
2058 if (maskNext50 & (1ull << itrig)) {
2059 expr.ReplaceAll(GetESDRun()->GetTriggerClass(itrig+50),"1");
2062 expr.ReplaceAll(GetESDRun()->GetTriggerClass(itrig+50),"0");
2067 if ((gROOT->ProcessLineFast(expr.Data(),&error) == 0) &&
2068 (error == TInterpreter::kNoError)) {
2076 //______________________________________________________________________________
2077 TObject* AliESDEvent::GetHLTTriggerDecision() const
2079 // get the HLT trigger decission object
2081 // cast away const'nes because the FindListObject method
2083 AliESDEvent* pNonConst=const_cast<AliESDEvent*>(this);
2084 return pNonConst->FindListObject("HLTGlobalTrigger");
2087 TString AliESDEvent::GetHLTTriggerDescription() const
2089 // get the HLT trigger decission description
2090 TString description;
2091 TObject* pDecision=GetHLTTriggerDecision();
2093 description=pDecision->GetTitle();
2099 //______________________________________________________________________________
2100 Bool_t AliESDEvent::IsHLTTriggerFired(const char* name) const
2102 // get the HLT trigger decission description
2103 TObject* pDecision=GetHLTTriggerDecision();
2104 if (!pDecision) return kFALSE;
2106 Option_t* option=pDecision->GetOption();
2107 if (option==NULL || *option!='1') return kFALSE;
2110 TString description=GetHLTTriggerDescription();
2111 Int_t index=description.Index(name);
2112 if (index<0) return kFALSE;
2113 index+=strlen(name);
2114 if (index>=description.Length()) return kFALSE;
2115 if (description[index]!=0 && description[index]!=' ') return kFALSE;
2120 //______________________________________________________________________________
2121 Bool_t AliESDEvent::IsPileupFromSPD(Int_t minContributors,
2123 Double_t nSigmaZdist,
2124 Double_t nSigmaDiamXY,
2125 Double_t nSigmaDiamZ) const{
2127 // This function checks if there was a pile up
2128 // reconstructed with SPD
2130 Int_t nc1=fSPDVertex->GetNContributors();
2131 if(nc1<1) return kFALSE;
2132 Int_t nPileVert=GetNumberOfPileupVerticesSPD();
2133 if(nPileVert==0) return kFALSE;
2135 for(Int_t i=0; i<nPileVert;i++){
2136 const AliESDVertex* pv=GetPileupVertexSPD(i);
2137 Int_t nc2=pv->GetNContributors();
2138 if(nc2>=minContributors){
2139 Double_t z1=fSPDVertex->GetZ();
2140 Double_t z2=pv->GetZ();
2141 Double_t distZ=TMath::Abs(z2-z1);
2142 Double_t distZdiam=TMath::Abs(z2-GetDiamondZ());
2143 Double_t cutZdiam=nSigmaDiamZ*TMath::Sqrt(GetSigma2DiamondZ());
2144 if(GetSigma2DiamondZ()<0.0001)cutZdiam=99999.; //protection for missing z diamond information
2145 if(distZ>minZdist && distZdiam<cutZdiam){
2146 Double_t x2=pv->GetX();
2147 Double_t y2=pv->GetY();
2148 Double_t distXdiam=TMath::Abs(x2-GetDiamondX());
2149 Double_t distYdiam=TMath::Abs(y2-GetDiamondY());
2150 Double_t cov1[6],cov2[6];
2151 fSPDVertex->GetCovarianceMatrix(cov1);
2152 pv->GetCovarianceMatrix(cov2);
2153 Double_t errxDist=TMath::Sqrt(cov2[0]+GetSigma2DiamondX());
2154 Double_t erryDist=TMath::Sqrt(cov2[2]+GetSigma2DiamondY());
2155 Double_t errzDist=TMath::Sqrt(cov1[5]+cov2[5]);
2156 Double_t cutXdiam=nSigmaDiamXY*errxDist;
2157 if(GetSigma2DiamondX()<0.0001)cutXdiam=99999.; //protection for missing diamond information
2158 Double_t cutYdiam=nSigmaDiamXY*erryDist;
2159 if(GetSigma2DiamondY()<0.0001)cutYdiam=99999.; //protection for missing diamond information
2160 if( (distXdiam<cutXdiam) && (distYdiam<cutYdiam) && (distZ>nSigmaZdist*errzDist) ){
2169 //______________________________________________________________________________
2170 void AliESDEvent::EstimateMultiplicity(Int_t &tracklets, Int_t &trITSTPC, Int_t &trITSSApure, Double_t eta, Bool_t useDCAFlag,Bool_t useV0Flag) const
2173 // calculates 3 estimators for the multiplicity in the -eta:eta range
2174 // tracklets : using SPD tracklets only
2175 // trITSTPC : using TPC/ITS + complementary ITS SA tracks + tracklets from clusters not used by tracks
2176 // trITSSApure : using ITS standalone tracks + tracklets from clusters not used by tracks
2177 // if useDCAFlag is true: account for the ESDtrack flag marking the tracks with large DCA
2178 // if useV0Flag is true: account for the ESDtrack flag marking conversion and K0's V0s
2180 AliWarning("This obsolete method will be eliminated soon. Use AliESDtrackCuts::GetReferenceMultiplicity");
2182 tracklets = trITSSApure = trITSTPC = 0;
2183 int ntr = fSPDMult ? fSPDMult->GetNumberOfTracklets() : 0;
2186 for (int itr=ntr;itr--;) {
2187 if (TMath::Abs(fSPDMult->GetEta(itr))>eta) continue;
2189 if (fSPDMult->FreeClustersTracklet(itr,0)) trITSTPC++; // not used in ITS/TPC or ITS_SA track
2190 if (fSPDMult->FreeClustersTracklet(itr,1)) trITSSApure++; // not used in ITS_SA_Pure track
2193 // count real tracks
2194 ntr = GetNumberOfTracks();
2195 for (int itr=ntr;itr--;) {
2196 AliESDtrack *t = GetTrack(itr);
2197 if (!t) {AliFatal(Form("NULL pointer for ESD track %d",itr));}
2198 if (TMath::Abs(t->Eta())>eta) continue;
2199 if (!t->IsOn(AliESDtrack::kITSin)) continue;
2200 if (useDCAFlag && t->IsOn(AliESDtrack::kMultSec)) continue;
2201 if (useV0Flag && t->IsOn(AliESDtrack::kMultInV0)) continue;
2202 if (t->IsOn(AliESDtrack::kITSpureSA)) trITSSApure++;
2208 //______________________________________________________________________________
2209 Bool_t AliESDEvent::IsPileupFromSPDInMultBins() const {
2210 Int_t nTracklets=GetMultiplicity()->GetNumberOfTracklets();
2211 if(nTracklets<20) return IsPileupFromSPD(3,0.8);
2212 else if(nTracklets<50) return IsPileupFromSPD(4,0.8);
2213 else return IsPileupFromSPD(5,0.8);
2216 //______________________________________________________________________________
2217 void AliESDEvent::SetTOFHeader(const AliTOFHeader *header)
2220 // Set the TOF event_time
2224 *fTOFHeader=*header;
2225 //fTOFHeader->SetName(fgkESDListName[kTOFHeader]);
2228 // for analysis of reconstructed events
2229 // when this information is not avaliable
2230 fTOFHeader = new AliTOFHeader(*header);
2231 //AddObject(fTOFHeader);
2236 //______________________________________________________________________________
2237 AliCentrality* AliESDEvent::GetCentrality()
2239 if (!fCentrality) fCentrality = new AliCentrality();
2243 //______________________________________________________________________________
2244 AliEventplane* AliESDEvent::GetEventplane()
2246 if (!fEventplane) fEventplane = new AliEventplane();
2250 //______________________________________________________________________________
2251 Float_t AliESDEvent::GetVZEROEqMultiplicity(Int_t i) const
2253 // Get VZERO Multiplicity for channel i
2254 // Themethod uses the equalization factors
2255 // stored in the ESD-run object in order to
2256 // get equal multiplicities within a VZERO rins (1/8 of VZERO)
2257 if (!fESDVZERO || !fESDRun) return -1;
2260 Float_t factorSum = 0;
2261 for(Int_t j = 8*ring; j < (8*ring+8); ++j) {
2262 factorSum += fESDRun->GetVZEROEqFactors(j);
2264 Float_t factor = fESDRun->GetVZEROEqFactors(i)*8./factorSum;
2266 return (fESDVZERO->GetMultiplicity(i)/factor);
2269 //______________________________________________________________________________
2270 void AliESDEvent::SetTOFcluster(Int_t ntofclusters,AliESDTOFCluster *cluster,Int_t *mapping)
2272 // Reset TClonesArray of TOF clusters
2273 if (!fESDTOFClusters) {
2274 AliError("fESDTOFClusters is not initialized");
2277 fESDTOFClusters->Clear();
2279 Int_t goodhit[20000];
2281 for(Int_t i=0;i < 20000;i++){
2286 for(Int_t i=0;i < ntofclusters;i++){
2288 if(cluster[i].GetNMatchableTracks() || !mapping){
2290 mapping[i] = fESDTOFClusters->GetEntriesFast();
2292 // update TClonesArray
2293 TClonesArray &ftr = *fESDTOFClusters;
2294 AliESDTOFCluster *clusterTBW = new(ftr[fESDTOFClusters->GetEntriesFast()])AliESDTOFCluster(cluster[i]);
2297 // loop over hit in the cluster
2298 for(Int_t k=0;k < clusterTBW->GetNTOFhits();k++){
2299 Int_t ipos = clusterTBW->GetHitIndex(k);
2300 goodhit[ipos] = 1; // hit should be kept
2307 AliInfo(Form("TOF cluster before of matching = %i , after = %i\n",ntofclusters,fESDTOFClusters->GetEntriesFast()));
2308 Int_t hitnewpos[20000]={0};
2309 Int_t nhitOriginal = fESDTOFHits->GetEntries();
2310 for(Int_t i=0;i < fESDTOFHits->GetEntries();i++){
2314 else{ // remove hit and decrease the hit array
2315 TClonesArray &a=*fESDTOFHits;
2316 Int_t lastpos = fESDTOFHits->GetEntries()-1;
2319 delete a.RemoveAt(i);
2321 Int_t nhitBefore = fESDTOFHits->GetEntries();
2322 for(Int_t k=nhitBefore-1;k>i;k--){ // find the last good track
2323 if(!goodhit[k]){ // remove track
2324 delete a.RemoveAt(k);
2325 if(k-i==1) delete a.RemoveAt(i);
2327 else{ // replace last one to the "i"
2328 AliESDTOFHit *last = (AliESDTOFHit *) fESDTOFHits->At(k);
2329 delete a.RemoveAt(i);
2330 new (a[i]) AliESDTOFHit(*last);
2331 delete a.RemoveAt(k);
2340 // remap cluster to hits
2341 for(Int_t i=0;i < fESDTOFClusters->GetEntries();i++){
2342 AliESDTOFCluster *cl = (AliESDTOFCluster *) fESDTOFClusters->At(i);
2343 // loop over hit in the cluster
2344 for(Int_t k=0;k < cl->GetNTOFhits();k++){
2345 cl->SetHitIndex(k,hitnewpos[cl->GetHitIndex(k)]);
2348 AliInfo(Form("TOF hit before of matching = %i , after = %i\n",nhitOriginal,fESDTOFHits->GetEntriesFast()));
2353 //______________________________________________________________________________
2354 void AliESDEvent::SetTOFcluster(Int_t ntofclusters,AliESDTOFCluster *cluster[],Int_t *mapping)
2356 // Reset TClonesArray of TOF clusters
2357 if(fESDTOFClusters)fESDTOFClusters->Delete();
2359 Int_t goodhit[20000];
2361 for(Int_t i=0;i < 20000;i++){
2366 for(Int_t i=0;i < ntofclusters;i++){
2368 if(cluster[i]->GetNMatchableTracks() || !mapping){
2370 mapping[i] = fESDTOFClusters->GetEntriesFast();
2372 // update TClonesArray
2373 TClonesArray &ftr = *fESDTOFClusters;
2374 AliESDTOFCluster *clusterTBW = new(ftr[fESDTOFClusters->GetEntriesFast()])AliESDTOFCluster(*(cluster[i]));
2377 // loop over hit in the cluster
2378 for(Int_t k=0;k < clusterTBW->GetNTOFhits();k++){
2379 Int_t ipos = clusterTBW->GetHitIndex(k);
2380 goodhit[ipos] = 1; // hit should be kept
2387 AliInfo(Form("TOF cluster before of matching = %i , after = %i\n",ntofclusters,fESDTOFClusters->GetEntriesFast()));
2388 Int_t hitnewpos[20000]={0};
2389 Int_t nhitOriginal = fESDTOFHits->GetEntries();
2390 for(Int_t i=0;i < fESDTOFHits->GetEntries();i++){
2394 else{ // remove hit and decrease the hit array
2395 TClonesArray &a=*fESDTOFHits;
2396 Int_t lastpos = fESDTOFHits->GetEntries()-1;
2399 delete a.RemoveAt(i);
2401 Int_t nhitBefore = fESDTOFHits->GetEntries();
2402 for(Int_t k=nhitBefore-1;k>i;k--){ // find the last good track
2403 if(!goodhit[k]){ // remove track
2404 delete a.RemoveAt(k);
2405 if(k-i==1) delete a.RemoveAt(i);
2407 else{ // replace last one to the "i"
2408 AliESDTOFHit *last = (AliESDTOFHit *) fESDTOFHits->At(k);
2409 delete a.RemoveAt(i);
2410 new (a[i]) AliESDTOFHit(*last);
2411 delete a.RemoveAt(k);
2420 // remap cluster to hits
2421 for(Int_t i=0;i < fESDTOFClusters->GetEntries();i++){
2422 AliESDTOFCluster *cl = (AliESDTOFCluster *) fESDTOFClusters->At(i);
2423 // loop over hit in the cluster
2424 for(Int_t k=0;k < cl->GetNTOFhits();k++){
2425 cl->SetHitIndex(k,hitnewpos[cl->GetHitIndex(k)]);
2428 AliInfo(Form("TOF hit before of matching = %i , after = %i\n",nhitOriginal,fESDTOFHits->GetEntriesFast()));
2433 //______________________________________________________________________________
2434 void AliESDEvent::ConnectTracks() {
2435 // Connect tracks to this event
2436 if (fTracksConnected || !fTracks || !fTracks->GetEntriesFast()) return;
2438 TIter next(fTracks);
2439 while ((track=(AliESDtrack*)next())) track->SetESDEvent(this);
2441 // The same for TOF clusters
2442 if (fESDTOFClusters) {
2443 AliESDTOFCluster *clus;
2444 TIter nextTOF(fESDTOFClusters);
2445 while ((clus=(AliESDTOFCluster*)nextTOF())) clus->SetEvent((AliVEvent *) this);
2447 fTracksConnected = kTRUE;
2451 //______________________________________________________________________________
2452 AliESDfriend* AliESDEvent::FindFriend() const
2454 return static_cast<AliESDfriend*>(FindListObject("AliESDfriend"));
2457 AliVEvent::EDataLayoutType AliESDEvent::GetDataLayoutType() const {return AliVEvent::kESD;}