1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 //-----------------------------------------------------------------
19 // Implementation of the ESD class
20 // This is the class to deal with during the phisical analysis of data
21 // This class is generated directly by the reconstruction methods
22 // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
23 //-----------------------------------------------------------------
28 #include "AliESDEvent.h"
29 #include "AliESDfriend.h"
30 #include "AliESDVZERO.h"
31 #include "AliESDHLTtrack.h"
32 #include "AliESDFMD.h"
38 //______________________________________________________________________________
39 AliESDEvent::AliESDEvent():
40 fESDObjects(new TList()),
63 fFirstEMCALCluster(-1),
68 //______________________________________________________________________________
69 AliESDEvent::AliESDEvent(const AliESDEvent& esd):
71 fESDObjects(new TList()),
72 fESDRun(new AliESDRun(*esd.fESDRun)),
73 fHeader(new AliESDHeader(*esd.fHeader)),
74 fESDZDC(new AliESDZDC(*esd.fESDZDC)),
75 fESDFMD(new AliESDFMD(*esd.fESDFMD)),
76 fESDVZERO(new AliESDVZERO(*esd.fESDVZERO)),
77 fESDTZERO(new AliESDTZERO(*esd.fESDTZERO)),
78 fSPDVertex(new AliESDVertex(*esd.fSPDVertex)),
79 fPrimaryVertex(new AliESDVertex(*esd.fPrimaryVertex)),
80 fSPDMult(new AliMultiplicity(*esd.fSPDMult)),
81 fPHOSTrigger(new AliESDCaloTrigger(*esd.fPHOSTrigger)),
82 fEMCALTrigger(new AliESDCaloTrigger(*esd.fEMCALTrigger)),
83 fTracks(new TClonesArray(*esd.fTracks)),
84 fMuonTracks(new TClonesArray(*esd.fMuonTracks)),
85 fPmdTracks(new TClonesArray(*esd.fPmdTracks)),
86 fTrdTracks(new TClonesArray(*esd.fTrdTracks)),
87 fV0s(new TClonesArray(*esd.fV0s)),
88 fCascades(new TClonesArray(*esd.fCascades)),
89 fKinks(new TClonesArray(*esd.fKinks)),
90 fCaloClusters(new TClonesArray(*esd.fCaloClusters)),
91 fErrorLogs(new TClonesArray(*esd.fErrorLogs)),
92 fESDOld(new AliESD(*esd.fESDOld)),
93 fEMCALClusters(esd.fEMCALClusters),
94 fFirstEMCALCluster(esd.fFirstEMCALCluster),
95 fPHOSClusters(esd.fPHOSClusters),
96 fFirstPHOSCluster(esd.fFirstPHOSCluster)
99 // CKB init in the constructor list and only add here ...
104 AddObject(fESDVZERO);
105 AddObject(fESDTZERO);
106 AddObject(fSPDVertex);
107 AddObject(fPrimaryVertex);
109 AddObject(fPHOSTrigger);
110 AddObject(fEMCALTrigger);
112 AddObject(fMuonTracks);
113 AddObject(fPmdTracks);
114 AddObject(fTrdTracks);
116 AddObject(fCascades);
118 AddObject(fCaloClusters);
119 AddObject(fErrorLogs);
125 //______________________________________________________________________________
126 AliESDEvent & AliESDEvent::operator=(const AliESDEvent& source) {
128 // Assignment operator
130 if(&source == this) return *this;
131 TObject::operator=(source);
133 fESDRun = new AliESDRun(*source.fESDRun);
134 fHeader = new AliESDHeader(*source.fHeader);
135 fESDZDC = new AliESDZDC(*source.fESDZDC);
136 fESDFMD = new AliESDFMD(*source.fESDFMD);
137 fESDVZERO = new AliESDVZERO(*source.fESDVZERO);
138 fESDTZERO = new AliESDTZERO(*source.fESDTZERO);
139 fSPDVertex = new AliESDVertex(*source.fSPDVertex);
140 fPrimaryVertex = new AliESDVertex(*source.fPrimaryVertex);
141 fSPDMult = new AliMultiplicity(*source.fSPDMult);
142 fPHOSTrigger = new AliESDCaloTrigger(*source.fPHOSTrigger);
143 fEMCALTrigger = new AliESDCaloTrigger(*source.fEMCALTrigger);
144 fTracks = new TClonesArray(*source.fTracks);
145 fMuonTracks = new TClonesArray(*source.fMuonTracks);
146 fPmdTracks = new TClonesArray(*source.fPmdTracks);
147 fTrdTracks = new TClonesArray(*source.fTrdTracks);
148 fV0s = new TClonesArray(*source.fV0s);
149 fCascades = new TClonesArray(*source.fCascades);
150 fKinks = new TClonesArray(*source.fKinks);
151 fCaloClusters = new TClonesArray(*source.fCaloClusters);
152 fErrorLogs = new TClonesArray(*source.fErrorLogs);
153 fESDOld = new AliESD(*source.fESDOld);
155 // or AddObject( fESDZDC = new AliESDZDC(*source.fESDZDC));
157 fESDObjects = new TList();
162 AddObject(fESDVZERO);
163 AddObject(fESDTZERO);
164 AddObject(fSPDVertex);
165 AddObject(fPrimaryVertex);
167 AddObject(fPHOSTrigger);
168 AddObject(fEMCALTrigger);
170 AddObject(fMuonTracks);
171 AddObject(fPmdTracks);
172 AddObject(fTrdTracks);
174 AddObject(fCascades);
176 AddObject(fCaloClusters);
177 AddObject(fErrorLogs);
180 fEMCALClusters = source.fEMCALClusters;
181 fFirstEMCALCluster = source.fFirstEMCALCluster;
182 fPHOSClusters = source.fPHOSClusters;
183 fFirstPHOSCluster = source.fFirstPHOSCluster;
192 //______________________________________________________________________________
193 AliESDEvent::~AliESDEvent()
196 // Standard destructor
199 // everthing on the list gets deleted automatically
204 //______________________________________________________________________________
205 void AliESDEvent::Reset()
209 // Reset the standard contents
212 if(fESDOld)fESDOld->Reset();
213 // call reset for user supplied data?
216 void AliESDEvent::ResetStdContent()
218 // Reset the standard contents
219 if(fESDRun) fESDRun->Reset();
220 if(fHeader) fHeader->Reset();
221 if(fESDZDC) fESDZDC->Reset();
222 if(fESDFMD) fESDFMD->Clear(); // why clear.... need consistend names
223 // if(fESDVZERO) fESDVZERO->; // NOT IMPLEMENTED
224 // if(fESDVZERO) new (fESDVZERO) AliESDVZERO();
225 if(fESDTZERO) fESDTZERO->Reset();
226 // CKB no clear/reset implemented
228 new (fSPDVertex) AliESDVertex();
229 fSPDVertex->SetName("SPDVertex");
232 new (fPrimaryVertex) AliESDVertex();
233 fPrimaryVertex->SetName("PrimaryVertex");
235 if(fSPDMult)new (fSPDMult) AliMultiplicity();
236 if(fPHOSTrigger)fPHOSTrigger->Reset();
237 if(fEMCALTrigger)fEMCALTrigger->Reset();
238 if(fTracks)fTracks->Clear();
239 if(fMuonTracks)fMuonTracks->Clear();
240 if(fPmdTracks)fPmdTracks->Clear();
241 if(fTrdTracks)fTrdTracks->Clear();
242 if(fV0s)fV0s->Clear();
243 if(fCascades)fCascades->Clear();
244 if(fKinks)fKinks->Clear();
245 if(fCaloClusters)fCaloClusters->Clear();
246 if(fErrorLogs) fErrorLogs->Clear();
249 fFirstEMCALCluster=-1;
251 fFirstPHOSCluster=-1;
255 Int_t AliESDEvent::AddV0(const AliESDv0 *v) {
259 TClonesArray &fv = *fV0s;
260 Int_t idx=fV0s->GetEntriesFast();
261 new(fv[idx]) AliESDv0(*v);
265 //______________________________________________________________________________
266 void AliESDEvent::Print(Option_t *) const
269 // Print header information of the event
271 printf("ESD run information\n");
272 printf("Event # in file %d Bunch crossing # %d Orbit # %d Period # %d Run # %d Trigger %lld Magnetic field %f \n",
273 GetEventNumberInFile(),
274 GetBunchCrossNumber(),
279 GetMagneticField() );
280 printf("Vertex: (%.4f +- %.4f, %.4f +- %.4f, %.4f +- %.4f) cm\n",
281 fPrimaryVertex->GetXv(), fPrimaryVertex->GetXRes(),
282 fPrimaryVertex->GetYv(), fPrimaryVertex->GetYRes(),
283 fPrimaryVertex->GetZv(), fPrimaryVertex->GetZRes());
284 printf("Mean vertex in RUN: X=%.4f Y=%.4f cm\n",
285 GetDiamondX(),GetDiamondY());
286 printf("SPD Multiplicity. Number of tracklets %d \n",
287 fSPDMult->GetNumberOfTracklets());
288 printf("Number of tracks: \n");
289 printf(" charged %d\n", GetNumberOfTracks());
290 printf(" muon %d\n", GetNumberOfMuonTracks());
291 printf(" pmd %d\n", GetNumberOfPmdTracks());
292 printf(" trd %d\n", GetNumberOfTrdTracks());
293 printf(" v0 %d\n", GetNumberOfV0s());
294 printf(" cascades %d\n", GetNumberOfCascades());
295 printf(" kinks %d\n", GetNumberOfKinks());
296 printf(" CaloClusters %d\n", GetNumberOfCaloClusters());
297 printf(" phos %d\n", GetNumberOfPHOSClusters());
298 printf(" emcal %d\n", GetNumberOfEMCALClusters());
299 printf(" FMD %s\n", (fESDFMD ? "yes" : "no"));
300 printf(" VZERO %s\n", (fESDVZERO ? "yes" : "no"));
303 void AliESDEvent::SetESDfriend(const AliESDfriend *ev) {
305 // Attaches the complementary info to the ESD
309 Int_t ntrk=ev->GetNumberOfTracks();
311 for (Int_t i=0; i<ntrk; i++) {
312 const AliESDfriendTrack *f=ev->GetTrack(i);
313 GetTrack(i)->SetFriendTrack(f);
317 Int_t AliESDEvent::AddTrack(const AliESDtrack *t) {
319 TClonesArray &ftr = *fTracks;
320 AliESDtrack * track = new(ftr[fTracks->GetEntriesFast()])AliESDtrack(*t);
321 track->SetID(fTracks->GetEntriesFast()-1);
322 return track->GetID();
325 Int_t AliESDEvent::AddKink(const AliESDkink *c) {
327 TClonesArray &fk = *fKinks;
328 AliESDkink * kink = new(fk[fKinks->GetEntriesFast()]) AliESDkink(*c);
329 kink->SetID(fKinks->GetEntriesFast()); // CKB different from the other imps..
330 return fKinks->GetEntriesFast()-1;
333 Int_t AliESDEvent::AddCaloCluster(const AliESDCaloCluster *c) {
335 TClonesArray &fc = *fCaloClusters;
336 AliESDCaloCluster *clus = new(fc[fCaloClusters->GetEntriesFast()]) AliESDCaloCluster(*c);
337 clus->SetID(fCaloClusters->GetEntriesFast()-1);
338 return fCaloClusters->GetEntriesFast()-1;
342 void AliESDEvent::SetFMDData(AliESDFMD * obj) {
343 // use already allocated space
345 new(fESDFMD) AliESDFMD(*obj);
349 void AliESDEvent::SetVZEROData(AliESDVZERO * obj){
350 // use already allocated space
352 new(fESDVZERO) AliESDVZERO(*obj);
355 void AliESDEvent::GetESDfriend(AliESDfriend *ev) const {
357 // Extracts the complementary info from the ESD
361 Int_t ntrk=GetNumberOfTracks();
363 for (Int_t i=0; i<ntrk; i++) {
364 const AliESDtrack *t=GetTrack(i);
365 const AliESDfriendTrack *f=t->GetFriendTrack();
371 void AliESDEvent::AddObject(TObject* obj)
373 // Add an object to the list of object.
374 // Please be aware that in order to increase performance you should
375 // refrain from using TObjArrays (if possible). Use TClonesArrays, instead.
376 fESDObjects->SetOwner(kTRUE);
377 fESDObjects->AddLast(obj);
381 void AliESDEvent::GetStdContent()
383 // set pointers for standard content
384 // eventually get by name?
385 fESDRun = (AliESDRun*)fESDObjects->At(kESDRun);
386 fHeader = (AliESDHeader*)fESDObjects->At(kHeader);
387 fESDZDC = (AliESDZDC*)fESDObjects->At(kESDZDC);
388 fESDFMD = (AliESDFMD*)fESDObjects->At(kESDFMD);
389 fESDVZERO = (AliESDVZERO*)fESDObjects->At(kESDVZERO);
390 fESDTZERO = (AliESDTZERO*)fESDObjects->At(kESDTZERO);
391 fSPDVertex = (AliESDVertex*)fESDObjects->At(kSPDVertex);
392 fPrimaryVertex = (AliESDVertex*)fESDObjects->At(kPrimaryVertex);
393 fSPDMult = (AliMultiplicity*)fESDObjects->At(kSPDMult);
394 fPHOSTrigger = (AliESDCaloTrigger*)fESDObjects->At(kPHOSTrigger);
395 fEMCALTrigger = (AliESDCaloTrigger*)fESDObjects->At(kEMCALTrigger);
396 fTracks = (TClonesArray*)fESDObjects->At(kTracks);
397 fMuonTracks = (TClonesArray*)fESDObjects->At(kMuonTracks);
398 fPmdTracks = (TClonesArray*)fESDObjects->At(kPmdTracks);
399 fTrdTracks = (TClonesArray*)fESDObjects->At(kTrdTracks);
400 fV0s = (TClonesArray*)fESDObjects->At(kV0s);
401 fCascades = (TClonesArray*)fESDObjects->At(kCascades);
402 fKinks = (TClonesArray*)fESDObjects->At(kKinks);
403 fCaloClusters = (TClonesArray*)fESDObjects->At(kCaloClusters);
404 fErrorLogs = (TClonesArray*)fESDObjects->At(kErrorLogs);
408 void AliESDEvent::SetStdNames(){
409 // Set the names of the standard contents
410 fSPDVertex->SetName("SPDVertex");
411 fPrimaryVertex->SetName("PrimaryVertex");
412 fPHOSTrigger->SetName("PHOSTrigger");
413 fEMCALTrigger->SetName("EMCALTrigger");
414 fTracks->SetName("Tracks");
415 fMuonTracks->SetName("MuonTracks");
416 fPmdTracks->SetName("PmdTracks");
417 fTrdTracks->SetName("TrdTracks");
418 fV0s->SetName("V0s");
419 fCascades->SetName("Cascades");
420 fKinks->SetName("Kinks");
421 fCaloClusters->SetName("CaloClusters");
425 void AliESDEvent::CreateStdContent()
427 // create the standard AOD content and set pointers
429 // create standard objects and add them to the TList of objects
430 AddObject(new AliESDRun());
431 AddObject(new AliESDHeader());
432 AddObject(new AliESDZDC());
433 AddObject(new AliESDFMD());
434 AddObject(new AliESDVZERO());
435 AddObject(new AliESDTZERO());
436 AddObject(new AliESDVertex());
437 AddObject(new AliESDVertex());
438 AddObject(new AliMultiplicity());
439 AddObject(new AliESDCaloTrigger());
440 AddObject(new AliESDCaloTrigger());
441 AddObject(new TClonesArray("AliESDtrack",0));
442 AddObject(new TClonesArray("AliESDMuonTrack",0));
443 AddObject(new TClonesArray("AliESDPmdTrack",0));
444 AddObject(new TClonesArray("AliESDTrdTrack",0));
445 AddObject(new TClonesArray("AliESDv0",0));
446 AddObject(new TClonesArray("AliESDcascade",0));
447 AddObject(new TClonesArray("AliESDkink",0));
448 AddObject(new TClonesArray("AliESDCaloCluster",0));
449 AddObject(new TClonesArray("AliRawDataErrorLog",0));
451 // check the order of the indices against enum...
453 // read back pointers
460 TObject* AliESDEvent::FindListObject(const char *name){
461 if(fESDObjects)return fESDObjects->FindObject(name);
465 void AliESDEvent::ReadFromTree(TTree *tree){
468 // if we find the "ESD" branch on the tree we do have the old structure
469 if(tree->GetBranch("ESD")){
470 printf("%s %d AliESDEvent::ReadFromTree() Reading old Tree \n",(char*)__FILE__,__LINE__);
471 tree->SetBranchAddress("ESD",&fESDOld);
472 CreateStdContent(); // create for copy
473 // when reading back we are not owner of the list
474 // must not delete it
475 fESDObjects->SetOwner(kFALSE);
482 // Try to find AliESDEvent
483 AliESDEvent *esdEvent = 0;
484 esdEvent = (AliESDEvent*)tree->GetTree()->GetUserInfo()->FindObject("AliESDEvent");
488 // Check if already connected to tree
489 TList* connectedList = (TList*) (tree->GetTree()->GetUserInfo()->FindObject("ESDObjectsConnectedToTree"));
491 // If connected use the connected list if objects
492 fESDObjects->Delete();
493 fESDObjects = connectedList;
498 if(fESDObjects->GetEntries()!=0){
499 // this should not happen here put a warning?
501 // prevent a memory leak when reading back the TList
504 // create a new TList from the UserInfo TList...
505 // copy constructor does not work...
506 fESDObjects = (TList*)(esdEvent->GetList()->Clone());
507 if(fESDObjects->GetEntries()<kESDListN){
508 printf("%s %d AliESDEvent::ReadFromTree() TList contains less than the standard contents %d < %d \n",
509 (char*)__FILE__,__LINE__,fESDObjects->GetEntries(),kESDListN);
511 // set the branch addresses
512 TIter next(fESDObjects);
514 while((el=(TNamed*)next())){
515 TString bname(el->GetName());
517 if(bname.CompareTo("AliESDfriend")==0)
519 // AliESDfriend does not have a name ...
520 tree->SetBranchAddress("ESDfriend.",fESDObjects->GetObjectRef(el));
523 tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));
527 // when reading back we are not owner of the list
528 // must not delete it
529 fESDObjects->SetOwner(kFALSE);
530 // Add list to user info
531 fESDObjects->SetName("ESDObjectsConnectedToTree");
532 tree->GetTree()->GetUserInfo()->Add(fESDObjects);
535 // we can't get the list from the user data, create standard content
536 // and set it by hand (no ESDfriend at the moment
538 TIter next(fESDObjects);
540 while((el=(TNamed*)next())){
541 TString bname(el->GetName());
542 tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));
545 // when reading back we are not owner of the list
546 // must not delete it
547 fESDObjects->SetOwner(kFALSE);
555 void AliESDEvent::CopyFromOldESD()
557 // Method which copies over everthing from the old esd structure to the
563 SetRunNumber(fESDOld->GetRunNumber());
564 SetPeriodNumber(fESDOld->GetPeriodNumber());
565 SetMagneticField(fESDRun->GetMagneticField());
567 // leave out diamond ...
568 // SetDiamond(const AliESDVertex *vertex) { fESDRun->SetDiamond(vertex);}
571 SetTriggerMask(fESDOld->GetTriggerMask());
572 SetOrbitNumber(fESDOld->GetOrbitNumber());
573 SetTimeStamp(fESDOld->GetTimeStamp());
574 SetEventType(fESDOld->GetEventType());
575 SetEventNumberInFile(fESDOld->GetEventNumberInFile());
576 SetBunchCrossNumber(fESDOld->GetBunchCrossNumber());
577 SetTriggerCluster(fESDOld->GetTriggerCluster());
581 SetZDC(fESDOld->GetZDCN1Energy(),
582 fESDOld->GetZDCP1Energy(),
583 fESDOld->GetZDCEMEnergy(),
584 fESDOld->GetZDCN2Energy(),
585 fESDOld->GetZDCP2Energy(),
586 fESDOld->GetZDCParticipants());
590 SetFMDData(fESDOld->GetFMDData());
594 SetT0zVertex(fESDOld->GetT0zVertex());
595 SetT0(fESDOld->GetT0());
599 SetVZEROData(fESDOld->GetVZEROData());
601 SetVertex(fESDOld->GetVertex());
603 SetPrimaryVertex(fESDOld->GetPrimaryVertex());
605 SetMultiplicity(fESDOld->GetMultiplicity());
607 for(int i = 0;i<fESDOld->GetNumberOfTracks();i++){
608 AddTrack(fESDOld->GetTrack(i));
611 for(int i = 0;i<fESDOld->GetNumberOfMuonTracks();i++){
612 AddMuonTrack(fESDOld->GetMuonTrack(i));
615 for(int i = 0;i<fESDOld->GetNumberOfPmdTracks();i++){
616 AddPmdTrack(fESDOld->GetPmdTrack(i));
619 for(int i = 0;i<fESDOld->GetNumberOfTrdTracks();i++){
620 AddTrdTrack(fESDOld->GetTrdTrack(i));
623 for(int i = 0;i<fESDOld->GetNumberOfV0s();i++){
624 AddV0(fESDOld->GetV0(i));
627 for(int i = 0;i<fESDOld->GetNumberOfCascades();i++){
628 AddCascade(fESDOld->GetCascade(i));
631 for(int i = 0;i<fESDOld->GetNumberOfKinks();i++){
632 AddKink(fESDOld->GetKink(i));
636 for(int i = 0;i<fESDOld->GetNumberOfCaloClusters();i++){
637 AddCaloCluster(fESDOld->GetCaloCluster(i));