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 "AliESDPmdTrack.h"
50 #include "AliESDTrdTrack.h"
51 #include "AliESDVertex.h"
52 #include "AliESDcascade.h"
53 #include "AliESDPmdTrack.h"
54 #include "AliESDTrdTrigger.h"
55 #include "AliESDTrdTrack.h"
56 #include "AliESDTrdTracklet.h"
57 #include "AliESDVertex.h"
58 #include "AliVertexerTracks.h"
59 #include "AliESDcascade.h"
60 #include "AliESDkink.h"
61 #include "AliESDtrack.h"
62 #include "AliESDHLTtrack.h"
63 #include "AliESDCaloCluster.h"
64 #include "AliESDCaloCells.h"
66 #include "AliESDFMD.h"
67 #include "AliESDVZERO.h"
68 #include "AliMultiplicity.h"
69 #include "AliRawDataErrorLog.h"
71 #include "AliESDACORDE.h"
73 #include "AliESDHLTDecision.h"
74 #include "AliCentrality.h"
75 #include "AliESDCosmicTrack.h"
76 #include "AliTriggerConfiguration.h"
77 #include "AliTriggerClass.h"
78 #include "AliTriggerCluster.h"
79 #include "AliEventplane.h"
86 // here we define the names, some classes are no TNamed, therefore the classnames
88 const char* AliESDEvent::fgkESDListName[kESDListN] = {"AliESDRun",
116 "AliRawDataErrorLogs",
122 //______________________________________________________________________________
123 AliESDEvent::AliESDEvent():
125 fESDObjects(new TList()),
141 fSPDPileupVertices(0),
142 fTrkPileupVertices(0),
154 fEMCALCells(0), fPHOSCells(0),
157 fOldMuonStructure(kFALSE),
162 fTracksConnected(kFALSE),
166 fDetectorStatus(0xFFFFFFFF),
167 fDAQDetectorPattern(0xFFFF),
168 fDAQAttributes(0xFFFF),
173 //______________________________________________________________________________
174 AliESDEvent::AliESDEvent(const AliESDEvent& esd):
176 fESDObjects(new TList()),
177 fESDRun(new AliESDRun(*esd.fESDRun)),
178 fHeader(new AliESDHeader(*esd.fHeader)),
179 fESDZDC(new AliESDZDC(*esd.fESDZDC)),
180 fESDFMD(new AliESDFMD(*esd.fESDFMD)),
181 fESDVZERO(new AliESDVZERO(*esd.fESDVZERO)),
182 fESDTZERO(new AliESDTZERO(*esd.fESDTZERO)),
183 fTPCVertex(new AliESDVertex(*esd.fTPCVertex)),
184 fSPDVertex(new AliESDVertex(*esd.fSPDVertex)),
185 fPrimaryVertex(new AliESDVertex(*esd.fPrimaryVertex)),
186 fSPDMult(new AliMultiplicity(*esd.fSPDMult)),
187 fPHOSTrigger(new AliESDCaloTrigger(*esd.fPHOSTrigger)),
188 fEMCALTrigger(new AliESDCaloTrigger(*esd.fEMCALTrigger)),
189 fESDACORDE(new AliESDACORDE(*esd.fESDACORDE)),
190 fESDAD(new AliESDAD(*esd.fESDAD)),
191 fTrdTrigger(new AliESDTrdTrigger(*esd.fTrdTrigger)),
192 fSPDPileupVertices(new TClonesArray(*esd.fSPDPileupVertices)),
193 fTrkPileupVertices(new TClonesArray(*esd.fTrkPileupVertices)),
194 fTracks(new TClonesArray(*esd.fTracks)),
195 fMuonTracks(new TClonesArray(*esd.fMuonTracks)),
196 fMuonClusters(new TClonesArray(*esd.fMuonClusters)),
197 fMuonPads(new TClonesArray(*esd.fMuonPads)),
198 fPmdTracks(new TClonesArray(*esd.fPmdTracks)),
199 fTrdTracks(new TClonesArray(*esd.fTrdTracks)),
200 fTrdTracklets(new TClonesArray(*esd.fTrdTracklets)),
201 fV0s(new TClonesArray(*esd.fV0s)),
202 fCascades(new TClonesArray(*esd.fCascades)),
203 fKinks(new TClonesArray(*esd.fKinks)),
204 fCaloClusters(new TClonesArray(*esd.fCaloClusters)),
205 fEMCALCells(new AliESDCaloCells(*esd.fEMCALCells)),
206 fPHOSCells(new AliESDCaloCells(*esd.fPHOSCells)),
207 fCosmicTracks(new TClonesArray(*esd.fCosmicTracks)),
208 fErrorLogs(new TClonesArray(*esd.fErrorLogs)),
209 fOldMuonStructure(esd.fOldMuonStructure),
210 fESDOld(esd.fESDOld ? new AliESD(*esd.fESDOld) : 0),
211 fESDFriendOld(esd.fESDFriendOld ? new AliESDfriend(*esd.fESDFriendOld) : 0),
212 fConnected(esd.fConnected),
213 fUseOwnList(esd.fUseOwnList),
214 fTracksConnected(kFALSE),
215 fTOFHeader(new AliTOFHeader(*esd.fTOFHeader)),
216 fCentrality(new AliCentrality(*esd.fCentrality)),
217 fEventplane(new AliEventplane(*esd.fEventplane)),
218 fDetectorStatus(esd.fDetectorStatus),
219 fDAQDetectorPattern(esd.fDAQDetectorPattern),
220 fDAQAttributes(esd.fDAQAttributes),
221 fNTOFclusters(esd.fNTOFclusters),
222 // fTOFcluster(esd.fTOFcluster)
223 fTOFcluster(new TObjArray(*(esd.fTOFcluster)))
225 printf("copying ESD event...\n"); // AU
226 // CKB init in the constructor list and only add here ...
231 AddObject(fESDVZERO);
232 AddObject(fESDTZERO);
233 AddObject(fTPCVertex);
234 AddObject(fSPDVertex);
235 AddObject(fPrimaryVertex);
237 AddObject(fPHOSTrigger);
238 AddObject(fEMCALTrigger);
239 AddObject(fTrdTrigger);
240 AddObject(fSPDPileupVertices);
241 AddObject(fTrkPileupVertices);
243 AddObject(fMuonTracks);
244 AddObject(fPmdTracks);
245 AddObject(fTrdTracks);
246 AddObject(fTrdTracklets);
248 AddObject(fCascades);
250 AddObject(fCaloClusters);
251 AddObject(fEMCALCells);
252 AddObject(fPHOSCells);
253 AddObject(fCosmicTracks);
254 AddObject(fErrorLogs);
255 AddObject(fESDACORDE);
257 AddObject(fTOFHeader);
258 AddObject(fMuonClusters);
259 AddObject(fMuonPads);
264 //______________________________________________________________________________
265 AliESDEvent & AliESDEvent::operator=(const AliESDEvent& source) {
267 // Assignment operator
268 printf("operator = ESD\n");
269 if(&source == this) return *this;
270 AliVEvent::operator=(source);
272 // This assumes that the list is already created
273 // and that the virtual void Copy(Tobject&) function
274 // is correctly implemented in the derived class
275 // otherwise only TObject::Copy() will be used
279 if((fESDObjects->GetSize()==0)&&(source.fESDObjects->GetSize()>=kESDListN)){
280 // We cover the case that we do not yet have the
281 // standard content but the source has it
285 TIter next(source.GetList());
288 while ((its = next())) {
289 name.Form("%s", its->GetName());
290 TObject *mine = fESDObjects->FindObject(name.Data());
292 TClass* pClass=TClass::GetClass(its->ClassName());
294 AliWarning(Form("Can not find class description for entry %s (%s)\n",
295 its->ClassName(), name.Data()));
299 mine=(TObject*)pClass->New();
301 // not in this: can be added to list
302 AliWarning(Form("%s:%d Could not find %s for copying \n",
303 (char*)__FILE__,__LINE__,name.Data()));
306 if(mine->InheritsFrom("TNamed")){
307 ((TNamed*)mine)->SetName(name);
309 else if(mine->InheritsFrom("TCollection")){
310 if(mine->InheritsFrom("TClonesArray")) {
311 TClonesArray* tcits = dynamic_cast<TClonesArray*>(its);
313 dynamic_cast<TClonesArray*>(mine)->SetClass(tcits->GetClass());
315 dynamic_cast<TCollection*>(mine)->SetName(name);
317 AliDebug(1, Form("adding object %s of type %s", mine->GetName(), mine->ClassName()));
321 if(!its->InheritsFrom("TCollection")){
325 else if(its->InheritsFrom("TClonesArray")){
326 // Create or expand the tclonesarray pointers
327 // so we can directly copy to the object
328 TClonesArray *itstca = (TClonesArray*)its;
329 TClonesArray *minetca = (TClonesArray*)mine;
331 // this leaves the capacity of the TClonesArray the same
332 // except for a factor of 2 increase when size > capacity
333 // does not release any memory occupied by the tca
334 minetca->ExpandCreate(itstca->GetEntriesFast());
335 for(int i = 0;i < itstca->GetEntriesFast();++i){
337 TObject *minetcaobj = minetca->At(i);
338 TObject *itstcaobj = itstca->At(i);
339 // no need to delete first
340 // pointers within the class should be handled by Copy()...
341 // Can there be Empty slots?
342 itstcaobj->Copy(*minetcaobj);
346 AliWarning(Form("%s:%d cannot copy TCollection \n",
347 (char*)__FILE__,__LINE__));
351 fOldMuonStructure = source.fOldMuonStructure;
353 fCentrality = source.fCentrality;
354 fEventplane = source.fEventplane;
356 fConnected = source.fConnected;
357 fUseOwnList = source.fUseOwnList;
359 fDetectorStatus = source.fDetectorStatus;
360 fDAQDetectorPattern = source.fDAQDetectorPattern;
361 fDAQAttributes = source.fDAQAttributes;
362 fNTOFclusters = source.fNTOFclusters;
364 *fTOFcluster = *source.fTOFcluster;
365 // fTOFcluster = new TObjArray(*(source.fTOFcluster));
366 fTracksConnected = kFALSE;
372 //______________________________________________________________________________
373 AliESDEvent::~AliESDEvent()
376 // Standard destructor
379 // everthing on the list gets deleted automatically
382 if(fESDObjects&&!fConnected)
387 if (fCentrality) delete fCentrality;
388 if (fEventplane) delete fEventplane;
392 fTOFcluster->Clear();
397 void AliESDEvent::Copy(TObject &obj) const {
399 // interface to TOBject::Copy
400 // Copies the content of this into obj!
401 // bascially obj = *this
403 if(this==&obj)return;
404 AliESDEvent *robj = dynamic_cast<AliESDEvent*>(&obj);
405 if(!robj)return; // not an AliESEvent
410 //______________________________________________________________________________
411 void AliESDEvent::Reset()
415 // Std content + Non std content
417 // Reset the standard contents
419 fDetectorStatus = 0xFFFFFFFF;
420 fDAQDetectorPattern = 0xFFFF;
421 fDAQAttributes = 0xFFFF;
422 // reset for the old data without AliESDEvent...
423 if(fESDOld)fESDOld->Reset();
425 fESDFriendOld->~AliESDfriend();
426 new (fESDFriendOld) AliESDfriend();
430 if(fESDObjects->GetSize()>kESDListN){
431 // we have non std content
432 // this also covers esdfriends
433 for(int i = kESDListN;i < fESDObjects->GetSize();++i){
434 TObject *pObject = fESDObjects->At(i);
436 if(pObject->InheritsFrom(TClonesArray::Class())){
437 ((TClonesArray*)pObject)->Delete();
439 else if(!pObject->InheritsFrom(TCollection::Class())){
440 TClass *pClass = TClass::GetClass(pObject->ClassName());
441 if (pClass && pClass->GetListOfMethods()->FindObject("Clear")) {
442 AliDebug(1, Form("Clear for object %s class %s", pObject->GetName(), pObject->ClassName()));
446 AliDebug(1, Form("ResetWithPlacementNew for object %s class %s", pObject->GetName(), pObject->ClassName()));
447 ResetWithPlacementNew(pObject);
451 AliWarning(Form("No reset for %s \n",
452 pObject->ClassName()));
459 //______________________________________________________________________________
460 Bool_t AliESDEvent::ResetWithPlacementNew(TObject *pObject){
462 // funtion to reset using the already allocated space
464 Long_t dtoronly = TObject::GetDtorOnly();
465 TClass *pClass = TClass::GetClass(pObject->ClassName());
466 TObject::SetDtorOnly(pObject);
468 // Recreate with placement new
469 pClass->New(pObject);
470 // Restore the state.
471 TObject::SetDtorOnly((void*)dtoronly);
475 //______________________________________________________________________________
476 void AliESDEvent::ResetStdContent()
478 // Reset the standard contents
479 if(fESDRun) fESDRun->Reset();
480 if(fHeader) fHeader->Reset();
481 if(fCentrality) fCentrality->Reset();
482 if(fEventplane) fEventplane->Reset();
483 if(fESDZDC) fESDZDC->Reset();
488 // reset by callin d'to /c'tor keep the pointer
489 fESDVZERO->~AliESDVZERO();
490 new (fESDVZERO) AliESDVZERO();
493 fESDACORDE->~AliESDACORDE();
494 new (fESDACORDE) AliESDACORDE();
499 new (fESDAD) AliESDAD();
503 if(fESDTZERO) fESDTZERO->Reset();
504 // CKB no clear/reset implemented
506 fTPCVertex->~AliESDVertex();
507 new (fTPCVertex) AliESDVertex();
508 fTPCVertex->SetName(fgkESDListName[kTPCVertex]);
511 fSPDVertex->~AliESDVertex();
512 new (fSPDVertex) AliESDVertex();
513 fSPDVertex->SetName(fgkESDListName[kSPDVertex]);
516 fPrimaryVertex->~AliESDVertex();
517 new (fPrimaryVertex) AliESDVertex();
518 fPrimaryVertex->SetName(fgkESDListName[kPrimaryVertex]);
521 fSPDMult->~AliMultiplicity();
522 new (fSPDMult) AliMultiplicity();
525 fTOFHeader->~AliTOFHeader();
526 new (fTOFHeader) AliTOFHeader();
527 //fTOFHeader->SetName(fgkESDListName[kTOFHeader]);
530 fTrdTrigger->~AliESDTrdTrigger();
531 new (fTrdTrigger) AliESDTrdTrigger();
534 if(fPHOSTrigger)fPHOSTrigger->DeAllocate();
535 if(fEMCALTrigger)fEMCALTrigger->DeAllocate();
536 if(fSPDPileupVertices)fSPDPileupVertices->Delete();
537 if(fTrkPileupVertices)fTrkPileupVertices->Delete();
538 fTracksConnected = kFALSE;
539 if(fTracks)fTracks->Delete();
540 if(fMuonTracks)fMuonTracks->Clear("C");
541 if(fMuonClusters)fMuonClusters->Clear("C");
542 if(fMuonPads)fMuonPads->Clear("C");
543 if(fPmdTracks)fPmdTracks->Delete();
544 if(fTrdTracks)fTrdTracks->Delete();
545 if(fTrdTracklets)fTrdTracklets->Delete();
546 if(fV0s)fV0s->Delete();
547 if(fCascades)fCascades->Delete();
548 if(fKinks)fKinks->Delete();
549 if(fCaloClusters)fCaloClusters->Delete();
550 if(fPHOSCells)fPHOSCells->DeleteContainer();
551 if(fEMCALCells)fEMCALCells->DeleteContainer();
552 if(fCosmicTracks)fCosmicTracks->Delete();
553 if(fErrorLogs) fErrorLogs->Delete();
555 // don't reset fconnected fConnected and the list
560 //______________________________________________________________________________
561 Int_t AliESDEvent::AddV0(const AliESDv0 *v) {
565 TClonesArray &fv = *fV0s;
566 Int_t idx=fV0s->GetEntriesFast();
567 new(fv[idx]) AliESDv0(*v);
571 //______________________________________________________________________________
572 Bool_t AliESDEvent::IsDetectorInTriggerCluster(TString detector, AliTriggerConfiguration* trigConf) const {
573 // Check if a given detector was read-out in the analyzed event
574 const TObjArray& classesArray=trigConf->GetClasses();
575 ULong64_t trigMask=GetTriggerMask();
576 Int_t nclasses = classesArray.GetEntriesFast();
577 for(Int_t iclass=0; iclass < nclasses; iclass++ ) {
578 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
579 Int_t classMask=trclass->GetMask();
580 if(trigMask & classMask){
581 TString detList=trclass->GetCluster()->GetDetectorsInCluster();
582 if(detList.Contains(detector.Data())){
589 //______________________________________________________________________________
590 void AliESDEvent::Print(Option_t *) const
593 // Print header information of the event
595 printf("ESD run information\n");
596 printf("Event # in file %d Bunch crossing # %d Orbit # %d Period # %d Run # %d Trigger %lld Magnetic field %f \n",
597 GetEventNumberInFile(),
598 GetBunchCrossNumber(),
603 GetMagneticField() );
605 printf("Vertex: (%.4f +- %.4f, %.4f +- %.4f, %.4f +- %.4f) cm\n",
606 fPrimaryVertex->GetXv(), fPrimaryVertex->GetXRes(),
607 fPrimaryVertex->GetYv(), fPrimaryVertex->GetYRes(),
608 fPrimaryVertex->GetZv(), fPrimaryVertex->GetZRes());
609 printf("Mean vertex in RUN: X=%.4f Y=%.4f Z=%.4f cm\n",
610 GetDiamondX(),GetDiamondY(),GetDiamondZ());
612 printf("SPD Multiplicity. Number of tracklets %d \n",
613 fSPDMult->GetNumberOfTracklets());
614 printf("Number of pileup primary vertices reconstructed with SPD %d\n",
615 GetNumberOfPileupVerticesSPD());
616 printf("Number of pileup primary vertices reconstructed using the tracks %d\n",
617 GetNumberOfPileupVerticesTracks());
618 printf("Number of tracks: \n");
619 printf(" charged %d\n", GetNumberOfTracks());
620 printf(" muon %d\n", GetNumberOfMuonTracks());
621 printf(" pmd %d\n", GetNumberOfPmdTracks());
622 printf(" trd %d\n", GetNumberOfTrdTracks());
623 printf(" trd trkl %d\n", GetNumberOfTrdTracklets());
624 printf(" v0 %d\n", GetNumberOfV0s());
625 printf(" cascades %d\n", GetNumberOfCascades());
626 printf(" kinks %d\n", GetNumberOfKinks());
627 if(fPHOSCells)printf(" PHOSCells %d\n", fPHOSCells->GetNumberOfCells());
628 else printf(" PHOSCells not in the Event\n");
629 if(fEMCALCells)printf(" EMCALCells %d\n", fEMCALCells->GetNumberOfCells());
630 else printf(" EMCALCells not in the Event\n");
631 printf(" CaloClusters %d\n", GetNumberOfCaloClusters());
632 printf(" FMD %s\n", (fESDFMD ? "yes" : "no"));
633 printf(" VZERO %s\n", (fESDVZERO ? "yes" : "no"));
634 printf(" muClusters %d\n", fMuonClusters ? fMuonClusters->GetEntriesFast() : 0);
635 printf(" muPad %d\n", fMuonPads ? fMuonPads->GetEntriesFast() : 0);
636 if (fCosmicTracks) printf(" Cosmics %d\n", GetNumberOfCosmicTracks());
638 TObject* pHLTDecision=GetHLTTriggerDecision();
639 printf("HLT trigger decision: %s\n", pHLTDecision?pHLTDecision->GetOption():"not available");
640 if (pHLTDecision) pHLTDecision->Print("compact");
645 //______________________________________________________________________________
646 void AliESDEvent::SetESDfriend(const AliESDfriend *ev) const
649 // Attaches the complementary info to the ESD
653 // to be sure that we set the tracks also
654 // in case of old esds
655 // if(fESDOld)CopyFromOldESD();
657 Int_t ntrk=ev->GetNumberOfTracks();
659 for (Int_t i=0; i<ntrk; i++) {
660 const AliESDfriendTrack *f=ev->GetTrack(i);
661 if (!f) {AliFatal(Form("NULL pointer for ESD track %d",i));}
662 GetTrack(i)->SetFriendTrack(f);
666 //______________________________________________________________________________
667 Bool_t AliESDEvent::RemoveKink(Int_t rm) const
669 // ---------------------------------------------------------
670 // Remove a kink candidate and references to it from ESD,
671 // if this candidate does not come from a reconstructed decay
672 // Not yet implemented...
673 // ---------------------------------------------------------
674 Int_t last=GetNumberOfKinks()-1;
675 if ((rm<0)||(rm>last)) return kFALSE;
680 //______________________________________________________________________________
681 Bool_t AliESDEvent::RemoveV0(Int_t rm) const
683 // ---------------------------------------------------------
684 // Remove a V0 candidate and references to it from ESD,
685 // if this candidate does not come from a reconstructed decay
686 // ---------------------------------------------------------
687 Int_t last=GetNumberOfV0s()-1;
688 if ((rm<0)||(rm>last)) return kFALSE;
690 AliESDv0 *v0=GetV0(rm);
691 Int_t idxP=v0->GetPindex(), idxN=v0->GetNindex();
694 Int_t lastIdxP=v0->GetPindex(), lastIdxN=v0->GetNindex();
698 // Check if this V0 comes from a reconstructed decay
699 Int_t ncs=GetNumberOfCascades();
700 for (Int_t n=0; n<ncs; n++) {
701 AliESDcascade *cs=GetCascade(n);
703 Int_t csIdxP=cs->GetPindex();
704 Int_t csIdxN=cs->GetNindex();
707 if (idxN==csIdxN) return kFALSE;
709 if (csIdxP==lastIdxP)
710 if (csIdxN==lastIdxN) used++;
713 //Replace the removed V0 with the last V0
714 TClonesArray &a=*fV0s;
715 delete a.RemoveAt(rm);
717 if (rm==last) return kTRUE;
719 //v0 is pointing to the last V0 candidate...
720 new (a[rm]) AliESDv0(*v0);
721 delete a.RemoveAt(last);
723 if (!used) return kTRUE;
726 // Remap the indices of the daughters of reconstructed decays
727 for (Int_t n=0; n<ncs; n++) {
728 AliESDcascade *cs=GetCascade(n);
731 Int_t csIdxP=cs->GetPindex();
732 Int_t csIdxN=cs->GetNindex();
734 if (csIdxP==lastIdxP)
735 if (csIdxN==lastIdxN) {
736 cs->AliESDv0::SetIndex(1,idxP);
737 cs->AliESDv0::SetIndex(0,idxN);
739 if (!used) return kTRUE;
746 //______________________________________________________________________________
747 Bool_t AliESDEvent::RemoveTrack(Int_t rm) const
749 // ---------------------------------------------------------
750 // Remove a track and references to it from ESD,
751 // if this track does not come from a reconstructed decay
752 // ---------------------------------------------------------
753 Int_t last=GetNumberOfTracks()-1;
754 if ((rm<0)||(rm>last)) return kFALSE;
758 // Check if this track comes from the reconstructed primary vertices
759 if (fTPCVertex && fTPCVertex->GetStatus()) {
760 UShort_t *primIdx=fTPCVertex->GetIndices();
761 Int_t n=fTPCVertex->GetNIndices();
763 Int_t idx=Int_t(primIdx[n]);
764 if (rm==idx) return kFALSE;
765 if (idx==last) used++;
768 if (fPrimaryVertex && fPrimaryVertex->GetStatus()) {
769 UShort_t *primIdx=fPrimaryVertex->GetIndices();
770 Int_t n=fPrimaryVertex->GetNIndices();
772 Int_t idx=Int_t(primIdx[n]);
773 if (rm==idx) return kFALSE;
774 if (idx==last) used++;
778 // Check if this track comes from a reconstructed decay
779 Int_t nv0=GetNumberOfV0s();
780 for (Int_t n=0; n<nv0; n++) {
781 AliESDv0 *v0=GetV0(n);
783 Int_t idx=v0->GetNindex();
784 if (rm==idx) return kFALSE;
785 if (idx==last) used++;
788 if (rm==idx) return kFALSE;
789 if (idx==last) used++;
792 Int_t ncs=GetNumberOfCascades();
793 for (Int_t n=0; n<ncs; n++) {
794 AliESDcascade *cs=GetCascade(n);
796 Int_t idx=cs->GetIndex();
797 if (rm==idx) return kFALSE;
798 if (idx==last) used++;
802 if (rm==idx) return kFALSE;
803 if (idx==last) used++;
806 if (rm==idx) return kFALSE;
807 if (idx==last) used++;
810 Int_t nkn=GetNumberOfKinks();
811 for (Int_t n=0; n<nkn; n++) {
812 AliESDkink *kn=GetKink(n);
814 Int_t idx=kn->GetIndex(0);
815 if (rm==idx) return kFALSE;
816 if (idx==last) used++;
819 if (rm==idx) return kFALSE;
820 if (idx==last) used++;
823 // Check if this track is associated with a CaloCluster
824 Int_t ncl=GetNumberOfCaloClusters();
825 for (Int_t n=0; n<ncl; n++) {
826 AliESDCaloCluster *cluster=GetCaloCluster(n);
827 TArrayI *arr=cluster->GetTracksMatched();
828 Int_t s=arr->GetSize();
830 Int_t idx=arr->At(s);
831 if (rm==idx) return kFALSE;
832 if (idx==last) used++;
838 //Replace the removed track with the last track
839 TClonesArray &a=*fTracks;
840 delete a.RemoveAt(rm);
842 if (rm==last) return kTRUE;
844 AliESDtrack *t=GetTrack(last);
845 if (!t) {AliFatal(Form("NULL pointer for ESD track %d",last));}
847 new (a[rm]) AliESDtrack(*t);
848 delete a.RemoveAt(last);
851 if (!used) return kTRUE;
854 // Remap the indices of the tracks used for the primary vertex reconstruction
855 if (fTPCVertex && fTPCVertex->GetStatus()) {
856 UShort_t *primIdx=fTPCVertex->GetIndices();
857 Int_t n=fTPCVertex->GetNIndices();
859 Int_t idx=Int_t(primIdx[n]);
861 primIdx[n]=Short_t(rm);
863 if (!used) return kTRUE;
867 if (fPrimaryVertex && fPrimaryVertex->GetStatus()) {
868 UShort_t *primIdx=fPrimaryVertex->GetIndices();
869 Int_t n=fPrimaryVertex->GetNIndices();
871 Int_t idx=Int_t(primIdx[n]);
873 primIdx[n]=Short_t(rm);
875 if (!used) return kTRUE;
880 // Remap the indices of the daughters of reconstructed decays
881 for (Int_t n=0; n<nv0; n++) {
882 AliESDv0 *v0=GetV0(n);
883 if (v0->GetIndex(0)==last) {
886 if (!used) return kTRUE;
888 if (v0->GetIndex(1)==last) {
891 if (!used) return kTRUE;
895 for (Int_t n=0; n<ncs; n++) {
896 AliESDcascade *cs=GetCascade(n);
897 if (cs->GetIndex()==last) {
900 if (!used) return kTRUE;
903 if (v0->GetIndex(0)==last) {
906 if (!used) return kTRUE;
908 if (v0->GetIndex(1)==last) {
911 if (!used) return kTRUE;
915 for (Int_t n=0; n<nkn; n++) {
916 AliESDkink *kn=GetKink(n);
917 if (kn->GetIndex(0)==last) {
920 if (!used) return kTRUE;
922 if (kn->GetIndex(1)==last) {
925 if (!used) return kTRUE;
929 // Remap the indices of the tracks accosicated with CaloClusters
930 for (Int_t n=0; n<ncl; n++) {
931 AliESDCaloCluster *cluster=GetCaloCluster(n);
932 TArrayI *arr=cluster->GetTracksMatched();
933 Int_t s=arr->GetSize();
935 Int_t idx=arr->At(s);
939 if (!used) return kTRUE;
947 //______________________________________________________________________________
948 Bool_t AliESDEvent::Clean(Float_t *cleanPars)
951 // Remove the data which are not needed for the physics analysis.
953 // 1) Cleaning the V0 candidates
954 // ---------------------------
955 // If the cosine of the V0 pointing angle "csp" and
956 // the DCA between the daughter tracks "dca" does not satisfy
959 // csp > cleanPars[1] + dca/cleanPars[0]*(1.- cleanPars[1])
961 // an attempt to remove this V0 candidate from ESD is made.
963 // The V0 candidate gets removed if it does not belong to any
964 // recosntructed cascade decay
966 // 12.11.2007, optimal values: cleanPars[0]=0.5, cleanPars[1]=0.999
968 // 2) Cleaning the tracks
969 // ----------------------
970 // If track's transverse parameter is larger than cleanPars[2]
972 // track's longitudinal parameter is larger than cleanPars[3]
973 // an attempt to remove this track from ESD is made.
975 // The track gets removed if it does not come
976 // from a reconstructed decay
980 Float_t dcaMax=cleanPars[0];
981 Float_t cspMin=cleanPars[1];
983 Int_t nV0s=GetNumberOfV0s();
984 for (Int_t i=nV0s-1; i>=0; i--) {
985 AliESDv0 *v0=GetV0(i);
987 Float_t dca=v0->GetDcaV0Daughters();
988 Float_t csp=v0->GetV0CosineOfPointingAngle();
989 Float_t cspcut=cspMin + dca/dcaMax*(1.-cspMin);
990 if (csp > cspcut) continue;
991 if (RemoveV0(i)) rc=kTRUE;
995 Float_t dmax=cleanPars[2], zmax=cleanPars[3];
997 const AliESDVertex *vertex=GetPrimaryVertexSPD();
998 Bool_t vtxOK=vertex->GetStatus();
1000 Int_t nTracks=GetNumberOfTracks();
1001 for (Int_t i=nTracks-1; i>=0; i--) {
1002 AliESDtrack *track=GetTrack(i);
1003 if (!track) {AliFatal(Form("NULL pointer for ESD track %d",i));}
1004 Float_t xy,z; track->GetImpactParameters(xy,z);
1005 if ((TMath::Abs(xy) > dmax) || (vtxOK && (TMath::Abs(z) > zmax))) {
1006 if (RemoveTrack(i)) rc=kTRUE;
1013 //______________________________________________________________________________
1014 Char_t AliESDEvent::AddPileupVertexSPD(const AliESDVertex *vtx)
1016 // Add a pileup primary vertex reconstructed with SPD
1017 TClonesArray &ftr = *fSPDPileupVertices;
1018 Char_t n=Char_t(ftr.GetEntriesFast());
1019 AliESDVertex *vertex = new(ftr[n]) AliESDVertex(*vtx);
1024 //______________________________________________________________________________
1025 Char_t AliESDEvent::AddPileupVertexTracks(const AliESDVertex *vtx)
1027 // Add a pileup primary vertex reconstructed with SPD
1028 TClonesArray &ftr = *fTrkPileupVertices;
1029 Char_t n=Char_t(ftr.GetEntriesFast());
1030 AliESDVertex *vertex = new(ftr[n]) AliESDVertex(*vtx);
1035 //______________________________________________________________________________
1036 Int_t AliESDEvent::AddTrack(const AliESDtrack *t)
1039 TClonesArray &ftr = *fTracks;
1040 AliESDtrack * track = new(ftr[fTracks->GetEntriesFast()])AliESDtrack(*t);
1041 track->SetID(fTracks->GetEntriesFast()-1);
1042 track->SetESDEvent(this);
1043 return track->GetID();
1046 //______________________________________________________________________________
1047 AliESDtrack* AliESDEvent::NewTrack()
1050 TClonesArray &ftr = *fTracks;
1051 AliESDtrack * track = new(ftr[fTracks->GetEntriesFast()])AliESDtrack();
1052 track->SetID(fTracks->GetEntriesFast()-1);
1053 track->SetESDEvent(this);
1057 //______________________________________________________________________________
1058 Bool_t AliESDEvent::MoveMuonObjects()
1060 // move MUON clusters and pads to the new ESD structure in needed.
1061 // to ensure backward compatibility
1063 if (!fOldMuonStructure) return kTRUE;
1065 if (!fMuonTracks || !fMuonClusters || !fMuonPads) return kFALSE;
1067 Bool_t reset = kTRUE;
1068 Bool_t containTrackerData = kFALSE;
1069 for (Int_t i = 0; i < fMuonTracks->GetEntriesFast(); i++) {
1071 AliESDMuonTrack *track = (AliESDMuonTrack*) fMuonTracks->UncheckedAt(i);
1073 if (track->ContainTrackerData()) containTrackerData = kTRUE;
1076 if (!track->IsOldTrack()) continue;
1078 // remove objects connected to previous event if needed
1080 if (fMuonClusters->GetEntriesFast() > 0) fMuonClusters->Clear("C");
1081 if (fMuonPads->GetEntriesFast() > 0) fMuonPads->Clear("C");
1085 track->MoveClustersToESD(*this);
1089 // remove objects connected to previous event if needed
1090 if (!containTrackerData) {
1091 if (fMuonClusters->GetEntriesFast() > 0) fMuonClusters->Clear("C");
1092 if (fMuonPads->GetEntriesFast() > 0) fMuonPads->Clear("C");
1098 //______________________________________________________________________________
1099 AliESDMuonTrack* AliESDEvent::GetMuonTrack(Int_t i)
1101 // get the MUON track at the position i in the internal array of track
1102 if (!fMuonTracks) return 0x0;
1103 if (!MoveMuonObjects()) return 0x0;
1104 AliESDMuonTrack *track = (AliESDMuonTrack*) fMuonTracks->UncheckedAt(i);
1105 track->SetESDEvent(this);
1109 //______________________________________________________________________________
1110 void AliESDEvent::AddMuonTrack(const AliESDMuonTrack *t)
1113 TClonesArray &fmu = *fMuonTracks;
1114 AliESDMuonTrack *track = new(fmu[fMuonTracks->GetEntriesFast()]) AliESDMuonTrack(*t);
1115 track->MoveClustersToESD(*this);
1118 //______________________________________________________________________________
1119 AliESDMuonTrack* AliESDEvent::NewMuonTrack()
1121 // create a new MUON track at the end of the internal array of track
1122 TClonesArray &fmu = *fMuonTracks;
1123 return new(fmu[fMuonTracks->GetEntriesFast()]) AliESDMuonTrack();
1126 //______________________________________________________________________________
1127 Int_t AliESDEvent::GetNumberOfMuonClusters()
1129 // get the number of MUON clusters
1130 if (!fMuonClusters) return 0;
1131 if (!MoveMuonObjects()) return 0;
1132 return fMuonClusters->GetEntriesFast();
1135 //______________________________________________________________________________
1136 AliESDMuonCluster* AliESDEvent::GetMuonCluster(Int_t i)
1138 // get the MUON cluster at the position i in the internal array of cluster
1139 if (!fMuonClusters) return 0x0;
1140 if (!MoveMuonObjects()) return 0x0;
1141 return (AliESDMuonCluster*) fMuonClusters->UncheckedAt(i);
1144 //______________________________________________________________________________
1145 AliESDMuonCluster* AliESDEvent::FindMuonCluster(UInt_t clusterId)
1147 // find the MUON cluster with this Id in the internal array of cluster
1148 if (!fMuonClusters) return 0x0;
1149 if (!MoveMuonObjects()) return 0x0;
1150 for (Int_t i = 0; i < fMuonClusters->GetEntriesFast(); i++) {
1151 AliESDMuonCluster *cluster = (AliESDMuonCluster*) fMuonClusters->UncheckedAt(i);
1152 if (cluster->GetUniqueID() == clusterId) return cluster;
1157 //______________________________________________________________________________
1158 AliESDMuonCluster* AliESDEvent::NewMuonCluster()
1160 // create a new MUON cluster at the end of the internal array of cluster
1161 TClonesArray &fmu = *fMuonClusters;
1162 return new(fmu[fMuonClusters->GetEntriesFast()]) AliESDMuonCluster();
1165 //______________________________________________________________________________
1166 Int_t AliESDEvent::GetNumberOfMuonPads()
1168 // get the number of MUON pads
1169 if (!fMuonPads) return 0;
1170 if (!MoveMuonObjects()) return 0;
1171 return fMuonPads->GetEntriesFast();
1174 //______________________________________________________________________________
1175 AliESDMuonPad* AliESDEvent::GetMuonPad(Int_t i)
1177 // get the MUON pad at the position i in the internal array of pad
1178 if (!fMuonPads) return 0x0;
1179 if (!MoveMuonObjects()) return 0x0;
1180 return (AliESDMuonPad*) fMuonPads->UncheckedAt(i);
1183 //______________________________________________________________________________
1184 AliESDMuonPad* AliESDEvent::FindMuonPad(UInt_t padId)
1186 // find the MUON pad with this Id in the internal array of pad
1187 if (!fMuonPads) return 0x0;
1188 if (!MoveMuonObjects()) return 0x0;
1189 for (Int_t i = 0; i < fMuonPads->GetEntriesFast(); i++) {
1190 AliESDMuonPad *pad = (AliESDMuonPad*) fMuonPads->UncheckedAt(i);
1191 if (pad->GetUniqueID() == padId) return pad;
1196 //______________________________________________________________________________
1197 AliESDMuonPad* AliESDEvent::NewMuonPad()
1199 // create a new MUON pad at the end of the internal array of pad
1200 TClonesArray &fmu = *fMuonPads;
1201 return new(fmu[fMuonPads->GetEntriesFast()]) AliESDMuonPad();
1204 //______________________________________________________________________________
1205 void AliESDEvent::AddPmdTrack(const AliESDPmdTrack *t)
1207 TClonesArray &fpmd = *fPmdTracks;
1208 new(fpmd[fPmdTracks->GetEntriesFast()]) AliESDPmdTrack(*t);
1211 //______________________________________________________________________________
1212 void AliESDEvent::SetTrdTrigger(const AliESDTrdTrigger *t)
1217 //______________________________________________________________________________
1218 void AliESDEvent::AddTrdTrack(const AliESDTrdTrack *t)
1220 TClonesArray &ftrd = *fTrdTracks;
1221 new(ftrd[fTrdTracks->GetEntriesFast()]) AliESDTrdTrack(*t);
1224 //______________________________________________________________________________
1225 void AliESDEvent::AddTrdTracklet(const AliESDTrdTracklet *trkl)
1227 new ((*fTrdTracklets)[fTrdTracklets->GetEntriesFast()]) AliESDTrdTracklet(*trkl);
1230 //______________________________________________________________________________
1231 void AliESDEvent::AddTrdTracklet(UInt_t trackletWord, Short_t hcid, Int_t label)
1233 new ((*fTrdTracklets)[fTrdTracklets->GetEntriesFast()]) AliESDTrdTracklet(trackletWord, hcid, label);
1236 //______________________________________________________________________________
1237 Int_t AliESDEvent::AddKink(const AliESDkink *c)
1240 TClonesArray &fk = *fKinks;
1241 AliESDkink * kink = new(fk[fKinks->GetEntriesFast()]) AliESDkink(*c);
1242 kink->SetID(fKinks->GetEntriesFast()); // CKB different from the other imps..
1243 return fKinks->GetEntriesFast()-1;
1247 //______________________________________________________________________________
1248 void AliESDEvent::AddCascade(const AliESDcascade *c)
1250 TClonesArray &fc = *fCascades;
1251 new(fc[fCascades->GetEntriesFast()]) AliESDcascade(*c);
1254 //______________________________________________________________________________
1255 void AliESDEvent::AddCosmicTrack(const AliESDCosmicTrack *t)
1257 TClonesArray &ft = *fCosmicTracks;
1258 new(ft[fCosmicTracks->GetEntriesFast()]) AliESDCosmicTrack(*t);
1262 //______________________________________________________________________________
1263 Int_t AliESDEvent::AddCaloCluster(const AliESDCaloCluster *c)
1266 TClonesArray &fc = *fCaloClusters;
1267 AliESDCaloCluster *clus = new(fc[fCaloClusters->GetEntriesFast()]) AliESDCaloCluster(*c);
1268 clus->SetID(fCaloClusters->GetEntriesFast()-1);
1269 return fCaloClusters->GetEntriesFast()-1;
1273 //______________________________________________________________________________
1274 void AliESDEvent::AddRawDataErrorLog(const AliRawDataErrorLog *log) const {
1275 TClonesArray &errlogs = *fErrorLogs;
1276 new(errlogs[errlogs.GetEntriesFast()]) AliRawDataErrorLog(*log);
1279 //______________________________________________________________________________
1280 void AliESDEvent::SetZDCData(const AliESDZDC * obj)
1282 // use already allocated space
1287 //______________________________________________________________________________
1288 void AliESDEvent::SetPrimaryVertexTPC(const AliESDVertex *vertex)
1290 // Set the TPC vertex
1291 // use already allocated space
1293 *fTPCVertex = *vertex;
1294 fTPCVertex->SetName(fgkESDListName[kTPCVertex]);
1298 //______________________________________________________________________________
1299 void AliESDEvent::SetPrimaryVertexSPD(const AliESDVertex *vertex)
1301 // Set the SPD vertex
1302 // use already allocated space
1304 *fSPDVertex = *vertex;
1305 fSPDVertex->SetName(fgkESDListName[kSPDVertex]);
1309 //______________________________________________________________________________
1310 void AliESDEvent::SetPrimaryVertexTracks(const AliESDVertex *vertex)
1312 // Set the primary vertex reconstructed using he ESD tracks.
1313 // use already allocated space
1315 *fPrimaryVertex = *vertex;
1316 fPrimaryVertex->SetName(fgkESDListName[kPrimaryVertex]);
1320 //______________________________________________________________________________
1321 const AliESDVertex * AliESDEvent::GetPrimaryVertex() const
1324 // Get the "best" available reconstructed primary vertex.
1327 if (fPrimaryVertex->GetStatus()) return fPrimaryVertex;
1330 if (fSPDVertex->GetStatus()) return fSPDVertex;
1332 if(fTPCVertex) return fTPCVertex;
1334 AliWarning("No primary vertex available. Returning the \"default\"...");
1338 //______________________________________________________________________________
1339 AliESDVertex * AliESDEvent::PrimaryVertexTracksUnconstrained() const
1342 // Removes diamond constraint from fPrimaryVertex (reconstructed with tracks)
1343 // Returns a AliESDVertex which has to be deleted by the user
1345 if(!fPrimaryVertex) {
1346 AliWarning("No primary vertex from tracks available.");
1349 if(!fPrimaryVertex->GetStatus()) {
1350 AliWarning("No primary vertex from tracks available.");
1354 AliVertexerTracks vertexer(GetMagneticField());
1355 Float_t diamondxyz[3]={(Float_t)GetDiamondX(),(Float_t)GetDiamondY(),0.};
1356 Float_t diamondcovxy[3]; GetDiamondCovXY(diamondcovxy);
1357 Float_t diamondcov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,7.};
1358 AliESDVertex *vertex =
1359 (AliESDVertex*)vertexer.RemoveConstraintFromVertex(fPrimaryVertex,diamondxyz,diamondcov);
1364 //______________________________________________________________________________
1365 void AliESDEvent::SetMultiplicity(const AliMultiplicity *mul)
1367 // Set the SPD Multiplicity
1374 //______________________________________________________________________________
1375 void AliESDEvent::SetFMDData(AliESDFMD * obj)
1377 // use already allocated space
1383 //______________________________________________________________________________
1384 void AliESDEvent::SetVZEROData(const AliESDVZERO * obj)
1386 // use already allocated space
1391 //______________________________________________________________________________
1392 void AliESDEvent::SetTZEROData(const AliESDTZERO * obj)
1394 // use already allocated space
1400 //______________________________________________________________________________
1401 void AliESDEvent::SetACORDEData(AliESDACORDE * obj)
1407 //______________________________________________________________________________
1408 void AliESDEvent::SetADData(AliESDAD * obj)
1414 //______________________________________________________________________________
1415 void AliESDEvent::GetESDfriend(AliESDfriend *ev) const
1418 // Extracts the complementary info from the ESD
1422 Int_t ntrk=GetNumberOfTracks();
1424 for (Int_t i=0; i<ntrk; i++) {
1425 AliESDtrack *t=GetTrack(i);
1426 if (!t) {AliFatal(Form("NULL pointer for ESD track %d",i));}
1427 const AliESDfriendTrack *f=t->GetFriendTrack();
1430 t->ReleaseESDfriendTrack();// Not to have two copies of "friendTrack"
1434 AliESDfriend *fr = (AliESDfriend*)(const_cast<AliESDEvent*>(this)->FindListObject("AliESDfriend"));
1435 if (fr) ev->SetVZEROfriend(fr->GetVZEROfriend());
1438 //______________________________________________________________________________
1439 void AliESDEvent::AddObject(TObject* obj)
1441 // Add an object to the list of object.
1442 // Please be aware that in order to increase performance you should
1443 // refrain from using TObjArrays (if possible). Use TClonesArrays, instead.
1444 fESDObjects->SetOwner(kTRUE);
1445 fESDObjects->AddLast(obj);
1448 //______________________________________________________________________________
1449 void AliESDEvent::GetStdContent()
1451 // set pointers for standard content
1452 // get by name much safer and not a big overhead since not called very often
1454 fESDRun = (AliESDRun*)fESDObjects->FindObject(fgkESDListName[kESDRun]);
1455 fHeader = (AliESDHeader*)fESDObjects->FindObject(fgkESDListName[kHeader]);
1456 fESDZDC = (AliESDZDC*)fESDObjects->FindObject(fgkESDListName[kESDZDC]);
1457 fESDFMD = (AliESDFMD*)fESDObjects->FindObject(fgkESDListName[kESDFMD]);
1458 fESDVZERO = (AliESDVZERO*)fESDObjects->FindObject(fgkESDListName[kESDVZERO]);
1459 fESDTZERO = (AliESDTZERO*)fESDObjects->FindObject(fgkESDListName[kESDTZERO]);
1460 fTPCVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kTPCVertex]);
1461 fSPDVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kSPDVertex]);
1462 fPrimaryVertex = (AliESDVertex*)fESDObjects->FindObject(fgkESDListName[kPrimaryVertex]);
1463 fSPDMult = (AliMultiplicity*)fESDObjects->FindObject(fgkESDListName[kSPDMult]);
1464 fPHOSTrigger = (AliESDCaloTrigger*)fESDObjects->FindObject(fgkESDListName[kPHOSTrigger]);
1465 fEMCALTrigger = (AliESDCaloTrigger*)fESDObjects->FindObject(fgkESDListName[kEMCALTrigger]);
1466 fSPDPileupVertices = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kSPDPileupVertices]);
1467 fTrkPileupVertices = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTrkPileupVertices]);
1468 fTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTracks]);
1469 fMuonTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kMuonTracks]);
1470 fMuonClusters = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kMuonClusters]);
1471 fMuonPads = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kMuonPads]);
1472 fPmdTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kPmdTracks]);
1473 fTrdTrigger = (AliESDTrdTrigger*)fESDObjects->FindObject(fgkESDListName[kTrdTrigger]);
1474 fTrdTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTrdTracks]);
1475 fTrdTracklets = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTrdTracklets]);
1476 fV0s = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kV0s]);
1477 fCascades = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kCascades]);
1478 fKinks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kKinks]);
1479 fCaloClusters = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kCaloClusters]);
1480 fEMCALCells = (AliESDCaloCells*)fESDObjects->FindObject(fgkESDListName[kEMCALCells]);
1481 fPHOSCells = (AliESDCaloCells*)fESDObjects->FindObject(fgkESDListName[kPHOSCells]);
1482 fErrorLogs = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kErrorLogs]);
1483 fESDACORDE = (AliESDACORDE*)fESDObjects->FindObject(fgkESDListName[kESDACORDE]);
1484 fESDAD = (AliESDAD*)fESDObjects->FindObject(fgkESDListName[kESDAD]);
1485 fTOFHeader = (AliTOFHeader*)fESDObjects->FindObject(fgkESDListName[kTOFHeader]);
1486 fCosmicTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kCosmicTracks]);
1487 fTOFcluster = new TObjArray(1);
1490 //______________________________________________________________________________
1491 void AliESDEvent::SetStdNames(){
1492 // Set the names of the standard contents
1494 if(fESDObjects->GetEntries()>=kESDListN){
1495 for(int i = 0;i < fESDObjects->GetEntries() && i<kESDListN;i++){
1496 TObject *fObj = fESDObjects->At(i);
1497 if(fObj->InheritsFrom("TNamed")){
1498 ((TNamed*)fObj)->SetName(fgkESDListName[i]);
1500 else if(fObj->InheritsFrom("TClonesArray")){
1501 ((TClonesArray*)fObj)->SetName(fgkESDListName[i]);
1506 AliWarning("Std Entries missing");
1510 //______________________________________________________________________________
1511 void AliESDEvent::CreateStdContent(Bool_t bUseThisList){
1512 fUseOwnList = bUseThisList;
1516 //______________________________________________________________________________
1517 void AliESDEvent::CreateStdContent()
1519 // create the standard AOD content and set pointers
1521 // create standard objects and add them to the TList of objects
1522 AddObject(new AliESDRun());
1523 AddObject(new AliESDHeader());
1524 AddObject(new AliESDZDC());
1525 AddObject(new AliESDFMD());
1526 AddObject(new AliESDVZERO());
1527 AddObject(new AliESDTZERO());
1528 AddObject(new AliESDVertex());
1529 AddObject(new AliESDVertex());
1530 AddObject(new AliESDVertex());
1531 AddObject(new AliMultiplicity());
1532 AddObject(new AliESDCaloTrigger());
1533 AddObject(new AliESDCaloTrigger());
1534 AddObject(new TClonesArray("AliESDVertex",0));
1535 AddObject(new TClonesArray("AliESDVertex",0));
1536 AddObject(new TClonesArray("AliESDtrack",0));
1537 AddObject(new TClonesArray("AliESDMuonTrack",0));
1538 AddObject(new TClonesArray("AliESDMuonCluster",0));
1539 AddObject(new TClonesArray("AliESDMuonPad",0));
1540 AddObject(new TClonesArray("AliESDPmdTrack",0));
1541 AddObject(new AliESDTrdTrigger());
1542 AddObject(new TClonesArray("AliESDTrdTrack",0));
1543 AddObject(new TClonesArray("AliESDTrdTracklet",0));
1544 AddObject(new TClonesArray("AliESDv0",0));
1545 AddObject(new TClonesArray("AliESDcascade",0));
1546 AddObject(new TClonesArray("AliESDkink",0));
1547 AddObject(new TClonesArray("AliESDCaloCluster",0));
1548 AddObject(new AliESDCaloCells());
1549 AddObject(new AliESDCaloCells());
1550 AddObject(new TClonesArray("AliRawDataErrorLog",0));
1551 AddObject(new AliESDACORDE());
1552 AddObject(new AliESDAD());
1553 AddObject(new AliTOFHeader());
1554 AddObject(new TClonesArray("AliESDCosmicTrack",0));
1556 // check the order of the indices against enum...
1560 // read back pointers
1564 //______________________________________________________________________________
1565 void AliESDEvent::CompleteStdContent()
1567 // Create missing standard objects and add them to the TList of objects
1569 // Add cosmic tracks for cases where esd files were created
1570 // before adding them to the std content
1571 if (!fESDObjects->FindObject(fgkESDListName[kCosmicTracks])) {
1572 TClonesArray* cosmics = new TClonesArray("AliESDCosmicTrack",0);
1573 fESDObjects->AddAt(cosmics, kCosmicTracks);
1574 fESDObjects->SetOwner(kTRUE);
1576 // Add new MUON containers if missing (for backward compatibility)
1577 if (!fESDObjects->FindObject(fgkESDListName[kMuonClusters])) {
1578 TClonesArray* muonClusters = new TClonesArray("AliESDMuonCluster",0);
1579 muonClusters->SetName(fgkESDListName[kMuonClusters]);
1580 fESDObjects->AddAt(muonClusters, kMuonClusters);
1581 fESDObjects->SetOwner(kTRUE);
1583 if (!fESDObjects->FindObject(fgkESDListName[kMuonPads])) {
1584 TClonesArray* muonPads = new TClonesArray("AliESDMuonPad",0);
1585 muonPads->SetName(fgkESDListName[kMuonPads]);
1586 fESDObjects->AddAt(muonPads, kMuonPads);
1587 fESDObjects->SetOwner(kTRUE);
1591 //______________________________________________________________________________
1592 TObject* AliESDEvent::FindListObject(const char *name) const {
1594 // Find object with name "name" in the list of branches
1597 return fESDObjects->FindObject(name);
1602 //______________________________________________________________________________
1603 Int_t AliESDEvent::GetPHOSClusters(TRefArray *clusters) const
1605 // fills the provided TRefArray with all found phos clusters
1609 AliESDCaloCluster *cl = 0;
1610 for (Int_t i = 0; i < GetNumberOfCaloClusters(); i++) {
1612 if ( (cl = GetCaloCluster(i)) ) {
1615 AliDebug(1,Form("IsPHOS cluster %d Size: %d \n",i,clusters->GetEntriesFast()));
1619 return clusters->GetEntriesFast();
1622 //______________________________________________________________________________
1623 Int_t AliESDEvent::GetEMCALClusters(TRefArray *clusters) const
1625 // fills the provided TRefArray with all found emcal clusters
1629 AliESDCaloCluster *cl = 0;
1630 for (Int_t i = 0; i < GetNumberOfCaloClusters(); i++) {
1632 if ( (cl = GetCaloCluster(i)) ) {
1635 AliDebug(1,Form("IsEMCAL cluster %d Size: %d \n",i,clusters->GetEntriesFast()));
1639 return clusters->GetEntriesFast();
1642 //______________________________________________________________________________
1643 void AliESDEvent::WriteToTree(TTree* tree) const {
1644 // Book the branches as in TTree::Branch(TCollection*)
1645 // but add a "." at the end of top level branches which are
1646 // not a TClonesArray
1650 TIter next(fESDObjects);
1651 const Int_t kSplitlevel = 99; // default value in TTree::Branch()
1652 const Int_t kBufsize = 32000; // default value in TTree::Branch()
1655 while ((obj = next())) {
1656 branchname.Form("%s", obj->GetName());
1657 if(branchname.CompareTo("AliESDfriend")==0)branchname = "ESDfriend.";
1658 if ((kSplitlevel > 1) && !obj->InheritsFrom(TClonesArray::Class())) {
1659 if(!branchname.EndsWith("."))branchname += ".";
1661 if (!tree->FindBranch(branchname)) {
1662 // For the custom streamer to be called splitlevel
1663 // has to be negative, only needed for HLT
1664 Int_t splitLevel = (TString(obj->ClassName()) == "AliHLTGlobalTriggerDecision") ? -1 : kSplitlevel - 1;
1665 tree->Bronch(branchname, obj->ClassName(), fESDObjects->GetObjectRef(obj),kBufsize, splitLevel);
1669 tree->Branch("fDetectorStatus",(void*)&fDetectorStatus,"fDetectorStatus/l");
1670 tree->Branch("fDAQDetectorPattern",(void*)&fDAQDetectorPattern,"fDAQDetectorPattern/i");
1671 tree->Branch("fDAQAttributes",(void*)&fDAQAttributes,"fDAQAttributes/i");
1672 tree->Branch("fNTOFclusters",(void *) &fNTOFclusters,"fNTOFclusters/i");
1673 tree->Branch("fTOFcluster","TObjArray",(void *) &fTOFcluster);
1676 //______________________________________________________________________________
1677 void AliESDEvent::ReadFromTree(TTree *tree, Option_t* opt){
1679 // Connect the ESDEvent to a tree
1682 AliWarning("AliESDEvent::ReadFromTree() Zero Pointer to Tree \n");
1686 if(!tree->GetTree())tree->LoadTree(0);
1688 // if we find the "ESD" branch on the tree we do have the old structure
1689 if(tree->GetBranch("ESD")) {
1690 fOldMuonStructure = kFALSE;
1691 char ** address = (char **)(tree->GetBranch("ESD")->GetAddress());
1692 // do we have the friend branch
1693 TBranch * esdFB = tree->GetBranch("ESDfriend.");
1694 char ** addressF = 0;
1695 if(esdFB)addressF = (char **)(esdFB->GetAddress());
1697 AliInfo("AliESDEvent::ReadFromTree() Reading old Tree");
1698 tree->SetBranchAddress("ESD", &fESDOld);
1700 tree->SetBranchAddress("ESDfriend.",&fESDFriendOld);
1703 AliInfo("AliESDEvent::ReadFromTree() Reading old Tree");
1704 AliInfo("Branch already connected. Using existing branch address.");
1705 fESDOld = (AliESD*) (*address);
1706 // addressF can still be 0, since branch needs to switched on
1707 if(addressF)fESDFriendOld = (AliESDfriend*) (*addressF);
1710 // have already connected the old ESD structure... ?
1711 // reuse also the pointer of the AlliESDEvent
1712 // otherwise create new ones
1713 TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("ESDObjectsConnectedToTree"));
1716 // If connected use the connected list of objects
1717 if(fESDObjects!= connectedList){
1718 // protect when called twice
1719 fESDObjects->Delete();
1720 fESDObjects = connectedList;
1725 // The pointer to the friend changes when called twice via InitIO
1726 // since AliESDEvent is deleted
1727 TObject* oldf = FindListObject("AliESDfriend");
1730 newf = (TObject*)*addressF;
1732 if(newf!=0&&oldf!=newf){
1733 // remove the old reference
1734 // Should we also delete it? Or is this handled in TTree I/O
1735 // since it is created by the first SetBranchAddress
1736 fESDObjects->Remove(oldf);
1738 fESDObjects->Add(newf);
1745 CreateStdContent(); // create for copy
1746 // if we have the esdfriend add it, so we always can access it via the userinfo
1747 if(fESDFriendOld)AddObject(fESDFriendOld);
1748 // we are not owner of the list objects
1749 // must not delete it
1750 fESDObjects->SetOwner(kTRUE);
1751 fESDObjects->SetName("ESDObjectsConnectedToTree");
1752 tree->GetUserInfo()->Add(fESDObjects);
1760 // Try to find AliESDEvent
1761 AliESDEvent *esdEvent = 0;
1762 esdEvent = (AliESDEvent*)tree->GetTree()->GetUserInfo()->FindObject("AliESDEvent");
1764 // Check if already connected to tree
1766 TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("ESDObjectsConnectedToTree"));
1769 if (connectedList && (strcmp(opt, "reconnect"))) {
1770 // If connected use the connected list if objects
1771 fESDObjects->Delete();
1772 fESDObjects = connectedList;
1773 tree->SetBranchAddress("fDetectorStatus",&fDetectorStatus); //PH probably redundant
1774 tree->SetBranchAddress("fDAQDetectorPattern",&fDAQDetectorPattern);
1775 tree->SetBranchAddress("fDAQAttributes",&fDAQAttributes);
1776 if(tree->GetBranch("fNTOFclusters")) tree->SetBranchAddress("fNTOFclusters",(UInt_t *) &fNTOFclusters);
1777 if(tree->GetBranch("fTOFcluster")) tree->SetBranchAddress("fTOFcluster",&fTOFcluster);
1779 fOldMuonStructure = fESDObjects->TestBit(BIT(23));
1785 // prevent a memory leak when reading back the TList
1786 // if (!(strcmp(opt, "reconnect"))) fESDObjects->Delete();
1789 // create a new TList from the UserInfo TList...
1790 // copy constructor does not work...
1791 fESDObjects = (TList*)(esdEvent->GetList()->Clone());
1792 fESDObjects->SetOwner(kTRUE);
1794 else if ( fESDObjects->GetEntries()==0){
1795 // at least create the std content if we want to read to our list
1800 // we only need new things in the list if we do no already have it..
1801 // TODO just add new entries
1802 CompleteStdContent();
1804 if(fESDObjects->GetEntries()<kESDListN){
1805 AliWarning(Form("AliESDEvent::ReadFromTree() TList contains less than the standard contents %d < %d \n",
1806 fESDObjects->GetEntries(),kESDListN));
1808 // set the branch addresses
1809 fOldMuonStructure = kFALSE;
1810 TIter next(fESDObjects);
1812 while((el=(TNamed*)next())){
1813 TString bname(el->GetName());
1814 if(bname.CompareTo("AliESDfriend")==0)
1816 // AliESDfriend does not have a name ...
1817 TBranch *br = tree->GetBranch("ESDfriend.");
1818 if (br) tree->SetBranchAddress("ESDfriend.",fESDObjects->GetObjectRef(el));
1821 // check if branch exists under this Name
1822 TBranch *br = tree->GetBranch(bname.Data());
1824 tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));
1827 br = tree->GetBranch(Form("%s.",bname.Data()));
1829 tree->SetBranchAddress(Form("%s.",bname.Data()),fESDObjects->GetObjectRef(el));
1832 AliWarning(Form("AliESDEvent::ReadFromTree() No Branch found with Name %s or %s.",bname.Data(),bname.Data()));
1833 if (bname == fgkESDListName[kMuonClusters]) {
1834 fOldMuonStructure = kTRUE;
1841 tree->SetBranchAddress("fDetectorStatus",&fDetectorStatus);
1842 tree->SetBranchAddress("fDAQDetectorPattern",&fDAQDetectorPattern);
1843 tree->SetBranchAddress("fDAQAttributes",&fDAQAttributes);
1844 if(tree->GetBranch("fNTOFclusters")) tree->SetBranchAddress("fNTOFclusters",(UInt_t *) &fNTOFclusters);
1845 if(tree->GetBranch("fTOFcluster")) tree->SetBranchAddress("fTOFcluster",&fTOFcluster);
1848 // when reading back we are not owner of the list
1849 // must not delete it
1850 fESDObjects->SetOwner(kTRUE);
1851 fESDObjects->SetName("ESDObjectsConnectedToTree");
1852 fESDObjects->SetBit(BIT(23), fOldMuonStructure);
1853 // we are not owner of the list objects
1854 // must not delete it
1855 tree->GetUserInfo()->Add(fESDObjects);
1856 tree->GetUserInfo()->SetOwner(kFALSE);
1860 // we can't get the list from the user data, create standard content
1861 // and set it by hand (no ESDfriend at the moment
1863 fOldMuonStructure = kFALSE;
1864 TIter next(fESDObjects);
1866 while((el=(TNamed*)next())){
1867 TString bname(el->GetName());
1868 TBranch *br = tree->GetBranch(bname.Data());
1870 tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));
1873 br = tree->GetBranch(Form("%s.",bname.Data()));
1875 tree->SetBranchAddress(Form("%s.",bname.Data()),fESDObjects->GetObjectRef(el));
1877 else if (bname == fgkESDListName[kMuonClusters]) {
1878 fOldMuonStructure = kTRUE;
1882 tree->SetBranchAddress("fDetectorStatus",&fDetectorStatus);
1883 tree->SetBranchAddress("fDAQDetectorPattern",&fDAQDetectorPattern);
1884 tree->SetBranchAddress("fDAQAttributes",&fDAQAttributes);
1885 if(tree->GetBranch("fNTOFclusters")) tree->SetBranchAddress("fNTOFclusters",(UInt_t *) &fNTOFclusters);
1886 if(tree->GetBranch("fTOFcluster")) tree->SetBranchAddress("fTOFcluster",&fTOFcluster);
1889 // when reading back we are not owner of the list
1890 // must not delete it
1891 fESDObjects->SetOwner(kTRUE);
1895 //______________________________________________________________________________
1896 void AliESDEvent::CopyFromOldESD()
1898 // Method which copies over everthing from the old esd structure to the
1903 SetRunNumber(fESDOld->GetRunNumber());
1904 SetPeriodNumber(fESDOld->GetPeriodNumber());
1905 SetMagneticField(fESDOld->GetMagneticField());
1907 // leave out diamond ...
1908 // SetDiamond(const AliESDVertex *vertex) { fESDRun->SetDiamond(vertex);}
1911 SetTriggerMask(fESDOld->GetTriggerMask());
1912 SetOrbitNumber(fESDOld->GetOrbitNumber());
1913 SetTimeStamp(fESDOld->GetTimeStamp());
1914 SetEventType(fESDOld->GetEventType());
1915 SetEventNumberInFile(fESDOld->GetEventNumberInFile());
1916 SetBunchCrossNumber(fESDOld->GetBunchCrossNumber());
1917 SetTriggerCluster(fESDOld->GetTriggerCluster());
1921 SetZDC(fESDOld->GetZDCN1Energy(),
1922 fESDOld->GetZDCP1Energy(),
1923 fESDOld->GetZDCEMEnergy(),
1925 fESDOld->GetZDCN2Energy(),
1926 fESDOld->GetZDCP2Energy(),
1927 fESDOld->GetZDCParticipants(),
1937 if(fESDOld->GetFMDData())SetFMDData(fESDOld->GetFMDData());
1941 SetT0zVertex(fESDOld->GetT0zVertex());
1942 SetT0(fESDOld->GetT0());
1946 if (fESDOld->GetVZEROData()) SetVZEROData(fESDOld->GetVZEROData());
1948 if(fESDOld->GetVertex())SetPrimaryVertexSPD(fESDOld->GetVertex());
1950 if(fESDOld->GetPrimaryVertex())SetPrimaryVertexTracks(fESDOld->GetPrimaryVertex());
1952 if(fESDOld->GetMultiplicity())SetMultiplicity(fESDOld->GetMultiplicity());
1954 for(int i = 0;i<fESDOld->GetNumberOfTracks();i++){
1955 AddTrack(fESDOld->GetTrack(i));
1958 for(int i = 0;i<fESDOld->GetNumberOfMuonTracks();i++){
1959 AddMuonTrack(fESDOld->GetMuonTrack(i));
1962 for(int i = 0;i<fESDOld->GetNumberOfPmdTracks();i++){
1963 AddPmdTrack(fESDOld->GetPmdTrack(i));
1966 for(int i = 0;i<fESDOld->GetNumberOfTrdTracks();i++){
1967 AddTrdTrack(fESDOld->GetTrdTrack(i));
1970 for(int i = 0;i<fESDOld->GetNumberOfV0s();i++){
1971 AddV0(fESDOld->GetV0(i));
1974 for(int i = 0;i<fESDOld->GetNumberOfCascades();i++){
1975 AddCascade(fESDOld->GetCascade(i));
1978 for(int i = 0;i<fESDOld->GetNumberOfKinks();i++){
1979 AddKink(fESDOld->GetKink(i));
1983 for(int i = 0;i<fESDOld->GetNumberOfCaloClusters();i++){
1984 AddCaloCluster(fESDOld->GetCaloCluster(i));
1990 //______________________________________________________________________________
1991 Bool_t AliESDEvent::IsEventSelected(const char *trigExpr) const
1993 // Check if the event satisfies the trigger
1994 // selection expression trigExpr.
1995 // trigExpr can be any logical expression
1996 // of the trigger classes defined in AliESDRun
1997 // In case of wrong syntax return kTRUE.
1999 TString expr(trigExpr);
2000 if (expr.IsNull()) return kTRUE;
2002 ULong64_t mask = GetTriggerMask();
2003 for(Int_t itrig = 0; itrig < AliESDRun::kNTriggerClasses; itrig++) {
2004 if (mask & (1ull << itrig)) {
2005 expr.ReplaceAll(GetESDRun()->GetTriggerClass(itrig),"1");
2008 expr.ReplaceAll(GetESDRun()->GetTriggerClass(itrig),"0");
2013 if ((gROOT->ProcessLineFast(expr.Data(),&error) == 0) &&
2014 (error == TInterpreter::kNoError)) {
2022 //______________________________________________________________________________
2023 TObject* AliESDEvent::GetHLTTriggerDecision() const
2025 // get the HLT trigger decission object
2027 // cast away const'nes because the FindListObject method
2029 AliESDEvent* pNonConst=const_cast<AliESDEvent*>(this);
2030 return pNonConst->FindListObject("HLTGlobalTrigger");
2033 TString AliESDEvent::GetHLTTriggerDescription() const
2035 // get the HLT trigger decission description
2036 TString description;
2037 TObject* pDecision=GetHLTTriggerDecision();
2039 description=pDecision->GetTitle();
2045 //______________________________________________________________________________
2046 Bool_t AliESDEvent::IsHLTTriggerFired(const char* name) const
2048 // get the HLT trigger decission description
2049 TObject* pDecision=GetHLTTriggerDecision();
2050 if (!pDecision) return kFALSE;
2052 Option_t* option=pDecision->GetOption();
2053 if (option==NULL || *option!='1') return kFALSE;
2056 TString description=GetHLTTriggerDescription();
2057 Int_t index=description.Index(name);
2058 if (index<0) return kFALSE;
2059 index+=strlen(name);
2060 if (index>=description.Length()) return kFALSE;
2061 if (description[index]!=0 && description[index]!=' ') return kFALSE;
2066 //______________________________________________________________________________
2067 Bool_t AliESDEvent::IsPileupFromSPD(Int_t minContributors,
2069 Double_t nSigmaZdist,
2070 Double_t nSigmaDiamXY,
2071 Double_t nSigmaDiamZ) const{
2073 // This function checks if there was a pile up
2074 // reconstructed with SPD
2076 Int_t nc1=fSPDVertex->GetNContributors();
2077 if(nc1<1) return kFALSE;
2078 Int_t nPileVert=GetNumberOfPileupVerticesSPD();
2079 if(nPileVert==0) return kFALSE;
2081 for(Int_t i=0; i<nPileVert;i++){
2082 const AliESDVertex* pv=GetPileupVertexSPD(i);
2083 Int_t nc2=pv->GetNContributors();
2084 if(nc2>=minContributors){
2085 Double_t z1=fSPDVertex->GetZ();
2086 Double_t z2=pv->GetZ();
2087 Double_t distZ=TMath::Abs(z2-z1);
2088 Double_t distZdiam=TMath::Abs(z2-GetDiamondZ());
2089 Double_t cutZdiam=nSigmaDiamZ*TMath::Sqrt(GetSigma2DiamondZ());
2090 if(GetSigma2DiamondZ()<0.0001)cutZdiam=99999.; //protection for missing z diamond information
2091 if(distZ>minZdist && distZdiam<cutZdiam){
2092 Double_t x2=pv->GetX();
2093 Double_t y2=pv->GetY();
2094 Double_t distXdiam=TMath::Abs(x2-GetDiamondX());
2095 Double_t distYdiam=TMath::Abs(y2-GetDiamondY());
2096 Double_t cov1[6],cov2[6];
2097 fSPDVertex->GetCovarianceMatrix(cov1);
2098 pv->GetCovarianceMatrix(cov2);
2099 Double_t errxDist=TMath::Sqrt(cov2[0]+GetSigma2DiamondX());
2100 Double_t erryDist=TMath::Sqrt(cov2[2]+GetSigma2DiamondY());
2101 Double_t errzDist=TMath::Sqrt(cov1[5]+cov2[5]);
2102 Double_t cutXdiam=nSigmaDiamXY*errxDist;
2103 if(GetSigma2DiamondX()<0.0001)cutXdiam=99999.; //protection for missing diamond information
2104 Double_t cutYdiam=nSigmaDiamXY*erryDist;
2105 if(GetSigma2DiamondY()<0.0001)cutYdiam=99999.; //protection for missing diamond information
2106 if( (distXdiam<cutXdiam) && (distYdiam<cutYdiam) && (distZ>nSigmaZdist*errzDist) ){
2115 //______________________________________________________________________________
2116 void AliESDEvent::EstimateMultiplicity(Int_t &tracklets, Int_t &trITSTPC, Int_t &trITSSApure, Double_t eta, Bool_t useDCAFlag,Bool_t useV0Flag) const
2119 // calculates 3 estimators for the multiplicity in the -eta:eta range
2120 // tracklets : using SPD tracklets only
2121 // trITSTPC : using TPC/ITS + complementary ITS SA tracks + tracklets from clusters not used by tracks
2122 // trITSSApure : using ITS standalone tracks + tracklets from clusters not used by tracks
2123 // if useDCAFlag is true: account for the ESDtrack flag marking the tracks with large DCA
2124 // if useV0Flag is true: account for the ESDtrack flag marking conversion and K0's V0s
2126 AliWarning("This obsolete method will be eliminated soon. Use AliESDtrackCuts::GetReferenceMultiplicity");
2128 tracklets = trITSSApure = trITSTPC = 0;
2129 int ntr = fSPDMult ? fSPDMult->GetNumberOfTracklets() : 0;
2132 for (int itr=ntr;itr--;) {
2133 if (TMath::Abs(fSPDMult->GetEta(itr))>eta) continue;
2135 if (fSPDMult->FreeClustersTracklet(itr,0)) trITSTPC++; // not used in ITS/TPC or ITS_SA track
2136 if (fSPDMult->FreeClustersTracklet(itr,1)) trITSSApure++; // not used in ITS_SA_Pure track
2139 // count real tracks
2140 ntr = GetNumberOfTracks();
2141 for (int itr=ntr;itr--;) {
2142 AliESDtrack *t = GetTrack(itr);
2143 if (!t) {AliFatal(Form("NULL pointer for ESD track %d",itr));}
2144 if (TMath::Abs(t->Eta())>eta) continue;
2145 if (!t->IsOn(AliESDtrack::kITSin)) continue;
2146 if (useDCAFlag && t->IsOn(AliESDtrack::kMultSec)) continue;
2147 if (useV0Flag && t->IsOn(AliESDtrack::kMultInV0)) continue;
2148 if (t->IsOn(AliESDtrack::kITSpureSA)) trITSSApure++;
2154 //______________________________________________________________________________
2155 Bool_t AliESDEvent::IsPileupFromSPDInMultBins() const {
2156 Int_t nTracklets=GetMultiplicity()->GetNumberOfTracklets();
2157 if(nTracklets<20) return IsPileupFromSPD(3,0.8);
2158 else if(nTracklets<50) return IsPileupFromSPD(4,0.8);
2159 else return IsPileupFromSPD(5,0.8);
2162 //______________________________________________________________________________
2163 void AliESDEvent::SetTOFHeader(const AliTOFHeader *header)
2166 // Set the TOF event_time
2170 *fTOFHeader=*header;
2171 //fTOFHeader->SetName(fgkESDListName[kTOFHeader]);
2174 // for analysis of reconstructed events
2175 // when this information is not avaliable
2176 fTOFHeader = new AliTOFHeader(*header);
2177 //AddObject(fTOFHeader);
2182 //______________________________________________________________________________
2183 AliCentrality* AliESDEvent::GetCentrality()
2185 if (!fCentrality) fCentrality = new AliCentrality();
2189 //______________________________________________________________________________
2190 AliEventplane* AliESDEvent::GetEventplane()
2192 if (!fEventplane) fEventplane = new AliEventplane();
2196 //______________________________________________________________________________
2197 Float_t AliESDEvent::GetVZEROEqMultiplicity(Int_t i) const
2199 // Get VZERO Multiplicity for channel i
2200 // Themethod uses the equalization factors
2201 // stored in the ESD-run object in order to
2202 // get equal multiplicities within a VZERO rins (1/8 of VZERO)
2203 if (!fESDVZERO || !fESDRun) return -1;
2206 Float_t factorSum = 0;
2207 for(Int_t j = 8*ring; j < (8*ring+8); ++j) {
2208 factorSum += fESDRun->GetVZEROEqFactors(j);
2210 Float_t factor = fESDRun->GetVZEROEqFactors(i)*8./factorSum;
2212 return (fESDVZERO->GetMultiplicity(i)/factor);
2215 //______________________________________________________________________________
2216 void AliESDEvent::SetTOFcluster(Int_t ntofclusters,AliESDTOFcluster *cluster,Int_t *mapping){
2219 fTOFcluster->Clear();
2220 fTOFcluster->Expand(1);
2222 for(Int_t i=0;i < ntofclusters;i++){
2224 if(cluster[i].GetNMatchableTracks() || !mapping){
2225 fTOFcluster->Expand(fNTOFclusters+1);
2226 fTOFcluster->AddAt(&cluster[i],fNTOFclusters);
2228 mapping[i] = fNTOFclusters;
2233 printf("TOF cluster before of matching = %i , after = %i\n",ntofclusters,fNTOFclusters);
2238 //______________________________________________________________________________
2239 void AliESDEvent::SetTOFcluster(Int_t ntofclusters,AliESDTOFcluster *cluster[],Int_t *mapping){
2242 fTOFcluster->Clear();
2243 fTOFcluster->Expand(1);
2245 for(Int_t i=0;i < ntofclusters;i++){
2247 if(cluster[i]->GetNMatchableTracks() || !mapping){
2248 fTOFcluster->Expand(fNTOFclusters+1);
2249 fTOFcluster->AddAt(cluster[i],fNTOFclusters);
2251 mapping[i] = fNTOFclusters;
2256 printf("TOF cluster before of matching = %i , after = %i\n",ntofclusters,fNTOFclusters);
2261 //______________________________________________________________________________
2262 void AliESDEvent::ConnectTracks() {
2263 // Connect tracks to this event
2264 if (fTracksConnected || !fTracks || !fTracks->GetEntriesFast()) return;
2266 TIter next(fTracks);
2267 while ((track=(AliESDtrack*)next())) track->SetESDEvent(this);
2268 fTracksConnected = kTRUE;