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 //-----------------------------------------------------------------
30 //______________________________________________________________________________
31 AliESDRun::AliESDRun() :
37 for (Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
38 for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=0.;
41 //______________________________________________________________________________
42 AliESDRun::AliESDRun(const AliESDRun &esd) :
44 fRunNumber(esd.fRunNumber),
45 fPeriodNumber(esd.fPeriodNumber),
46 fRecoVersion(esd.fRecoVersion),
47 fMagneticField(esd.fMagneticField)
49 for (Int_t i=0; i<2; i++) fDiamondXY[i]=esd.fDiamondXY[i];
50 for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=esd.fDiamondCovXY[i];
53 //______________________________________________________________________________
54 AliESDRun& AliESDRun::operator=(const AliESDRun &esd)
57 TObject::operator=(esd);
58 fRunNumber=esd.fRunNumber;
59 fPeriodNumber=esd.fPeriodNumber;
60 fRecoVersion=esd.fRecoVersion;
61 fMagneticField=esd.fMagneticField;
62 for (Int_t i=0; i<2; i++) fDiamondXY[i]=esd.fDiamondXY[i];
63 for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=esd.fDiamondCovXY[i];
68 //______________________________________________________________________________
69 void AliESDRun::Print(const Option_t *) const
71 printf("Mean vertex in RUN %d: X=%.4f Y=%.4f cm\n",
72 GetRunNumber(),GetDiamondX(),GetDiamondY());
73 printf("Magnetic field = %f T\n",
75 printf("Event from reconstruction version %d \n",fRecoVersion);
78 void AliESDRun::Reset()
84 for (Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
85 for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=0.;
88 ClassImp(AliESDHeader)
90 //______________________________________________________________________________
91 AliESDHeader::AliESDHeader() :
97 fEventNumberInFile(0),
104 AliESDHeader::AliESDHeader(const AliESDHeader &header) :
106 fTriggerMask(header.fTriggerMask),
107 fOrbitNumber(header.fOrbitNumber),
108 fTimeStamp(header.fTimeStamp),
109 fEventType(header.fEventType),
110 fEventNumberInFile(header.fEventNumberInFile),
111 fBunchCrossNumber(header.fBunchCrossNumber),
112 fTriggerCluster(header.fTriggerCluster)
116 AliESDHeader& AliESDHeader::operator=(const AliESDHeader &header)
119 TObject::operator=(header);
120 fTriggerMask = header.fTriggerMask;
121 fOrbitNumber = header.fOrbitNumber;
122 fTimeStamp = header.fTimeStamp;
123 fEventType = header.fEventType;
124 fEventNumberInFile = header.fEventNumberInFile;
125 fBunchCrossNumber = header.fBunchCrossNumber;
126 fTriggerCluster = header.fTriggerCluster;
133 //______________________________________________________________________________
134 void AliESDHeader::Reset()
140 fEventNumberInFile = 0;
141 fBunchCrossNumber = 0;
145 //______________________________________________________________________________
146 void AliESDHeader::Print(const Option_t *) const
148 printf("Event # %d in file Bunch crossing # %d Orbit # %d Trigger %lld \n",
149 GetEventNumberInFile(),
150 GetBunchCrossNumber(),
157 //______________________________________________________________________________
158 AliESDZDC::AliESDZDC() :
169 AliESDZDC::AliESDZDC(const AliESDZDC& zdc) :
171 fZDCN1Energy(zdc.fZDCN1Energy),
172 fZDCP1Energy(zdc.fZDCP1Energy),
173 fZDCN2Energy(zdc.fZDCN2Energy),
174 fZDCP2Energy(zdc.fZDCP2Energy),
175 fZDCEMEnergy(zdc.fZDCEMEnergy),
176 fZDCParticipants(zdc.fZDCParticipants)
180 AliESDZDC& AliESDZDC::operator=(const AliESDZDC&zdc)
183 TObject::operator=(zdc);
184 fZDCN1Energy = zdc.fZDCN1Energy;
185 fZDCP1Energy = zdc.fZDCP1Energy;
186 fZDCN2Energy = zdc.fZDCN2Energy;
187 fZDCP2Energy = zdc.fZDCP2Energy;
188 fZDCEMEnergy = zdc.fZDCEMEnergy;
189 fZDCParticipants = zdc.fZDCParticipants;
195 //______________________________________________________________________________
196 void AliESDZDC::Reset()
206 //______________________________________________________________________________
207 void AliESDZDC::Print(const Option_t *) const
212 ClassImp(AliESDTZERO)
214 //______________________________________________________________________________
215 AliESDTZERO::AliESDTZERO() :
220 for(int i = 0;i<24;i++)fT0time[i] = fT0amplitude[i] = 0;
223 AliESDTZERO::AliESDTZERO(const AliESDTZERO &tzero ) :
225 fT0zVertex(tzero.fT0zVertex),
226 fT0timeStart(tzero.fT0timeStart)
228 for(int i = 0;i<24;i++){
229 fT0time[i] = tzero.fT0time[i];
230 fT0amplitude[i] = tzero.fT0amplitude[i];
234 AliESDTZERO& AliESDTZERO::operator=(const AliESDTZERO& tzero){
236 TObject::operator=(tzero);
237 fT0zVertex = tzero.fT0zVertex;
238 fT0timeStart = tzero.fT0timeStart;
239 for(int i = 0;i<24;i++){
240 fT0time[i] = tzero.fT0time[i];
241 fT0amplitude[i] = tzero.fT0amplitude[i];
247 //______________________________________________________________________________
248 void AliESDTZERO::Reset()
252 for(int i = 0;i<24;i++)fT0time[i] = fT0amplitude[i] = 0;
255 //______________________________________________________________________________
256 void AliESDTZERO::Print(const Option_t *) const
260 ClassImp(AliESDCaloTrigger)
262 AliESDCaloTrigger::AliESDCaloTrigger() :
264 fTriggerAmplitudes(0x0),
265 fTriggerPosition(0x0)
269 AliESDCaloTrigger::AliESDCaloTrigger(const AliESDCaloTrigger &ctrig) :
271 fTriggerAmplitudes(ctrig.fTriggerAmplitudes),
272 fTriggerPosition(ctrig.fTriggerPosition)
276 AliESDCaloTrigger::~AliESDCaloTrigger()
278 delete fTriggerAmplitudes; fTriggerAmplitudes = 0;
279 delete fTriggerPosition; fTriggerPosition = 0;
282 AliESDCaloTrigger& AliESDCaloTrigger::operator=(const AliESDCaloTrigger& ctrig)
285 TNamed::operator=(ctrig);
286 // CKB dont't want to create leak if fTriggerAmp points to
287 // somthing already, use new with placement
288 if(fTriggerAmplitudes){
289 fTriggerAmplitudes = new(fTriggerAmplitudes) TArrayF(*ctrig.fTriggerAmplitudes);
292 fTriggerAmplitudes = new TArrayF(*ctrig.fTriggerAmplitudes);
294 if(fTriggerPosition){
295 fTriggerPosition = new(fTriggerPosition) TArrayF(*ctrig.fTriggerPosition);
298 fTriggerPosition = new TArrayF(*ctrig.fTriggerPosition);
304 void AliESDCaloTrigger::Reset()
307 if( fTriggerAmplitudes){
308 printf("%s %d Size %d",(char*)__FILE__,__LINE__,fTriggerAmplitudes->GetSize());
309 fTriggerAmplitudes->Reset();
310 // delete fTriggerAmplitudes;
312 if( fTriggerPosition){
313 fTriggerPosition->Reset();
314 // delete fTriggerPosition;
322 //______________________________________________________________________________
324 fESDObjects(new TList()),
346 fFirstEMCALCluster(-1),
348 fFirstPHOSCluster(-1)
351 //______________________________________________________________________________
352 AliESD::AliESD(const AliESD& esd):
354 fESDObjects(new TList()),
355 fESDRun(new AliESDRun(*esd.fESDRun)),
356 fHeader(new AliESDHeader(*esd.fHeader)),
357 fESDZDC(new AliESDZDC(*esd.fESDZDC)),
358 fESDFMD(new AliESDFMD(*esd.fESDFMD)),
359 fESDVZERO(new AliESDVZERO(*esd.fESDVZERO)),
360 fESDTZERO(new AliESDTZERO(*esd.fESDTZERO)),
361 fSPDVertex(new AliESDVertex(*esd.fSPDVertex)),
362 fPrimaryVertex(new AliESDVertex(*esd.fPrimaryVertex)),
363 fSPDMult(new AliMultiplicity(*esd.fSPDMult)),
364 fPHOSTrigger(new AliESDCaloTrigger(*esd.fPHOSTrigger)),
365 fEMCALTrigger(new AliESDCaloTrigger(*esd.fEMCALTrigger)),
366 fTracks(new TClonesArray(*esd.fTracks)),
367 fMuonTracks(new TClonesArray(*esd.fMuonTracks)),
368 fPmdTracks(new TClonesArray(*esd.fPmdTracks)),
369 fTrdTracks(new TClonesArray(*esd.fTrdTracks)),
370 fV0s(new TClonesArray(*esd.fV0s)),
371 fCascades(new TClonesArray(*esd.fCascades)),
372 fKinks(new TClonesArray(*esd.fKinks)),
373 fCaloClusters(new TClonesArray(*esd.fCaloClusters)),
374 fErrorLogs(new TClonesArray(*esd.fErrorLogs)),
375 fEMCALClusters(esd.fEMCALClusters),
376 fFirstEMCALCluster(esd.fFirstEMCALCluster),
377 fPHOSClusters(esd.fPHOSClusters),
378 fFirstPHOSCluster(esd.fFirstPHOSCluster)
381 // CKB init in the constructor list and only add here ...
386 AddObject(fESDVZERO);
387 AddObject(fESDTZERO);
388 AddObject(fSPDVertex);
389 AddObject(fPrimaryVertex);
391 AddObject(fPHOSTrigger);
392 AddObject(fEMCALTrigger);
394 AddObject(fMuonTracks);
395 AddObject(fPmdTracks);
396 AddObject(fTrdTracks);
398 AddObject(fCascades);
400 AddObject(fCaloClusters);
401 AddObject(fErrorLogs);
407 //______________________________________________________________________________
408 AliESD & AliESD::operator=(const AliESD& source) {
410 // Assignment operator
412 if(&source == this) return *this;
413 TObject::operator=(source);
415 fESDRun = new AliESDRun(*source.fESDRun);
416 fHeader = new AliESDHeader(*source.fHeader);
417 fESDZDC = new AliESDZDC(*source.fESDZDC);
418 fESDFMD = new AliESDFMD(*source.fESDFMD);
419 fESDVZERO = new AliESDVZERO(*source.fESDVZERO);
420 fESDTZERO = new AliESDTZERO(*source.fESDTZERO);
421 fSPDVertex = new AliESDVertex(*source.fSPDVertex);
422 fPrimaryVertex = new AliESDVertex(*source.fPrimaryVertex);
423 fSPDMult = new AliMultiplicity(*source.fSPDMult);
424 fPHOSTrigger = new AliESDCaloTrigger(*source.fPHOSTrigger);
425 fEMCALTrigger = new AliESDCaloTrigger(*source.fEMCALTrigger);
426 fTracks = new TClonesArray(*source.fTracks);
427 fMuonTracks = new TClonesArray(*source.fMuonTracks);
428 fPmdTracks = new TClonesArray(*source.fPmdTracks);
429 fTrdTracks = new TClonesArray(*source.fTrdTracks);
430 fV0s = new TClonesArray(*source.fV0s);
431 fCascades = new TClonesArray(*source.fCascades);
432 fKinks = new TClonesArray(*source.fKinks);
433 fCaloClusters = new TClonesArray(*source.fCaloClusters);
434 fErrorLogs = new TClonesArray(*source.fErrorLogs);
437 // or AddObject( fESDZDC = new AliESDZDC(*source.fESDZDC));
439 fESDObjects = new TList();
444 AddObject(fESDVZERO);
445 AddObject(fESDTZERO);
446 AddObject(fSPDVertex);
447 AddObject(fPrimaryVertex);
449 AddObject(fPHOSTrigger);
450 AddObject(fEMCALTrigger);
452 AddObject(fMuonTracks);
453 AddObject(fPmdTracks);
454 AddObject(fTrdTracks);
456 AddObject(fCascades);
458 AddObject(fCaloClusters);
459 AddObject(fErrorLogs);
462 fEMCALClusters = source.fEMCALClusters;
463 fFirstEMCALCluster = source.fFirstEMCALCluster;
464 fPHOSClusters = source.fPHOSClusters;
465 fFirstPHOSCluster = source.fFirstPHOSCluster;
474 //______________________________________________________________________________
478 // Standard destructor
484 // everthing on the list gets deleted automatically
487 fHLTConfMapTracks.Delete();
488 fHLTHoughTracks.Delete();
489 fMuonTracks.Delete();
495 fCaloClusters.Delete();
497 // fEMCALTriggerPosition->Delete();
498 // fEMCALTriggerAmplitudes->Delete();
499 // fPHOSTriggerPosition->Delete();
500 // fPHOSTriggerAmplitudes->Delete();
501 // delete fEMCALTriggerPosition;
502 // delete fEMCALTriggerAmplitudes;
503 // delete fPHOSTriggerPosition;
504 // delete fPHOSTriggerAmplitudes;
508 //______________________________________________________________________________
512 if(fESDRun) fESDRun->Reset();
513 if(fHeader) fHeader->Reset();
514 if(fESDZDC) fESDZDC->Reset();
515 if(fESDFMD) fESDFMD->Clear(); // why clear.... need consistend names
516 // if(fESDVZERO) fESDVZERO->; // NOT IMPLEMENTED
517 // if(fESDVZERO) new (fESDVZERO) AliESDVZERO();
518 if(fESDTZERO) fESDTZERO->Reset();
519 // CKB no clear/reset implemented
521 new (fSPDVertex) AliESDVertex();
522 fSPDVertex->SetName("SPDVertex");
525 new (fPrimaryVertex) AliESDVertex();
526 fPrimaryVertex->SetName("PrimaryVertex");
528 if(fSPDMult)new (fSPDMult) AliMultiplicity();
529 if(fPHOSTrigger)fPHOSTrigger->Reset();
530 if(fEMCALTrigger)fEMCALTrigger->Reset();
531 if(fTracks)fTracks->Clear();
532 if(fMuonTracks)fMuonTracks->Clear();
533 if(fPmdTracks)fPmdTracks->Clear();
534 if(fTrdTracks)fTrdTracks->Clear();
535 if(fV0s)fV0s->Clear();
536 if(fCascades)fCascades->Clear();
537 if(fKinks)fKinks->Clear();
538 if(fCaloClusters)fCaloClusters->Clear();
539 if(fErrorLogs) fErrorLogs->Clear();
543 fFirstEMCALCluster=-1;
545 fFirstPHOSCluster=-1;
548 Int_t AliESD::AddV0(const AliESDv0 *v) {
552 TClonesArray &fv = *fV0s;
553 Int_t idx=fV0s->GetEntriesFast();
554 new(fv[idx]) AliESDv0(*v);
558 //______________________________________________________________________________
559 void AliESD::Print(Option_t *) const
562 // Print header information of the event
564 printf("ESD run information\n");
565 printf("Event # in file %d Bunch crossing # %d Orbit # %d Period # %d Run # %d Trigger %lld Magnetic field %f \n",
566 GetEventNumberInFile(),
567 GetBunchCrossNumber(),
572 GetMagneticField() );
573 printf("Vertex: (%.4f +- %.4f, %.4f +- %.4f, %.4f +- %.4f) cm\n",
574 fPrimaryVertex->GetXv(), fPrimaryVertex->GetXRes(),
575 fPrimaryVertex->GetYv(), fPrimaryVertex->GetYRes(),
576 fPrimaryVertex->GetZv(), fPrimaryVertex->GetZRes());
577 printf("Mean vertex in RUN: X=%.4f Y=%.4f cm\n",
578 GetDiamondX(),GetDiamondY());
579 printf("SPD Multiplicity. Number of tracklets %d \n",
580 fSPDMult->GetNumberOfTracklets());
581 printf("Number of tracks: \n");
582 printf(" charged %d\n", GetNumberOfTracks());
583 printf(" muon %d\n", GetNumberOfMuonTracks());
584 printf(" pmd %d\n", GetNumberOfPmdTracks());
585 printf(" trd %d\n", GetNumberOfTrdTracks());
586 printf(" v0 %d\n", GetNumberOfV0s());
587 printf(" cascades %d\n", GetNumberOfCascades());
588 printf(" kinks %d\n", GetNumberOfKinks());
589 printf(" CaloClusters %d\n", GetNumberOfCaloClusters());
590 printf(" phos %d\n", GetNumberOfPHOSClusters());
591 printf(" emcal %d\n", GetNumberOfEMCALClusters());
592 printf(" FMD %s\n", (fESDFMD ? "yes" : "no"));
593 printf(" VZERO %s\n", (fESDVZERO ? "yes" : "no"));
596 void AliESD::SetESDfriend(const AliESDfriend *ev) {
598 // Attaches the complementary info to the ESD
602 Int_t ntrk=ev->GetNumberOfTracks();
604 for (Int_t i=0; i<ntrk; i++) {
605 const AliESDfriendTrack *f=ev->GetTrack(i);
606 GetTrack(i)->SetFriendTrack(f);
610 void AliESD::GetESDfriend(AliESDfriend *ev) const {
612 // Extracts the complementary info from the ESD
616 Int_t ntrk=GetNumberOfTracks();
618 for (Int_t i=0; i<ntrk; i++) {
619 const AliESDtrack *t=GetTrack(i);
620 const AliESDfriendTrack *f=t->GetFriendTrack();
625 void AliESD::AddObject(TObject* obj)
627 // Add an object to the list of object.
628 // Please be aware that in order to increase performance you should
629 // refrain from using TObjArrays (if possible). Use TClonesArrays, instead.
630 fESDObjects->AddLast(obj);
633 void AliESD::GetStdContent()
635 // set pointers for standard content
637 fESDRun = (AliESDRun*)fESDObjects->At(kESDRun);
638 fHeader = (AliESDHeader*)fESDObjects->At(kHeader);
639 fESDZDC = (AliESDZDC*)fESDObjects->At(kESDZDC);
640 fESDFMD = (AliESDFMD*)fESDObjects->At(kESDFMD);
641 fESDVZERO = (AliESDVZERO*)fESDObjects->At(kESDVZERO);
642 fESDTZERO = (AliESDTZERO*)fESDObjects->At(kESDTZERO);
643 fSPDVertex = (AliESDVertex*)fESDObjects->At(kSPDVertex);
644 fPrimaryVertex = (AliESDVertex*)fESDObjects->At(kPrimaryVertex);
645 fSPDMult = (AliMultiplicity*)fESDObjects->At(kSPDMult);
646 fPHOSTrigger = (AliESDCaloTrigger*)fESDObjects->At(kPHOSTrigger);
647 fEMCALTrigger = (AliESDCaloTrigger*)fESDObjects->At(kEMCALTrigger);
648 fTracks = (TClonesArray*)fESDObjects->At(kTracks);
649 fMuonTracks = (TClonesArray*)fESDObjects->At(kMuonTracks);
650 fPmdTracks = (TClonesArray*)fESDObjects->At(kPmdTracks);
651 fTrdTracks = (TClonesArray*)fESDObjects->At(kTrdTracks);
652 fV0s = (TClonesArray*)fESDObjects->At(kV0s);
653 fCascades = (TClonesArray*)fESDObjects->At(kCascades);
654 fKinks = (TClonesArray*)fESDObjects->At(kKinks);
655 fCaloClusters = (TClonesArray*)fESDObjects->At(kCaloClusters);
656 fErrorLogs = (TClonesArray*)fESDObjects->At(kErrorLogs);
660 void AliESD::SetStdNames(){
662 fSPDVertex->SetName("SPDVertex");
663 fPrimaryVertex->SetName("PrimaryVertex");
664 fPHOSTrigger->SetName("PHOSTrigger");
665 fEMCALTrigger->SetName("EMCALTrigger");
666 fTracks->SetName("Tracks");
667 fMuonTracks->SetName("MuonTracks");
668 fPmdTracks->SetName("PmdTracks");
669 fTrdTracks->SetName("TrdTracks");
670 fV0s->SetName("V0s");
671 fCascades->SetName("Cascades");
672 fKinks->SetName("Kinks");
673 fCaloClusters->SetName("CaloClusters");
677 void AliESD::CreateStdContent()
679 // create the standard AOD content and set pointers
681 // create standard objects and add them to the TList of objects
682 AddObject(new AliESDRun());
683 AddObject(new AliESDHeader());
684 AddObject(new AliESDZDC());
685 AddObject(new AliESDFMD());
686 AddObject(new AliESDVZERO());
687 AddObject(new AliESDTZERO());
688 AddObject(new AliESDVertex());
689 AddObject(new AliESDVertex());
690 AddObject(new AliMultiplicity());
691 AddObject(new AliESDCaloTrigger());
692 AddObject(new AliESDCaloTrigger());
693 AddObject(new TClonesArray("AliESDtrack",0));
694 AddObject(new TClonesArray("AliESDMuonTrack",0));
695 AddObject(new TClonesArray("AliESDPmdTrack",0));
696 AddObject(new TClonesArray("AliESDTrdTrack",0));
697 AddObject(new TClonesArray("AliESDv0",0));
698 AddObject(new TClonesArray("AliESDcascade",0));
699 AddObject(new TClonesArray("AliESDkink",0));
700 AddObject(new TClonesArray("AliESDCaloCluster",0));
701 AddObject(new TClonesArray("AliRawDataErrorLog",0));
703 // check the order of the indices against enum...
705 // read back pointers
712 void AliESD::ReadFromTree(TTree *tree){
715 // is this really so smart that an ESDObject has a pointer to a list
716 // of another ESDObject...
718 fESDObjects = (TList*)((AliESD*)tree->GetTree()->GetUserInfo()->FindObject("AliESD"))->GetList();
720 if(fESDObjects->GetEntries()<kESDListN){
721 printf("%s %d AliESD::ReadFromTree() TList contains less than the standard contents %d < %d \n",(char*)__FILE__,__LINE__,fESDObjects->GetEntries(),kESDListN);
725 // we could still set the branch adresses based on
726 // tree->GetListOfBranches() CKB
727 // or create standard list
729 // set the branch addresses
730 TIter next(fESDObjects);
732 while((el=(TNamed*)next())){
733 TString bname(el->GetName());
735 if(bname.CompareTo("AliESDfriend")==0)
737 // AliESDfriend does not have a name ...
738 tree->SetBranchStatus("ESDfriend.*",1);
739 printf("Friend %s\n", bname.Data());
740 tree->SetBranchAddress("ESDfriend.",fESDObjects->GetObjectRef(el));
745 printf("%s\n", bname.Data());
746 tree->SetBranchAddress(bname.Data(),fESDObjects->GetObjectRef(el));