correct mask for V0 charge decoding in STU payload
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALBiasAPD.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
18// Objects of this class contain info on APD bias settings/voltages
19//
20
21#include <fstream>
22#include <TString.h>
61917ab3 23#include <TFile.h>
24#include <TTree.h>
d81e6423 25
26#include "AliEMCALBiasAPD.h"
27
28using namespace std;
29
30ClassImp(AliEMCALBiasAPD)
31
32//____________________________________________________________________________
2f17a269 33AliEMCALBiasAPD::AliEMCALBiasAPD(const int nSM) :
34 fNSuperModule(nSM), // make space for everyone
35 fSuperModuleData()
d81e6423 36{
37 //Default constructor.
2f17a269 38 for (int i=0; i<fNSuperModule; i++) {
39 fSuperModuleData.Add(new AliEMCALSuperModuleBiasAPD(i));
40 }
41 fSuperModuleData.Compress(); // compress the TObjArray
61e4e2e3 42 fSuperModuleData.SetOwner(kTRUE);
d81e6423 43}
44
45//____________________________________________________________________________
61917ab3 46void AliEMCALBiasAPD::ReadTextBiasAPDInfo(Int_t nSM, const TString &txtFileName,
47 Bool_t swapSides)
d81e6423 48{
49 //Read data from txt file. ; coordinates given on SuperModule basis
50
51 std::ifstream inputFile(txtFileName.Data());
52 if (!inputFile) {
53 printf("AliEMCALBiasAPD::ReadBiasAPDInfo - Cannot open the APD info file %s\n", txtFileName.Data());
54 return;
55 }
56
57 fNSuperModule = nSM;
d81e6423 58
59 Int_t iSM = 0; // SuperModule index
60 Int_t iCol = 0;
61 Int_t iRow = 0;
62 Int_t iElecId = 0;
63 Int_t iDAC = 0;
64 Float_t voltage = 0;
65
66 Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
67
68 for (Int_t i = 0; i < fNSuperModule; i++) {
2f17a269 69 AliEMCALSuperModuleBiasAPD * t = (AliEMCALSuperModuleBiasAPD*) fSuperModuleData[i];
70
d81e6423 71 if (!inputFile) {
b48d1356 72 printf("AliEMCALBiasAPD::ReadBiasAPDInfo - Error while reading input file; likely EOF..\n");
d81e6423 73 return;
74 }
75 inputFile >> iSM;
2f17a269 76 t->SetSuperModuleNum(iSM);
d81e6423 77
78 for (Int_t j=0; j<nAPDPerSM; j++) {
79 inputFile >> iCol >> iRow >> iElecId >> iDAC >> voltage;
80
b48d1356 81 // check that input values are not out bounds
82 if (iCol<0 || iCol>(AliEMCALGeoParams::fgkEMCALCols-1) ||
83 iRow<0 || iRow>(AliEMCALGeoParams::fgkEMCALRows-1) ) {
84 printf("AliEMCALBiasAPD::ReadBiasAPDInfo - Error while reading input file; j %d iCol %d iRow %d\n", j, iCol, iRow);
85 return;
86 }
87
d81e6423 88 // assume that this info is already swapped and done for this basis?
89 if (swapSides) {
90 // C side, oriented differently than A side: swap is requested
91 iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
92 iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
93 }
94
2f17a269 95 t->SetElecId(iCol, iRow, iElecId);
96 t->SetDAC(iCol, iRow, iDAC);
97 t->SetVoltage(iCol, iRow, voltage);
d81e6423 98 }
99
100 } // i, SuperModule
101
102 inputFile.close();
103
104 return;
105}
106
107//____________________________________________________________________________
61917ab3 108void AliEMCALBiasAPD::WriteTextBiasAPDInfo(const TString &txtFileName,
109 Bool_t swapSides)
d81e6423 110{
111 // write data to txt file. ; coordinates given on SuperModule basis
112
113 std::ofstream outputFile(txtFileName.Data());
114 if (!outputFile) {
115 printf("AliEMCALBiasAPD::WriteBiasAPDInfo - Cannot open the APD output file %s\n", txtFileName.Data());
116 return;
117 }
118
119 Int_t iCol = 0;
120 Int_t iRow = 0;
121 Int_t iElecId = 0;
122 Int_t iDAC = 0;
123 Float_t voltage = 0;
124
125 Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
126
127 for (Int_t i = 0; i < fNSuperModule; i++) {
2f17a269 128 AliEMCALSuperModuleBiasAPD * t = (AliEMCALSuperModuleBiasAPD*) fSuperModuleData[i];
129 outputFile << t->GetSuperModuleNum() << endl;
d81e6423 130
131 for (Int_t j=0; j<nAPDPerSM; j++) {
132 iCol = j / AliEMCALGeoParams::fgkEMCALRows;
133 iRow = j % AliEMCALGeoParams::fgkEMCALRows;
134
2f17a269 135 iElecId = t->GetElecId(iCol, iRow);
136 iDAC = t->GetDAC(iCol, iRow);
137 voltage = t->GetVoltage(iCol, iRow);
d81e6423 138
139 if (swapSides) {
140 // C side, oriented differently than A side: swap is requested
141 iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
142 iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
143 }
144
145 outputFile << iCol << " " << iRow << " "
146 << iElecId << " " << iDAC << " "
147 << voltage << endl;
148 }
149
150 } // i, SuperModule
151
152 outputFile.close();
153
154 return;
155}
156
157//____________________________________________________________________________
61917ab3 158void AliEMCALBiasAPD::ReadRootBiasAPDInfo(const TString &rootFileName,
159 Bool_t swapSides)
160{
161 //Read data from root file. ; coordinates given on SuperModule basis
162 TFile inputFile(rootFileName, "read");
163
164 TTree *tree = (TTree*) inputFile.Get("tree");
165
166 ReadTreeBiasAPDInfo(tree, swapSides);
167
168 inputFile.Close();
169
170 return;
171}
172
173//____________________________________________________________________________
174void AliEMCALBiasAPD::ReadTreeBiasAPDInfo(TTree *tree,
175 Bool_t swapSides)
176{
177 // how many SuperModule's worth of entries / APDs do we have?
178 Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
179 fNSuperModule = tree->GetEntries() / nAPDPerSM;
180
61917ab3 181 Int_t iSM = 0; // SuperModule index
182 Int_t iCol = 0;
183 Int_t iRow = 0;
184 // list of values to be read
185 Int_t iElecId = 0;
186 Int_t iDAC = 0;
187 Float_t voltage = 0;
188 // end - all values
189
190 // declare the branches
191 tree->SetBranchAddress("iSM", &iSM);
192 tree->SetBranchAddress("iCol", &iCol);
193 tree->SetBranchAddress("iRow", &iRow);
194 tree->SetBranchAddress("iElecId", &iElecId);
195 tree->SetBranchAddress("iDAC", &iDAC);
196 tree->SetBranchAddress("voltage", &voltage);
197
198 for (int ient=0; ient<tree->GetEntries(); ient++) {
199 tree->GetEntry(ient);
200
201 // assume the index SuperModules come in order: i=iSM
2f17a269 202 AliEMCALSuperModuleBiasAPD * t = (AliEMCALSuperModuleBiasAPD*) fSuperModuleData[iSM];
203 t->SetSuperModuleNum(iSM);
61917ab3 204
205 // assume that this info is already swapped and done for this basis?
206 if (swapSides) {
207 // C side, oriented differently than A side: swap is requested
208 iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
209 iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
210 }
211
2f17a269 212 t->SetElecId(iCol, iRow, iElecId);
213 t->SetDAC(iCol, iRow, iDAC);
214 t->SetVoltage(iCol, iRow, voltage);
61917ab3 215
216 } //
217
218 return;
219}
220
221//____________________________________________________________________________
222void AliEMCALBiasAPD::WriteRootBiasAPDInfo(const TString &rootFileName,
223 Bool_t swapSides)
224{
225 // write data to root file. ; coordinates given on SuperModule basis
226 TFile destFile(rootFileName, "recreate");
227 if (destFile.IsZombie()) {
228 return;
229 }
230 destFile.cd();
231
232 TTree *tree = new TTree("tree","");
233
234 // variables for filling the TTree
235 Int_t iSM = 0; // SuperModule index
236 Int_t iCol = 0;
237 Int_t iRow = 0;
238 Int_t iElecId = 0;
239 Int_t iDAC = 0;
240 Float_t voltage = 0;
241 // declare the branches
242 tree->Branch("iSM", &iSM, "iSM/I");
243 tree->Branch("iCol", &iCol, "iCol/I");
244 tree->Branch("iRow", &iRow, "iRow/I");
245 tree->Branch("iElecId", &iElecId, "iElecId/I");
246 tree->Branch("iDAC", &iDAC, "iDAC/I");
247 tree->Branch("voltage", &voltage, "voltage/F");
248
249 Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
250
251 for (iSM = 0; iSM < fNSuperModule; iSM++) {
2f17a269 252 AliEMCALSuperModuleBiasAPD * t = (AliEMCALSuperModuleBiasAPD*) fSuperModuleData[iSM];
61917ab3 253
254 for (Int_t j=0; j<nAPDPerSM; j++) {
255 iCol = j / AliEMCALGeoParams::fgkEMCALRows;
256 iRow = j % AliEMCALGeoParams::fgkEMCALRows;
257
2f17a269 258 iElecId = t->GetElecId(iCol, iRow);
259 iDAC = t->GetDAC(iCol, iRow);
260 voltage = t->GetVoltage(iCol, iRow);
61917ab3 261
262 if (swapSides) {
263 // C side, oriented differently than A side: swap is requested
264 iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
265 iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
266 }
267
268 tree->Fill();
269 }
270
271 } // i, SuperModule
272
273 tree->Write();
274 destFile.Close();
275
276 return;
277}
278
279//____________________________________________________________________________
d81e6423 280AliEMCALBiasAPD::~AliEMCALBiasAPD()
281{
2f17a269 282 fSuperModuleData.Delete();
d81e6423 283}
284
285//____________________________________________________________________________
2f17a269 286AliEMCALSuperModuleBiasAPD * AliEMCALBiasAPD::GetSuperModuleBiasAPDNum(Int_t supModIndex)const
d81e6423 287{
d81e6423 288 for (int i=0; i<fNSuperModule; i++) {
2f17a269 289 AliEMCALSuperModuleBiasAPD * t = (AliEMCALSuperModuleBiasAPD*) fSuperModuleData[i];
290 if (t->GetSuperModuleNum() == supModIndex) {
291 return t;
d81e6423 292 }
293 }
294
2f17a269 295 // if we arrived here, then nothing was found.. just return a NULL pointer
296 return NULL;
d81e6423 297}
298