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 //-----------------------------------------------------------------
29 #include "AliESDfriend.h"
30 #include "AliESDVZERO.h"
31 #include "AliESDHLTtrack.h"
32 #include "AliESDFMD.h"
37 //______________________________________________________________________________
39 fESDObjects(new TList()),
61 fFirstEMCALCluster(-1),
66 //______________________________________________________________________________
67 AliESD::AliESD(const AliESD& esd):
69 fESDObjects(new TList()),
70 fESDRun(new AliESDRun(*esd.fESDRun)),
71 fHeader(new AliESDHeader(*esd.fHeader)),
72 fESDZDC(new AliESDZDC(*esd.fESDZDC)),
73 fESDFMD(new AliESDFMD(*esd.fESDFMD)),
74 fESDVZERO(new AliESDVZERO(*esd.fESDVZERO)),
75 fESDTZERO(new AliESDTZERO(*esd.fESDTZERO)),
76 fSPDVertex(new AliESDVertex(*esd.fSPDVertex)),
77 fPrimaryVertex(new AliESDVertex(*esd.fPrimaryVertex)),
78 fSPDMult(new AliMultiplicity(*esd.fSPDMult)),
79 fPHOSTrigger(new AliESDCaloTrigger(*esd.fPHOSTrigger)),
80 fEMCALTrigger(new AliESDCaloTrigger(*esd.fEMCALTrigger)),
81 fTracks(new TClonesArray(*esd.fTracks)),
82 fMuonTracks(new TClonesArray(*esd.fMuonTracks)),
83 fPmdTracks(new TClonesArray(*esd.fPmdTracks)),
84 fTrdTracks(new TClonesArray(*esd.fTrdTracks)),
85 fV0s(new TClonesArray(*esd.fV0s)),
86 fCascades(new TClonesArray(*esd.fCascades)),
87 fKinks(new TClonesArray(*esd.fKinks)),
88 fCaloClusters(new TClonesArray(*esd.fCaloClusters)),
89 fErrorLogs(new TClonesArray(*esd.fErrorLogs)),
90 fEMCALClusters(esd.fEMCALClusters),
91 fFirstEMCALCluster(esd.fFirstEMCALCluster),
92 fPHOSClusters(esd.fPHOSClusters),
93 fFirstPHOSCluster(esd.fFirstPHOSCluster)
96 // CKB init in the constructor list and only add here ...
101 AddObject(fESDVZERO);
102 AddObject(fESDTZERO);
103 AddObject(fSPDVertex);
104 AddObject(fPrimaryVertex);
106 AddObject(fPHOSTrigger);
107 AddObject(fEMCALTrigger);
109 AddObject(fMuonTracks);
110 AddObject(fPmdTracks);
111 AddObject(fTrdTracks);
113 AddObject(fCascades);
115 AddObject(fCaloClusters);
116 AddObject(fErrorLogs);
122 //______________________________________________________________________________
123 AliESD & AliESD::operator=(const AliESD& source) {
125 // Assignment operator
127 if(&source == this) return *this;
128 TObject::operator=(source);
130 fESDRun = new AliESDRun(*source.fESDRun);
131 fHeader = new AliESDHeader(*source.fHeader);
132 fESDZDC = new AliESDZDC(*source.fESDZDC);
133 fESDFMD = new AliESDFMD(*source.fESDFMD);
134 fESDVZERO = new AliESDVZERO(*source.fESDVZERO);
135 fESDTZERO = new AliESDTZERO(*source.fESDTZERO);
136 fSPDVertex = new AliESDVertex(*source.fSPDVertex);
137 fPrimaryVertex = new AliESDVertex(*source.fPrimaryVertex);
138 fSPDMult = new AliMultiplicity(*source.fSPDMult);
139 fPHOSTrigger = new AliESDCaloTrigger(*source.fPHOSTrigger);
140 fEMCALTrigger = new AliESDCaloTrigger(*source.fEMCALTrigger);
141 fTracks = new TClonesArray(*source.fTracks);
142 fMuonTracks = new TClonesArray(*source.fMuonTracks);
143 fPmdTracks = new TClonesArray(*source.fPmdTracks);
144 fTrdTracks = new TClonesArray(*source.fTrdTracks);
145 fV0s = new TClonesArray(*source.fV0s);
146 fCascades = new TClonesArray(*source.fCascades);
147 fKinks = new TClonesArray(*source.fKinks);
148 fCaloClusters = new TClonesArray(*source.fCaloClusters);
149 fErrorLogs = new TClonesArray(*source.fErrorLogs);
152 // or AddObject( fESDZDC = new AliESDZDC(*source.fESDZDC));
154 fESDObjects = new TList();
159 AddObject(fESDVZERO);
160 AddObject(fESDTZERO);
161 AddObject(fSPDVertex);
162 AddObject(fPrimaryVertex);
164 AddObject(fPHOSTrigger);
165 AddObject(fEMCALTrigger);
167 AddObject(fMuonTracks);
168 AddObject(fPmdTracks);
169 AddObject(fTrdTracks);
171 AddObject(fCascades);
173 AddObject(fCaloClusters);
174 AddObject(fErrorLogs);
177 fEMCALClusters = source.fEMCALClusters;
178 fFirstEMCALCluster = source.fFirstEMCALCluster;
179 fPHOSClusters = source.fPHOSClusters;
180 fFirstPHOSCluster = source.fFirstPHOSCluster;
189 //______________________________________________________________________________
193 // Standard destructor
199 // everthing on the list gets deleted automatically
202 fHLTConfMapTracks.Delete();
203 fHLTHoughTracks.Delete();
204 fMuonTracks.Delete();
210 fCaloClusters.Delete();
212 // fEMCALTriggerPosition->Delete();
213 // fEMCALTriggerAmplitudes->Delete();
214 // fPHOSTriggerPosition->Delete();
215 // fPHOSTriggerAmplitudes->Delete();
216 // delete fEMCALTriggerPosition;
217 // delete fEMCALTriggerAmplitudes;
218 // delete fPHOSTriggerPosition;
219 // delete fPHOSTriggerAmplitudes;
223 //______________________________________________________________________________
226 // Reset the standard contents
227 if(fESDRun) fESDRun->Reset();
228 if(fHeader) fHeader->Reset();
229 if(fESDZDC) fESDZDC->Reset();
230 if(fESDFMD) fESDFMD->Clear(); // why clear.... need consistend names
231 // if(fESDVZERO) fESDVZERO->; // NOT IMPLEMENTED
232 // if(fESDVZERO) new (fESDVZERO) AliESDVZERO();
233 if(fESDTZERO) fESDTZERO->Reset();
234 // CKB no clear/reset implemented
236 new (fSPDVertex) AliESDVertex();
237 fSPDVertex->SetName("SPDVertex");
240 new (fPrimaryVertex) AliESDVertex();
241 fPrimaryVertex->SetName("PrimaryVertex");
243 if(fSPDMult)new (fSPDMult) AliMultiplicity();
244 if(fPHOSTrigger)fPHOSTrigger->Reset();
245 if(fEMCALTrigger)fEMCALTrigger->Reset();
246 if(fTracks)fTracks->Clear();
247 if(fMuonTracks)fMuonTracks->Clear();
248 if(fPmdTracks)fPmdTracks->Clear();
249 if(fTrdTracks)fTrdTracks->Clear();
250 if(fV0s)fV0s->Clear();
251 if(fCascades)fCascades->Clear();
252 if(fKinks)fKinks->Clear();
253 if(fCaloClusters)fCaloClusters->Clear();
254 if(fErrorLogs) fErrorLogs->Clear();
258 fFirstEMCALCluster=-1;
260 fFirstPHOSCluster=-1;
263 Int_t AliESD::AddV0(const AliESDv0 *v) {
267 TClonesArray &fv = *fV0s;
268 Int_t idx=fV0s->GetEntriesFast();
269 new(fv[idx]) AliESDv0(*v);
273 //______________________________________________________________________________
274 void AliESD::Print(Option_t *) const
277 // Print header information of the event
279 printf("ESD run information\n");
280 printf("Event # in file %d Bunch crossing # %d Orbit # %d Period # %d Run # %d Trigger %lld Magnetic field %f \n",
281 GetEventNumberInFile(),
282 GetBunchCrossNumber(),
287 GetMagneticField() );
288 printf("Vertex: (%.4f +- %.4f, %.4f +- %.4f, %.4f +- %.4f) cm\n",
289 fPrimaryVertex->GetXv(), fPrimaryVertex->GetXRes(),
290 fPrimaryVertex->GetYv(), fPrimaryVertex->GetYRes(),
291 fPrimaryVertex->GetZv(), fPrimaryVertex->GetZRes());
292 printf("Mean vertex in RUN: X=%.4f Y=%.4f cm\n",
293 GetDiamondX(),GetDiamondY());
294 printf("SPD Multiplicity. Number of tracklets %d \n",
295 fSPDMult->GetNumberOfTracklets());
296 printf("Number of tracks: \n");
297 printf(" charged %d\n", GetNumberOfTracks());
298 printf(" muon %d\n", GetNumberOfMuonTracks());
299 printf(" pmd %d\n", GetNumberOfPmdTracks());
300 printf(" trd %d\n", GetNumberOfTrdTracks());
301 printf(" v0 %d\n", GetNumberOfV0s());
302 printf(" cascades %d\n", GetNumberOfCascades());
303 printf(" kinks %d\n", GetNumberOfKinks());
304 printf(" CaloClusters %d\n", GetNumberOfCaloClusters());
305 printf(" phos %d\n", GetNumberOfPHOSClusters());
306 printf(" emcal %d\n", GetNumberOfEMCALClusters());
307 printf(" FMD %s\n", (fESDFMD ? "yes" : "no"));
308 printf(" VZERO %s\n", (fESDVZERO ? "yes" : "no"));
311 void AliESD::SetESDfriend(const AliESDfriend *ev) {
313 // Attaches the complementary info to the ESD
317 Int_t ntrk=ev->GetNumberOfTracks();
319 for (Int_t i=0; i<ntrk; i++) {
320 const AliESDfriendTrack *f=ev->GetTrack(i);
321 GetTrack(i)->SetFriendTrack(f);
325 Int_t AliESD::AddTrack(const AliESDtrack *t) {
327 TClonesArray &ftr = *fTracks;
328 AliESDtrack * track = new(ftr[fTracks->GetEntriesFast()])AliESDtrack(*t);
329 track->SetID(fTracks->GetEntriesFast()-1);
330 return track->GetID();
333 Int_t AliESD::AddKink(const AliESDkink *c) {
335 TClonesArray &fk = *fKinks;
336 AliESDkink * kink = new(fk[fKinks->GetEntriesFast()]) AliESDkink(*c);
337 kink->SetID(fKinks->GetEntriesFast()); // CKB different from the other imps..
338 return fKinks->GetEntriesFast()-1;
341 Int_t AliESD::AddCaloCluster(const AliESDCaloCluster *c) {
343 TClonesArray &fc = *fCaloClusters;
344 AliESDCaloCluster *clus = new(fc[fCaloClusters->GetEntriesFast()]) AliESDCaloCluster(*c);
345 clus->SetID(fCaloClusters->GetEntriesFast()-1);
346 return fCaloClusters->GetEntriesFast()-1;
350 void AliESD::SetFMDData(AliESDFMD * obj) {
351 // use already allocated space
353 new(fESDFMD) AliESDFMD(*obj);
357 void AliESD::SetVZEROData(AliESDVZERO * obj){
358 // use already allocated space
360 new(fESDVZERO) AliESDVZERO(*obj);
363 void AliESD::GetESDfriend(AliESDfriend *ev) const {
365 // Extracts the complementary info from the ESD
369 Int_t ntrk=GetNumberOfTracks();
371 for (Int_t i=0; i<ntrk; i++) {
372 const AliESDtrack *t=GetTrack(i);
373 const AliESDfriendTrack *f=t->GetFriendTrack();
379 void AliESD::AddObject(TObject* obj)
381 // Add an object to the list of object.
382 // Please be aware that in order to increase performance you should
383 // refrain from using TObjArrays (if possible). Use TClonesArrays, instead.
384 fESDObjects->AddLast(obj);
388 void AliESD::GetStdContent()
390 // set pointers for standard content
392 fESDRun = (AliESDRun*)fESDObjects->At(kESDRun);
393 fHeader = (AliESDHeader*)fESDObjects->At(kHeader);
394 fESDZDC = (AliESDZDC*)fESDObjects->At(kESDZDC);
395 fESDFMD = (AliESDFMD*)fESDObjects->At(kESDFMD);
396 fESDVZERO = (AliESDVZERO*)fESDObjects->At(kESDVZERO);
397 fESDTZERO = (AliESDTZERO*)fESDObjects->At(kESDTZERO);
398 fSPDVertex = (AliESDVertex*)fESDObjects->At(kSPDVertex);
399 fPrimaryVertex = (AliESDVertex*)fESDObjects->At(kPrimaryVertex);
400 fSPDMult = (AliMultiplicity*)fESDObjects->At(kSPDMult);
401 fPHOSTrigger = (AliESDCaloTrigger*)fESDObjects->At(kPHOSTrigger);
402 fEMCALTrigger = (AliESDCaloTrigger*)fESDObjects->At(kEMCALTrigger);
403 fTracks = (TClonesArray*)fESDObjects->At(kTracks);
404 fMuonTracks = (TClonesArray*)fESDObjects->At(kMuonTracks);
405 fPmdTracks = (TClonesArray*)fESDObjects->At(kPmdTracks);
406 fTrdTracks = (TClonesArray*)fESDObjects->At(kTrdTracks);
407 fV0s = (TClonesArray*)fESDObjects->At(kV0s);
408 fCascades = (TClonesArray*)fESDObjects->At(kCascades);
409 fKinks = (TClonesArray*)fESDObjects->At(kKinks);
410 fCaloClusters = (TClonesArray*)fESDObjects->At(kCaloClusters);
411 fErrorLogs = (TClonesArray*)fESDObjects->At(kErrorLogs);
415 void AliESD::SetStdNames(){
416 // Set the names of the standard contents
417 fSPDVertex->SetName("SPDVertex");
418 fPrimaryVertex->SetName("PrimaryVertex");
419 fPHOSTrigger->SetName("PHOSTrigger");
420 fEMCALTrigger->SetName("EMCALTrigger");
421 fTracks->SetName("Tracks");
422 fMuonTracks->SetName("MuonTracks");
423 fPmdTracks->SetName("PmdTracks");
424 fTrdTracks->SetName("TrdTracks");
425 fV0s->SetName("V0s");
426 fCascades->SetName("Cascades");
427 fKinks->SetName("Kinks");
428 fCaloClusters->SetName("CaloClusters");
432 void AliESD::CreateStdContent()
434 // create the standard AOD content and set pointers
436 // create standard objects and add them to the TList of objects
437 AddObject(new AliESDRun());
438 AddObject(new AliESDHeader());
439 AddObject(new AliESDZDC());
440 AddObject(new AliESDFMD());
441 AddObject(new AliESDVZERO());
442 AddObject(new AliESDTZERO());
443 AddObject(new AliESDVertex());
444 AddObject(new AliESDVertex());
445 AddObject(new AliMultiplicity());
446 AddObject(new AliESDCaloTrigger());
447 AddObject(new AliESDCaloTrigger());
448 AddObject(new TClonesArray("AliESDtrack",0));
449 AddObject(new TClonesArray("AliESDMuonTrack",0));
450 AddObject(new TClonesArray("AliESDPmdTrack",0));
451 AddObject(new TClonesArray("AliESDTrdTrack",0));
452 AddObject(new TClonesArray("AliESDv0",0));
453 AddObject(new TClonesArray("AliESDcascade",0));
454 AddObject(new TClonesArray("AliESDkink",0));
455 AddObject(new TClonesArray("AliESDCaloCluster",0));
456 AddObject(new TClonesArray("AliRawDataErrorLog",0));
458 // check the order of the indices against enum...
460 // read back pointers
467 void AliESD::ReadFromTree(TTree *tree){
470 // is this really so smart that an ESDObject has a pointer to a list
471 // of another ESDObject...
473 fESDObjects = (TList*)((AliESD*)tree->GetTree()->GetUserInfo()->FindObject("AliESD"))->GetList();
476 // we could still set the branch adresses based on
477 // tree->GetListOfBranches() CKB
478 // or create standard list
480 if(fESDObjects->GetEntries()<kESDListN){
481 printf("%s %d AliESD::ReadFromTree() TList contains less than the standard contents %d < %d \n",(char*)__FILE__,__LINE__,fESDObjects->GetEntries(),kESDListN);
486 // set the branch addresses
487 TIter next(fESDObjects);
489 while((el=(TNamed*)next())){
490 TString bname(el->GetName());
492 if(bname.CompareTo("AliESDfriend")==0)
494 // AliESDfriend does not have a name ...
495 tree->SetBranchStatus("ESDfriend.*",1);
496 tree->SetBranchAddress("ESDfriend.",fESDObjects->GetObjectRef(el));
501 tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));