Move AliWarning and AliInfo to AliDebug to reduce prints during reconstruction
[u/mrichter/AliRoot.git] / EMCAL / SMcalib / AliEMCALCalibAPD.cxx
CommitLineData
a8827307 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 read txt file with APD number data
19//
20
21#include <fstream>
22#include <TString.h>
23
24#include "AliEMCALCalibAPD.h"
25
26const int kMaxLen = 1000; // maximum length of single line (# of characters)
27// an OK line with complete info should have a certain number of characters
c093846b 28const int kMinLenAPDLine = 135;
29const int kMaxLenAPDLine = 1000;
a8827307 30
31ClassImp(AliEMCALCalibAPD)
32
33//____________________________________________________________________________
34AliEMCALCalibAPD::AliEMCALCalibAPD() :
35 fNCalibAPD(0),
36 fData(0)
37{
38 //Default constructor.
39}
40
41//____________________________________________________________________________
42void AliEMCALCalibAPD::ReadCalibAPDInfo(Int_t nAPD, const TString &txtFileName)
43{
44 //Read data from txt file. ; coordinates given on SuperModule basis
45
46 std::ifstream inputFile(txtFileName.Data());
47 if (!inputFile) {
48 printf("AliEMCALCalibAPD::ReadCalibAPDInfo - Cannot open the APD info file %s\n", txtFileName.Data());
49 return;
50 }
51
52 fNCalibAPD = nAPD;
53 if (fData) delete [] fData;
54 fData = new AliEMCALCalibAPDData[fNCalibAPD];
55
56 char line[kMaxLen];
57
c093846b 58 /* DS: header lines skipped when switched to white-spaced separeted dat files instead of csv:
59 conversion from spreadsheet can be done a la
60 sed 's/,/ /g' APD-database-Houston.csv | egrep ^2 | awk '{if (NF==19) {print $0}}' > APD-database-Houston.dat
61 - meaning "replace , with whitespace, only get the columns that start with the number 2 (Houston APDs),
62 and only get rows with the full 19 fields
63
a8827307 64 // get header lines:
65 inputFile.getline(line, kMaxLen);
66 // printf(" 1st header line character count %d\n", inputFile.gcount());
67 inputFile.getline(line, kMaxLen);
68 // printf(" 2nd header line character count %d\n", inputFile.gcount());
c093846b 69 */
a8827307 70
71 // variables for reading
72 int i1,i2,i3,i4,i5;
73 float f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12;
74 char c1[10], c2[20];
75
76 int j = 0; // index for the ones that were read OK
77 for (Int_t i = 0; i < fNCalibAPD; i++) {
78 AliEMCALCalibAPDData &t = fData[j];
79 if (!inputFile) {
cdb5074a 80 printf("AliEMCALCalibAPD::ReadCalibAPDInfo - Error while reading input file; likely EOF..\n");
a8827307 81 fNCalibAPD = j; // that's how many we actually read succesfully
82 printf("AliEMCALCalibAPD::ReadCalibAPDInfo - read %d OK\n", fNCalibAPD);
83 return;
84 }
85
86 // use some temporary/local values to perhaps help with the order when
87 // trying to read all the many fields in a line..
88 inputFile.getline(line, kMaxLen);
89 int nchar = inputFile.gcount();
c093846b 90 //printf(" line %d ok %d - character count %d\n", i, j, nchar);
a8827307 91
92 if (nchar>kMinLenAPDLine && nchar<kMaxLenAPDLine) {
93 // looks like the line has about the right number of characters, let's
94 // try to decode it now..
95
96 // printf("input: %s\n",line);
c093846b 97 sscanf(line, "%d %u %s %s %d %d %f %f %f %f %f %f %f %f %f %d %f %f %f",
a8827307 98 &i1, &i2, c1, c2, &i3, &i4, // header-type info
99 &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, // measurements
100 &i5, &f10, &f11, &f12); // Hamamatsu
101
102 // printf("after scanf: %s\n",line);
103 /*
104 printf("%d,%u,%s,%s,%d,%d,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d,%g,%13.11f,%g\n",
105 i1, i2, c1, c2, i3, i4, // header-type info
106 f1, f2, f3, f4, f5, f6, f7, f8, f9, // measurements
107 i5, f10, f11, f12); // Hamamatsu
108 */
109 // assign the variables:
110 t.fAPDNum = i1;
111 t.fSerialNum = i2;
112 sprintf(t.fStatus,"%s",c1);
113 sprintf(t.fLocation,"%s",c2);
114 t.fRunNum = i3;
115 t.fTestPos = i4;
116
117 t.fV30 = f1;
118 t.fV50 = f2;
119 t.fVoltCoeff = f3;
120 t.fPar[0] = f4;
121 t.fPar[1] = f5;
122 t.fPar[2] = f6;
123 t.fParErr[0] = f7;
124 t.fParErr[1] = f8;
125 t.fParErr[2] = f9;
126
127 t.fBreakDown = i5;
128 t.fHamV50 = f10;
129 t.fDarkCurrent = f11;
130 t.fTestTemp = f12;
131
132 j++; // increment our 'OK' counter..
133 } // line length appears OK
134 } // i, APD
135
136 inputFile.close();
137
138 return;
139}
140
141//____________________________________________________________________________
142void AliEMCALCalibAPD::WriteCalibAPDInfo(const TString &txtFileName)
143{
144 // write data to txt file. ; coordinates given on SuperModule basis
145
146 std::ofstream outputFile(txtFileName.Data());
147 if (!outputFile) {
148 printf("AliEMCALCalibAPD::WriteCalibAPDInfo - Cannot open the APD output file %s\n", txtFileName.Data());
149 return;
150 }
151
152 char *comma = ",";
153
154 for (Int_t i = 0; i < fNCalibAPD; i++) {
155 AliEMCALCalibAPDData &t = fData[i];
156
157 outputFile << t.fAPDNum << comma
158 << t.fSerialNum << comma // Serial Number; from Hamamatsu
159 << t.fStatus << comma //
160 << t.fLocation << comma //
161 << t.fRunNum << comma
162 << t.fTestPos << comma
163 << t.fV30 << comma // Catania/Houston Voltage V30 (V) at T = 25 deg C
164 << t.fV50 << comma
165 << t.fVoltCoeff << comma // 1/M x dM/dV
166 << t.fPar[0] << comma // fit parameters, p0,p1,p2 - for ADC vs bias measurement
167 << t.fPar[1] << comma
168 << t.fPar[2] << comma
169 << t.fParErr[0] << comma // error on fit parameters
170 << t.fParErr[1] << comma
171 << t.fParErr[2] << comma
172 << t.fBreakDown << comma // Hamamatsu Breakdown Voltage (V)
173 << t.fHamV50 << comma; // Hamamatsu Voltage V50 (V)
174 // I wasn't able to quite reproduce the values as they appeared on the
175 // original file: e.g. dark current is not always 11-field - if last digit is zero..
176 // the other floats have 6 significant digits, but sometimes switch to
177 // scientific notation - don't know how to handle this for varying length of fields.. -leave it as is for now..
178 outputFile << t.fDarkCurrent << comma; // Hamamatsu Dark Current (A)
179 /*
180 // some tweaking for the dark-current field to get the output the same
181 // as on the original CSV
182 outputFile.precision(11);
183 outputFile << fixed << t.fDarkCurrent << comma; // Hamamatsu Dark Current (A)
184 // back to normal..
185 outputFile.precision(6); outputFile.unsetf(ios_base::floatfield);
186 */
187
188 outputFile << t.fTestTemp // Hamamatsu Testing Temperature (deg C)
189 << endl;
190
191 } // i, APD
192
193 outputFile.close();
194
195 return;
196}
197
198//____________________________________________________________________________
199AliEMCALCalibAPD::~AliEMCALCalibAPD()
200{
201 delete [] fData;
202}
203
204//____________________________________________________________________________
205AliEMCALCalibAPD::AliEMCALCalibAPDData AliEMCALCalibAPD::GetCalibAPDDataId(Int_t apdIndex)const
206{
207 AliEMCALCalibAPDData t; // just to maybe prevent a crash, but we are returning something not-initialized so maybe not better really..
208 if (!fData)
209 return t;
210
211 return fData[apdIndex];
212}
213
214//____________________________________________________________________________
215AliEMCALCalibAPD::AliEMCALCalibAPDData AliEMCALCalibAPD::GetCalibAPDDataNum(Int_t apdNum)const
216{
217 AliEMCALCalibAPDData t; // just to maybe prevent a crash, but we are returning something not-initialized so maybe not better really..
218 if (!fData)
219 return t;
220
221 for (int i=0; i<fNCalibAPD; i++) {
222 if (fData[i].fAPDNum == apdNum) {
223 return fData[i];
224 }
225 }
226
227 // if we made it to here, then no match was found - just return then
228 return t;
229}
230
231