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()));
487 /* set calib par file */
488 fgCalibStatFile = fileIn;
491 for (Int_t i = 0; i < kNcalibStats; i++)
492 LoadHisto(fileIn, &fCalibStat[i], fgkCalibStatName[i].Data());
496 //__________________________________________________________________________
499 AliTOFcalibHisto::WriteCalibHisto()
501 /* write calib histo */
503 /* open output file */
504 TFile *fileOut = TFile::Open(GetCalibHistoFileName(), "RECREATE");
505 if (!fileOut || !fileOut->IsOpen()) {
506 AliFatal(Form("cannot open output file %s", GetCalibHistoFileName()));
511 for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
512 CreateHisto(&fCalibConst[iConst], fgkCalibConstName[iConst].Data(), 1);
514 for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
516 CreateHisto(&fCalibMap[iMap], fgkCalibMapName[iMap].Data(), fgkNchannelsEO);
518 CreateHisto(&fCalibMap[iMap], fgkCalibMapName[iMap].Data(), fgkNchannels);
520 /*** SETUP CONSTS ***/
522 SetHisto(fCalibConst[kLHCperiod], 0, fgkLHCperiod);
523 SetHisto(fCalibConst[kAmphenolCableDelay], 0, fgkAmphenolCableDelay);
524 SetHisto(fCalibConst[kFlatCableDelay], 0, fgkFlatCableDelay);
525 SetHisto(fCalibConst[kInterfaceCardDelay], 0, fgkInterfaceCardDelay);
529 AliTOFRawStream rawStream;
530 Int_t indexEO, det[5], dummy, index, sector, plate, strip, sectorStrip, padz, padx, pad, icIndex;
532 /* temporarly disable warnings */
533 AliLog::EType_t logLevel = (AliLog::EType_t)AliLog::GetGlobalLogLevel();
534 AliLog::SetGlobalLogLevel(AliLog::kError);
536 /* loop over electronics oriented (EO) indices */
537 for (Int_t ddl = 0; ddl < 72; ddl++)
538 for (Int_t trm = 0; trm < 10; trm++)
539 for (Int_t chain = 0; chain < 2; chain++)
540 for (Int_t tdc = 0; tdc < 15; tdc++)
541 for (Int_t channel = 0; channel < 8; channel++) {
543 /* compute index EO */
544 indexEO = GetIndexEO(ddl, trm, chain, tdc, channel);
546 /* convert EO indices into detector oriented (DO) indices
547 (this call causes some warnings because the loop includes
548 EO indices which are not connected to physical channels) */
549 rawStream.EquipmentId2VolumeId(ddl, trm + 3, chain, tdc, channel, det);
551 /* swap det[3] and det[4] */
552 dummy = det[3]; det[3] = det[4]; det[4] = dummy;
554 /* check detector indices */
555 if (det[0] < 0 || det[0] > 17 ||
556 det[1] < 0 || det[1] > 4 ||
557 det[2] < 0 || det[2] > 18 ||
558 det[3] < 0 || det[3] > 1 ||
559 det[4] < 0 || det[4] > 47) {
560 SetHisto(fCalibMap[kIndex], indexEO, -1);
564 /* setup information */
565 index = AliTOFGeometry::GetIndex(det);
569 sectorStrip = plate < 3 ? plate * 19 + strip : plate * 19 - 4 + strip;
572 pad = padz + 2 * padx;
573 icIndex = pad < 48 ? pad : 95 - pad;
578 SetHisto(fCalibMap[kIndex], indexEO, index);
580 SetHisto(fCalibMap[kDDL], index, ddl);
581 SetHisto(fCalibMap[kTRM], index, trm);
582 SetHisto(fCalibMap[kChain], index, chain);
583 SetHisto(fCalibMap[kTDC], index, tdc);
584 SetHisto(fCalibMap[kChannel], index, channel);
586 SetHisto(fCalibMap[kSector], index, sector);
587 SetHisto(fCalibMap[kPlate], index, plate);
588 SetHisto(fCalibMap[kStrip], index, strip);
589 SetHisto(fCalibMap[kSectorStrip], index, sectorStrip);
590 SetHisto(fCalibMap[kPadZ], index, padz);
591 SetHisto(fCalibMap[kPadX], index, padx);
592 SetHisto(fCalibMap[kPad], index, pad);
593 SetHisto(fCalibMap[kInterfaceCardIndex], index, icIndex);
594 /* calib constants */
595 SetHisto(fCalibMap[kDDLBCshift], index, fgkDDLBCshift[ddl]);
596 SetHisto(fCalibMap[kFlatCableLength], index, fgkFlatCableLength[sectorStrip]);
597 SetHisto(fCalibMap[kInterfaceCardLength], index, fgkInterfaceCardLength[icIndex]);
598 SetHisto(fCalibMap[kAmphenolCableLength], index, AliTOFCableLengthMap::GetCableLength(ddl, trm + 3, chain, tdc));
600 } /* loop over electronics oriented (EO) indices */
602 /* re-enable warnings */
603 AliLog::SetGlobalLogLevel(logLevel);
606 for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
607 WriteHisto(fileOut, fCalibConst[iConst]);
609 for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
610 WriteHisto(fileOut, fCalibMap[iMap]);
612 /* close output file */
616 //__________________________________________________________________________
619 AliTOFcalibHisto::WriteCalibStat()
621 /* write calib stat */
623 /* open output file */
624 TFile *fileOut = TFile::Open(GetCalibStatFileName(), "RECREATE");
625 if (!fileOut || !fileOut->IsOpen()) {
626 AliFatal(Form("cannot open output file %s", GetCalibStatFileName()));
631 for (Int_t iStat = 0; iStat < kNcalibStats; iStat++)
632 CreateHisto(&fCalibStat[iStat], fgkCalibStatName[iStat].Data(), fgkNchannels);
634 /*** SETUP STATS ***/
636 Int_t sector, sectorStrip;
638 /* load calib histo */
641 /* loop over channels */
642 for (Int_t index = 0; index < fgkNchannels; index++) {
643 sector = (Int_t)GetCalibMap(kSector, index);
644 sectorStrip = (Int_t)GetCalibMap(kSectorStrip, index);
646 SetHisto(fCalibStat[kStripStat], index, (Double_t)fgkStripStat[sector][sectorStrip]);
647 } /* loop over channels */
650 for (Int_t iStat = 0; iStat < kNcalibStats; iStat++)
651 WriteHisto(fileOut, fCalibStat[iStat]);
653 /* close output file */
657 //__________________________________________________________________________
660 AliTOFcalibHisto::GetCorrection(Int_t corr, Int_t index, Double_t tot)
662 /* apply correction */
664 Int_t ddl, chain, tdc, channel, hptdc, pbCh, feaIndex, sector, plate, padx, trm, icIndex, sectorStrip;
669 return -GetCalibConst(kLHCperiod) * GetCalibMap(kDDLBCshift, index);
670 case kAmphenolCableCorr:
671 return GetCalibConst(kAmphenolCableDelay) * GetCalibMap(kAmphenolCableLength, index);
673 return GetCalibConst(kFlatCableDelay) * GetCalibMap(kFlatCableLength, index);
674 case kInterfaceCardCorr:
675 return GetCalibConst(kInterfaceCardDelay) * GetCalibMap(kInterfaceCardLength, index);
677 ddl = (Int_t)GetCalibMap(kDDL, index);
678 return GetCalibPar(kDDLdelayPar, ddl);
679 case kHPTDCdelayCorr:
680 chain = (Int_t)GetCalibMap(kChain, index);
681 tdc = (Int_t)GetCalibMap(kTDC, index);
682 hptdc = tdc + 15 * chain;
683 return GetCalibPar(kHPTDCdelayPar, hptdc);
684 case kFEAchDelayCorr:
685 ddl = (Int_t)GetCalibMap(kDDL, index);
686 tdc = (Int_t)GetCalibMap(kTDC, index);
687 channel = (Int_t)GetCalibMap(kChannel, index);
688 pbCh = channel + 8 * (tdc % 3);
690 return GetCalibPar(kRightFEAchDelayPar, pbCh);
692 return GetCalibPar(kLeftFEAchDelayPar, pbCh);
694 sector = (Int_t)GetCalibMap(kSector, index);
695 plate = (Int_t)GetCalibMap(kPlate, index);
696 sectorStrip = (Int_t)GetCalibMap(kSectorStrip, index);
697 padx = (Int_t)GetCalibMap(kPadX, index);
698 feaIndex = padx / 12 + 4 * sectorStrip + 364 * sector;
699 return GetCalibPar(kFEAdelayPar, feaIndex);
701 ddl = (Int_t)GetCalibMap(kDDL, index);
702 trm = (Int_t)GetCalibMap(kTRM, index);
703 return GetCalibPar(kTRMdelayPar, trm + 10 * ddl);
705 icIndex = (Int_t)GetCalibMap(kInterfaceCardIndex, index);
706 return GetCalibPar(kICdelayPar, icIndex);
707 case kStripDelayCorr:
708 sector = (Int_t)GetCalibMap(kSector, index);
709 sectorStrip = (Int_t)GetCalibMap(kSectorStrip, index);
710 return GetCalibPar(kStripDelayPar, sectorStrip + 91 * sector);
711 case kIndexDelayCorr:
712 return GetCalibPar(kIndexDelayPar, index);
713 case kTimeSlewingCorr:
714 tot = tot < SLEW_TOTMIN ? SLEW_TOTMIN : tot;
715 tot = tot > SLEW_TOTMAX ? SLEW_TOTMAX : tot;
717 for (Int_t i = 0; i < fCalibPar[kTimeSlewingPar]->GetNbinsX(); i++)
718 slewing += GetCalibPar(kTimeSlewingPar, i) * TMath::Power(tot, i);
721 AliWarning(Form("unknown correction flag (%d)", corr));
726 //__________________________________________________________________________
729 AliTOFcalibHisto::GetNominalCorrection(Int_t index)
731 /* get nominal correction */
733 for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
734 corr += GetCorrection(iCorr, index);
738 //__________________________________________________________________________
741 AliTOFcalibHisto::ApplyNominalCorrection(AliESDtrack *track)
743 /* apply nominal correction */
745 Double_t rawTime = track->GetTOFsignalRaw();
746 Int_t index = track->GetTOFCalChannel();
747 Double_t time = rawTime - 1.e3 * GetNominalCorrection(index);
748 track->SetTOFsignal(time);
751 //__________________________________________________________________________
754 AliTOFcalibHisto::GetCableCorrection(Int_t index)
756 /* get cable correction */
758 for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
759 if (fgCableCorrectionFlag[iCorr])
760 corr += GetCorrection(iCorr, index);
764 //__________________________________________________________________________
767 AliTOFcalibHisto::GetFullCorrection(Int_t index, Double_t tot)
769 /* get full correction */
771 for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
772 if (fgFullCorrectionFlag[iCorr]) {
773 corr += GetCorrection(iCorr, index, tot);
778 //__________________________________________________________________________
781 AliTOFcalibHisto::GetStatus(Int_t index)
785 Bool_t status = kTRUE;
787 for (Int_t iStat = 0; iStat < kNcalibStats; iStat++)
788 status &= GetCalibStat(iStat, index);