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