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 // A singleton. This class should be used in the analysis stage to get
20 // reconstructed objects: Digits, RecPoints, TrackSegments and RecParticles,
21 // instead of directly reading them from galice.root file. This container
22 // ensures, that one reads Digits, made of these particular digits, RecPoints,
23 // made of these particular RecPoints, TrackSegments and RecParticles.
24 // This becomes non trivial if there are several identical branches, produced with
25 // different set of parameters.
27 // An example of how to use (see also class AliEMCALAnalyser):
28 // AliEMCALGetter * gime = AliEMCALGetter::GetInstance("galice.root","test") ;
29 // for(Int_t irecp = 0; irecp < gime->NRecParticles() ; irecp++)
30 // AliEMCALRecParticle * part = gime->RecParticle(1) ;
32 // gime->Event(event) ; // reads new event from galice.root
34 //*-- Author: Yves Schutz (SUBATECH) & Dmitri Peressounko (RRC KI & SUBATECH)
35 //*-- Completely redesigned by Dmitri Peressounko March 2001
37 //*-- YS June 2001 : renamed the original AliEMCALIndexToObject and make
38 //*-- systematic usage of TFolders without changing the interface
39 //////////////////////////////////////////////////////////////////////////////
41 // --- ROOT system ---
47 // #include "TObjString.h"
48 // #include "TFolder.h"
49 // #include "TParticle.h"
51 // --- Standard library ---
53 // --- AliRoot header files ---
54 // #include "AliRun.h"
55 // #include "AliConfig.h"
56 #include "AliEMCALGetter.h"
57 #include "AliRunLoader.h"
59 #include "AliEMCALLoader.h"
62 ClassImp(AliEMCALGetter)
64 AliEMCALGetter * AliEMCALGetter::fgObjGetter = 0 ;
65 AliEMCALLoader * AliEMCALGetter::fgEmcalLoader = 0;
66 Int_t AliEMCALGetter::fgDebug = 0;
68 // TFile * AliEMCALGetter::fgFile = 0 ;
70 //____________________________________________________________________________
71 AliEMCALGetter::AliEMCALGetter(const char* headerFile, const char* version, Option_t * openingOption)
73 // ctor only called by Instance()
75 AliRunLoader* rl = AliRunLoader::GetRunLoader(version) ;
77 rl = AliRunLoader::Open(headerFile, version, openingOption);
79 Fatal("AliEMCALGetter", "Could not find the Run Loader for %s - %s",headerFile, version) ;
82 if (rl->GetAliRun() == 0x0) {
84 gAlice = rl->GetAliRun(); // should be removed
87 fgEmcalLoader = dynamic_cast<AliEMCALLoader*>(rl->GetLoader("EMCALLoader"));
89 Error("AliEMCALGetter", "Could not find EMCALLoader") ;
91 fgEmcalLoader->SetTitle(version);
94 // initialize data members
101 //____________________________________________________________________________
102 AliEMCALGetter::~AliEMCALGetter()
105 delete fgEmcalLoader ;
109 fPrimaries->Delete() ;
113 //____________________________________________________________________________
114 AliEMCALClusterizer * AliEMCALGetter::Clusterizer()
116 AliEMCALClusterizer * rv ;
117 rv = dynamic_cast<AliEMCALClusterizer *>(EmcalLoader()->Reconstructioner()) ;
120 rv = dynamic_cast<AliEMCALClusterizer*>(EmcalLoader()->Reconstructioner()) ;
126 //____________________________________________________________________________
127 TClonesArray * AliEMCALGetter::Digits()
129 // asks the Loader to return the Digits container
131 TClonesArray * rv = 0 ;
132 rv = EmcalLoader()->Digits() ;
135 EmcalLoader()->MakeDigitsArray() ;
136 rv = EmcalLoader()->Digits() ;
141 //____________________________________________________________________________
142 AliEMCALDigitizer * AliEMCALGetter::Digitizer()
144 AliEMCALDigitizer * rv ;
145 rv = dynamic_cast<AliEMCALDigitizer *>(EmcalLoader()->Digitizer()) ;
148 rv = dynamic_cast<AliEMCALDigitizer *>(EmcalLoader()->Digitizer()) ;
154 //____________________________________________________________________________
155 TObjArray * AliEMCALGetter::PRERecPoints()
157 // asks the Loader to return the EMC RecPoints container
161 rv = EmcalLoader()->PRERecPoints() ;
163 EmcalLoader()->MakeRecPointsArray() ;
164 rv = EmcalLoader()->PRERecPoints() ;
169 //____________________________________________________________________________
170 TObjArray * AliEMCALGetter::ECARecPoints()
172 // asks the Loader to return the EMC RecPoints container
176 rv = EmcalLoader()->ECARecPoints() ;
178 EmcalLoader()->MakeRecPointsArray() ;
179 rv = EmcalLoader()->ECARecPoints() ;
184 //____________________________________________________________________________
185 TObjArray * AliEMCALGetter::HCARecPoints()
187 // asks the Loader to return the EMC RecPoints container
191 rv = EmcalLoader()->HCARecPoints() ;
193 EmcalLoader()->MakeRecPointsArray() ;
194 rv = EmcalLoader()->HCARecPoints() ;
199 //____________________________________________________________________________
200 TClonesArray * AliEMCALGetter::TrackSegments()
202 // asks the Loader to return the TrackSegments container
204 TClonesArray * rv = 0 ;
206 rv = EmcalLoader()->TrackSegments() ;
208 EmcalLoader()->MakeTrackSegmentsArray() ;
209 rv = EmcalLoader()->TrackSegments() ;
214 //____________________________________________________________________________
215 AliEMCALTrackSegmentMaker * AliEMCALGetter::TrackSegmentMaker()
217 AliEMCALTrackSegmentMaker * rv ;
218 rv = dynamic_cast<AliEMCALTrackSegmentMaker *>(EmcalLoader()->TrackSegmentMaker()) ;
221 rv = dynamic_cast<AliEMCALTrackSegmentMaker *>(EmcalLoader()->TrackSegmentMaker()) ;
226 //____________________________________________________________________________
227 TClonesArray * AliEMCALGetter::RecParticles()
229 // asks the Loader to return the TrackSegments container
231 TClonesArray * rv = 0 ;
233 rv = EmcalLoader()->RecParticles() ;
235 EmcalLoader()->MakeRecParticlesArray() ;
236 rv = EmcalLoader()->RecParticles() ;
240 //____________________________________________________________________________
241 void AliEMCALGetter::Event(const Int_t event, const char* opt)
243 // Reads the content of all Tree's S, D and R
245 if ( event >= MaxEvent() ) {
246 Error("Event", "%d not found in TreeE !", event) ;
250 AliRunLoader * rl = AliRunLoader::GetRunLoader(EmcalLoader()->GetTitle());
252 // checks if we are dealing with test-beam data
253 // TBranch * btb = rl->TreeE()->GetBranch("AliEMCALBeamTestEvent") ;
256 // fBTE = new AliEMCALBeamTestEvent() ;
257 // btb->SetAddress(&fBTE) ;
258 // btb->GetEntry(event) ;
267 // Loads the type of object(s) requested
269 rl->GetEvent(event) ;
271 if( strstr(opt,"X") || (strcmp(opt,"")==0) )
280 if( strstr(opt,"D") )
283 if( strstr(opt,"R") )
286 if( strstr(opt,"T") )
289 if( strstr(opt,"P") )
292 // if( strstr(opt,"Q") )
298 //____________________________________________________________________________
299 Int_t AliEMCALGetter::EventNumber() const
301 // return the current event number
302 AliRunLoader * rl = AliRunLoader::GetRunLoader(EmcalLoader()->GetTitle());
303 return static_cast<Int_t>(rl->GetEventNumber()) ;
306 //____________________________________________________________________________
307 TClonesArray * AliEMCALGetter::Hits()
309 // asks the loader to return the Hits container
311 TClonesArray * rv = 0 ;
313 rv = EmcalLoader()->Hits() ;
315 EmcalLoader()->LoadHits("read");
316 rv = EmcalLoader()->Hits() ;
321 //____________________________________________________________________________
322 AliEMCALGetter * AliEMCALGetter::Instance(const char* alirunFileName, const char* version, Option_t * openingOption)
324 // Creates and returns the pointer of the unique instance
325 // Must be called only when the environment has changed
327 //::Info("Instance","alirunFileName=%s version=%s openingOption=%s",alirunFileName,version,openingOption);
329 if(!fgObjGetter){ // first time the getter is called
330 fgObjGetter = new AliEMCALGetter(alirunFileName, version, openingOption) ;
332 else { // the getter has been called previously
333 AliRunLoader * rl = AliRunLoader::GetRunLoader(fgEmcalLoader->GetTitle());
334 if ( rl->GetFileName() == alirunFileName ) {// the alirunFile has the same name
335 // check if the file is already open
336 TFile * galiceFile = dynamic_cast<TFile *>(gROOT->FindObject(rl->GetFileName()) ) ;
339 fgObjGetter = new AliEMCALGetter(alirunFileName, version, openingOption) ;
341 else { // the file is already open check the version name
342 TString currentVersionName = rl->GetEventFolder()->GetName() ;
343 TString newVersionName(version) ;
344 if (currentVersionName == newVersionName)
346 ::Warning( "Instance", "Files with version %s already open", currentVersionName.Data() ) ;
348 fgObjGetter = new AliEMCALGetter(alirunFileName, version, openingOption) ;
353 fgObjGetter = new AliEMCALGetter(alirunFileName, version, openingOption) ;
356 ::Error("Instance", "Failed to create the EMCAL Getter object") ;
364 //____________________________________________________________________________
365 AliEMCALGetter * AliEMCALGetter::Instance()
367 // Returns the pointer of the unique instance already defined
370 ::Error("Instance", "Getter not initialized") ;
376 //____________________________________________________________________________
377 Int_t AliEMCALGetter::MaxEvent() const
379 // returns the number of events in the run (from TE)
381 AliRunLoader * rl = AliRunLoader::GetRunLoader(EmcalLoader()->GetTitle());
382 return static_cast<Int_t>(rl->GetNumberOfEvents()) ;
385 //____________________________________________________________________________
386 TParticle * AliEMCALGetter::Primary(Int_t index) const
388 AliRunLoader * rl = AliRunLoader::GetRunLoader(EmcalLoader()->GetTitle());
389 return rl->Stack()->Particle(index) ;
392 //____________________________________________________________________________
393 AliEMCAL * AliEMCALGetter:: EMCAL() const
395 // returns the EMCAL object
396 AliEMCAL * emcal = dynamic_cast<AliEMCAL*>(EmcalLoader()->GetModulesFolder()->FindObject("EMCAL")) ;
399 Warning("EMCAL", "EMCAL module not found in module folders: %s", EmcalLoader()->GetModulesFolder()->GetName() ) ;
405 //____________________________________________________________________________
406 AliEMCALPID * AliEMCALGetter::PID()
409 rv = dynamic_cast<AliEMCALPID *>(EmcalLoader()->PIDTask()) ;
412 rv = dynamic_cast<AliEMCALPID *>(EmcalLoader()->PIDTask()) ;
417 //____________________________________________________________________________
418 AliEMCALGeometry * AliEMCALGetter::EMCALGeometry() const
420 // Returns EMCAL geometry
422 AliEMCALGeometry * rv = 0 ;
424 rv = EMCAL()->GetGeometry() ;
428 //____________________________________________________________________________
429 TClonesArray * AliEMCALGetter::Primaries()
431 // creates the Primaries container if needed
434 Info("Primaries", "Creating a new TClonesArray for primaries") ;
435 fPrimaries = new TClonesArray("TParticle", 1000) ;
440 //____________________________________________________________________________
441 void AliEMCALGetter::Print()
443 // Print usefull information about the getter
445 AliRunLoader * rl = AliRunLoader::GetRunLoader(fgEmcalLoader->GetTitle());
446 ::Info( "Print", "gAlice file is %s -- version name is %s", (rl->GetFileName()).Data(), rl->GetEventFolder()->GetName() ) ;
449 //____________________________________________________________________________
450 void AliEMCALGetter::ReadPrimaries()
452 // Read Primaries from Kinematics.root
454 AliRunLoader * rl = AliRunLoader::GetRunLoader(EmcalLoader()->GetTitle());
456 // gets kine tree from the root file (Kinematics.root)
457 if ( ! rl->TreeK() ) // load treeK the first time
458 rl->LoadKinematics() ;
460 fNPrimaries = rl->Stack()->GetNtrack() ;
463 Info( "ReadTreeK", "Found %d particles in event # %d", fNPrimaries, EventNumber() ) ;
466 // first time creates the container
468 fPrimaries->Clear() ;
471 for (index = 0 ; index < fNPrimaries; index++) {
472 new ((*fPrimaries)[index]) TParticle(*(Primary(index)));
476 //____________________________________________________________________________
477 Int_t AliEMCALGetter::ReadTreeD()
482 // gets TreeD from the root file (EMCAL.SDigits.root)
483 if ( !IsLoaded("D") ) {
484 EmcalLoader()->LoadDigits("UPDATE") ;
485 EmcalLoader()->LoadDigitizer("UPDATE") ;
488 return Digits()->GetEntries() ;
491 //____________________________________________________________________________
492 Int_t AliEMCALGetter::ReadTreeH()
496 // gets TreeH from the root file (EMCAL.Hit.root)
497 if ( !IsLoaded("H") ) {
498 EmcalLoader()->LoadHits("UPDATE") ;
501 return Hits()->GetEntries() ;
504 //____________________________________________________________________________
505 Int_t AliEMCALGetter::ReadTreeR()
507 // Read the RecPoints
510 // gets TreeR from the root file (EMCAL.RecPoints.root)
511 if ( !IsLoaded("R") ) {
512 EmcalLoader()->LoadRecPoints("UPDATE") ;
513 EmcalLoader()->LoadClusterizer("UPDATE") ;
517 return ECARecPoints()->GetEntries() ;
520 //____________________________________________________________________________
521 Int_t AliEMCALGetter::ReadTreeT()
523 // Read the TrackSegments
526 // gets TreeT from the root file (EMCAL.TrackSegments.root)
527 if ( !IsLoaded("T") ) {
528 EmcalLoader()->LoadTracks("UPDATE") ;
529 EmcalLoader()->LoadTrackSegmentMaker("UPDATE") ;
533 return TrackSegments()->GetEntries() ;
535 //____________________________________________________________________________
536 Int_t AliEMCALGetter::ReadTreeP()
538 // Read the TrackSegments
541 // gets TreeT from the root file (EMCAL.TrackSegments.root)
542 if ( !IsLoaded("P") ) {
543 EmcalLoader()->LoadRecParticles("UPDATE") ;
544 EmcalLoader()->LoadPID("UPDATE") ;
548 return RecParticles()->GetEntries() ;
550 //____________________________________________________________________________
551 Int_t AliEMCALGetter::ReadTreeS()
556 // gets TreeS from the root file (EMCAL.SDigits.root)
557 if ( !IsLoaded("S") ) {
558 EmcalLoader()->LoadSDigits("UPDATE") ;
559 EmcalLoader()->LoadSDigitizer("UPDATE") ;
563 return SDigits()->GetEntries() ;
566 //____________________________________________________________________________
567 TClonesArray * AliEMCALGetter::SDigits()
569 // asks the Loader to return the Digits container
571 TClonesArray * rv = 0 ;
573 rv = EmcalLoader()->SDigits() ;
575 EmcalLoader()->MakeSDigitsArray() ;
576 rv = EmcalLoader()->SDigits() ;
581 //____________________________________________________________________________
582 AliEMCALSDigitizer * AliEMCALGetter::SDigitizer()
584 AliEMCALSDigitizer * rv ;
585 rv = dynamic_cast<AliEMCALSDigitizer *>(EmcalLoader()->SDigitizer()) ;
588 rv = dynamic_cast<AliEMCALSDigitizer *>(EmcalLoader()->SDigitizer()) ;
593 //____________________________________________________________________________
594 TParticle * AliEMCALGetter::Secondary(const TParticle* p, const Int_t index) const
596 // Return first (index=1) or second (index=2) secondary particle of primary particle p
604 Int_t daughterIndex = p->GetDaughter(index-1) ;
605 AliRunLoader * rl = AliRunLoader::GetRunLoader(EmcalLoader()->GetTitle());
606 return rl->GetAliRun()->GetMCApp()->Particle(daughterIndex) ;
612 //____________________________________________________________________________
613 void AliEMCALGetter::Track(const Int_t itrack)
615 // Read the first entry of EMCAL branch in hit tree gAlice->TreeH()
617 AliRunLoader * rl = AliRunLoader::GetRunLoader(EmcalLoader()->GetTitle());
619 if( !TreeH() ) // load treeH the first time
622 // first time create the container
623 TClonesArray * hits = Hits() ;
627 TBranch * emcalbranch = dynamic_cast<TBranch*>(TreeH()->GetBranch("EMCAL")) ;
628 emcalbranch->SetAddress(&hits) ;
629 emcalbranch->GetEntry(itrack) ;
632 //____________________________________________________________________________
633 TTree * AliEMCALGetter::TreeD() const
636 rv = EmcalLoader()->TreeD() ;
638 EmcalLoader()->MakeTree("D");
639 rv = EmcalLoader()->TreeD() ;
645 //____________________________________________________________________________
646 TTree * AliEMCALGetter::TreeH() const
649 rv = EmcalLoader()->TreeH() ;
651 EmcalLoader()->MakeTree("H");
652 rv = EmcalLoader()->TreeH() ;
658 //____________________________________________________________________________
659 TTree * AliEMCALGetter::TreeR() const
662 rv = EmcalLoader()->TreeR() ;
664 EmcalLoader()->MakeTree("R");
665 rv = EmcalLoader()->TreeR() ;
671 //____________________________________________________________________________
672 TTree * AliEMCALGetter::TreeT() const
675 rv = EmcalLoader()->TreeT() ;
677 EmcalLoader()->MakeTree("T");
678 rv = EmcalLoader()->TreeT() ;
683 //____________________________________________________________________________
684 TTree * AliEMCALGetter::TreeP() const
687 rv = EmcalLoader()->TreeP() ;
689 EmcalLoader()->MakeTree("P");
690 rv = EmcalLoader()->TreeP() ;
696 //____________________________________________________________________________
697 TTree * AliEMCALGetter::TreeS() const
700 rv = EmcalLoader()->TreeS() ;
702 EmcalLoader()->MakeTree("S");
703 rv = EmcalLoader()->TreeS() ;
709 //____________________________________________________________________________
710 Bool_t AliEMCALGetter::VersionExists(TString & opt) const
712 // checks if the version with the present name already exists in the same directory
716 AliRunLoader * rl = AliRunLoader::GetRunLoader(EmcalLoader()->GetTitle());
717 TString version( rl->GetEventFolder()->GetName() ) ;
721 if ( opt == "sdigits") {
722 // add the version name to the root file name
723 TString fileName( EmcalLoader()->GetSDigitsFileName() ) ;
724 if (version != AliConfig::fgkDefaultEventFolderName) // only if not the default folder name
725 fileName = fileName.ReplaceAll(".root", "") + "_" + version + ".root" ;
726 if ( !(gSystem->AccessPathName(fileName)) ) {
727 Warning("VersionExists", "The file %s already exists", fileName.Data()) ;
730 EmcalLoader()->SetSDigitsFileName(fileName) ;
733 if ( opt == "digits") {
734 // add the version name to the root file name
735 TString fileName( EmcalLoader()->GetDigitsFileName() ) ;
736 if (version != AliConfig::fgkDefaultEventFolderName) // only if not the default folder name
737 fileName = fileName.ReplaceAll(".root", "") + "_" + version + ".root" ;
738 if ( !(gSystem->AccessPathName(fileName)) ) {
739 Warning("VersionExists", "The file %s already exists", fileName.Data()) ;
742 EmcalLoader()->SetDigitsFileName(fileName) ;
749 //____________________________________________________________________________
750 UShort_t AliEMCALGetter::EventPattern(void) const
752 // Return the pattern (trigger bit register) of the beam-test event
754 // return fBTE->GetPattern() ;
758 //____________________________________________________________________________
759 Float_t AliEMCALGetter::BeamEnergy(void) const
761 // Return the beam energy of the beam-test event
763 // return fBTE->GetBeamEnergy() ;