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, plate, 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 plate = (Int_t)GetCalibMap(kPlate, index);
698 sectorStrip = (Int_t)GetCalibMap(kSectorStrip, index);
699 padx = (Int_t)GetCalibMap(kPadX, index);
700 feaIndex = padx / 12 + 4 * sectorStrip + 364 * sector;
701 return GetCalibPar(kFEAdelayPar, feaIndex);
703 ddl = (Int_t)GetCalibMap(kDDL, index);
704 trm = (Int_t)GetCalibMap(kTRM, index);
705 return GetCalibPar(kTRMdelayPar, trm + 10 * ddl);
707 icIndex = (Int_t)GetCalibMap(kInterfaceCardIndex, index);
708 return GetCalibPar(kICdelayPar, icIndex);
709 case kStripDelayCorr:
710 sector = (Int_t)GetCalibMap(kSector, index);
711 sectorStrip = (Int_t)GetCalibMap(kSectorStrip, index);
712 return GetCalibPar(kStripDelayPar, sectorStrip + 91 * sector);
713 case kIndexDelayCorr:
714 return GetCalibPar(kIndexDelayPar, index);
715 case kTimeSlewingCorr:
716 tot = tot < SLEW_TOTMIN ? SLEW_TOTMIN : tot;
717 tot = tot > SLEW_TOTMAX ? SLEW_TOTMAX : tot;
719 for (Int_t i = 0; i < fCalibPar[kTimeSlewingPar]->GetNbinsX(); i++)
720 slewing += GetCalibPar(kTimeSlewingPar, i) * TMath::Power(tot, i);
723 AliWarning(Form("unknown correction flag (%d)", corr));
728 //__________________________________________________________________________
731 AliTOFcalibHisto::GetNominalCorrection(Int_t index)
733 /* get nominal correction */
735 for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
736 corr += GetCorrection(iCorr, index);
740 //__________________________________________________________________________
743 AliTOFcalibHisto::ApplyNominalCorrection(AliESDtrack *track)
745 /* apply nominal correction */
747 Double_t rawTime = track->GetTOFsignalRaw();
748 Int_t index = track->GetTOFCalChannel();
749 Double_t time = rawTime - 1.e3 * GetNominalCorrection(index);
750 track->SetTOFsignal(time);
753 //__________________________________________________________________________
756 AliTOFcalibHisto::GetCableCorrection(Int_t index)
758 /* get cable correction */
760 for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
761 if (fgCableCorrectionFlag[iCorr])
762 corr += GetCorrection(iCorr, index);
766 //__________________________________________________________________________
769 AliTOFcalibHisto::GetFullCorrection(Int_t index, Double_t tot)
771 /* get full correction */
773 for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
774 if (fgFullCorrectionFlag[iCorr]) {
775 corr += GetCorrection(iCorr, index, tot);
780 //__________________________________________________________________________
783 AliTOFcalibHisto::GetStatus(Int_t index)
787 Bool_t status = kTRUE;
789 for (Int_t iStat = 0; iStat < kNcalibStats; iStat++)
790 status &= GetCalibStat(iStat, index);