]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EMCAL/AliEMCALCalibAbs.cxx
fix for TRU2x2Id; need to check which TRU the data came from
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALCalibAbs.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 // Objects of this class contain basis for absolute calibrations
19 //
20
21 #include <fstream>
22 #include <TString.h>
23 #include <TFile.h>
24 #include <TTree.h>
25
26 #include "AliEMCALCalibAbs.h"
27
28 using namespace std;
29
30 ClassImp(AliEMCALCalibAbs)
31
32 //____________________________________________________________________________
33 AliEMCALCalibAbs::AliEMCALCalibAbs(const int nSM) : 
34   fNSuperModule(nSM),
35   fSuperModuleData()
36 {
37   //Default constructor.
38   for (int i=0; i<fNSuperModule; i++) {
39     fSuperModuleData.Add(new AliEMCALSuperModuleCalibAbs(i));
40   }
41   fSuperModuleData.Compress(); // compress the TObjArray
42 }
43
44 //____________________________________________________________________________
45 void AliEMCALCalibAbs::ReadTextCalibAbsInfo(Int_t nSM, const TString &txtFileName,
46                                             Bool_t swapSides)
47 {
48   //Read data from txt file. ; coordinates given on SuperModule basis
49
50   std::ifstream inputFile(txtFileName.Data());
51   if (!inputFile) {
52     printf("AliEMCALCalibAbs::ReadCalibAbsInfo - Cannot open the APD info file %s\n", txtFileName.Data());
53     return;
54   }
55
56   fNSuperModule = nSM;
57
58   Int_t iSM = 0; // SuperModule index
59   Int_t iCol = 0;
60   Int_t iRow = 0;
61   Int_t id = 0;
62
63   // list of values to be read
64   // first: overall values for the whole SuperModule
65   Int_t CalibMethod; 
66   Int_t CalibPass; 
67   Int_t CalibTime; 
68   Float_t AbsoluteGain; 
69   // second: additional info for LED Reference and SM temperature
70   Float_t LEDRefAmp;
71   Float_t LEDRefAmpRMS;
72   Float_t LEDRefHighLowRatio;
73   Int_t LEDRefHighLow;
74   Float_t Temperature;
75   Float_t TemperatureRMS;
76   // third: info for each tower
77   Float_t RelativeGain; // (ADC>GeV relative gain/conversion), value around 1
78   Float_t HighLowRatio; // value around 16 or so
79   Int_t HighLow; // 
80   Float_t LEDAmp; // low gain eq. amplitude
81   Float_t LEDAmpRMS; //
82   // end - all values
83
84   Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
85
86   for (Int_t i = 0; i < fNSuperModule; i++) {
87     AliEMCALSuperModuleCalibAbs * t = (AliEMCALSuperModuleCalibAbs*) fSuperModuleData[i];
88     if (!inputFile) {
89       printf("AliEMCALCalibAbs::ReadCalibAbsInfo - Error while reading input file; likely EOF..");
90       return;
91     }
92     inputFile >> iSM;
93     t->SetSuperModuleNum(iSM);
94
95     // first: overall values for the whole SuperModule
96     inputFile >> CalibMethod >> CalibPass >> CalibTime >> AbsoluteGain;
97     t->SetCalibMethod(CalibMethod);
98     t->SetCalibPass(CalibPass);
99     t->SetCalibTime(CalibTime);
100     t->SetAbsoluteGain(AbsoluteGain);
101
102     // second: additional info for LED Reference and SM temperature
103     for (Int_t j=0; j<AliEMCALGeoParams::fgkEMCALLEDRefs; j++) {
104       inputFile >> id >> LEDRefAmp >> LEDRefAmpRMS >> LEDRefHighLowRatio >> LEDRefHighLow;
105       t->SetLEDRefAmp(id, LEDRefAmp);
106       t->SetLEDRefAmpRMS(id, LEDRefAmpRMS);
107       t->SetLEDRefHighLowRatio(id, LEDRefHighLowRatio);
108       t->SetLEDRefHighLow(id, LEDRefHighLow);
109     }
110     for (Int_t j=0; j<AliEMCALGeoParams::fgkEMCALTempSensors; j++) {
111       inputFile >> id >> Temperature >> TemperatureRMS;
112       t->SetTemperature(id, Temperature);
113       t->SetTemperatureRMS(id, TemperatureRMS);
114     }
115
116     // third: info for each tower
117     for (Int_t j=0; j<nAPDPerSM; j++) {
118       inputFile >> iCol >> iRow 
119                 >> RelativeGain >> HighLowRatio >> HighLow >> LEDAmp >> LEDAmpRMS;
120
121       // assume that this info is already swapped and done for this basis?
122       if (swapSides) {
123         // C side, oriented differently than A side: swap is requested
124         iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
125         iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
126       }
127
128       AliEMCALCalibAbsVal * v = t->GetAPDVal(iCol, iRow);
129
130       v->SetRelativeGain(RelativeGain);
131       v->SetHighLowRatio(HighLowRatio);
132       v->SetHighLow(HighLow);
133       v->SetLEDAmp(LEDAmp);
134       v->SetLEDAmpRMS(LEDAmpRMS);
135     }
136
137   } // i, SuperModule
138
139   inputFile.close();
140
141   return;
142 }
143
144 //____________________________________________________________________________
145 void AliEMCALCalibAbs::WriteTextCalibAbsInfo(const TString &txtFileName,
146                                              Bool_t swapSides)
147 {
148   // write data to txt file. ; coordinates given on SuperModule basis
149
150   std::ofstream outputFile(txtFileName.Data());
151   if (!outputFile) {
152     printf("AliEMCALCalibAbs::WriteCalibAbsInfo - Cannot open the APD output file %s\n", txtFileName.Data());
153     return;
154   }
155
156   Int_t iCol = 0;
157   Int_t iRow = 0;
158
159   Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
160
161   for (Int_t i = 0; i < fNSuperModule; i++) {
162     AliEMCALSuperModuleCalibAbs * t = (AliEMCALSuperModuleCalibAbs*) fSuperModuleData[i];
163
164     // first: overall values for the whole SuperModule
165     outputFile << t->GetSuperModuleNum() << endl;
166     outputFile << t->GetCalibMethod() << " " 
167                << t->GetCalibPass() << " " 
168                << t->GetCalibTime() << " " 
169                << t->GetAbsoluteGain() << endl;
170
171     // second: additional info for LED Reference and SM temperature
172     for (Int_t j=0; j<AliEMCALGeoParams::fgkEMCALLEDRefs; j++) {
173       outputFile << j << " " << t->GetLEDRefAmp(j) << " " << t->GetLEDRefAmpRMS(j) 
174                  << " " << t->GetLEDRefHighLowRatio(j) << " " << t->GetLEDRefHighLow(j) 
175                  << endl;
176     }
177     for (Int_t j=0; j<AliEMCALGeoParams::fgkEMCALTempSensors; j++) {
178       outputFile << j << " " << t->GetTemperature(j) << " " << t->GetTemperatureRMS(j) << endl;
179     }
180
181     // third: info for each tower
182     for (Int_t j=0; j<nAPDPerSM; j++) {
183       iCol = j / AliEMCALGeoParams::fgkEMCALRows;
184       iRow = j % AliEMCALGeoParams::fgkEMCALRows;
185
186       AliEMCALCalibAbsVal * v = t->GetAPDVal(iCol, iRow);
187
188       if (swapSides) {
189         // C side, oriented differently than A side: swap is requested
190         iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
191         iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
192       }
193
194       outputFile << iCol << " " << iRow 
195                  << " " << v->GetRelativeGain()
196                  << " " << v->GetHighLowRatio() 
197                  << " " << v->GetHighLow() 
198                  << " " << v->GetLEDAmp() 
199                  << " " << v->GetLEDAmpRMS() << endl;
200     }
201
202   } // i, SuperModule
203
204   outputFile.close();
205
206   return;
207 }
208
209 //____________________________________________________________________________
210 void AliEMCALCalibAbs::ReadRootCalibAbsInfo(const TString &rootFileName,
211                                             Bool_t swapSides)
212 {
213   //Read data from root file. ; coordinates given on SuperModule basis
214   TFile inputFile(rootFileName, "read");  
215
216   TTree *tree = (TTree*) inputFile.Get("tree");
217
218   ReadTreeCalibAbsInfo(tree, swapSides);
219
220   inputFile.Close();
221
222   return;
223 }
224
225 //____________________________________________________________________________
226 void AliEMCALCalibAbs::ReadTreeCalibAbsInfo(TTree *tree,
227                                             Bool_t swapSides)
228 {
229   // how many SuperModule's worth of entries / APDs do we have?
230   Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
231   fNSuperModule = tree->GetEntries() / nAPDPerSM;
232
233   Int_t iSM = 0; // SuperModule index
234   // list of values to be read
235   // first: overall values for the whole SuperModule
236   Int_t CalibMethod; 
237   Int_t CalibPass= {0}; 
238   Int_t CalibTime= {0}; 
239   Float_t AbsoluteGain= {0}; 
240   // second: additional info for LED Reference and SM temperature
241   Float_t LEDRefAmp[AliEMCALGeoParams::fgkEMCALLEDRefs]= {0};
242   Float_t LEDRefAmpRMS[AliEMCALGeoParams::fgkEMCALLEDRefs]= {0};
243   Float_t LEDRefHighLowRatio[AliEMCALGeoParams::fgkEMCALLEDRefs]= {0};
244   Int_t LEDRefHighLow[AliEMCALGeoParams::fgkEMCALLEDRefs]= {0};
245   Float_t Temperature[AliEMCALGeoParams::fgkEMCALTempSensors]= {0};
246   Float_t TemperatureRMS[AliEMCALGeoParams::fgkEMCALTempSensors]= {0};
247   // third: info for each tower
248   Float_t RelativeGain[AliEMCALGeoParams::fgkEMCALCols][AliEMCALGeoParams::fgkEMCALRows]= {0}; 
249   Float_t HighLowRatio[AliEMCALGeoParams::fgkEMCALCols][AliEMCALGeoParams::fgkEMCALRows]= {0}; 
250   Int_t HighLow[AliEMCALGeoParams::fgkEMCALCols][AliEMCALGeoParams::fgkEMCALRows]= {0}; 
251   Float_t LEDAmp[AliEMCALGeoParams::fgkEMCALCols][AliEMCALGeoParams::fgkEMCALRows]= {0}; 
252   Float_t LEDAmpRMS[AliEMCALGeoParams::fgkEMCALCols][AliEMCALGeoParams::fgkEMCALRows]= {0}; 
253   // end - all values
254
255   // just to make the initializations of the arrays are done correctly, let's use memset
256   memset(LEDRefAmp, 0, sizeof(LEDRefAmp)); 
257   memset(LEDRefAmpRMS, 0, sizeof(LEDRefAmpRMS)); 
258   memset(LEDRefHighLowRatio, 0, sizeof(LEDRefHighLowRatio)); 
259   memset(LEDRefHighLow, 0, sizeof(LEDRefHighLow)); 
260   memset(Temperature, 0, sizeof(Temperature)); 
261   memset(TemperatureRMS, 0, sizeof(TemperatureRMS)); 
262   memset(RelativeGain, 0, sizeof(RelativeGain)); 
263   memset(HighLowRatio, 0, sizeof(HighLowRatio)); 
264   memset(HighLow, 0, sizeof(HighLow)); 
265   memset(LEDAmp, 0, sizeof(LEDAmp)); 
266   memset(LEDAmpRMS, 0, sizeof(LEDAmpRMS)); 
267
268   // declare the branches
269   tree->SetBranchAddress("iSM", &iSM);
270   tree->SetBranchAddress("CalibMethod", &CalibMethod);
271   tree->SetBranchAddress("CalibPass", &CalibPass);
272   tree->SetBranchAddress("CalibTime", &CalibTime);
273   tree->SetBranchAddress("AbsoluteGain", &AbsoluteGain);
274   //
275   tree->SetBranchAddress("LEDRefAmp", LEDRefAmp);
276   tree->SetBranchAddress("LEDRefAmpRMS", LEDRefAmpRMS);
277   tree->SetBranchAddress("LEDRefHighLowRatio", LEDRefHighLowRatio);
278   tree->SetBranchAddress("LEDRefHighLow", LEDRefHighLow);
279   tree->SetBranchAddress("Temperature", Temperature);
280   tree->SetBranchAddress("TemperatureRMS", TemperatureRMS);
281   //
282   tree->SetBranchAddress("RelativeGain", RelativeGain);
283   tree->SetBranchAddress("HighLowRatio", HighLowRatio);
284   tree->SetBranchAddress("HighLow", HighLow);
285   tree->SetBranchAddress("LEDAmp", LEDAmp);
286   tree->SetBranchAddress("LEDAmpRMS", LEDAmpRMS);
287
288   // indices for looping over the towers
289   Int_t iCol = 0;
290   Int_t iRow = 0;
291
292   for (int ient=0; ient<tree->GetEntries(); ient++) {
293     tree->GetEntry(ient);
294
295     // assume the index SuperModules come in order: i=iSM
296     AliEMCALSuperModuleCalibAbs * t = (AliEMCALSuperModuleCalibAbs*) fSuperModuleData[iSM];
297
298     t->SetSuperModuleNum(iSM);
299     // first, overall values
300     t->SetCalibMethod(CalibMethod);
301     t->SetCalibPass(CalibPass);
302     t->SetCalibTime(CalibTime);
303     t->SetAbsoluteGain(AbsoluteGain);
304
305     // second: additional info for LED references and SM temperatures
306     for (Int_t j=0; j<AliEMCALGeoParams::fgkEMCALLEDRefs; j++) {
307       t->SetLEDRefAmp(j, LEDRefAmp[j]);
308       t->SetLEDRefAmpRMS(j, LEDRefAmpRMS[j]);
309       t->SetLEDRefHighLowRatio(j, LEDRefHighLowRatio[j]);
310       t->SetLEDRefHighLow(j, LEDRefHighLow[j]);
311     }
312     for (Int_t j=0; j<AliEMCALGeoParams::fgkEMCALTempSensors; j++) {
313       t->SetTemperature(j, Temperature[j]);
314       t->SetTemperatureRMS(j, TemperatureRMS[j]);
315     }
316
317     // third: info for each tower
318     for (Int_t j=0; j<nAPDPerSM; j++) {
319       iCol = j / AliEMCALGeoParams::fgkEMCALRows;
320       iRow = j % AliEMCALGeoParams::fgkEMCALRows;
321
322       // help variables: possibly modified or swapped indices
323       int iColMod = iCol;
324       int iRowMod = iRow;
325       // assume that this info is already swapped and done for this basis?
326       if (swapSides) {
327         // C side, oriented differently than A side: swap is requested
328         iColMod = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
329         iRowMod = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
330       }
331
332       AliEMCALCalibAbsVal * v = t->GetAPDVal(iCol, iRow);
333
334       v->SetRelativeGain(RelativeGain[iCol][iRow]);
335       v->SetHighLowRatio(HighLowRatio[iCol][iRow]);
336       v->SetHighLow(HighLow[iCol][iRow]);
337       v->SetLEDAmp(LEDAmp[iCol][iRow]);
338       v->SetLEDAmpRMS(LEDAmpRMS[iCol][iRow]);
339     }
340
341   } // loop over entries
342
343   return;
344 }
345
346 //____________________________________________________________________________
347 void AliEMCALCalibAbs::WriteRootCalibAbsInfo(const TString &rootFileName,
348                                              Bool_t swapSides)
349 {
350   // write data to root file. ; coordinates given on SuperModule basis
351   TFile destFile(rootFileName, "recreate");  
352   if (destFile.IsZombie()) {
353     return;
354   }  
355   destFile.cd();
356
357   TTree *tree = new TTree("tree","");
358
359   // variables for filling the TTree
360   Int_t iSM = 0; // SuperModule index
361   // list of values to be written
362   // first: overall values for the whole SuperModule
363   Int_t CalibMethod = 0; 
364   Int_t CalibPass = 0; 
365   Int_t CalibTime = 0; 
366   Float_t AbsoluteGain = 0; 
367   // second: additional info for LED Reference and SM temperature
368   Float_t LEDRefAmp[AliEMCALGeoParams::fgkEMCALLEDRefs] = {0};
369   Float_t LEDRefAmpRMS[AliEMCALGeoParams::fgkEMCALLEDRefs]= {0};
370   Float_t LEDRefHighLowRatio[AliEMCALGeoParams::fgkEMCALLEDRefs]= {0};
371   Int_t LEDRefHighLow[AliEMCALGeoParams::fgkEMCALLEDRefs]= {0};
372   Float_t Temperature[AliEMCALGeoParams::fgkEMCALTempSensors]= {0};
373   Float_t TemperatureRMS[AliEMCALGeoParams::fgkEMCALTempSensors]= {0};
374   // third: info for each tower
375   Float_t RelativeGain[AliEMCALGeoParams::fgkEMCALCols][AliEMCALGeoParams::fgkEMCALRows]= {0}; 
376   Float_t HighLowRatio[AliEMCALGeoParams::fgkEMCALCols][AliEMCALGeoParams::fgkEMCALRows]= {0}; 
377   Int_t HighLow[AliEMCALGeoParams::fgkEMCALCols][AliEMCALGeoParams::fgkEMCALRows]= {0}; 
378   Float_t LEDAmp[AliEMCALGeoParams::fgkEMCALCols][AliEMCALGeoParams::fgkEMCALRows]= {0}; 
379   Float_t LEDAmpRMS[AliEMCALGeoParams::fgkEMCALCols][AliEMCALGeoParams::fgkEMCALRows]= {0}; 
380   // end - all values
381
382   // just to make the initializations of the arrays are done correctly, let's use memset
383   memset(LEDRefAmp, 0, sizeof(LEDRefAmp)); 
384   memset(LEDRefAmpRMS, 0, sizeof(LEDRefAmpRMS)); 
385   memset(LEDRefHighLowRatio, 0, sizeof(LEDRefHighLowRatio)); 
386   memset(LEDRefHighLow, 0, sizeof(LEDRefHighLow)); 
387   memset(Temperature, 0, sizeof(Temperature)); 
388   memset(TemperatureRMS, 0, sizeof(TemperatureRMS)); 
389   memset(RelativeGain, 0, sizeof(RelativeGain)); 
390   memset(HighLowRatio, 0, sizeof(HighLowRatio)); 
391   memset(HighLow, 0, sizeof(HighLow)); 
392   memset(LEDAmp, 0, sizeof(LEDAmp)); 
393   memset(LEDAmpRMS, 0, sizeof(LEDAmpRMS)); 
394
395   Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
396   // for looping over towers
397   Int_t iCol = 0;
398   Int_t iRow = 0;
399
400   // declare the branches
401   // first
402   tree->Branch("iSM", &iSM, "iSM/I");
403   tree->Branch("CalibMethod", &CalibMethod, "CalibMethod/I");
404   tree->Branch("CalibPass", &CalibPass, "CalibPass/I");
405   tree->Branch("CalibTime", &CalibTime, "CalibTime/I");
406   tree->Branch("AbsoluteGain", &AbsoluteGain, "AbsoluteGain/F");
407   // second  
408   tree->Branch( "LEDRefAmp", &LEDRefAmp, Form("LEDRefAmp[%d]/F", AliEMCALGeoParams::fgkEMCALLEDRefs) );
409   tree->Branch( "LEDRefAmpRMS", &LEDRefAmpRMS, Form("LEDRefAmpRMS[%d]/F", AliEMCALGeoParams::fgkEMCALLEDRefs) );
410   tree->Branch( "LEDRefHighLowRatio", &LEDRefHighLowRatio, Form("LEDRefHighLowRatio[%d]/F", AliEMCALGeoParams::fgkEMCALLEDRefs) );
411   tree->Branch( "LEDRefHighLow", &LEDRefHighLow, Form("LEDRefHighLow[%d]/I", AliEMCALGeoParams::fgkEMCALLEDRefs) );
412   tree->Branch( "Temperature", &Temperature, Form("Temperature[%d]/F", AliEMCALGeoParams::fgkEMCALTempSensors) );
413   tree->Branch( "TemperatureRMS", &TemperatureRMS, Form("TemperatureRMS[%d]/F", AliEMCALGeoParams::fgkEMCALTempSensors) );
414   // third: info for each tower; see if a 2D array works OK or if we'll have to use 1D arrays instead 
415   tree->Branch( "RelativeGain", &RelativeGain, Form("RelativeGain[%d][%d]/F", AliEMCALGeoParams::fgkEMCALCols, AliEMCALGeoParams::fgkEMCALRows) );
416   tree->Branch( "HighLowRatio", &HighLowRatio, Form("HighLowRatio[%d][%d]/F", AliEMCALGeoParams::fgkEMCALCols, AliEMCALGeoParams::fgkEMCALRows) );
417   tree->Branch( "HighLow", &HighLow, Form("HighLow[%d][%d]/I", AliEMCALGeoParams::fgkEMCALCols, AliEMCALGeoParams::fgkEMCALRows) );
418   tree->Branch( "LEDAmp", &LEDAmp, Form("LEDAmp[%d][%d]/F", AliEMCALGeoParams::fgkEMCALCols, AliEMCALGeoParams::fgkEMCALRows) );
419   tree->Branch( "LEDAmpRMS", &LEDAmpRMS, Form("LEDAmpRMS[%d][%d]/F", AliEMCALGeoParams::fgkEMCALCols, AliEMCALGeoParams::fgkEMCALRows) );
420
421   for (iSM = 0; iSM < fNSuperModule; iSM++) {
422     AliEMCALSuperModuleCalibAbs * t = (AliEMCALSuperModuleCalibAbs*) fSuperModuleData[iSM];
423
424     iSM = t->GetSuperModuleNum();
425     // first, overall values
426     CalibMethod = t->GetCalibMethod();
427     CalibPass = t->GetCalibPass();
428     CalibTime = t->GetCalibTime();
429     AbsoluteGain = t->GetAbsoluteGain();
430
431     // second: additional info for LED references and SM temperatures
432     for (Int_t j=0; j<AliEMCALGeoParams::fgkEMCALLEDRefs; j++) {
433       LEDRefAmp[j] = t->GetLEDRefAmp(j);
434       LEDRefAmpRMS[j] = t->GetLEDRefAmpRMS(j);
435       LEDRefHighLowRatio[j] = t->GetLEDRefHighLowRatio(j);
436       LEDRefHighLow[j] = t->GetLEDRefHighLow(j);
437     }
438     for (Int_t j=0; j<AliEMCALGeoParams::fgkEMCALTempSensors; j++) {
439       Temperature[j] = t->GetTemperature(j);
440       TemperatureRMS[j] = t->GetTemperatureRMS(j);
441     }
442
443     // third: info for each tower
444     for (Int_t j=0; j<nAPDPerSM; j++) {
445       iCol = j / AliEMCALGeoParams::fgkEMCALRows;
446       iRow = j % AliEMCALGeoParams::fgkEMCALRows;
447
448       // help variables: possibly modified or swapped indices
449       int iColMod = iCol;
450       int iRowMod = iRow;
451       // assume that this info is already swapped and done for this basis?
452       if (swapSides) {
453         // C side, oriented differently than A side: swap is requested
454         iColMod = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
455         iRowMod = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
456       }
457
458       AliEMCALCalibAbsVal * v = t->GetAPDVal(iCol, iRow);
459
460       RelativeGain[iCol][iRow] = v->GetRelativeGain();
461       HighLowRatio[iCol][iRow] = v->GetHighLowRatio();
462       HighLow[iCol][iRow] = v->GetHighLow();
463       LEDAmp[iCol][iRow] = v->GetLEDAmp();
464       LEDAmpRMS[iCol][iRow] = v->GetLEDAmpRMS();
465     }
466
467     tree->Fill();
468   } // i, SuperModule
469
470   tree->Write();
471   destFile.Close();
472
473   return;
474 }
475
476 //____________________________________________________________________________
477 AliEMCALCalibAbs::~AliEMCALCalibAbs()
478 {
479   fSuperModuleData.Delete();
480 }
481
482 //____________________________________________________________________________
483 AliEMCALSuperModuleCalibAbs * AliEMCALCalibAbs::GetSuperModuleCalibAbsNum(Int_t supModIndex)const
484 {
485   for (int i=0; i<fNSuperModule; i++) {
486     AliEMCALSuperModuleCalibAbs * t = (AliEMCALSuperModuleCalibAbs*) fSuperModuleData[i];
487     if (t->GetSuperModuleNum() == supModIndex) {
488       return t;
489     }
490   }
491
492   // if we arrived here, then nothing was found.. just return a NULL pointer 
493   return NULL;
494 }
495