]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EMCAL/AliEMCALLoader.cxx
This is a backward incompatible change in AliRoot. The following methods have been...
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALLoader.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15
16 /* $Id$ */
17
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. 
22 //                  
23 //  MvL Feb 2006:
24 //  The AliEMCALLoader now holds the TClonesArray and TObjArray for reading
25 //  Hits, Dgits, SDigits and RecPoints. Filling is managed in the GetEvent()
26 //  method.
27 //
28 //  Creation/writing of files is managed by the relevant parts of the 
29 //  reconstruction software (AliEMCALDigitiser etx)
30 //
31 //*-- Author: Yves Schutz (SUBATECH) & Dmitri Peressounko (RRC KI & SUBATECH)
32 //*--         Completely redesigned by Dmitri Peressounko March 2001  
33 //
34 //*-- YS June 2001 : renamed the original AliEMCALIndexToObject and make
35 //*--         systematic usage of TFolders without changing the interface
36 // 
37 //*-- Marco van Leeuwen, Jan 2006: complete revision to simplify reading
38 //*--         and fit better in general ALICE scheme
39 //
40 //////////////////////////////////////////////////////////////////////////////
41
42 // --- ROOT system ---
43 #include "TMath.h"
44 #include "TTree.h"
45
46 // --- Standard library ---
47
48 // --- AliRoot header files ---
49 #include "AliEMCALLoader.h"
50 #include "AliLog.h"
51 #include "AliCDBLocal.h"
52 #include "AliCDBStorage.h"
53 #include "AliCDBManager.h"
54 #include "AliCDBEntry.h"
55 #include "AliEMCALHit.h"
56
57 ClassImp(AliEMCALLoader)
58   
59 const TString         AliEMCALLoader::fgkECARecPointsBranchName("EMCALECARP");//Name for branch with ECA Reconstructed Points
60 AliEMCALCalibData*    AliEMCALLoader::fgCalibData = 0; //calibration data
61 AliCaloCalibPedestal* AliEMCALLoader::fgCaloPed   = 0; //dead map data
62 AliEMCALSimParam*     AliEMCALLoader::fgSimParam  = 0; //simulation parameters
63
64 //____________________________________________________________________________ 
65 AliEMCALLoader::AliEMCALLoader()
66   : fDebug(0),
67     fHits(0),
68     fDigits(0),
69     fSDigits(0),
70     fRecPoints(0)
71 {
72   //Default constructor for EMCAL Loader Class
73
74   fDebug = 0;
75   fHits = new TClonesArray("AliEMCALHit");
76   fDigits = new TClonesArray("AliEMCALDigit");
77   fSDigits = new TClonesArray("AliEMCALDigit");
78   fRecPoints = new TObjArray();
79 }
80
81 //____________________________________________________________________________ 
82 AliEMCALLoader::AliEMCALLoader(const Char_t *detname,const Char_t *eventfoldername)
83   : AliLoader(detname,eventfoldername),
84     fDebug(0),
85     fHits(new TClonesArray("AliEMCALHit")),
86     fDigits(new TClonesArray("AliEMCALDigit")),
87     fSDigits(new TClonesArray("AliEMCALDigit")),
88     fRecPoints(new TObjArray())
89 {
90   //Specific constructor for EMCAL Loader class
91 }
92
93 //____________________________________________________________________________
94 AliEMCALLoader::AliEMCALLoader(const Char_t *name, TFolder *topfolder)
95   : AliLoader(name,topfolder),
96     fDebug(0),
97     fHits(new TClonesArray("AliEMCALHit")),
98     fDigits(new TClonesArray("AliEMCALDigit")),
99     fSDigits(new TClonesArray("AliEMCALDigit")),
100     fRecPoints(new TObjArray())
101 {
102   //Specific constructor for EMCAL Loader class
103 }
104
105 //____________________________________________________________________________ 
106 AliEMCALLoader::~AliEMCALLoader()
107 {
108   // Disconnect trees and remove arrays
109   if (TreeH())
110     TreeH()->SetBranchAddress(fDetectorName,0);
111   if (TreeD())
112     TreeD()->SetBranchAddress(fDetectorName,0);
113   if (TreeS())
114     TreeS()->SetBranchAddress(fDetectorName,0);
115   if (TreeR())
116     TreeR()->SetBranchAddress(fgkECARecPointsBranchName,0);
117   if (fHits) {
118     fHits->Delete();
119     delete fHits;
120   }
121   delete fDigits;
122   delete fSDigits;
123   delete fRecPoints;
124 }
125
126 //____________________________________________________________________________ 
127 AliEMCALCalibData* AliEMCALLoader::CalibData()
128
129   // Check if the instance of AliEMCALCalibData exists, if not, create it if 
130   // the OCDB is available, and finally return it.
131
132   if(!fgCalibData && (AliCDBManager::Instance()->IsDefaultStorageSet()))
133     {
134       AliCDBEntry *entry = (AliCDBEntry*) 
135         AliCDBManager::Instance()->Get("EMCAL/Calib/Data");
136       if (entry) fgCalibData =  (AliEMCALCalibData*) entry->GetObject();
137     }
138   
139   if(!fgCalibData)
140     AliFatal("Calibration parameters not found in CDB!");
141   
142   return fgCalibData;
143   
144 }
145
146 //____________________________________________________________________________ 
147 AliCaloCalibPedestal* AliEMCALLoader::PedestalData()
148
149         // Check if the instance of AliCaloCalibPedestal exists, if not, create it if 
150         // the OCDB is available, and finally return it.
151         
152         if(!fgCaloPed && (AliCDBManager::Instance()->IsDefaultStorageSet()))
153     {
154                 AliCDBEntry *entry = (AliCDBEntry*) 
155                 AliCDBManager::Instance()->Get("EMCAL/Calib/Pedestals");
156                 if (entry) fgCaloPed =  (AliCaloCalibPedestal*) entry->GetObject();
157     }
158         
159         if(!fgCaloPed)
160                 AliFatal("Pedestal info not found in CDB!");
161         
162         return fgCaloPed;
163         
164 }
165
166 //____________________________________________________________________________ 
167 AliEMCALSimParam* AliEMCALLoader::SimulationParameters()
168
169         // Check if the instance of AliEMCALSimParam exists, if not, create it if 
170         // the OCDB is available, and finally return it.
171         
172         if(!fgSimParam && (AliCDBManager::Instance()->IsDefaultStorageSet()))
173     {
174                 AliCDBEntry *entry = (AliCDBEntry*) 
175                 AliCDBManager::Instance()->Get("EMCAL/Calib/SimParam");
176                 if (entry) fgSimParam =  (AliEMCALSimParam*) entry->GetObject();
177         
178     }
179         
180         if(!fgSimParam)
181                 AliFatal("Simulations parameters not found in CDB!");
182
183         return fgSimParam;
184         
185 }
186
187 //____________________________________________________________________________ 
188 Int_t AliEMCALLoader::CalibrateRaw(Double_t energy, Int_t module, 
189                                    Int_t column, Int_t row)
190 {
191   // Convert energy into digitized amplitude for a cell relId
192   // It is a user responsilibity to open CDB and set
193   // AliEMCALCalibData object by the following operators:
194   // 
195   // AliCDBLocal *loc = new AliCDBLocal("deCalibDB");
196   // AliEMCALCalibData* clb = (AliEMCALCalibData*)AliCDBStorage::Instance()
197   //    ->Get(path_to_calibdata,run_number);
198   // AliEMCALGetter* gime = AliEMCALGetter::Instance("galice.root");
199   // gime->SetCalibData(clb);
200
201   if (CalibData() == 0)
202     Warning("CalibrateRaw","Calibration DB is not initiated!");
203
204   Float_t gainFactor = 0.00305;//0.0015; // width of one ADC channel in GeV
205   Float_t pedestal   = 0.009;//0.005;  // pedestals
206
207   if(CalibData()) {
208     gainFactor = CalibData()->GetADCchannel (module,column,row);
209     pedestal   = CalibData()->GetADCpedestal(module,column,row);
210   }
211   
212   Int_t   amp = static_cast<Int_t>( (energy - pedestal) / gainFactor + 0.5 ) ; 
213   return amp;
214 }
215
216 //____________________________________________________________________________ 
217 Int_t AliEMCALLoader::GetEvent() 
218 {
219   //Method to load all of the data
220   //members of the EMCAL for a given
221   //event from the Trees
222
223   AliLoader::GetEvent();  // First call AliLoader to do all the groundwork
224   
225   // Now connect and fill TClonesArray
226
227   // Hits
228    TTree *treeH = TreeH();
229    
230    if (treeH) {
231      Int_t nEnt = treeH->GetEntries();  // TreeH has array of hits for every primary
232      fHits->Clear();
233      Int_t index = 0;
234      TClonesArray *tempArr = 0x0;
235      TBranch * branchH = treeH->GetBranch(fDetectorName);
236      branchH->SetAddress(&tempArr);
237      for (Int_t iEnt = 0; iEnt < nEnt; iEnt++) {
238        treeH->GetEntry(iEnt);
239        Int_t nHit = tempArr->GetEntriesFast();
240        for (Int_t iHit = 0; iHit < nHit; iHit++) {
241          new ((*fHits)[index]) AliEMCALHit(*((AliEMCALHit*)tempArr->At(iHit)));
242          index++;
243        }
244      }
245      branchH->ResetAddress();
246      if (tempArr) {
247        tempArr->Delete();
248        delete tempArr;
249      }
250    }
251   
252    // SDigits
253    TTree *treeS = TreeS();
254    if (treeS) {
255      TBranch * branchS = treeS->GetBranch(fDetectorName);
256      branchS->ResetAddress();
257      if (fSDigits) {
258        fSDigits->Clear();
259      }
260      branchS->SetAddress(&fSDigits);
261      treeS->GetEvent(0);
262    }
263    
264    // Digits
265    TTree *treeD = TreeD();
266    if (treeD) {
267      TBranch * branchD = treeD->GetBranch(fDetectorName);
268      branchD->ResetAddress();
269      if (fDigits) {
270        fDigits->Clear();
271      }
272      branchD->SetAddress(&fDigits);
273      treeD->GetEvent(0);
274    }
275
276    // RecPoints
277    TTree *treeR = TreeR();
278    if (treeR) {
279      TBranch * branchR = treeR->GetBranch(fgkECARecPointsBranchName);
280      branchR->ResetAddress();
281      if (fRecPoints) {
282        fRecPoints->Clear();
283      }
284      branchR->SetAddress(&fRecPoints);
285      treeR->GetEvent(0);
286    }
287    
288    return 0;
289 }