]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EMCAL/AliEMCALLoader.cxx
-mavoid creation-deletion of TClonesArray per event
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALLoader.cxx
index 6074f07dbf8ed42bf227903fbf608a062e2d5a58..5f12d827bd2d154819d9a7bf1b1781bb22a1fec2 100644 (file)
 /* $Id$ */
 
 //_________________________________________________________________________
-//  A singleton. This class should be used in the analysis stage to get 
-//  reconstructed objects: Digits, RecPoints, TrackSegments and RecParticles,
-//  instead of directly reading them from galice.root file. 
-//                  
-//  MvL Feb 2006:
-//  The AliEMCALLoader now holds the TClonesArray and TObjArray for reading
+//  The AliEMCALLoader gets the TClonesArray and TObjArray for reading
 //  Hits, Dgits, SDigits and RecPoints. Filling is managed in the GetEvent()
 //  method.
-//
-//  Creation/writing of files is managed by the relevant parts of the 
-//  reconstruction software (AliEMCALDigitiser etx)
+//  It also provides acces methods to the calibration and simulation OCDB parameters 
 //
 //*-- Author: Yves Schutz (SUBATECH) & Dmitri Peressounko (RRC KI & SUBATECH)
 //*--         Completely redesigned by Dmitri Peressounko March 2001  
 // 
 //*-- Marco van Leeuwen, Jan 2006: complete revision to simplify reading
 //*--         and fit better in general ALICE scheme
+//*-- GCB: Remove TClonesArrays and TObjArrays data members, they are created elsewhere.
+//*--      Provide access to OCDB calibration and simulation parameters.          
 //
 //////////////////////////////////////////////////////////////////////////////
 
-
 // --- ROOT system ---
-
+#include "TMath.h"
 #include "TTree.h"
-
 // --- Standard library ---
 
 // --- AliRoot header files ---
 #include "AliEMCALLoader.h"
 #include "AliLog.h"
+#include "AliCDBLocal.h"
+#include "AliCDBStorage.h"
+#include "AliCDBManager.h"
+#include "AliCDBEntry.h"
+#include "AliEMCALHit.h"
 
-ClassImp(AliEMCALLoader)
+ ClassImp(AliEMCALLoader)
   
-const TString AliEMCALLoader::fgkECARecPointsBranchName("EMCALECARP");//Name for branch with ECA Reconstructed Points
+const TString         AliEMCALLoader::fgkECARecPointsBranchName("EMCALECARP");//Name for branch with ECA Reconstructed Points
+const TString         AliEMCALLoader::fgkECADigitsBranchName("DIGITS");//Name for branch with ECA Digits
+const TString         AliEMCALLoader::fgkECASDigitsBranchName("SDIGITS");//Name for branch with ECA SDigits
+const TString         AliEMCALLoader::fgkECAHitsBranchName("HITS");//Name for branch with ECA Hits
+
+AliEMCALCalibData*    AliEMCALLoader::fgCalibData = 0; //calibration data
+//AliCaloCalibPedestal* AliEMCALLoader::fgCaloPed   = 0; //dead map data
+AliEMCALSimParam*     AliEMCALLoader::fgSimParam  = 0; //simulation parameters
 
 //____________________________________________________________________________ 
 AliEMCALLoader::AliEMCALLoader()
+: fDebug(0), fTempArr(0x0)
 {
-  fDebug = 0;
-  fHits = new TClonesArray("AliEMCALHit");
-  fDigits = new TClonesArray("AliEMCALDigit");
-  fSDigits = new TClonesArray("AliEMCALDigit");
-  fRecPoints = new TObjArray();
+  //Default constructor for EMCAL Loader Class
+  fTempArr =  new TClonesArray("AliEMCALHit",0);
+
 }
 
 //____________________________________________________________________________ 
-AliEMCALLoader::AliEMCALLoader(const Char_t *detname,const Char_t *eventfoldername):
-  AliLoader(detname,eventfoldername)
+AliEMCALLoader::AliEMCALLoader(const Char_t *detname,const Char_t *eventfoldername)
+  : AliLoader(detname,eventfoldername), fDebug(0), fTempArr(0x0)
 {
-  fDebug=0;
-  fHits = new TClonesArray("AliEMCALHit");
-  fDigits = new TClonesArray("AliEMCALDigit");
-  fSDigits = new TClonesArray("AliEMCALDigit");
-  fRecPoints = new TObjArray();
+  //Specific constructor for EMCAL Loader class
+  fTempArr =  new TClonesArray("AliEMCALHit",0);
+
+}
+
+//____________________________________________________________________________
+AliEMCALLoader::AliEMCALLoader(const Char_t *name, TFolder *topfolder)
+  : AliLoader(name,topfolder), fDebug(0), fTempArr(0x0)
+{
+  //Specific constructor for EMCAL Loader class
+  fTempArr =  new TClonesArray("AliEMCALHit",0);
+
 }
 
 //____________________________________________________________________________ 
 AliEMCALLoader::~AliEMCALLoader()
 {
   // Disconnect trees and remove arrays
-  if (TreeH())
-    TreeH()->SetBranchAddress(fDetectorName,0);
-  if (TreeD())
-    TreeD()->SetBranchAddress(fDetectorName,0);
-  if (TreeS())
-    TreeS()->SetBranchAddress(fDetectorName,0);
-  if (TreeR())
-    TreeR()->SetBranchAddress(fgkECARecPointsBranchName,0);
-  delete fHits;
-  delete fDigits;
-  delete fSDigits;
-  delete fRecPoints;
+//  if (TreeH())
+//    TreeH()->SetBranchAddress(fDetectorName,0);
+//  if (TreeD())
+//    TreeD()->SetBranchAddress(fDetectorName,0);
+//  if (TreeS())
+//    TreeS()->SetBranchAddress(fDetectorName,0);
+//  if (TreeR())
+//    TreeR()->SetBranchAddress(fgkECARecPointsBranchName,0);
+       
+       Clean(fgkECAHitsBranchName);
+       Clean(fgkECASDigitsBranchName);
+       Clean(fgkECADigitsBranchName);
+       Clean(fgkECARecPointsBranchName);
+       
+       AliLoader::CleanFolders();
+       
+       if (fTempArr) {
+               fTempArr->Delete();
+               delete fTempArr;
+       }
+       
 }
 
 //____________________________________________________________________________ 
-Int_t AliEMCALLoader::GetEvent() {
-  AliLoader::GetEvent();  // First call AliLoader to do all the groundwork
+AliEMCALCalibData* AliEMCALLoader::CalibData()
+{ 
+  // Check if the instance of AliEMCALCalibData exists, if not, create it if 
+  // the OCDB is available, and finally return it.
+  
+  if(!fgCalibData && (AliCDBManager::Instance()->IsDefaultStorageSet()))
+    {
+      AliCDBEntry *entry = (AliCDBEntry*) 
+       AliCDBManager::Instance()->Get("EMCAL/Calib/Data");
+      if (entry) fgCalibData =  (AliEMCALCalibData*) entry->GetObject();
+    }
+  
+  if(!fgCalibData)
+    AliFatal("Calibration parameters not found in CDB!");
+  
+  return fgCalibData;
+  
+}
+
+//____________________________________________________________________________ 
+//AliCaloCalibPedestal* AliEMCALLoader::PedestalData()
+//{ 
+//     // Check if the instance of AliCaloCalibPedestal exists, if not, create it if 
+//     // the OCDB is available, and finally return it.
+//     
+//     if(!fgCaloPed && (AliCDBManager::Instance()->IsDefaultStorageSet()))
+//    {
+//             AliCDBEntry *entry = (AliCDBEntry*) 
+//             AliCDBManager::Instance()->Get("EMCAL/Calib/Pedestals");
+//             if (entry) fgCaloPed =  (AliCaloCalibPedestal*) entry->GetObject();
+//    }
+//     
+//     if(!fgCaloPed)
+//             AliFatal("Pedestal info not found in CDB!");
+//     
+//     return fgCaloPed;
+//     
+//}
 
-  AliDebug(1,__PRETTY_FUNCTION__);
-  // Now connect and fill TClonesArray
+//____________________________________________________________________________ 
+AliEMCALSimParam* AliEMCALLoader::SimulationParameters()
+{ 
+  // Check if the instance of AliEMCALSimParam exists, if not, create it if 
+  // the OCDB is available, and finally return it.
+  
+  if(!fgSimParam && (AliCDBManager::Instance()->IsDefaultStorageSet()))
+    {
+      AliCDBEntry *entry = (AliCDBEntry*) 
+       AliCDBManager::Instance()->Get("EMCAL/Calib/SimParam");
+      if (entry) fgSimParam =  (AliEMCALSimParam*) entry->GetObject();
+      
+    }
+  
+  if(!fgSimParam)
+    AliFatal("Simulations parameters not found in CDB!");
+  
+  return fgSimParam;
+  
+}
 
-  // Hits
-  TTree *treeH = TreeH();
+//____________________________________________________________________________ 
+Int_t AliEMCALLoader::GetEvent() 
+{
+  //Method to load all of the data
+  //members of the EMCAL for a given
+  //event from the Trees
+  
+  AliLoader::GetEvent();  // First call AliLoader to do all the groundwork
+  
+  // *** Hits ***
+  // Initialize the Hits TClonesArray, only if it did not existed before
+  MakeHitsArray();
+  
+  TTree *treeH = TreeH();      
   if (treeH) {
-    treeH->SetBranchAddress(fDetectorName,&fHits);
-    if (treeH->GetEntries() > 1)
-      Warning(__PRETTY_FUNCTION__,"multiple arrays in treeH no longer supported");
-    treeH->GetEvent(0);
+    Int_t nEnt = treeH->GetEntries();  // TreeH has array of hits for every primary
+    Int_t index = 0;
+    TBranch * branchH = treeH->GetBranch(fDetectorName);
+    branchH->SetAddress(&fTempArr);
+    TClonesArray* hits = const_cast<AliEMCALLoader *>(this)->Hits();
+    if (hits) hits->Clear();
+    for (Int_t iEnt = 0; iEnt < nEnt; iEnt++) {
+      branchH->GetEntry(iEnt);
+      Int_t nHit = fTempArr->GetEntriesFast();
+      for (Int_t iHit = 0; iHit < nHit; iHit++) {
+       new ((*hits)[index]) AliEMCALHit(*((AliEMCALHit*)fTempArr->At(iHit)));
+       index++;
+      }
+    }
+    branchH->ResetAddress();
+       if (fTempArr) {
+                 fTempArr->Clear();
+       }
   }
-
-  // SDigits
+  
+  // *** SDigits ***
+  // Initialize the SDigits TClonesArray, only if it did not existed before
+  MakeSDigitsArray();
+  
   TTree *treeS = TreeS();
   if (treeS) {
-    treeS->SetBranchAddress(fDetectorName,&fSDigits);
-    treeS->GetEvent(0);
+    TBranch * branchS = treeS->GetBranch(fDetectorName);
+    
+    // Reset SDigits array and branch
+    branchS->ResetAddress();
+    TClonesArray* sdigits = const_cast<AliEMCALLoader *>(this)->SDigits();
+    if (sdigits) sdigits->Clear();
+    
+    branchS->SetAddress(&sdigits);
+    branchS->GetEntry(0);
   }
-
-  // Digits
+  
+  // *** Digits ***
+  // Initialize the Digits TClonesArray, only if it did not existed before
+  MakeDigitsArray();
+  
   TTree *treeD = TreeD();
   if (treeD) {
-    treeD->SetBranchAddress(fDetectorName,&fDigits);
-    treeD->GetEvent(0);
+    TBranch * branchD = treeD->GetBranch(fDetectorName);
+    
+    // Reset Digits array and branch
+    branchD->ResetAddress();
+    TClonesArray* digits = const_cast<AliEMCALLoader *>(this)->Digits();
+    if (digits) digits->Clear();
+    
+    branchD->SetAddress(&digits);
+    branchD->GetEntry(0);
   }
-
-  // RecPoints
+  
+  // *** RecPoints ***  
+  // Initialize the RecPoints TObjArray, only if it did not existed before
+  MakeRecPointsArray();
+  
   TTree *treeR = TreeR();
   if (treeR) {
-    treeR->SetBranchAddress(fgkECARecPointsBranchName,&fRecPoints);
-    treeR->GetEvent(0);
+    TBranch * branchR = treeR->GetBranch(fgkECARecPointsBranchName);
+    
+    // Reset RecPoints array and branch
+    branchR->ResetAddress();
+    TObjArray* rp = const_cast<AliEMCALLoader *>(this)->RecPoints();
+    if (rp) rp->Clear();
+    
+    branchR->SetAddress(&rp);
+    branchR->GetEntry(0);
   }
-
+  
   return 0;
 }
+
+//____________________________________________________________________________
+void AliEMCALLoader::MakeHitsArray(){
+  // Add Hits array to the data folder
+  if (Hits()) return;
+  TClonesArray* hits = new TClonesArray("AliEMCALHit",0);
+  hits->SetName(fgkECAHitsBranchName);
+  GetDetectorDataFolder()->Add(hits);
+}
+
+//____________________________________________________________________________
+void AliEMCALLoader::MakeSDigitsArray(){
+  // Add SDigits array to the data folder
+  if (SDigits()) return;
+  TClonesArray* sdigits = new TClonesArray("AliEMCALDigit",0);
+  sdigits->SetName(fgkECASDigitsBranchName);
+  GetDetectorDataFolder()->Add(sdigits);
+}
+
+//____________________________________________________________________________
+void AliEMCALLoader::MakeDigitsArray(){
+  // Add Digits array to the data folder
+  if (Digits()) return;
+  TClonesArray* digits = new TClonesArray("AliEMCALDigit",0);
+  digits->SetName(fgkECADigitsBranchName);
+  GetDetectorDataFolder()->Add(digits);
+}
+
+//____________________________________________________________________________
+void AliEMCALLoader::MakeRecPointsArray(){
+  // Add RecPoints array to the data folder
+  if (RecPoints()) return;
+  TObjArray* rp = new TObjArray(0);
+  rp->SetName(fgkECARecPointsBranchName);
+  GetDetectorDataFolder()->Add(rp);
+}