1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 // Objects of this class contain basis for absolute calibrations
26 #include "AliEMCALCalibAbs.h"
30 ClassImp(AliEMCALCalibAbs)
32 //____________________________________________________________________________
33 AliEMCALCalibAbs::AliEMCALCalibAbs(const int nSM) :
37 //Default constructor.
38 for (int i=0; i<fNSuperModule; i++) {
39 fSuperModuleData.Add(new AliEMCALSuperModuleCalibAbs(i));
41 fSuperModuleData.Compress(); // compress the TObjArray
44 //____________________________________________________________________________
45 void AliEMCALCalibAbs::ReadTextCalibAbsInfo(Int_t nSM, const TString &txtFileName,
48 //Read data from txt file. ; coordinates given on SuperModule basis
50 std::ifstream inputFile(txtFileName.Data());
52 printf("AliEMCALCalibAbs::ReadCalibAbsInfo - Cannot open the APD info file %s\n", txtFileName.Data());
58 Int_t iSM = 0; // SuperModule index
63 // list of values to be read
64 // first: overall values for the whole SuperModule
69 // second: additional info for LED Reference and SM temperature
72 Float_t LEDRefHighLowRatio;
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
80 Float_t LEDAmp; // low gain eq. amplitude
84 Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
86 for (Int_t i = 0; i < fNSuperModule; i++) {
87 AliEMCALSuperModuleCalibAbs * t = (AliEMCALSuperModuleCalibAbs*) fSuperModuleData[i];
89 printf("AliEMCALCalibAbs::ReadCalibAbsInfo - Error while reading input file; likely EOF..");
93 t->SetSuperModuleNum(iSM);
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);
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);
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);
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;
121 // assume that this info is already swapped and done for this basis?
123 // C side, oriented differently than A side: swap is requested
124 iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
125 iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
128 AliEMCALCalibAbsVal * v = t->GetAPDVal(iCol, iRow);
130 v->SetRelativeGain(RelativeGain);
131 v->SetHighLowRatio(HighLowRatio);
132 v->SetHighLow(HighLow);
133 v->SetLEDAmp(LEDAmp);
134 v->SetLEDAmpRMS(LEDAmpRMS);
144 //____________________________________________________________________________
145 void AliEMCALCalibAbs::WriteTextCalibAbsInfo(const TString &txtFileName,
148 // write data to txt file. ; coordinates given on SuperModule basis
150 std::ofstream outputFile(txtFileName.Data());
152 printf("AliEMCALCalibAbs::WriteCalibAbsInfo - Cannot open the APD output file %s\n", txtFileName.Data());
159 Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
161 for (Int_t i = 0; i < fNSuperModule; i++) {
162 AliEMCALSuperModuleCalibAbs * t = (AliEMCALSuperModuleCalibAbs*) fSuperModuleData[i];
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;
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)
177 for (Int_t j=0; j<AliEMCALGeoParams::fgkEMCALTempSensors; j++) {
178 outputFile << j << " " << t->GetTemperature(j) << " " << t->GetTemperatureRMS(j) << endl;
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;
186 AliEMCALCalibAbsVal * v = t->GetAPDVal(iCol, iRow);
189 // C side, oriented differently than A side: swap is requested
190 iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
191 iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
194 outputFile << iCol << " " << iRow
195 << " " << v->GetRelativeGain()
196 << " " << v->GetHighLowRatio()
197 << " " << v->GetHighLow()
198 << " " << v->GetLEDAmp()
199 << " " << v->GetLEDAmpRMS() << endl;
209 //____________________________________________________________________________
210 void AliEMCALCalibAbs::ReadRootCalibAbsInfo(const TString &rootFileName,
213 //Read data from root file. ; coordinates given on SuperModule basis
214 TFile inputFile(rootFileName, "read");
216 TTree *tree = (TTree*) inputFile.Get("tree");
218 ReadTreeCalibAbsInfo(tree, swapSides);
225 //____________________________________________________________________________
226 void AliEMCALCalibAbs::ReadTreeCalibAbsInfo(TTree *tree,
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;
233 Int_t iSM = 0; // SuperModule index
234 // list of values to be read
235 // first: overall values for the whole SuperModule
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};
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));
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);
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);
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);
288 // indices for looping over the towers
292 for (int ient=0; ient<tree->GetEntries(); ient++) {
293 tree->GetEntry(ient);
295 // assume the index SuperModules come in order: i=iSM
296 AliEMCALSuperModuleCalibAbs * t = (AliEMCALSuperModuleCalibAbs*) fSuperModuleData[iSM];
298 t->SetSuperModuleNum(iSM);
299 // first, overall values
300 t->SetCalibMethod(CalibMethod);
301 t->SetCalibPass(CalibPass);
302 t->SetCalibTime(CalibTime);
303 t->SetAbsoluteGain(AbsoluteGain);
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]);
312 for (Int_t j=0; j<AliEMCALGeoParams::fgkEMCALTempSensors; j++) {
313 t->SetTemperature(j, Temperature[j]);
314 t->SetTemperatureRMS(j, TemperatureRMS[j]);
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;
322 // help variables: possibly modified or swapped indices
325 // assume that this info is already swapped and done for this basis?
327 // C side, oriented differently than A side: swap is requested
328 iColMod = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
329 iRowMod = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
332 AliEMCALCalibAbsVal * v = t->GetAPDVal(iCol, iRow);
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]);
341 } // loop over entries
346 //____________________________________________________________________________
347 void AliEMCALCalibAbs::WriteRootCalibAbsInfo(const TString &rootFileName,
350 // write data to root file. ; coordinates given on SuperModule basis
351 TFile destFile(rootFileName, "recreate");
352 if (destFile.IsZombie()) {
357 TTree *tree = new TTree("tree","");
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;
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};
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));
395 Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
396 // for looping over towers
400 // declare the branches
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");
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) );
421 for (iSM = 0; iSM < fNSuperModule; iSM++) {
422 AliEMCALSuperModuleCalibAbs * t = (AliEMCALSuperModuleCalibAbs*) fSuperModuleData[iSM];
424 iSM = t->GetSuperModuleNum();
425 // first, overall values
426 CalibMethod = t->GetCalibMethod();
427 CalibPass = t->GetCalibPass();
428 CalibTime = t->GetCalibTime();
429 AbsoluteGain = t->GetAbsoluteGain();
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);
438 for (Int_t j=0; j<AliEMCALGeoParams::fgkEMCALTempSensors; j++) {
439 Temperature[j] = t->GetTemperature(j);
440 TemperatureRMS[j] = t->GetTemperatureRMS(j);
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;
448 // help variables: possibly modified or swapped indices
451 // assume that this info is already swapped and done for this basis?
453 // C side, oriented differently than A side: swap is requested
454 iColMod = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
455 iRowMod = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
458 AliEMCALCalibAbsVal * v = t->GetAPDVal(iCol, iRow);
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();
476 //____________________________________________________________________________
477 AliEMCALCalibAbs::~AliEMCALCalibAbs()
479 fSuperModuleData.Delete();
482 //____________________________________________________________________________
483 AliEMCALSuperModuleCalibAbs * AliEMCALCalibAbs::GetSuperModuleCalibAbsNum(Int_t supModIndex)const
485 for (int i=0; i<fNSuperModule; i++) {
486 AliEMCALSuperModuleCalibAbs * t = (AliEMCALSuperModuleCalibAbs*) fSuperModuleData[i];
487 if (t->GetSuperModuleNum() == supModIndex) {
492 // if we arrived here, then nothing was found.. just return a NULL pointer