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 // * AliTOFcalibHisto - class to handle TOF calibration histograms,
19 // * map histograms and more
22 // * autors: Roberto Preghenella (R+)
23 // * concacts: preghenella@bo.infn.it
27 #include "AliTOFcalibHisto.h"
31 #include "AliTOFRawStream.h"
32 #include "AliTOFCableLengthMap.h"
33 #include "AliESDtrack.h"
35 #define SLEW_TOTMIN 10.
36 #define SLEW_TOTMAX 16.
38 ClassImp(AliTOFcalibHisto)
40 //__________________________________________________________________________
42 TFile *AliTOFcalibHisto::fgCalibHistoFile = NULL;
43 TFile *AliTOFcalibHisto::fgCalibParFile = NULL;
44 TFile *AliTOFcalibHisto::fgCalibStatFile = NULL;
46 //__________________________________________________________________________
48 TString AliTOFcalibHisto::fgCalibHistoFileName = "$ALICE_ROOT/TOF/data/AliTOFcalibHisto.root";
49 TString AliTOFcalibHisto::fgCalibParFileName = "$ALICE_ROOT/TOF/data/AliTOFcalibPar.root";
50 TString AliTOFcalibHisto::fgCalibStatFileName = "$ALICE_ROOT/TOF/data/AliTOFcalibStat.root";
52 //__________________________________________________________________________
54 const TString AliTOFcalibHisto::fgkCalibConstName[kNcalibConsts] = {
61 //__________________________________________________________________________
63 const TString AliTOFcalibHisto::fgkCalibMapName[kNcalibMaps] = {
84 "InterfaceCardLength",
88 //__________________________________________________________________________
90 const TString AliTOFcalibHisto::fgkCalibParName[kNcalibPars] = {
103 //__________________________________________________________________________
105 const TString AliTOFcalibHisto::fgkCalibStatName[kNcalibStats] = {
109 //__________________________________________________________________________
111 /* LHC clock period [ns] */
112 const Double_t AliTOFcalibHisto::fgkLHCperiod = (24.4e-3 * 1024); /* ns */
114 //__________________________________________________________________________
116 /* Amphenol cable delay [ns/cm] */
117 const Double_t AliTOFcalibHisto::fgkAmphenolCableDelay = 5.13e-2; /* from measurement */
119 //__________________________________________________________________________
121 /* flat cable delay [ns/cm] */
122 //const Double_t AliTOFcalibHisto::fgkFlatCableDelay = 5.3e-2; /* from Amphenol 132-2829 series data-sheet */
123 const Double_t AliTOFcalibHisto::fgkFlatCableDelay = 5.124e-2; /* from LHC08d calibration */
125 //__________________________________________________________________________
127 /* interface card delay [ns/cm] */
128 //const Double_t AliTOFcalibHisto::fgkInterfaceCardDelay = 6.9e-2; /* from HyperLinx simulation */
129 //const Double_t AliTOFcalibHisto::fgkInterfaceCardDelay = 5.7898e-2; /* from LHC08d calibration */
130 const Double_t AliTOFcalibHisto::fgkInterfaceCardDelay = 6.31360207815420404e-02; /* from LHC09c calibration */
132 //__________________________________________________________________________
134 /* number of readout channels (DO/EO) */
135 const Int_t AliTOFcalibHisto::fgkNchannels = 157248;
136 const Int_t AliTOFcalibHisto::fgkNchannelsEO = 172800;
138 //__________________________________________________________________________
140 /* DDL BC shifts due to TTC fibers [LHCperiod] */
141 const Int_t AliTOFcalibHisto::fgkDDLBCshift[72] = {
162 //__________________________________________________________________________
164 /* strip flat-cable length (preliminary) [cm] */
165 const Double_t AliTOFcalibHisto::fgkFlatCableLength[91] = {
166 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 17.,
167 21., 21., 21., 21., 21., 17., 17., 21., 21., 17., 21., 21., 21., 17., 21., 21., 17., 21., 23.,
168 17., 19., 17., 19., 17., 19., 17., 19., 17., 19., 17., 19., 17., 19., 17.,
169 23., 21., 17., 21., 21., 17., 21., 21., 21., 17., 21., 21., 17., 17., 21., 21., 21., 21., 21.,
170 17., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18.
173 //__________________________________________________________________________
175 /* interface card lenght (preliminary) [cm] */
176 const Double_t AliTOFcalibHisto::fgkInterfaceCardLength[48] = {
177 13.97, 12.57, 14.52, 13.10, 15.44, 13.60, 10.58, 9.14,
178 11.21, 9.76, 12.11, 10.76, 8.67, 7.58, 9.32, 8.09,
179 10.24, 8.4, 5.51, 4.31, 6.54, 5.23, 7.48, 6.28,
180 10.43, 8.76, 11.05, 9.43, 11.72, 10.14, 7.2, 5.69,
181 7.71, 6.26, 8.36, 7.19, 4.85, 4.09, 5.57, 4.35,
182 6.59, 5.12, 2.49, 2.96, 2.70, 2.76, 2.91, 2.55
185 //__________________________________________________________________________
187 Bool_t AliTOFcalibHisto::fgCableCorrectionFlag[kNcorrections] = {
188 kFALSE, // kDDLBCcorr
189 kTRUE, // kAmphenolCableCorr
190 kTRUE, // kFlatCableCorr
191 kTRUE, // kInterfaceCardCorr
192 kFALSE, // kDDLdelayCorr
193 kFALSE, // kHPTDCdelayCorr
194 kFALSE, // kFEAchDelayCorr
195 kFALSE, // kFEAdelayCorr
196 kFALSE, // kTRMdelayCorr
197 kFALSE, // kICdelayCorr
198 kFALSE, // kStripDelayCorr
199 kFALSE, // kIndexDelayCorr
200 kFALSE, // kTimeSlewingCorr
203 //__________________________________________________________________________
205 Bool_t AliTOFcalibHisto::fgFullCorrectionFlag[kNcorrections] = {
206 kFALSE, // kDDLBCcorr
207 kTRUE, // kAmphenolCableCorr
208 kTRUE, // kFlatCableCorr
209 kTRUE, // kInterfaceCardCorr
210 kTRUE, // kDDLdelayCorr
211 kTRUE, // kHPTDCdelayCorr
212 kTRUE, // kFEAchDelayCorr
213 kTRUE, // kFEAdelayCorr
214 kTRUE, // kTRMdelayCorr
215 kFALSE, // kICdelayCorr
216 kTRUE, // kStripDelayCorr
217 kTRUE, // kIndexDelayCorr
218 kTRUE, // kTimeSlewingCorr
221 //__________________________________________________________________________
223 const Int_t AliTOFcalibHisto::fgkStripStat[18][91] = {
225 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
226 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
227 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
228 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
229 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* S00 */
231 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
232 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
233 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
234 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
235 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* S01 */
237 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
238 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
239 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
240 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
241 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* S02 */
243 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
244 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
245 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
246 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
247 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* S03 */
249 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
250 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
251 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
252 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
253 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* S04 */
255 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
256 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
257 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
258 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
259 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* S05 */
261 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
262 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
263 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
264 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
265 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* S06 */
267 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
268 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
269 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
270 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
271 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* S07 */
273 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
274 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
275 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
276 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
277 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* S08 */
279 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
280 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
281 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
282 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
283 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* S09 */
285 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
286 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
287 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
288 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
289 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* S10 */
291 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
292 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
293 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
294 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
295 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* S11 */
297 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
298 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
299 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1,
300 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
301 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* S12 */
303 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
304 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
305 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
306 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
307 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* S13 */
309 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
310 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
311 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
312 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
313 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* S14 */
315 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
316 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
317 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
318 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
319 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* S15 */
321 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
322 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
323 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
324 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
325 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* S16 */
327 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
328 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
329 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
330 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
331 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} /* S17 */
335 //__________________________________________________________________________
337 AliTOFcalibHisto::AliTOFcalibHisto() :
344 /* default constructor */
347 //__________________________________________________________________________
349 AliTOFcalibHisto::~AliTOFcalibHisto()
351 /* default destructor */
353 if (fgCalibHistoFile && fgCalibHistoFile->IsOpen()) {
354 fgCalibHistoFile->Close();
358 //__________________________________________________________________________
361 AliTOFcalibHisto::LoadHisto(TFile * const file, TH1D **histo, const Char_t *name)
364 *histo = (TH1D *)file->Get(name);
366 AliWarning(Form("error while getting %s histo", name));
369 //__________________________________________________________________________
372 AliTOFcalibHisto::CreateHisto(TH1D **histo, const Char_t *name, Int_t size)
375 *histo = new TH1D(name, Form(";index;%s", name), size, 0, size);
377 AliWarning(Form("error while creating %s histo", name));
380 //__________________________________________________________________________
383 AliTOFcalibHisto::WriteHisto(TFile *file, TH1D *histo)
386 if (!file || !file->IsOpen() || !histo)
392 //__________________________________________________________________________
395 AliTOFcalibHisto::SetHisto(TH1D *histo, Int_t index, Double_t value)
400 histo->SetBinContent(index + 1, value);
403 //__________________________________________________________________________
406 AliTOFcalibHisto::GetHisto(TH1D *histo, Int_t index)
410 AliWarning("cannot get histo");
413 return histo->GetBinContent(index + 1);
416 //__________________________________________________________________________
419 AliTOFcalibHisto::LoadCalibHisto()
421 /* load calib histo */
423 if (fgCalibHistoFile && fgCalibHistoFile->IsOpen()) {
424 AliWarning("calib histo file already open: reloading");
425 fgCalibHistoFile->Close();
428 /* open input file */
429 TFile *fileIn = TFile::Open(GetCalibHistoFileName());
430 if (!fileIn || !fileIn->IsOpen()) {
431 AliFatal(Form("cannot open input file %s", GetCalibHistoFileName()));
435 /* set calib histo file */
436 fgCalibHistoFile = fileIn;
439 for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
440 LoadHisto(fileIn, &fCalibConst[iConst], fgkCalibConstName[iConst].Data());
442 for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
443 LoadHisto(fileIn, &fCalibMap[iMap], fgkCalibMapName[iMap].Data());
446 //__________________________________________________________________________
449 AliTOFcalibHisto::LoadCalibPar()
453 if (fgCalibParFile && fgCalibParFile->IsOpen())
454 AliWarning("calib par file already open: reloading");
456 /* load calib histo */
459 /* open input file */
460 TFile *fileIn = TFile::Open(GetCalibParFileName());
461 if (!fileIn || !fileIn->IsOpen()) {
462 AliError(Form("cannot open input file %s", GetCalibParFileName()));
466 /* set calib par file */
467 fgCalibParFile = fileIn;
470 for (Int_t i = 0; i < kNcalibPars; i++)
471 LoadHisto(fileIn, &fCalibPar[i], fgkCalibParName[i].Data());
475 //__________________________________________________________________________
478 AliTOFcalibHisto::LoadCalibStat()
480 /* load calib stat */
482 if (fgCalibStatFile && fgCalibStatFile->IsOpen())
483 AliWarning("calib par file already open: reloading");
485 /* load calib histo */
488 /* open input file */
489 TFile *fileIn = TFile::Open(GetCalibStatFileName());
490 if (!fileIn || !fileIn->IsOpen()) {
491 AliError(Form("cannot open input file %s", GetCalibStatFileName()));
495 /* set calib par file */
496 fgCalibStatFile = fileIn;
499 for (Int_t i = 0; i < kNcalibStats; i++)
500 LoadHisto(fileIn, &fCalibStat[i], fgkCalibStatName[i].Data());
504 //__________________________________________________________________________
507 AliTOFcalibHisto::WriteCalibHisto()
509 /* write calib histo */
511 /* open output file */
512 TFile *fileOut = TFile::Open(GetCalibHistoFileName(), "RECREATE");
513 if (!fileOut || !fileOut->IsOpen()) {
514 AliFatal(Form("cannot open output file %s", GetCalibHistoFileName()));
519 for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
520 CreateHisto(&fCalibConst[iConst], fgkCalibConstName[iConst].Data(), 1);
522 for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
524 CreateHisto(&fCalibMap[iMap], fgkCalibMapName[iMap].Data(), fgkNchannelsEO);
526 CreateHisto(&fCalibMap[iMap], fgkCalibMapName[iMap].Data(), fgkNchannels);
528 /*** SETUP CONSTS ***/
530 SetHisto(fCalibConst[kLHCperiod], 0, fgkLHCperiod);
531 SetHisto(fCalibConst[kAmphenolCableDelay], 0, fgkAmphenolCableDelay);
532 SetHisto(fCalibConst[kFlatCableDelay], 0, fgkFlatCableDelay);
533 SetHisto(fCalibConst[kInterfaceCardDelay], 0, fgkInterfaceCardDelay);
537 AliTOFRawStream rawStream;
538 Int_t indexEO, det[5], dummy, index, sector, plate, strip, sectorStrip, padz, padx, pad, icIndex;
540 /* temporarly disable warnings */
541 AliLog::EType_t logLevel = (AliLog::EType_t)AliLog::GetGlobalLogLevel();
542 AliLog::SetGlobalLogLevel(AliLog::kError);
544 /* loop over electronics oriented (EO) indices */
545 for (Int_t ddl = 0; ddl < 72; ddl++)
546 for (Int_t trm = 0; trm < 10; trm++)
547 for (Int_t chain = 0; chain < 2; chain++)
548 for (Int_t tdc = 0; tdc < 15; tdc++)
549 for (Int_t channel = 0; channel < 8; channel++) {
551 /* compute index EO */
552 indexEO = GetIndexEO(ddl, trm, chain, tdc, channel);
554 /* convert EO indices into detector oriented (DO) indices
555 (this call causes some warnings because the loop includes
556 EO indices which are not connected to physical channels) */
557 rawStream.EquipmentId2VolumeId(ddl, trm + 3, chain, tdc, channel, det);
559 /* swap det[3] and det[4] */
560 dummy = det[3]; det[3] = det[4]; det[4] = dummy;
562 /* check detector indices */
563 if (det[0] < 0 || det[0] > 17 ||
564 det[1] < 0 || det[1] > 4 ||
565 det[2] < 0 || det[2] > 18 ||
566 det[3] < 0 || det[3] > 1 ||
567 det[4] < 0 || det[4] > 47) {
568 SetHisto(fCalibMap[kIndex], indexEO, -1);
572 /* setup information */
573 index = AliTOFGeometry::GetIndex(det);
577 sectorStrip = plate < 3 ? plate * 19 + strip : plate * 19 - 4 + strip;
580 pad = padz + 2 * padx;
581 icIndex = pad < 48 ? pad : 95 - pad;
586 SetHisto(fCalibMap[kIndex], indexEO, index);
588 SetHisto(fCalibMap[kDDL], index, ddl);
589 SetHisto(fCalibMap[kTRM], index, trm);
590 SetHisto(fCalibMap[kChain], index, chain);
591 SetHisto(fCalibMap[kTDC], index, tdc);
592 SetHisto(fCalibMap[kChannel], index, channel);
594 SetHisto(fCalibMap[kSector], index, sector);
595 SetHisto(fCalibMap[kPlate], index, plate);
596 SetHisto(fCalibMap[kStrip], index, strip);
597 SetHisto(fCalibMap[kSectorStrip], index, sectorStrip);
598 SetHisto(fCalibMap[kPadZ], index, padz);
599 SetHisto(fCalibMap[kPadX], index, padx);
600 SetHisto(fCalibMap[kPad], index, pad);
601 SetHisto(fCalibMap[kInterfaceCardIndex], index, icIndex);
602 /* calib constants */
603 SetHisto(fCalibMap[kDDLBCshift], index, fgkDDLBCshift[ddl]);
604 SetHisto(fCalibMap[kFlatCableLength], index, fgkFlatCableLength[sectorStrip]);
605 SetHisto(fCalibMap[kInterfaceCardLength], index, fgkInterfaceCardLength[icIndex]);
606 SetHisto(fCalibMap[kAmphenolCableLength], index, AliTOFCableLengthMap::GetCableLength(ddl, trm + 3, chain, tdc));
608 } /* loop over electronics oriented (EO) indices */
610 /* re-enable warnings */
611 AliLog::SetGlobalLogLevel(logLevel);
614 for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
615 WriteHisto(fileOut, fCalibConst[iConst]);
617 for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
618 WriteHisto(fileOut, fCalibMap[iMap]);
620 /* close output file */
624 //__________________________________________________________________________
627 AliTOFcalibHisto::WriteCalibStat()
629 /* write calib stat */
631 /* open output file */
632 TFile *fileOut = TFile::Open(GetCalibStatFileName(), "RECREATE");
633 if (!fileOut || !fileOut->IsOpen()) {
634 AliFatal(Form("cannot open output file %s", GetCalibStatFileName()));
639 for (Int_t iStat = 0; iStat < kNcalibStats; iStat++)
640 CreateHisto(&fCalibStat[iStat], fgkCalibStatName[iStat].Data(), fgkNchannels);
642 /*** SETUP STATS ***/
644 Int_t sector, sectorStrip;
646 /* load calib histo */
649 /* loop over channels */
650 for (Int_t index = 0; index < fgkNchannels; index++) {
651 sector = (Int_t)GetCalibMap(kSector, index);
652 sectorStrip = (Int_t)GetCalibMap(kSectorStrip, index);
654 SetHisto(fCalibStat[kStripStat], index, (Double_t)fgkStripStat[sector][sectorStrip]);
655 } /* loop over channels */
658 for (Int_t iStat = 0; iStat < kNcalibStats; iStat++)
659 WriteHisto(fileOut, fCalibStat[iStat]);
661 /* close output file */
665 //__________________________________________________________________________
668 AliTOFcalibHisto::GetCorrection(Int_t corr, Int_t index, Double_t tot)
670 /* apply correction */
672 Int_t ddl, chain, tdc, channel, hptdc, pbCh, feaIndex, sector, plate, padx, trm, icIndex, sectorStrip;
677 return -GetCalibConst(kLHCperiod) * GetCalibMap(kDDLBCshift, index);
678 case kAmphenolCableCorr:
679 return GetCalibConst(kAmphenolCableDelay) * GetCalibMap(kAmphenolCableLength, index);
681 return GetCalibConst(kFlatCableDelay) * GetCalibMap(kFlatCableLength, index);
682 case kInterfaceCardCorr:
683 return GetCalibConst(kInterfaceCardDelay) * GetCalibMap(kInterfaceCardLength, index);
685 ddl = (Int_t)GetCalibMap(kDDL, index);
686 return GetCalibPar(kDDLdelayPar, ddl);
687 case kHPTDCdelayCorr:
688 chain = (Int_t)GetCalibMap(kChain, index);
689 tdc = (Int_t)GetCalibMap(kTDC, index);
690 hptdc = tdc + 15 * chain;
691 return GetCalibPar(kHPTDCdelayPar, hptdc);
692 case kFEAchDelayCorr:
693 ddl = (Int_t)GetCalibMap(kDDL, index);
694 tdc = (Int_t)GetCalibMap(kTDC, index);
695 channel = (Int_t)GetCalibMap(kChannel, index);
696 pbCh = channel + 8 * (tdc % 3);
698 return GetCalibPar(kRightFEAchDelayPar, pbCh);
700 return GetCalibPar(kLeftFEAchDelayPar, pbCh);
702 sector = (Int_t)GetCalibMap(kSector, index);
703 plate = (Int_t)GetCalibMap(kPlate, index);
704 sectorStrip = (Int_t)GetCalibMap(kSectorStrip, index);
705 padx = (Int_t)GetCalibMap(kPadX, index);
706 feaIndex = padx / 12 + 4 * sectorStrip + 364 * sector;
707 return GetCalibPar(kFEAdelayPar, feaIndex);
709 ddl = (Int_t)GetCalibMap(kDDL, index);
710 trm = (Int_t)GetCalibMap(kTRM, index);
711 return GetCalibPar(kTRMdelayPar, trm + 10 * ddl);
713 icIndex = (Int_t)GetCalibMap(kInterfaceCardIndex, index);
714 return GetCalibPar(kICdelayPar, icIndex);
715 case kStripDelayCorr:
716 sector = (Int_t)GetCalibMap(kSector, index);
717 sectorStrip = (Int_t)GetCalibMap(kSectorStrip, index);
718 return GetCalibPar(kStripDelayPar, sectorStrip + 91 * sector);
719 case kIndexDelayCorr:
720 return GetCalibPar(kIndexDelayPar, index);
721 case kTimeSlewingCorr:
722 tot = tot < SLEW_TOTMIN ? SLEW_TOTMIN : tot;
723 tot = tot > SLEW_TOTMAX ? SLEW_TOTMAX : tot;
725 for (Int_t i = 0; i < fCalibPar[kTimeSlewingPar]->GetNbinsX(); i++)
726 slewing += GetCalibPar(kTimeSlewingPar, i) * TMath::Power(tot, i);
729 AliWarning(Form("unknown correction flag (%d)", corr));
734 //__________________________________________________________________________
737 AliTOFcalibHisto::GetNominalCorrection(Int_t index)
739 /* get nominal correction */
741 for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
742 corr += GetCorrection(iCorr, index);
746 //__________________________________________________________________________
749 AliTOFcalibHisto::ApplyNominalCorrection(AliESDtrack *track)
751 /* apply nominal correction */
753 Double_t rawTime = track->GetTOFsignalRaw();
754 Int_t index = track->GetTOFCalChannel();
755 Double_t time = rawTime - 1.e3 * GetNominalCorrection(index);
756 track->SetTOFsignal(time);
759 //__________________________________________________________________________
762 AliTOFcalibHisto::GetCableCorrection(Int_t index)
764 /* get cable correction */
766 for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
767 if (fgCableCorrectionFlag[iCorr])
768 corr += GetCorrection(iCorr, index);
772 //__________________________________________________________________________
775 AliTOFcalibHisto::GetFullCorrection(Int_t index, Double_t tot)
777 /* get full correction */
779 for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
780 if (fgFullCorrectionFlag[iCorr]) {
781 corr += GetCorrection(iCorr, index, tot);
786 //__________________________________________________________________________
789 AliTOFcalibHisto::GetStatus(Int_t index)
793 Bool_t status = kTRUE;
795 for (Int_t iStat = 0; iStat < kNcalibStats; iStat++)
796 status &= GetCalibStat(iStat, index);