Adding a reminder for coders
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALCalibTimeDepCorrection.cxx
CommitLineData
d81e6423 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
61917ab3 18// Objects of this class contain info on time-dependent corrections
d81e6423 19//
20
21#include <fstream>
22#include <TString.h>
61917ab3 23#include <TFile.h>
24#include <TTree.h>
d81e6423 25
26#include "AliEMCALCalibTimeDepCorrection.h"
27
28using namespace std;
29
30ClassImp(AliEMCALCalibTimeDepCorrection)
31
32//____________________________________________________________________________
2f17a269 33AliEMCALCalibTimeDepCorrection::AliEMCALCalibTimeDepCorrection(const int nSM) :
34 fNSuperModule(nSM),
35 fSuperModuleData(),
220ed45a 36 fStartTime(0),
37 fNTimeBins(0),
38 fTimeBinSize(0)
d81e6423 39{
40 //Default constructor.
2f17a269 41 for (int i=0; i<fNSuperModule; i++) {
42 fSuperModuleData.Add(new AliEMCALSuperModuleCalibTimeDepCorrection(i));
43 }
44 fSuperModuleData.Compress(); // compress the TObjArray
d81e6423 45}
46
47//____________________________________________________________________________
716fca62 48void AliEMCALCalibTimeDepCorrection::InitCorrection(Int_t nSM, Int_t nBins, Float_t val)
d81e6423 49{
50 // This methods assumes that you are using SuperModules 0..nSM-1
51 fNSuperModule = nSM;
d81e6423 52
53 Int_t iSM = 0; // SuperModule index
54 Int_t iCol = 0;
55 Int_t iRow = 0;
56 Int_t nCorr = nBins;
ab962f7b 57 Float_t correction = val;
d81e6423 58
59 Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
60
61 for (Int_t i = 0; i < fNSuperModule; i++) {
2f17a269 62 AliEMCALSuperModuleCalibTimeDepCorrection * t = (AliEMCALSuperModuleCalibTimeDepCorrection*) fSuperModuleData[i];
716fca62 63 iSM = i;
2f17a269 64 t->SetSuperModuleNum(iSM); // assume SMs are coming in order
d81e6423 65
66 for (Int_t j=0; j<nAPDPerSM; j++) {
716fca62 67 iCol = j / AliEMCALGeoParams::fgkEMCALRows;
68 iRow = j % AliEMCALGeoParams::fgkEMCALRows;
d81e6423 69
70 // set size of TArray
2f17a269 71 t->GetCorrection(iCol,iRow)->Set(nCorr);
d81e6423 72 for (Int_t k=0; k<nCorr; k++) {
73 // add to TArray
ab962f7b 74 t->GetCorrection(iCol,iRow)->AddAt(correction, k); // AddAt = SetAt..
d81e6423 75 }
76 }
77
78 } // i, SuperModule
79
80 return;
81}
82
83//____________________________________________________________________________
84void AliEMCALCalibTimeDepCorrection::SetCorrection(Int_t supModIndex, Int_t iCol, Int_t iRow, Int_t iBin, Float_t val)
85{ // if you call for non-existing data, there may be a crash..
2f17a269 86 ((AliEMCALSuperModuleCalibTimeDepCorrection*)fSuperModuleData[supModIndex])->GetCorrection(iCol,iRow)->AddAt(val, iBin); // AddAt = SetAt..
d81e6423 87 return;
88}
89
90//____________________________________________________________________________
2f17a269 91Float_t AliEMCALCalibTimeDepCorrection::GetCorrection(Int_t supModIndex, Int_t iCol, Int_t iRow, Int_t iBin) const
d81e6423 92{ // if you call for non-existing data, there may be a crash..
0ce5c45d 93 return ((AliEMCALSuperModuleCalibTimeDepCorrection*)fSuperModuleData[supModIndex])->GetCorrection(iCol,iRow)->At(iBin);
d81e6423 94}
95
96//____________________________________________________________________________
61917ab3 97void AliEMCALCalibTimeDepCorrection::ReadTextInfo(Int_t nSM, const TString &txtFileName,
98 Bool_t swapSides)
d81e6423 99{
100 //Read data from txt file. ; coordinates given on SuperModule basis
101
102 std::ifstream inputFile(txtFileName.Data());
103 if (!inputFile) {
61917ab3 104 printf("AliEMCALCalibTimeDepCorrection::ReadTextInfo - Cannot open the APD info file %s\n", txtFileName.Data());
d81e6423 105 return;
106 }
107
108 fNSuperModule = nSM;
d81e6423 109
110 Int_t iSM = 0; // SuperModule index
111 Int_t iCol = 0;
112 Int_t iRow = 0;
113 Int_t nCorr = 0;
ab962f7b 114 Float_t correction = 0;
d81e6423 115
116 Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
117
61917ab3 118 // read header info
119 inputFile >> fStartTime >> fNTimeBins >> fTimeBinSize;
120
d81e6423 121 for (Int_t i = 0; i < fNSuperModule; i++) {
2f17a269 122 AliEMCALSuperModuleCalibTimeDepCorrection * t = (AliEMCALSuperModuleCalibTimeDepCorrection*) fSuperModuleData[i];
123
d81e6423 124 if (!inputFile) {
b48d1356 125 printf("AliEMCALCalibTimeDepCorrection::ReadTextInfo - Error while reading input file; likely EOF..\n");
d81e6423 126 return;
127 }
128 inputFile >> iSM;
2f17a269 129 t->SetSuperModuleNum(iSM);
d81e6423 130
131 for (Int_t j=0; j<nAPDPerSM; j++) {
132 inputFile >> iCol >> iRow >> nCorr;
133
b48d1356 134 // check that input values are not out bounds
135 if (iCol<0 || iCol>(AliEMCALGeoParams::fgkEMCALCols-1) ||
3a282863 136 iRow<0 || iRow>(AliEMCALGeoParams::fgkEMCALRows-1) ||
137 nCorr<0 ) {
138 printf("AliEMCALCalibTimeDepCorrection::ReadTextInfo - Error while reading input file; j %d iCol %d iRow %d nCorr %d\n", j, iCol, iRow, nCorr);
b48d1356 139 return;
140 }
141
d81e6423 142 // assume that this info is already swapped and done for this basis?
143 if (swapSides) {
144 // C side, oriented differently than A side: swap is requested
145 iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
146 iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
147 }
148
149 // set size of TArray
2f17a269 150 t->GetCorrection(iCol,iRow)->Set(nCorr);
d81e6423 151 for (Int_t k=0; k<nCorr; k++) {
ab962f7b 152 inputFile >> correction;
d81e6423 153 // add to TArray
ab962f7b 154 t->GetCorrection(iCol,iRow)->AddAt(correction, k);
d81e6423 155 }
156 }
157
158 } // i, SuperModule
159
160 inputFile.close();
161
162 return;
163}
164
165//____________________________________________________________________________
61917ab3 166void AliEMCALCalibTimeDepCorrection::WriteTextInfo(const TString &txtFileName,
167 Bool_t swapSides)
d81e6423 168{
169 // write data to txt file. ; coordinates given on SuperModule basis
170
171 std::ofstream outputFile(txtFileName.Data());
172 if (!outputFile) {
61917ab3 173 printf("AliEMCALCalibTimeDepCorrection::WriteTextInfo - Cannot open the APD output file %s\n", txtFileName.Data());
d81e6423 174 return;
175 }
176
177 Int_t iCol = 0;
178 Int_t iRow = 0;
179 Int_t nCorr = 0;
180
181 Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
182
61917ab3 183 // write header info
184 outputFile << fStartTime << " " << fNTimeBins << " " << fTimeBinSize << endl;
185
d81e6423 186 for (Int_t i = 0; i < fNSuperModule; i++) {
2f17a269 187 AliEMCALSuperModuleCalibTimeDepCorrection * t = (AliEMCALSuperModuleCalibTimeDepCorrection*) fSuperModuleData[i];
188 outputFile << t->GetSuperModuleNum() << endl;
d81e6423 189
190 for (Int_t j=0; j<nAPDPerSM; j++) {
191 iCol = j / AliEMCALGeoParams::fgkEMCALRows;
192 iRow = j % AliEMCALGeoParams::fgkEMCALRows;
193
2f17a269 194 nCorr = t->GetCorrection(iCol,iRow)->GetSize();
d81e6423 195
196 if (swapSides) {
197 // C side, oriented differently than A side: swap is requested
198 iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
199 iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
200 }
201
202 outputFile << iCol << " " << iRow << " " << nCorr << endl;
203 for (Int_t k=0; k<nCorr; k++) {
2f17a269 204 outputFile << t->GetCorrection(iCol,iRow)->At(k) << " ";
d81e6423 205 }
206 outputFile << endl;
207
208 }
209
210 } // i, SuperModule
211
212 outputFile.close();
213
214 return;
215}
216
217//____________________________________________________________________________
61917ab3 218void AliEMCALCalibTimeDepCorrection::ReadRootInfo(const TString &rootFileName,
219 Bool_t swapSides)
220{
221 //Read data from root file. ; coordinates given on SuperModule basis
222 TFile inputFile(rootFileName, "read");
223
224 TTree *treeGlob = (TTree*) inputFile.Get("treeGlob");
225 TTree *treeCorr = (TTree*) inputFile.Get("treeCorr");
226
227 ReadTreeInfo(treeGlob, treeCorr, swapSides);
228
229 inputFile.Close();
230
231 return;
232}
233
234//____________________________________________________________________________
235void AliEMCALCalibTimeDepCorrection::ReadTreeInfo(TTree *treeGlob, TTree *treeCorr,
236 Bool_t swapSides)
237{
238 // how many SuperModule's worth of entries / APDs do we have?
239 Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
240 fNSuperModule = treeCorr->GetEntries() / nAPDPerSM;
241
242 // global variables : only one entry
243 treeGlob->SetBranchAddress("fStartTime", &fStartTime);
244 treeGlob->SetBranchAddress("fNTimeBins", &fNTimeBins);
245 treeGlob->SetBranchAddress("fTimeBinSize", &fTimeBinSize);
246 treeGlob->GetEntry(0);
247
61917ab3 248 Int_t iSM = 0; // SuperModule index
249 Int_t iCol = 0;
250 Int_t iRow = 0;
251 // list of values to be read
252 Int_t nCorr = 0;
253 Float_t correction[fgkMaxTimeBins] = {0};
254 // make sure it's really initialized correctly
255 memset(correction, 0, sizeof(correction)); // better safe than sorry
256 // end - all values
257
258 // declare the branches
259 treeCorr->SetBranchAddress("iSM", &iSM);
260 treeCorr->SetBranchAddress("iCol", &iCol);
261 treeCorr->SetBranchAddress("iRow", &iRow);
262 treeCorr->SetBranchAddress("nCorr", &nCorr);
263 treeCorr->SetBranchAddress("correction", correction);
264
265 for (int ient=0; ient<treeCorr->GetEntries(); ient++) {
266 treeCorr->GetEntry(ient);
267
268 // assume the index SuperModules come in order: i=iSM
2f17a269 269 AliEMCALSuperModuleCalibTimeDepCorrection * t = (AliEMCALSuperModuleCalibTimeDepCorrection*) fSuperModuleData[iSM];
270 t->SetSuperModuleNum(iSM);
61917ab3 271
272 // assume that this info is already swapped and done for this basis?
273 if (swapSides) {
274 // C side, oriented differently than A side: swap is requested
275 iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
276 iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
277 }
278
279
280 // set size of TArray
2f17a269 281 t->GetCorrection(iCol,iRow)->Set(nCorr);
61917ab3 282 for (Int_t k=0; k<nCorr; k++) {
283 // add to TArray
2f17a269 284 t->GetCorrection(iCol,iRow)->AddAt(correction[k], k);
61917ab3 285 }
286
287 } // entry
288
289 return;
290}
291
292//____________________________________________________________________________
293void AliEMCALCalibTimeDepCorrection::WriteRootInfo(const TString &rootFileName,
294 Bool_t swapSides)
295{
296 // write data to root file. ; coordinates given on SuperModule basis
297 TFile destFile(rootFileName, "recreate");
298 if (destFile.IsZombie()) {
299 return;
300 }
301 destFile.cd();
302
303 TTree *treeGlob = new TTree("treeGlob","");
304 TTree *treeCorr = new TTree("treeCorr","");
305
306 // global part only has one entry
2c62d6a3 307 treeGlob->Branch("fStartTime", &fStartTime, "fStartTime/i"); // unsigned int..
61917ab3 308 treeGlob->Branch("fNTimeBins", &fNTimeBins, "fNTimeBins/I");
309 treeGlob->Branch("fTimeBinSize", &fTimeBinSize, "fTimeBinSize/I");
310 treeGlob->Fill();
311
312 // variables for filling the TTree
313 Int_t iSM = 0; // SuperModule index
314 Int_t iCol = 0;
315 Int_t iRow = 0;
316 Int_t nCorr = 0;
317 Float_t correction[fgkMaxTimeBins] = {0};
318 // make sure it's really initialized correctly
319 memset(correction, 0, sizeof(correction)); // better safe than sorry
320
321 // declare the branches
322 treeCorr->Branch("iSM", &iSM, "iSM/I");
323 treeCorr->Branch("iCol", &iCol, "iCol/I");
324 treeCorr->Branch("iRow", &iRow, "iRow/I");
325 treeCorr->Branch("nCorr", &nCorr, "nCorr/I");
326 treeCorr->Branch("correction", &correction, "correction[nCorr]/F");
327
328 Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
329
330 for (iSM = 0; iSM < fNSuperModule; iSM++) {
2f17a269 331 AliEMCALSuperModuleCalibTimeDepCorrection * t = (AliEMCALSuperModuleCalibTimeDepCorrection*) fSuperModuleData[iSM];
61917ab3 332
333 for (Int_t j=0; j<nAPDPerSM; j++) {
334 iCol = j / AliEMCALGeoParams::fgkEMCALRows;
335 iRow = j % AliEMCALGeoParams::fgkEMCALRows;
336
2f17a269 337 nCorr = t->GetCorrection(iCol,iRow)->GetSize();
61917ab3 338 if (nCorr > fgkMaxTimeBins) {
339 printf("AliEMCALCalibTimeDepCorrection::WriteRootInfo - too many correction/timebins %d kept\n", nCorr);
340 return;
341 }
342
343 if (swapSides) {
344 // C side, oriented differently than A side: swap is requested
345 iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
346 iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
347 }
348
349 for (Int_t k=0; k<nCorr; k++) {
2f17a269 350 correction[k] = t->GetCorrection(iCol,iRow)->At(k);
61917ab3 351 }
352
353 treeCorr->Fill();
354 }
355
356 } // i, SuperModule
357
358 treeGlob->Write();
359 treeCorr->Write();
360 destFile.Close();
361
362 return;
363}
364
365//____________________________________________________________________________
d81e6423 366AliEMCALCalibTimeDepCorrection::~AliEMCALCalibTimeDepCorrection()
367{
2f17a269 368 fSuperModuleData.Delete();
d81e6423 369}
370
371//____________________________________________________________________________
2f17a269 372AliEMCALSuperModuleCalibTimeDepCorrection * AliEMCALCalibTimeDepCorrection::GetSuperModuleCalibTimeDepCorrectionNum(Int_t supModIndex)const
d81e6423 373{
d81e6423 374 for (int i=0; i<fNSuperModule; i++) {
2f17a269 375 AliEMCALSuperModuleCalibTimeDepCorrection * t = (AliEMCALSuperModuleCalibTimeDepCorrection*) fSuperModuleData[i];
376 if (t->GetSuperModuleNum() == supModIndex) {
377 return t;
d81e6423 378 }
379 }
380
2f17a269 381 // if we arrived here, then nothing was found.. just return a NULL pointer
382 return NULL;
d81e6423 383}
384