88cb7938 |
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 | |
803d1ab0 |
16 | /* $Id$ */ |
88cb7938 |
17 | |
18 | //_________________________________________________________________________ |
19 | // A singleton. This class should be used in the analysis stage to get |
20 | // reconstructed objects: Digits, RecPoints, TrackSegments and RecParticles, |
5dee926e |
21 | // instead of directly reading them from galice.root file. |
88cb7938 |
22 | // |
5dee926e |
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 | // |
88cb7938 |
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 |
5dee926e |
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 | // |
88cb7938 |
40 | ////////////////////////////////////////////////////////////////////////////// |
41 | |
88cb7938 |
42 | // --- ROOT system --- |
090026bf |
43 | #include "TMath.h" |
88cb7938 |
44 | #include "TTree.h" |
88cb7938 |
45 | |
46 | // --- Standard library --- |
88cb7938 |
47 | |
48 | // --- AliRoot header files --- |
a9bbb414 |
49 | #include "AliEMCALLoader.h" |
50 | #include "AliLog.h" |
f565d89d |
51 | #include "AliCDBLocal.h" |
52 | #include "AliCDBStorage.h" |
53 | #include "AliCDBManager.h" |
1f337798 |
54 | #include "AliCDBEntry.h" |
825fa573 |
55 | #include "AliEMCALHit.h" |
88cb7938 |
56 | |
57 | ClassImp(AliEMCALLoader) |
d64c959b |
58 | |
88cb7938 |
59 | const TString AliEMCALLoader::fgkECARecPointsBranchName("EMCALECARP");//Name for branch with ECA Reconstructed Points |
14ce0a6e |
60 | AliEMCALCalibData* AliEMCALLoader::fgCalibData = 0; //calibation data |
d64c959b |
61 | |
88cb7938 |
62 | //____________________________________________________________________________ |
63 | AliEMCALLoader::AliEMCALLoader() |
18a21c7c |
64 | : fDebug(0), |
65 | fHits(0), |
66 | fDigits(0), |
67 | fSDigits(0), |
68 | fRecPoints(0) |
d64c959b |
69 | { |
14ce0a6e |
70 | //Default constructor for EMCAL Loader Class |
71 | |
88cb7938 |
72 | fDebug = 0; |
5dee926e |
73 | fHits = new TClonesArray("AliEMCALHit"); |
74 | fDigits = new TClonesArray("AliEMCALDigit"); |
75 | fSDigits = new TClonesArray("AliEMCALDigit"); |
76 | fRecPoints = new TObjArray(); |
d64c959b |
77 | } |
78 | |
88cb7938 |
79 | //____________________________________________________________________________ |
18a21c7c |
80 | AliEMCALLoader::AliEMCALLoader(const Char_t *detname,const Char_t *eventfoldername) |
81 | : AliLoader(detname,eventfoldername), |
82 | fDebug(0), |
83 | fHits(0), |
84 | fDigits(0), |
85 | fSDigits(0), |
86 | fRecPoints(0) |
88cb7938 |
87 | { |
14ce0a6e |
88 | //Specific constructor for EMCAL Loader class |
89 | |
88cb7938 |
90 | fDebug=0; |
5dee926e |
91 | fHits = new TClonesArray("AliEMCALHit"); |
92 | fDigits = new TClonesArray("AliEMCALDigit"); |
93 | fSDigits = new TClonesArray("AliEMCALDigit"); |
94 | fRecPoints = new TObjArray(); |
88cb7938 |
95 | } |
88cb7938 |
96 | |
6b299d9e |
97 | //____________________________________________________________________________ |
98 | AliEMCALLoader::AliEMCALLoader(const Char_t *name, TFolder *topfolder) |
99 | : AliLoader(name,topfolder), |
100 | fDebug(0), |
101 | fHits(0), |
102 | fDigits(0), |
103 | fSDigits(0), |
104 | fRecPoints(0) |
105 | { |
106 | //Specific constructor for EMCAL Loader class |
107 | |
108 | fDebug=0; |
109 | fHits = new TClonesArray("AliEMCALHit"); |
110 | fDigits = new TClonesArray("AliEMCALDigit"); |
111 | fSDigits = new TClonesArray("AliEMCALDigit"); |
112 | fRecPoints = new TObjArray(); |
113 | } |
114 | |
d64c959b |
115 | //____________________________________________________________________________ |
88cb7938 |
116 | AliEMCALLoader::~AliEMCALLoader() |
117 | { |
5dee926e |
118 | // Disconnect trees and remove arrays |
119 | if (TreeH()) |
120 | TreeH()->SetBranchAddress(fDetectorName,0); |
121 | if (TreeD()) |
122 | TreeD()->SetBranchAddress(fDetectorName,0); |
123 | if (TreeS()) |
124 | TreeS()->SetBranchAddress(fDetectorName,0); |
125 | if (TreeR()) |
126 | TreeR()->SetBranchAddress(fgkECARecPointsBranchName,0); |
ac169647 |
127 | if (fHits) { |
128 | fHits->Delete(); |
129 | delete fHits; |
130 | } |
5dee926e |
131 | delete fDigits; |
132 | delete fSDigits; |
133 | delete fRecPoints; |
134 | } |
135 | |
f565d89d |
136 | //____________________________________________________________________________ |
137 | AliEMCALCalibData* AliEMCALLoader::CalibData() |
138 | { |
1f337798 |
139 | // Check if the instance of AliEMCALCalibData exists, if not, create it if |
140 | // the OCDB is available, and finally return it. |
f565d89d |
141 | |
1f337798 |
142 | if(!fgCalibData && (AliCDBManager::Instance()->IsDefaultStorageSet())) |
143 | { |
144 | AliCDBEntry *entry = (AliCDBEntry*) |
145 | AliCDBManager::Instance()->Get("EMCAL/Calib/Data"); |
146 | if (entry) fgCalibData = (AliEMCALCalibData*) entry->GetObject(); |
147 | } |
148 | |
149 | if(!fgCalibData) |
150 | AliFatal("Calibration parameters not found in CDB!"); |
78cbbabb |
151 | |
14ce0a6e |
152 | return fgCalibData; |
78cbbabb |
153 | |
f565d89d |
154 | } |
155 | |
3a8be91c |
156 | |
157 | //____________________________________________________________________________ |
f565d89d |
158 | Int_t AliEMCALLoader::CalibrateRaw(Double_t energy, Int_t module, |
159 | Int_t column, Int_t row) |
160 | { |
161 | // Convert energy into digitized amplitude for a cell relId |
162 | // It is a user responsilibity to open CDB and set |
163 | // AliEMCALCalibData object by the following operators: |
164 | // |
165 | // AliCDBLocal *loc = new AliCDBLocal("deCalibDB"); |
166 | // AliEMCALCalibData* clb = (AliEMCALCalibData*)AliCDBStorage::Instance() |
167 | // ->Get(path_to_calibdata,run_number); |
168 | // AliEMCALGetter* gime = AliEMCALGetter::Instance("galice.root"); |
169 | // gime->SetCalibData(clb); |
170 | |
171 | if (CalibData() == 0) |
172 | Warning("CalibrateRaw","Calibration DB is not initiated!"); |
173 | |
78cbbabb |
174 | Float_t gainFactor = 0.00305;//0.0015; // width of one ADC channel in GeV |
175 | Float_t pedestal = 0.009;//0.005; // pedestals |
f565d89d |
176 | |
177 | if(CalibData()) { |
178 | gainFactor = CalibData()->GetADCchannel (module,column,row); |
179 | pedestal = CalibData()->GetADCpedestal(module,column,row); |
180 | } |
181 | |
182 | Int_t amp = static_cast<Int_t>( (energy - pedestal) / gainFactor + 0.5 ) ; |
183 | return amp; |
184 | } |
185 | |
ea6ddc2c |
186 | //____________________________________________________________________________ |
14ce0a6e |
187 | Int_t AliEMCALLoader::GetEvent() |
188 | { |
189 | //Method to load all of the data |
190 | //members of the EMCAL for a given |
191 | //event from the Trees |
192 | |
ea6ddc2c |
193 | AliLoader::GetEvent(); // First call AliLoader to do all the groundwork |
194 | |
195 | // Now connect and fill TClonesArray |
196 | |
197 | // Hits |
198 | TTree *treeH = TreeH(); |
199 | |
200 | if (treeH) { |
825fa573 |
201 | Int_t nEnt = treeH->GetEntries(); // TreeH has array of hits for every primary |
202 | fHits->Clear(); |
203 | Int_t index = 0; |
ac169647 |
204 | TClonesArray *tempArr = 0x0; |
205 | TBranch * branchH = treeH->GetBranch(fDetectorName); |
206 | branchH->SetAddress(&tempArr); |
825fa573 |
207 | for (Int_t iEnt = 0; iEnt < nEnt; iEnt++) { |
208 | treeH->GetEntry(iEnt); |
ac169647 |
209 | Int_t nHit = tempArr->GetEntriesFast(); |
825fa573 |
210 | for (Int_t iHit = 0; iHit < nHit; iHit++) { |
ac169647 |
211 | new ((*fHits)[index]) AliEMCALHit(*((AliEMCALHit*)tempArr->At(iHit))); |
825fa573 |
212 | index++; |
213 | } |
214 | } |
ac169647 |
215 | branchH->ResetAddress(); |
216 | if (tempArr) { |
217 | tempArr->Delete(); |
218 | delete tempArr; |
219 | } |
ea6ddc2c |
220 | } |
825fa573 |
221 | |
ea6ddc2c |
222 | // SDigits |
223 | TTree *treeS = TreeS(); |
224 | if (treeS) { |
ac169647 |
225 | TBranch * branchS = treeS->GetBranch(fDetectorName); |
226 | branchS->ResetAddress(); |
227 | if (fSDigits) { |
9517d886 |
228 | fSDigits->Clear(); |
ac169647 |
229 | } |
230 | branchS->SetAddress(&fSDigits); |
ea6ddc2c |
231 | treeS->GetEvent(0); |
232 | } |
233 | |
234 | // Digits |
235 | TTree *treeD = TreeD(); |
236 | if (treeD) { |
ac169647 |
237 | TBranch * branchD = treeD->GetBranch(fDetectorName); |
238 | branchD->ResetAddress(); |
239 | if (fDigits) { |
9517d886 |
240 | fDigits->Clear(); |
ac169647 |
241 | } |
242 | branchD->SetAddress(&fDigits); |
ea6ddc2c |
243 | treeD->GetEvent(0); |
244 | } |
245 | |
246 | // RecPoints |
247 | TTree *treeR = TreeR(); |
248 | if (treeR) { |
ac169647 |
249 | TBranch * branchR = treeR->GetBranch(fgkECARecPointsBranchName); |
250 | branchR->ResetAddress(); |
251 | if (fRecPoints) { |
9517d886 |
252 | fRecPoints->Clear(); |
ac169647 |
253 | } |
254 | branchR->SetAddress(&fRecPoints); |
ea6ddc2c |
255 | treeR->GetEvent(0); |
256 | } |
257 | |
258 | return 0; |
88cb7938 |
259 | } |