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 info on APD calibration and map info
26 #include "AliEMCALCalibMapAPD.h"
30 ClassImp(AliEMCALCalibMapAPD)
32 //____________________________________________________________________________
33 AliEMCALCalibMapAPD::AliEMCALCalibMapAPD(const int nSM) :
37 //Default constructor.
38 for (int i=0; i<fNSuperModule; i++) {
39 fSuperModuleData.Add(new AliEMCALSuperModuleCalibMapAPD(i));
41 fSuperModuleData.Compress(); // compress the TObjArray
42 fSuperModuleData.SetOwner(kTRUE);
45 //____________________________________________________________________________
46 void AliEMCALCalibMapAPD::ReadTextCalibMapAPDInfo(Int_t nSM, const TString &txtFileName,
49 //Read data from txt file. ; coordinates given on SuperModule basis
51 std::ifstream inputFile(txtFileName.Data());
53 printf("AliEMCALCalibMapAPD::ReadCalibMapAPDInfo - Cannot open the APD info file %s\n", txtFileName.Data());
59 Int_t iSM = 0; // SuperModule index
62 // list of values to be read
67 Float_t parErr[3] = {0};
69 Float_t darkCurrent = 0;
72 Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
74 for (Int_t i = 0; i < fNSuperModule; i++) {
75 AliEMCALSuperModuleCalibMapAPD * t = (AliEMCALSuperModuleCalibMapAPD*) fSuperModuleData[i];
77 printf("AliEMCALCalibMapAPD::ReadCalibMapAPDInfo - Error while reading input file; likely EOF..");
81 t->SetSuperModuleNum(iSM);
83 for (Int_t j=0; j<nAPDPerSM; j++) {
84 inputFile >> iCol >> iRow >> iHW
86 >> par[0] >> par[1] >> par[2]
87 >> parErr[0] >> parErr[1] >> parErr[2]
88 >> iBreakDown >> darkCurrent;
90 // assume that this info is already swapped and done for this basis?
92 // C side, oriented differently than A side: swap is requested
93 iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
94 iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
97 AliEMCALCalibMapAPDVal * v = t->GetAPDVal(iCol, iRow);
99 v->SetHardWareId(iHW);
100 v->SetAPDNum(iAPDNum);
102 v->SetPar(0, par[0]);
103 v->SetPar(1, par[1]);
104 v->SetPar(2, par[2]);
105 v->SetParErr(0, parErr[0]);
106 v->SetParErr(1, parErr[1]);
107 v->SetParErr(2, parErr[2]);
108 v->SetBreakDown(iBreakDown);
109 v->SetDarkCurrent(darkCurrent);
119 //____________________________________________________________________________
120 void AliEMCALCalibMapAPD::WriteTextCalibMapAPDInfo(const TString &txtFileName,
123 // write data to txt file. ; coordinates given on SuperModule basis
125 std::ofstream outputFile(txtFileName.Data());
127 printf("AliEMCALCalibMapAPD::WriteCalibMapAPDInfo - Cannot open the APD output file %s\n", txtFileName.Data());
134 Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
136 for (Int_t i = 0; i < fNSuperModule; i++) {
137 AliEMCALSuperModuleCalibMapAPD * t = (AliEMCALSuperModuleCalibMapAPD*) fSuperModuleData[i];
138 outputFile << t->GetSuperModuleNum() << endl;
140 for (Int_t j=0; j<nAPDPerSM; j++) {
141 iCol = j / AliEMCALGeoParams::fgkEMCALRows;
142 iRow = j % AliEMCALGeoParams::fgkEMCALRows;
144 AliEMCALCalibMapAPDVal * v = t->GetAPDVal(iCol, iRow);
147 // C side, oriented differently than A side: swap is requested
148 iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
149 iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
152 outputFile << iCol << " " << iRow << " " << v->GetHardWareId()
153 << " " << v->GetAPDNum() << " " << v->GetV30()
154 << " " << v->GetPar(0) << " " << v->GetPar(1) << " " << v->GetPar(2)
155 << " " << v->GetParErr(0) << " " << v->GetParErr(1) << " " << v->GetParErr(2)
156 << " " << v->GetBreakDown() << " " << v->GetDarkCurrent() << endl;
166 //____________________________________________________________________________
167 void AliEMCALCalibMapAPD::ReadRootCalibMapAPDInfo(const TString &rootFileName,
170 //Read data from root file. ; coordinates given on SuperModule basis
171 TFile inputFile(rootFileName, "read");
173 TTree *tree = (TTree*) inputFile.Get("tree");
175 ReadTreeCalibMapAPDInfo(tree, swapSides);
182 //____________________________________________________________________________
183 void AliEMCALCalibMapAPD::ReadTreeCalibMapAPDInfo(TTree *tree,
186 // how many SuperModule's worth of entries / APDs do we have?
187 Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
188 fNSuperModule = tree->GetEntries() / nAPDPerSM;
190 Int_t iSM = 0; // SuperModule index
193 // list of values to be read
197 Float_t par[3] = {0};
198 Float_t parErr[3] = {0};
199 Int_t iBreakDown = 0;
200 Float_t darkCurrent = 0;
203 // declare the branches
204 tree->SetBranchAddress("iSM", &iSM);
205 tree->SetBranchAddress("iCol", &iCol);
206 tree->SetBranchAddress("iRow", &iRow);
207 tree->SetBranchAddress("iHW", &iHW);
208 tree->SetBranchAddress("APDNum", &iAPDNum);
209 tree->SetBranchAddress("V30", &v30);
210 tree->SetBranchAddress("Par", par);
211 tree->SetBranchAddress("ParErr", parErr);
212 tree->SetBranchAddress("BreakDown", &iBreakDown);
213 tree->SetBranchAddress("DarkCurrent", &darkCurrent);
215 for (int ient=0; ient<tree->GetEntries(); ient++) {
216 tree->GetEntry(ient);
218 // assume the index SuperModules come in order: i=iSM
219 AliEMCALSuperModuleCalibMapAPD * t = (AliEMCALSuperModuleCalibMapAPD*) fSuperModuleData[iSM];
220 t->SetSuperModuleNum(iSM);
222 // assume that this info is already swapped and done for this basis?
224 // C side, oriented differently than A side: swap is requested
225 iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
226 iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
229 AliEMCALCalibMapAPDVal * v = t->GetAPDVal(iCol, iRow);
231 v->SetHardWareId(iHW);
232 v->SetAPDNum(iAPDNum);
234 v->SetPar(0, par[0]);
235 v->SetPar(1, par[1]);
236 v->SetPar(2, par[2]);
237 v->SetParErr(0, parErr[0]);
238 v->SetParErr(1, parErr[1]);
239 v->SetParErr(2, parErr[2]);
240 v->SetBreakDown(iBreakDown);
241 v->SetDarkCurrent(darkCurrent);
247 //____________________________________________________________________________
248 void AliEMCALCalibMapAPD::WriteRootCalibMapAPDInfo(const TString &rootFileName,
251 // write data to root file. ; coordinates given on SuperModule basis
252 TFile destFile(rootFileName, "recreate");
253 if (destFile.IsZombie()) {
258 TTree *tree = new TTree("tree","");
260 // variables for filling the TTree
261 Int_t iSM = 0; // SuperModule index
265 Float_t par[3] = {0};
266 Float_t parErr[3] = {0};
267 Int_t iBreakDown = 0;
268 Float_t darkCurrent = 0;
272 // declare the branches
273 tree->Branch("iSM", &iSM, "iSM/I");
274 tree->Branch("iCol", &iCol, "iCol/I");
275 tree->Branch("iRow", &iRow, "iRow/I");
276 tree->Branch("iHW", &iHW, "iHW/I");
277 tree->Branch("APDNum", &iAPDNum, "APDNum/I");
278 tree->Branch("V30", &v30, "V30/F");
279 tree->Branch("Par", &par, "Par[3]/F");
280 tree->Branch("ParErr", &parErr, "ParErr[3]/F");
281 tree->Branch("BreakDown", &iBreakDown, "BreakDown/I");
282 tree->Branch("DarkCurrent", &darkCurrent, "DarkCurrent/F");
284 Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
286 for (iSM = 0; iSM < fNSuperModule; iSM++) {
287 AliEMCALSuperModuleCalibMapAPD * t = (AliEMCALSuperModuleCalibMapAPD *) fSuperModuleData[iSM];
289 for (Int_t j=0; j<nAPDPerSM; j++) {
290 iCol = j / AliEMCALGeoParams::fgkEMCALRows;
291 iRow = j % AliEMCALGeoParams::fgkEMCALRows;
293 AliEMCALCalibMapAPDVal * v = t->GetAPDVal(iCol, iRow);
296 // C side, oriented differently than A side: swap is requested
297 iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
298 iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
301 iHW = v->GetHardWareId();
302 iAPDNum = v->GetAPDNum();
304 for (int k=0; k<3; k++) {
305 par[k] = v->GetPar(k);
306 parErr[k] = v->GetParErr(k);
308 iBreakDown = v->GetBreakDown();
309 darkCurrent = v->GetDarkCurrent();
322 //____________________________________________________________________________
323 AliEMCALCalibMapAPD::~AliEMCALCalibMapAPD()
325 fSuperModuleData.Delete();
328 //____________________________________________________________________________
329 AliEMCALSuperModuleCalibMapAPD * AliEMCALCalibMapAPD::GetSuperModuleCalibMapAPDNum(Int_t supModIndex)const
331 for (int i=0; i<fNSuperModule; i++) {
332 AliEMCALSuperModuleCalibMapAPD * t = (AliEMCALSuperModuleCalibMapAPD*) fSuperModuleData[i];
333 if (t->GetSuperModuleNum() == supModIndex) {
338 // if we arrived here, then nothing was found.. just return a NULL pointer