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 */
354 //__________________________________________________________________________
357 AliTOFcalibHisto::LoadHisto(TFile * const file, TH1D **histo, const Char_t *name)
360 *histo = (TH1D *)file->Get(name);
362 AliWarning(Form("error while getting %s histo", name));
365 //__________________________________________________________________________
368 AliTOFcalibHisto::CreateHisto(TH1D **histo, const Char_t *name, Int_t size)
371 *histo = new TH1D(name, Form(";index;%s", name), size, 0, size);
373 AliWarning(Form("error while creating %s histo", name));
376 //__________________________________________________________________________
379 AliTOFcalibHisto::WriteHisto(TFile *file, TH1D *histo)
382 if (!file || !file->IsOpen() || !histo)
388 //__________________________________________________________________________
391 AliTOFcalibHisto::SetHisto(TH1D *histo, Int_t index, Double_t value)
396 histo->SetBinContent(index + 1, value);
399 //__________________________________________________________________________
402 AliTOFcalibHisto::GetHisto(TH1D *histo, Int_t index)
406 AliWarning("cannot get histo");
409 return histo->GetBinContent(index + 1);
412 //__________________________________________________________________________
415 AliTOFcalibHisto::LoadCalibHisto()
417 /* load calib histo */
419 if (fgCalibHistoFile && fgCalibHistoFile->IsOpen())
420 AliWarning("calib histo file already open: reloading");
422 /* open input file */
423 TFile *fileIn = TFile::Open(GetCalibHistoFileName());
424 if (!fileIn || !fileIn->IsOpen()) {
425 AliFatal(Form("cannot open input file %s", GetCalibHistoFileName()));
429 /* set calib histo file */
430 fgCalibHistoFile = fileIn;
433 for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
434 LoadHisto(fileIn, &fCalibConst[iConst], fgkCalibConstName[iConst].Data());
436 for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
437 LoadHisto(fileIn, &fCalibMap[iMap], fgkCalibMapName[iMap].Data());
440 //__________________________________________________________________________
443 AliTOFcalibHisto::LoadCalibPar()
447 if (fgCalibParFile && fgCalibParFile->IsOpen())
448 AliWarning("calib par file already open: reloading");
450 /* load calib histo */
453 /* open input file */
454 TFile *fileIn = TFile::Open(GetCalibParFileName());
455 if (!fileIn || !fileIn->IsOpen()) {
456 AliError(Form("cannot open input file %s", GetCalibParFileName()));
460 /* set calib par file */
461 fgCalibParFile = fileIn;
464 for (Int_t i = 0; i < kNcalibPars; i++)
465 LoadHisto(fileIn, &fCalibPar[i], fgkCalibParName[i].Data());
469 //__________________________________________________________________________
472 AliTOFcalibHisto::LoadCalibStat()
474 /* load calib stat */
476 if (fgCalibStatFile && fgCalibStatFile->IsOpen())
477 AliWarning("calib par file already open: reloading");
479 /* load calib histo */
482 /* open input file */
483 TFile *fileIn = TFile::Open(GetCalibStatFileName());
484 if (!fileIn || !fileIn->IsOpen()) {
485 AliError(Form("cannot open input file %s", GetCalibStatFileName()));
489 /* set calib par file */
490 fgCalibStatFile = fileIn;
493 for (Int_t i = 0; i < kNcalibStats; i++)
494 LoadHisto(fileIn, &fCalibStat[i], fgkCalibStatName[i].Data());
498 //__________________________________________________________________________
501 AliTOFcalibHisto::WriteCalibHisto()
503 /* write calib histo */
505 /* open output file */
506 TFile *fileOut = TFile::Open(GetCalibHistoFileName(), "RECREATE");
507 if (!fileOut || !fileOut->IsOpen()) {
508 AliFatal(Form("cannot open output file %s", GetCalibHistoFileName()));
513 for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
514 CreateHisto(&fCalibConst[iConst], fgkCalibConstName[iConst].Data(), 1);
516 for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
518 CreateHisto(&fCalibMap[iMap], fgkCalibMapName[iMap].Data(), fgkNchannelsEO);
520 CreateHisto(&fCalibMap[iMap], fgkCalibMapName[iMap].Data(), fgkNchannels);
522 /*** SETUP CONSTS ***/
524 SetHisto(fCalibConst[kLHCperiod], 0, fgkLHCperiod);
525 SetHisto(fCalibConst[kAmphenolCableDelay], 0, fgkAmphenolCableDelay);
526 SetHisto(fCalibConst[kFlatCableDelay], 0, fgkFlatCableDelay);
527 SetHisto(fCalibConst[kInterfaceCardDelay], 0, fgkInterfaceCardDelay);
531 AliTOFRawStream rawStream;
532 Int_t indexEO, det[5], dummy, index, sector, plate, strip, sectorStrip, padz, padx, pad, icIndex;
534 /* temporarly disable warnings */
535 AliLog::EType_t logLevel = (AliLog::EType_t)AliLog::GetGlobalLogLevel();
536 AliLog::SetGlobalLogLevel(AliLog::kError);
538 /* loop over electronics oriented (EO) indices */
539 for (Int_t ddl = 0; ddl < 72; ddl++)
540 for (Int_t trm = 0; trm < 10; trm++)
541 for (Int_t chain = 0; chain < 2; chain++)
542 for (Int_t tdc = 0; tdc < 15; tdc++)
543 for (Int_t channel = 0; channel < 8; channel++) {
545 /* compute index EO */
546 indexEO = GetIndexEO(ddl, trm, chain, tdc, channel);
548 /* convert EO indices into detector oriented (DO) indices
549 (this call causes some warnings because the loop includes
550 EO indices which are not connected to physical channels) */
551 rawStream.EquipmentId2VolumeId(ddl, trm + 3, chain, tdc, channel, det);
553 /* swap det[3] and det[4] */
554 dummy = det[3]; det[3] = det[4]; det[4] = dummy;
556 /* check detector indices */
557 if (det[0] < 0 || det[0] > 17 ||
558 det[1] < 0 || det[1] > 4 ||
559 det[2] < 0 || det[2] > 18 ||
560 det[3] < 0 || det[3] > 1 ||
561 det[4] < 0 || det[4] > 47) {
562 SetHisto(fCalibMap[kIndex], indexEO, -1);
566 /* setup information */
567 index = AliTOFGeometry::GetIndex(det);
571 sectorStrip = plate < 3 ? plate * 19 + strip : plate * 19 - 4 + strip;
574 pad = padz + 2 * padx;
575 icIndex = pad < 48 ? pad : 95 - pad;
580 SetHisto(fCalibMap[kIndex], indexEO, index);
582 SetHisto(fCalibMap[kDDL], index, ddl);
583 SetHisto(fCalibMap[kTRM], index, trm);
584 SetHisto(fCalibMap[kChain], index, chain);
585 SetHisto(fCalibMap[kTDC], index, tdc);
586 SetHisto(fCalibMap[kChannel], index, channel);
588 SetHisto(fCalibMap[kSector], index, sector);
589 SetHisto(fCalibMap[kPlate], index, plate);
590 SetHisto(fCalibMap[kStrip], index, strip);
591 SetHisto(fCalibMap[kSectorStrip], index, sectorStrip);
592 SetHisto(fCalibMap[kPadZ], index, padz);
593 SetHisto(fCalibMap[kPadX], index, padx);
594 SetHisto(fCalibMap[kPad], index, pad);
595 SetHisto(fCalibMap[kInterfaceCardIndex], index, icIndex);
596 /* calib constants */
597 SetHisto(fCalibMap[kDDLBCshift], index, fgkDDLBCshift[ddl]);
598 SetHisto(fCalibMap[kFlatCableLength], index, fgkFlatCableLength[sectorStrip]);
599 SetHisto(fCalibMap[kInterfaceCardLength], index, fgkInterfaceCardLength[icIndex]);
600 SetHisto(fCalibMap[kAmphenolCableLength], index, AliTOFCableLengthMap::GetCableLength(ddl, trm + 3, chain, tdc));
602 } /* loop over electronics oriented (EO) indices */
604 /* re-enable warnings */
605 AliLog::SetGlobalLogLevel(logLevel);
608 for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
609 WriteHisto(fileOut, fCalibConst[iConst]);
611 for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
612 WriteHisto(fileOut, fCalibMap[iMap]);
614 /* close output file */
618 //__________________________________________________________________________
621 AliTOFcalibHisto::WriteCalibStat()
623 /* write calib stat */
625 /* open output file */
626 TFile *fileOut = TFile::Open(GetCalibStatFileName(), "RECREATE");
627 if (!fileOut || !fileOut->IsOpen()) {
628 AliFatal(Form("cannot open output file %s", GetCalibStatFileName()));
633 for (Int_t iStat = 0; iStat < kNcalibStats; iStat++)
634 CreateHisto(&fCalibStat[iStat], fgkCalibStatName[iStat].Data(), fgkNchannels);
636 /*** SETUP STATS ***/
638 Int_t sector, sectorStrip;
640 /* load calib histo */
643 /* loop over channels */
644 for (Int_t index = 0; index < fgkNchannels; index++) {
645 sector = (Int_t)GetCalibMap(kSector, index);
646 sectorStrip = (Int_t)GetCalibMap(kSectorStrip, index);
648 SetHisto(fCalibStat[kStripStat], index, (Double_t)fgkStripStat[sector][sectorStrip]);
649 } /* loop over channels */
652 for (Int_t iStat = 0; iStat < kNcalibStats; iStat++)
653 WriteHisto(fileOut, fCalibStat[iStat]);
655 /* close output file */
659 //__________________________________________________________________________
662 AliTOFcalibHisto::GetCorrection(Int_t corr, Int_t index, Double_t tot)
664 /* apply correction */
666 Int_t ddl, chain, tdc, channel, hptdc, pbCh, feaIndex, sector, padx, trm, icIndex, sectorStrip;
671 return -GetCalibConst(kLHCperiod) * GetCalibMap(kDDLBCshift, index);
672 case kAmphenolCableCorr:
673 return GetCalibConst(kAmphenolCableDelay) * GetCalibMap(kAmphenolCableLength, index);
675 return GetCalibConst(kFlatCableDelay) * GetCalibMap(kFlatCableLength, index);
676 case kInterfaceCardCorr:
677 return GetCalibConst(kInterfaceCardDelay) * GetCalibMap(kInterfaceCardLength, index);
679 ddl = (Int_t)GetCalibMap(kDDL, index);
680 return GetCalibPar(kDDLdelayPar, ddl);
681 case kHPTDCdelayCorr:
682 chain = (Int_t)GetCalibMap(kChain, index);
683 tdc = (Int_t)GetCalibMap(kTDC, index);
684 hptdc = tdc + 15 * chain;
685 return GetCalibPar(kHPTDCdelayPar, hptdc);
686 case kFEAchDelayCorr:
687 ddl = (Int_t)GetCalibMap(kDDL, index);
688 tdc = (Int_t)GetCalibMap(kTDC, index);
689 channel = (Int_t)GetCalibMap(kChannel, index);
690 pbCh = channel + 8 * (tdc % 3);
692 return GetCalibPar(kRightFEAchDelayPar, pbCh);
694 return GetCalibPar(kLeftFEAchDelayPar, pbCh);
696 sector = (Int_t)GetCalibMap(kSector, index);
697 sectorStrip = (Int_t)GetCalibMap(kSectorStrip, index);
698 padx = (Int_t)GetCalibMap(kPadX, index);
699 feaIndex = padx / 12 + 4 * sectorStrip + 364 * sector;
700 return GetCalibPar(kFEAdelayPar, feaIndex);
702 ddl = (Int_t)GetCalibMap(kDDL, index);
703 trm = (Int_t)GetCalibMap(kTRM, index);
704 return GetCalibPar(kTRMdelayPar, trm + 10 * ddl);
706 icIndex = (Int_t)GetCalibMap(kInterfaceCardIndex, index);
707 return GetCalibPar(kICdelayPar, icIndex);
708 case kStripDelayCorr:
709 sector = (Int_t)GetCalibMap(kSector, index);
710 sectorStrip = (Int_t)GetCalibMap(kSectorStrip, index);
711 return GetCalibPar(kStripDelayPar, sectorStrip + 91 * sector);
712 case kIndexDelayCorr:
713 return GetCalibPar(kIndexDelayPar, index);
714 case kTimeSlewingCorr:
715 tot = tot < SLEW_TOTMIN ? SLEW_TOTMIN : tot;
716 tot = tot > SLEW_TOTMAX ? SLEW_TOTMAX : tot;
718 for (Int_t i = 0; i < fCalibPar[kTimeSlewingPar]->GetNbinsX(); i++)
719 slewing += GetCalibPar(kTimeSlewingPar, i) * TMath::Power(tot, i);
722 AliWarning(Form("unknown correction flag (%d)", corr));
727 //__________________________________________________________________________
730 AliTOFcalibHisto::GetNominalCorrection(Int_t index)
732 /* get nominal correction */
734 for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
735 corr += GetCorrection(iCorr, index);
739 //__________________________________________________________________________
742 AliTOFcalibHisto::ApplyNominalCorrection(AliESDtrack *track)
744 /* apply nominal correction */
746 Double_t rawTime = track->GetTOFsignalRaw();
747 Int_t index = track->GetTOFCalChannel();
748 Double_t time = rawTime - 1.e3 * GetNominalCorrection(index);
749 track->SetTOFsignal(time);
752 //__________________________________________________________________________
755 AliTOFcalibHisto::GetCableCorrection(Int_t index)
757 /* get cable correction */
759 for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
760 if (fgCableCorrectionFlag[iCorr])
761 corr += GetCorrection(iCorr, index);
765 //__________________________________________________________________________
768 AliTOFcalibHisto::GetFullCorrection(Int_t index, Double_t tot)
770 /* get full correction */
772 for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
773 if (fgFullCorrectionFlag[iCorr]) {
774 corr += GetCorrection(iCorr, index, tot);
779 //__________________________________________________________________________
782 AliTOFcalibHisto::GetStatus(Int_t index)
786 Bool_t status = kTRUE;
788 for (Int_t iStat = 0; iStat < kNcalibStats; iStat++)
789 status &= GetCalibStat(iStat, index);