1 /**************************************************************************
2 * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 //-------------------------------------------------------------------------
20 // Author: Markus Oldenburg, CERN
21 //-------------------------------------------------------------------------
26 #include <TFriendElement.h>
27 #include <TProcessID.h>
28 #include <TCollection.h>
29 #include "Riostream.h"
30 #include "AliAODEvent.h"
31 #include "AliAODHeader.h"
32 #include "AliAODTrack.h"
33 #include "AliAODDimuon.h"
34 #include "AliAODTrdTrack.h"
38 // definition of std AOD member names
39 const char* AliAODEvent::fAODListName[kAODListN] = {"header",
62 //______________________________________________________________________________
63 AliAODEvent::AliAODEvent() :
68 fTracksConnected(kFALSE),
91 // default constructor
92 if (TClass::IsCallingNew() != TClass::kDummyNew) fAODObjects = new TList();
95 //______________________________________________________________________________
96 AliAODEvent::AliAODEvent(const AliAODEvent& aod):
98 fAODObjects(new TList()),
101 fTracksConnected(kFALSE),
102 // fHeader(new AliAODHeader(*aod.fHeader)),
104 fTracks(new TClonesArray(*aod.fTracks)),
105 fVertices(new TClonesArray(*aod.fVertices)),
106 fV0s(new TClonesArray(*aod.fV0s)),
107 fCascades(new TClonesArray(*aod.fCascades)),
108 fTracklets(new AliAODTracklets(*aod.fTracklets)),
109 fJets(new TClonesArray(*aod.fJets)),
110 fEmcalCells(new AliAODCaloCells(*aod.fEmcalCells)),
111 fPhosCells(new AliAODCaloCells(*aod.fPhosCells)),
112 fCaloClusters(new TClonesArray(*aod.fCaloClusters)),
113 fEMCALTrigger(new AliAODCaloTrigger(*aod.fEMCALTrigger)),
114 fPHOSTrigger(new AliAODCaloTrigger(*aod.fPHOSTrigger)),
115 fFmdClusters(new TClonesArray(*aod.fFmdClusters)),
116 fPmdClusters(new TClonesArray(*aod.fPmdClusters)),
117 fHMPIDrings(new TClonesArray(*aod.fHMPIDrings)),
118 fDimuons(new TClonesArray(*aod.fDimuons)),
119 fAODTZERO(new AliAODTZERO(*aod.fAODTZERO)),
120 fAODVZERO(new AliAODVZERO(*aod.fAODVZERO)),
121 fAODZDC(new AliAODZDC(*aod.fAODZDC)),
122 fTOFHeader(new AliTOFHeader(*aod.fTOFHeader)),
123 fTrdTracks(new TClonesArray(*aod.fTrdTracks))
129 AddObject(fVertices);
131 AddObject(fCascades);
132 AddObject(fTracklets);
134 AddObject(fEmcalCells);
135 AddObject(fPhosCells);
136 AddObject(fCaloClusters);
137 AddObject(fEMCALTrigger);
138 AddObject(fPHOSTrigger);
139 AddObject(fFmdClusters);
140 AddObject(fPmdClusters);
141 AddObject(fHMPIDrings);
143 AddObject(fAODTZERO);
144 AddObject(fAODVZERO);
146 AddObject(fTOFHeader);
147 AddObject(fTrdTracks);
148 fConnected = aod.fConnected;
154 //______________________________________________________________________________
155 AliAODEvent & AliAODEvent::operator=(const AliAODEvent& aod) {
157 // Assignment operator
159 if(&aod == this) return *this;
160 AliVEvent::operator=(aod);
162 // This assumes that the list is already created
163 // and that the virtual void Copy(Tobject&) function
164 // is correctly implemented in the derived class
165 // otherwise only TObject::Copy() will be used
167 if((fAODObjects->GetSize()==0)&&(aod.fAODObjects->GetSize()>=kAODListN)){
168 // We cover the case that we do not yet have the
169 // standard content but the source has it
173 // Here we have the standard content without user additions, but the content is
174 // not matching the aod source.
176 // Iterate the list of source objects
177 TIter next(aod.GetList());
180 while ((its = next())) {
181 name = its->GetName();
182 // Check if we have this object type in out list
183 TObject *mine = fAODObjects->FindObject(name);
185 // We have to create the same type of object.
186 TClass* pClass=TClass::GetClass(its->ClassName());
188 AliWarning(Form("Can not find class description for entry %s (%s)\n",
189 its->ClassName(), name.Data()));
192 mine=(TObject*)pClass->New();
194 // not in this: can be added to list
195 AliWarning(Form("%s:%d Could not find %s for copying \n",
196 (char*)__FILE__,__LINE__,name.Data()));
199 if(mine->InheritsFrom("TNamed")) {
200 ((TNamed*)mine)->SetName(name);
201 } else if(mine->InheritsFrom("TCollection")){
202 if(mine->InheritsFrom("TClonesArray")) {
203 TClonesArray *itscl = dynamic_cast<TClonesArray*>(its);
205 AliWarning(Form("Class description for entry %s (%s) not TClonesArray\n",
206 its->ClassName(), name.Data()));
210 dynamic_cast<TClonesArray*>(mine)->SetClass(itscl->GetClass(), itscl->GetSize());
212 dynamic_cast<TCollection*>(mine)->SetName(name);
214 AliDebug(1, Form("adding object %s of type %s", mine->GetName(), mine->ClassName()));
217 // Now we have an object of the same type and name, but different content.
218 if(!its->InheritsFrom("TCollection")){
219 // simple objects (do they have a Copy method that calls operator= ?)
221 } else if (its->InheritsFrom("TClonesArray")) {
222 // Create or expand the tclonesarray pointers
223 // so we can directly copy to the object
224 TClonesArray *its_tca = (TClonesArray*)its;
225 TClonesArray *mine_tca = (TClonesArray*)mine;
226 // this leaves the capacity of the TClonesArray the same
227 // except for a factor of 2 increase when size > capacity
228 // does not release any memory occupied by the tca
229 Int_t its_entries = its_tca->GetEntriesFast();
230 mine_tca->ExpandCreate(its_entries);
231 for(int i=0; i<its_entries; i++){
233 TObject *mine_tca_obj = mine_tca->At(i);
234 TObject *its_tca_obj = its_tca->At(i);
235 // no need to delete first
236 // pointers within the class should be handled by Copy()...
237 // Can there be Empty slots?
238 its_tca_obj->Copy(*mine_tca_obj);
241 AliWarning(Form("%s:%d cannot copy TCollection \n",
242 (char*)__FILE__,__LINE__));
245 fConnected = aod.fConnected;
246 fTracksConnected = kFALSE;
252 //______________________________________________________________________________
253 AliAODEvent::~AliAODEvent()
259 // fAODObjects->Delete("slow");
264 //______________________________________________________________________________
265 void AliAODEvent::AddObject(TObject* obj)
267 // Add an object to the list of objects.
268 // Please be aware that in order to increase performance you should
269 // refrain from using TObjArrays (if possible). Use TClonesArrays, instead.
271 // if ( !fAODObjects ) {
272 // fAODObjects = new TList();
273 // fAODObjects->SetOwner();
275 if ( !fAODObjects->FindObject(obj) )
277 fAODObjects->AddLast(obj);
281 //______________________________________________________________________________
282 Int_t AliAODEvent::AddTrack(const AliAODTrack* trk)
284 // Add new AOD track. Make sure to set the event if needed.
285 AliAODTrack *track = new((*fTracks)[fTracks->GetEntriesFast()]) AliAODTrack(*trk);
286 track->SetAODEvent(this);
287 return fTracks->GetEntriesFast()-1;
290 //______________________________________________________________________________
291 void AliAODEvent::RemoveObject(TObject* obj)
293 // Removes an object from the list of objects.
295 fAODObjects->Remove(obj);
298 //______________________________________________________________________________
299 TObject *AliAODEvent::FindListObject(const char *objName) const
301 // Return the pointer to the object with the given name.
303 return fAODObjects->FindObject(objName);
306 //______________________________________________________________________________
307 void AliAODEvent::CreateStdContent()
309 // create the standard AOD content and set pointers
311 // create standard objects and add them to the TList of objects
312 AddObject(new AliAODHeader());
313 AddObject(new TClonesArray("AliAODTrack", 0));
314 AddObject(new TClonesArray("AliAODVertex", 0));
315 AddObject(new TClonesArray("AliAODv0", 0));
316 AddObject(new TClonesArray("AliAODcascade", 0));
317 AddObject(new AliAODTracklets());
318 AddObject(new TClonesArray("AliAODJet", 0));
319 AddObject(new AliAODCaloCells());
320 AddObject(new AliAODCaloCells());
321 AddObject(new TClonesArray("AliAODCaloCluster", 0));
322 AddObject(new AliAODCaloTrigger()); // EMCAL
323 AddObject(new AliAODCaloTrigger()); // PHOS
324 AddObject(new TClonesArray("AliAODFmdCluster", 0));
325 AddObject(new TClonesArray("AliAODPmdCluster", 0));
326 AddObject(new TClonesArray("AliAODHMPIDrings", 0));
327 AddObject(new TClonesArray("AliAODDimuon", 0));
328 AddObject(new AliAODTZERO());
329 AddObject(new AliAODVZERO());
330 AddObject(new AliAODZDC());
331 AddObject(new AliTOFHeader());
332 AddObject(new TClonesArray("AliAODTrdTrack", 0));
336 // read back pointers
342 void AliAODEvent::MakeEntriesReferencable()
344 // Make all entries referencable in a subsequent process
346 TIter next(fAODObjects);
348 while ((obj = next()))
350 if(obj->InheritsFrom("TCollection"))
352 AssignIDtoCollection((TCollection*)obj);
357 //______________________________________________________________________________
358 void AliAODEvent::SetStdNames()
360 // introduce the standard naming
362 if(fAODObjects->GetEntries()==kAODListN){
363 for(int i = 0;i < fAODObjects->GetEntries();i++){
364 TObject *fObj = fAODObjects->At(i);
365 if(fObj->InheritsFrom("TNamed")){
366 ((TNamed*)fObj)->SetName(fAODListName[i]);
368 else if(fObj->InheritsFrom("TClonesArray")){
369 ((TClonesArray*)fObj)->SetName(fAODListName[i]);
374 printf("%s:%d SetStdNames() Wrong number of Std Entries \n",(char*)__FILE__,__LINE__);
378 //______________________________________________________________________________
379 void AliAODEvent::CreateStdFolders()
381 // Create the standard folder structure
382 if(fAODFolder)delete fAODFolder;
383 fAODFolder = gROOT->GetRootFolder()->AddFolder("AOD", "AOD");
384 if(fAODObjects->GetEntries()==kAODListN){
385 for(int i = 0;i < fAODObjects->GetEntries();i++){
386 TObject *fObj = fAODObjects->At(i);
387 if(fObj->InheritsFrom("TClonesArray")){
388 fAODFolder->AddFolder(fAODListName[i], fAODListName[i], (TCollection*) fObj);
390 fAODFolder->AddFolder(fAODListName[i], fAODListName[i], 0);
395 printf("%s:%d CreateStdFolders() Wrong number of Std Entries \n",(char*)__FILE__,__LINE__);
399 //______________________________________________________________________________
400 void AliAODEvent::GetStdContent()
402 // set pointers for standard content
404 fHeader = (AliVAODHeader*)fAODObjects->FindObject("header");
405 fTracks = (TClonesArray*)fAODObjects->FindObject("tracks");
406 fVertices = (TClonesArray*)fAODObjects->FindObject("vertices");
407 fV0s = (TClonesArray*)fAODObjects->FindObject("v0s");
408 fCascades = (TClonesArray*)fAODObjects->FindObject("cascades");
409 fTracklets = (AliAODTracklets*)fAODObjects->FindObject("tracklets");
410 fJets = (TClonesArray*)fAODObjects->FindObject("jets");
411 fEmcalCells = (AliAODCaloCells*)fAODObjects->FindObject("emcalCells");
412 fPhosCells = (AliAODCaloCells*)fAODObjects->FindObject("phosCells");
413 fCaloClusters = (TClonesArray*)fAODObjects->FindObject("caloClusters");
414 fEMCALTrigger = (AliAODCaloTrigger*)fAODObjects->FindObject("emcalTrigger");
415 fPHOSTrigger = (AliAODCaloTrigger*)fAODObjects->FindObject("phosTrigger");
416 fFmdClusters = (TClonesArray*)fAODObjects->FindObject("fmdClusters");
417 fPmdClusters = (TClonesArray*)fAODObjects->FindObject("pmdClusters");
418 fHMPIDrings = (TClonesArray*)fAODObjects->FindObject("hmpidRings");
419 fDimuons = (TClonesArray*)fAODObjects->FindObject("dimuons");
420 fAODTZERO = (AliAODTZERO*)fAODObjects->FindObject("AliAODTZERO");
421 fAODVZERO = (AliAODVZERO*)fAODObjects->FindObject("AliAODVZERO");
422 fAODZDC = (AliAODZDC*)fAODObjects->FindObject("AliAODZDC");
423 fTOFHeader = (AliTOFHeader*)fAODObjects->FindObject("AliTOFHeader");
424 fTrdTracks = (TClonesArray*)fAODObjects->FindObject("trdTracks");
427 //______________________________________________________________________________
428 void AliAODEvent::ResetStd(Int_t trkArrSize,
431 Int_t cascadeArrSize,
436 Int_t hmpidRingsSize,
441 // deletes content of standard arrays and resets size
442 fTracksConnected = kFALSE;
445 if (trkArrSize > fTracks->GetSize())
446 fTracks->Expand(trkArrSize);
450 if (vtxArrSize > fVertices->GetSize())
451 fVertices->Expand(vtxArrSize);
455 if (v0ArrSize > fV0s->GetSize())
456 fV0s->Expand(v0ArrSize);
460 if (cascadeArrSize > fCascades->GetSize())
461 fCascades->Expand(cascadeArrSize);
465 if (jetSize > fJets->GetSize())
466 fJets->Expand(jetSize);
469 fCaloClusters->Delete();
470 if (caloClusSize > fCaloClusters->GetSize())
471 fCaloClusters->Expand(caloClusSize);
474 fFmdClusters->Delete();
475 if (fmdClusSize > fFmdClusters->GetSize())
476 fFmdClusters->Expand(fmdClusSize);
479 fPmdClusters->Delete();
480 if (pmdClusSize > fPmdClusters->GetSize())
481 fPmdClusters->Expand(pmdClusSize);
484 fHMPIDrings->Delete();
485 if (hmpidRingsSize > fHMPIDrings->GetSize())
486 fHMPIDrings->Expand(hmpidRingsSize);
490 if (dimuonArrSize > fDimuons->GetSize())
491 fDimuons->Expand(dimuonArrSize);
494 // no pointers in there, so cheaper Clear suffices
495 // fTrdTracks->Clear("C");
496 // Not quite: AliAODTrdTrack has a clones array of tracklets inside
497 fTrdTracks->Delete();
498 if (nTrdTracks > fTrdTracks->GetSize())
499 fTrdTracks->Expand(nTrdTracks);
503 fTracklets->DeleteContainer();
505 fPhosCells->DeleteContainer();
507 fEmcalCells->DeleteContainer();
510 fEMCALTrigger->DeAllocate();
512 fPHOSTrigger->DeAllocate();
516 //______________________________________________________________________________
517 void AliAODEvent::ClearStd()
519 // clears the standard arrays
521 // FIXME: this if-else patch was introduced by Michele Floris on 17/03/14 to test nano AOD. To be removed.
522 if(fHeader->InheritsFrom("AliAODHeader")){
526 AliVHeader * head = 0;
527 head = dynamic_cast<AliVHeader*>((TObject*)fHeader);
528 if(head) head->Clear();
531 fTracksConnected = kFALSE;
535 fVertices ->Delete();
539 fCascades ->Delete();
541 fTracklets ->DeleteContainer();
545 fEmcalCells ->DeleteContainer();
547 fPhosCells ->DeleteContainer();
549 fCaloClusters ->Delete();
551 fFmdClusters ->Clear();
553 fPmdClusters ->Clear();
555 fHMPIDrings ->Clear();
559 fTrdTracks ->Clear();
562 fEMCALTrigger->DeAllocate();
564 fPHOSTrigger->DeAllocate();
567 //_________________________________________________________________
568 Int_t AliAODEvent::GetPHOSClusters(TRefArray *clusters) const
570 // fills the provided TRefArray with all found phos clusters
574 AliAODCaloCluster *cl = 0;
575 Bool_t first = kTRUE;
576 for (Int_t i = 0; i < GetNumberOfCaloClusters() ; i++) {
577 if ( (cl = GetCaloCluster(i)) ) {
580 new (clusters) TRefArray(TProcessID::GetProcessWithUID(cl));
584 //printf("IsPHOS cluster %d, E %2.3f Size: %d \n",i,cl->E(),clusters->GetEntriesFast());
588 return clusters->GetEntriesFast();
591 //_________________________________________________________________
592 Int_t AliAODEvent::GetEMCALClusters(TRefArray *clusters) const
594 // fills the provided TRefArray with all found emcal clusters
597 AliAODCaloCluster *cl = 0;
598 Bool_t first = kTRUE;
599 for (Int_t i = 0; i < GetNumberOfCaloClusters(); i++) {
600 if ( (cl = GetCaloCluster(i)) ) {
603 new (clusters) TRefArray(TProcessID::GetProcessWithUID(cl));
607 //printf("IsEMCal cluster %d, E %2.3f Size: %d \n",i,cl->E(),clusters->GetEntriesFast());
611 return clusters->GetEntriesFast();
615 //______________________________________________________________________________
616 Int_t AliAODEvent::GetMuonTracks(TRefArray *muonTracks) const
618 // fills the provided TRefArray with all found muon tracks
622 AliAODTrack *track = 0;
623 for (Int_t iTrack = 0; iTrack < GetNumberOfTracks(); iTrack++) {
624 track = dynamic_cast<AliAODTrack*>(GetTrack(iTrack));
625 if(!track) AliFatal("Not a standard AOD");
626 if (track->IsMuonTrack()) {
627 muonTracks->Add(track);
631 return muonTracks->GetEntriesFast();
635 //______________________________________________________________________________
636 Int_t AliAODEvent::GetNumberOfMuonTracks() const
638 // get number of muon tracks
641 if(!dynamic_cast<AliAODTrack*>(GetTrack(0))) {
642 AliError("Not a standard AOD");
646 for (Int_t iTrack = 0; iTrack < GetNumberOfTracks(); iTrack++) {
647 if (((AliAODTrack*)GetTrack(iTrack))->IsMuonTrack()) {
655 //______________________________________________________________________________
656 Int_t AliAODEvent::GetMuonGlobalTracks(TRefArray *muonGlobalTracks) const // AU
658 // fills the provided TRefArray with all found muon global tracks
660 muonGlobalTracks->Clear();
662 AliAODTrack *track = 0;
663 for (Int_t iTrack = 0; iTrack < GetNumberOfTracks(); iTrack++) {
664 track = dynamic_cast<AliAODTrack*>(GetTrack(iTrack));
665 if(!track) AliFatal("Not a standard AOD");
666 if (track->IsMuonGlobalTrack()) {
667 muonGlobalTracks->Add(track);
671 return muonGlobalTracks->GetEntriesFast();
675 //______________________________________________________________________________
676 Int_t AliAODEvent::GetNumberOfMuonGlobalTracks() const // AU
678 // get number of muon global tracks
679 Int_t nMuonGlobalTracks=0;
680 if(!dynamic_cast<AliAODTrack*>(GetTrack(0))) {
681 AliError("Not a standard AOD");
684 for (Int_t iTrack = 0; iTrack < GetNumberOfTracks(); iTrack++) {
685 if (((AliAODTrack*)GetTrack(iTrack))->IsMuonGlobalTrack()) {
690 return nMuonGlobalTracks;
693 //______________________________________________________________________________
694 void AliAODEvent::ReadFromTree(TTree *tree, Option_t* opt /*= ""*/)
696 // Connects aod event to tree
699 AliWarning("Zero Pointer to Tree \n");
703 if(!tree->GetTree())tree->LoadTree(0);
705 // Try to find AliAODEvent
706 AliAODEvent *aodEvent = 0;
707 aodEvent = (AliAODEvent*)tree->GetTree()->GetUserInfo()->FindObject("AliAODEvent");
709 // This event is connected to the tree by definition, just say so
710 aodEvent->SetConnected();
711 // Check if already connected to tree
712 TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("AODObjectsConnectedToTree"));
713 if (connectedList && (!strcmp(opt, "reconnect"))) {
714 // If connected use the connected list of objects
715 if (fAODObjects != connectedList) {
717 fAODObjects = connectedList;
724 // prevent a memory leak when reading back the TList
725 // if (!(strcmp(opt, "reconnect"))) fAODObjects->Delete();
727 // create a new TList from the UserInfo TList...
728 // copy constructor does not work...
729 // fAODObjects = (TList*)(aodEvent->GetList()->Clone());
730 fAODObjects = (TList*)aodEvent->GetList();
731 fAODObjects->SetOwner(kTRUE);
732 if(fAODObjects->GetEntries()<kAODListN)
734 AliWarning(Form("AliAODEvent::ReadFromTree() TList contains less than the standard contents %d < %d"
735 " That might be fine though (at least for filtered AODs)",fAODObjects->GetEntries(),kAODListN));
738 // Let's find out whether we have friends
739 TList* friendL = tree->GetTree()->GetListOfFriends();
744 while ((fe = (TFriendElement*)next())){
745 aodEvent = (AliAODEvent*)(fe->GetTree()->GetUserInfo()->FindObject("AliAODEvent"));
747 printf("No UserInfo on tree \n");
750 // TList* objL = (TList*)(aodEvent->GetList()->Clone());
751 TList* objL = (TList*)aodEvent->GetList();
752 printf("Get list of object from tree %d !!\n", objL->GetEntries());
753 TIter nextobject(objL);
755 while((obj = nextobject()))
757 printf("Adding object from friend %s !\n", obj->GetName());
758 fAODObjects->Add(obj);
759 } // object "branch" loop
763 // set the branch addresses
764 TIter next(fAODObjects);
766 while((el=(TNamed*)next())){
767 TString bname(el->GetName());
768 // check if branch exists under this Name
769 TBranch *br = tree->GetTree()->GetBranch(bname.Data());
771 tree->SetBranchAddress(bname.Data(),fAODObjects->GetObjectRef(el));
773 br = tree->GetBranch(Form("%s.",bname.Data()));
775 tree->SetBranchAddress(Form("%s.",bname.Data()),fAODObjects->GetObjectRef(el));
778 printf("%s %d AliAODEvent::ReadFromTree() No Branch found with Name %s. \n",
779 (char*)__FILE__,__LINE__,bname.Data());
784 // when reading back we are not owner of the list
785 // must not delete it
786 fAODObjects->SetOwner(kTRUE);
787 fAODObjects->SetName("AODObjectsConnectedToTree");
788 // we are not owner of the list objects
789 // must not delete it
790 tree->GetUserInfo()->Add(fAODObjects);
794 // we can't get the list from the user data, create standard content
795 // and set it by hand
797 TIter next(fAODObjects);
799 while((el=(TNamed*)next())){
800 TString bname(el->GetName());
801 tree->SetBranchAddress(bname.Data(),fAODObjects->GetObjectRef(el));
804 // when reading back we are not owner of the list
805 // must not delete it
806 fAODObjects->SetOwner(kTRUE);
809 //______________________________________________________________________________
810 Int_t AliAODEvent::GetNumberOfPileupVerticesSPD() const{
811 // count number of SPD pileup vertices
812 Int_t nVertices=GetNumberOfVertices();
813 Int_t nPileupVertices=0;
814 for(Int_t iVert=0; iVert<nVertices; iVert++){
815 AliAODVertex *v=GetVertex(iVert);
816 if(v->GetType()==AliAODVertex::kPileupSPD) nPileupVertices++;
818 return nPileupVertices;
820 //______________________________________________________________________________
821 Int_t AliAODEvent::GetNumberOfPileupVerticesTracks() const{
822 // count number of track pileup vertices
823 Int_t nVertices=GetNumberOfVertices();
824 Int_t nPileupVertices=0;
825 for(Int_t iVert=0; iVert<nVertices; iVert++){
826 AliAODVertex *v=GetVertex(iVert);
827 if(v->GetType()==AliAODVertex::kPileupTracks) nPileupVertices++;
829 return nPileupVertices;
831 //______________________________________________________________________________
832 AliAODVertex* AliAODEvent::GetPrimaryVertexSPD() const{
833 // Get SPD primary vertex
834 Int_t nVertices=GetNumberOfVertices();
835 for(Int_t iVert=0; iVert<nVertices; iVert++){
836 AliAODVertex *v=GetVertex(iVert);
837 if(v->GetType()==AliAODVertex::kMainSPD) return v;
841 //______________________________________________________________________________
842 AliAODVertex* AliAODEvent::GetPrimaryVertexTPC() const{
843 // Get SPD primary vertex
844 Int_t nVertices=GetNumberOfVertices();
845 for(Int_t iVert=0; iVert<nVertices; iVert++){
846 AliAODVertex *v=GetVertex(iVert);
847 if(v->GetType()==AliAODVertex::kMainTPC) return v;
851 //______________________________________________________________________________
852 AliAODVertex* AliAODEvent::GetPileupVertexSPD(Int_t iV) const{
853 // Get pile-up vertex iV
854 Int_t nVertices=GetNumberOfVertices();
856 for(Int_t iVert=0; iVert<nVertices; iVert++){
857 AliAODVertex *v=GetVertex(iVert);
858 if(v->GetType()==AliAODVertex::kPileupSPD){
859 if(counter==iV) return v;
865 //______________________________________________________________________________
866 AliAODVertex* AliAODEvent::GetPileupVertexTracks(Int_t iV) const{
867 // Get pile-up vertex iV
868 Int_t nVertices=GetNumberOfVertices();
870 for(Int_t iVert=0; iVert<nVertices; iVert++){
871 AliAODVertex *v=GetVertex(iVert);
872 if(v->GetType()==AliAODVertex::kPileupTracks){
873 if(counter==iV) return v;
879 //______________________________________________________________________________
880 Bool_t AliAODEvent::IsPileupFromSPD(Int_t minContributors,
882 Double_t nSigmaZdist,
883 Double_t nSigmaDiamXY,
884 Double_t nSigmaDiamZ) const{
886 // This function checks if there was a pile up
887 // reconstructed with SPD
889 AliAODVertex *mainV=GetPrimaryVertexSPD();
890 if(!mainV) return kFALSE;
891 Int_t nc1=mainV->GetNContributors();
892 if(nc1<1) return kFALSE;
893 Int_t nPileVert=GetNumberOfPileupVerticesSPD();
894 if(nPileVert==0) return kFALSE;
895 Int_t nVertices=GetNumberOfVertices();
897 for(Int_t iVert=0; iVert<nVertices; iVert++){
898 AliAODVertex *pv=GetVertex(iVert);
899 if(pv->GetType()!=AliAODVertex::kPileupSPD) continue;
900 Int_t nc2=pv->GetNContributors();
901 if(nc2>=minContributors){
902 Double_t z1=mainV->GetZ();
903 Double_t z2=pv->GetZ();
904 Double_t distZ=TMath::Abs(z2-z1);
905 Double_t distZdiam=TMath::Abs(z2-GetDiamondZ());
906 Double_t cutZdiam=nSigmaDiamZ*TMath::Sqrt(GetSigma2DiamondZ());
907 if(GetSigma2DiamondZ()<0.0001)cutZdiam=99999.; //protection for missing z diamond information
908 if(distZ>minZdist && distZdiam<cutZdiam){
909 Double_t x2=pv->GetX();
910 Double_t y2=pv->GetY();
911 Double_t distXdiam=TMath::Abs(x2-GetDiamondX());
912 Double_t distYdiam=TMath::Abs(y2-GetDiamondY());
913 Double_t cov1[6],cov2[6];
914 mainV->GetCovarianceMatrix(cov1);
915 pv->GetCovarianceMatrix(cov2);
916 Double_t errxDist=TMath::Sqrt(cov2[0]+GetSigma2DiamondX());
917 Double_t erryDist=TMath::Sqrt(cov2[2]+GetSigma2DiamondY());
918 Double_t errzDist=TMath::Sqrt(cov1[5]+cov2[5]);
919 Double_t cutXdiam=nSigmaDiamXY*errxDist;
920 if(GetSigma2DiamondX()<0.0001)cutXdiam=99999.; //protection for missing diamond information
921 Double_t cutYdiam=nSigmaDiamXY*erryDist;
922 if(GetSigma2DiamondY()<0.0001)cutYdiam=99999.; //protection for missing diamond information
923 if( (distXdiam<cutXdiam) && (distYdiam<cutYdiam) && (distZ>nSigmaZdist*errzDist) ){
932 //______________________________________________________________________________
933 void AliAODEvent::Print(Option_t *) const
935 // Print the names of the all branches
936 TIter next(fAODObjects);
938 Printf(">>>>> AOD Content <<<<<");
939 while((el=(TNamed*)next())){
940 Printf(">> %s ",el->GetName());
942 Printf(">>>>> <<<<<");
947 //______________________________________________________________________________
948 void AliAODEvent::AssignIDtoCollection(const TCollection* col)
950 // Static method which assigns a ID to each object in a collection
951 // In this way the objects are marked as referenced and written with
952 // an ID. This has the advantage that TRefs to this objects can be
953 // written by a subsequent process.
956 while ((obj = next()))
957 TProcessID::AssignID(obj);
960 //______________________________________________________________________________
961 Bool_t AliAODEvent::IsPileupFromSPDInMultBins() const {
962 Int_t nTracklets=GetTracklets()->GetNumberOfTracklets();
963 if(nTracklets<20) return IsPileupFromSPD(3,0.8);
964 else if(nTracklets<50) return IsPileupFromSPD(4,0.8);
965 else return IsPileupFromSPD(5,0.8);
968 //______________________________________________________________________________
969 void AliAODEvent::Reset()
972 // Std content + Non std content
975 if(fAODObjects->GetSize()>kAODListN){
976 // we have non std content
977 // this also covers aodfriends
978 for(int i = kAODListN;i < fAODObjects->GetSize();++i){
979 TObject *pObject = fAODObjects->At(i);
981 if(pObject->InheritsFrom(TClonesArray::Class())){
982 ((TClonesArray*)pObject)->Delete();
984 else if(!pObject->InheritsFrom(TCollection::Class())){
985 TClass *pClass = TClass::GetClass(pObject->ClassName());
986 if (pClass && pClass->GetListOfMethods()->FindObject("Clear")) {
987 AliDebug(1, Form("Clear for object %s class %s", pObject->GetName(), pObject->ClassName()));
991 AliDebug(1, Form("ResetWithPlacementNew for object %s class %s", pObject->GetName(), pObject->ClassName()));
992 Long_t dtoronly = TObject::GetDtorOnly();
993 TObject::SetDtorOnly(pObject);
995 pClass->New(pObject);
996 TObject::SetDtorOnly((void*)dtoronly);
1000 AliWarning(Form("No reset for %s \n",
1001 pObject->ClassName()));
1007 // FIXME: Why is this in event and not in header?
1008 Float_t AliAODEvent::GetVZEROEqMultiplicity(Int_t i) const
1010 // Get VZERO Multiplicity for channel i
1011 // Themethod uses the equalization factors
1012 // stored in the ESD-run object in order to
1013 // get equal multiplicities within a VZERO rins (1/8 of VZERO)
1014 if (!fAODVZERO || !fHeader) return -1;
1017 Float_t factorSum = 0;
1018 for(Int_t j = 8*ring; j < (8*ring+8); ++j) {
1019 factorSum += fHeader->GetVZEROEqFactors(j);
1021 Float_t factor = fHeader->GetVZEROEqFactors(i)*8./factorSum;
1023 return (fAODVZERO->GetMultiplicity(i)/factor);
1026 //------------------------------------------------------------
1027 void AliAODEvent::SetTOFHeader(const AliTOFHeader *header)
1030 // Set the TOF event_time
1034 *fTOFHeader=*header;
1035 //fTOFHeader->SetName(fgkESDListName[kTOFHeader]);
1038 // for analysis of reconstructed events
1039 // when this information is not avaliable
1040 fTOFHeader = new AliTOFHeader(*header);
1041 //AddObject(fTOFHeader);
1045 //------------------------------------------------------------
1046 AliAODHMPIDrings *AliAODEvent::GetHMPIDringForTrackID(Int_t trackID) const
1049 // Returns the HMPID object if any for a given track ID
1053 for(Int_t ien = 0 ; ien < GetNHMPIDrings(); ien++)
1055 if( GetHMPIDring(ien)->GetHmpTrkID() == trackID ) return GetHMPIDring(ien);
1060 //------------------------------------------------------------
1061 Int_t AliAODEvent::GetNHMPIDrings() const
1064 // If there is a list of HMPID rings in the given AOD event, return their number
1066 if ( fHMPIDrings) return fHMPIDrings->GetEntriesFast();
1069 //------------------------------------------------------------
1070 AliAODHMPIDrings *AliAODEvent::GetHMPIDring(Int_t nRings) const
1073 // If there is a list of HMPID rings in the given AOD event, return corresponding ring
1076 if( (AliAODHMPIDrings*)fHMPIDrings->UncheckedAt(nRings) ) {
1077 return (AliAODHMPIDrings*)fHMPIDrings->UncheckedAt(nRings);
1083 //------------------------------------------------------------
1084 AliAODTrdTrack& AliAODEvent::AddTrdTrack(const AliVTrdTrack *track) {
1085 return *(new ((*fTrdTracks)[fTrdTracks->GetEntriesFast()]) AliAODTrdTrack(*track));
1088 //______________________________________________________________________________
1089 void AliAODEvent::ConnectTracks() {
1090 // Connect tracks to this event
1091 if (fTracksConnected || !fTracks || !fTracks->GetEntriesFast()) return;
1092 AliAODTrack *track = 0;
1093 track = dynamic_cast<AliAODTrack*>(GetTrack(0));
1095 AliWarning("Not an AliAODTrack, this is not a standard AOD");
1099 TIter next(fTracks);
1100 while ((track=(AliAODTrack*)next())) track->SetAODEvent(this);
1101 fTracksConnected = kTRUE;
1104 AliVEvent::EDataLayoutType AliAODEvent::GetDataLayoutType() const {return AliVEvent::kAOD;}