]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TOF/AliTOFcalibHisto.cxx
Fix compiler warning
[u/mrichter/AliRoot.git] / TOF / AliTOFcalibHisto.cxx
CommitLineData
2cdf778a 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16/*************************************************************************
17 *
18 * AliTOFcalibHisto - class to handle TOF calibration histograms,
19 * map histograms and more
20 *
21 * autors: Roberto Preghenella (R+)
22 * concacts: preghenella@bo.infn.it
23 *
24 *************************************************************************/
25
26#include "AliTOFcalibHisto.h"
27#include "AliLog.h"
28#include "TH1F.h"
29#include "TFile.h"
30#include "AliTOFRawStream.h"
31#include "AliTOFCableLengthMap.h"
32#include "AliESDtrack.h"
33
34ClassImp(AliTOFcalibHisto)
35
36//__________________________________________________________________________
37
38TFile *AliTOFcalibHisto::fgCalibHistoFile = NULL;
39TFile *AliTOFcalibHisto::fgCalibParFile = NULL;
40
41//__________________________________________________________________________
42
43TString AliTOFcalibHisto::fgCalibHistoFileName = "$ALICE_ROOT/TOF/data/AliTOFcalibHisto.root";
44TString AliTOFcalibHisto::fgCalibParFileName = "$ALICE_ROOT/TOF/data/AliTOFcalibPar.root";
45
46//__________________________________________________________________________
47
48const TString AliTOFcalibHisto::fgkCalibConstName[kNcalibConsts] = {
49 "LHCperiod",
50 "AmphenolCableDelay",
51 "FlatCableDelay",
52 "InterfaceCardDelay"
53};
54
55//__________________________________________________________________________
56
57const TString AliTOFcalibHisto::fgkCalibMapName[kNcalibMaps] = {
0e095c11 58 /* main index */
59 "Index",
2cdf778a 60 /* EO indices */
61 "DDL",
62 "TRM",
63 "Chain",
64 "TDC",
65 "Channel",
66 /* DO indices */
67 "Sector",
68 "Plate",
69 "Strip",
70 "SectorStrip",
71 "PadZ",
72 "PadX",
73 "Pad",
74 "InterfaceCardIndex",
75 /* calib constants */
76 "DDLBCshift",
77 "FlatCableLength",
78 "InterfaceCardLength",
79 "AmphenolCableLength"
80};
81
82//__________________________________________________________________________
83
84const TString AliTOFcalibHisto::fgkCalibParName[kNcalibPars] = {
85 "hDDLDelay",
86 "hHPTDCDelay",
87 "hLeftFEAchDelay",
88 "hRightFEAchDelay",
89 "hFEADelay",
90 "hTRMDelay",
91 "hSlew"
92};
93
94//__________________________________________________________________________
95
96/* LHC clock period [ns] */
97const Float_t AliTOFcalibHisto::fgkLHCperiod = 25.; /* SET THE CORRECT VALUE !!! */
98
99//__________________________________________________________________________
100
101/* Amphenol cable delay [ns/cm] */
102const Float_t AliTOFcalibHisto::fgkAmphenolCableDelay = 5.13e-2; /* from measurement */
103
104//__________________________________________________________________________
105
106/* flat cable delay [ns/cm] */
107//const Float_t AliTOFcalibHisto::fgkFlatCableDelay = 5.3e-2; /* from Amphenol 132-2829 series data-sheet */
108const Float_t AliTOFcalibHisto::fgkFlatCableDelay = 5.124e-2; /* from LHC08d calibration */
109
110//__________________________________________________________________________
111
112/* interface card delay [ns/cm] */
113//const Float_t AliTOFcalibHisto::fgkInterfaceCardDelay = 6.9e-2; /* from HyperLinx simulation */
114const Float_t AliTOFcalibHisto::fgkInterfaceCardDelay = 5.7898e-2; /* from LHC08d calibration */
115
116//__________________________________________________________________________
117
0e095c11 118/* number of readout channels (DO/EO) */
2cdf778a 119const Int_t AliTOFcalibHisto::fgkNchannels = 157248;
0e095c11 120const Int_t AliTOFcalibHisto::fgkNchannelsEO = 172800;
2cdf778a 121
122//__________________________________________________________________________
123
124/* DDL BC shifts due to TTC fibers [LHCperiod] */
125const Int_t AliTOFcalibHisto::fgkDDLBCshift[72] = {
126 2, 2, -1, -1,
127 2, 2, 0, 0,
128 2, 2, 0, 0,
129 2, 2, 0, 0,
130 2, 2, 0, 0,
131 2, 2, 0, 0,
132 2, 2, 0, 0,
133 2, 2, 0, 0,
134 2, 2, 0, 0,
135 2, 2, 0, 0,
136 2, 2, -1, -1,
137 2, 2, -1, -1,
138 2, 2, -2, -2,
139 2, 2, -2, -2,
140 2, 2, -2, -2,
141 2, 2, -1, -1,
142 2, 2, -1, -1,
143 2, 2, -1, -1,
144};
145
146//__________________________________________________________________________
147
148/* strip flat-cable length (preliminary) [cm] */
149const Float_t AliTOFcalibHisto::fgkFlatCableLength[91] = {
150 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 17.,
151 21., 21., 21., 21., 21., 17., 17., 21., 21., 17., 21., 21., 21., 17., 21., 21., 17., 21., 23.,
152 17., 19., 17., 19., 17., 19., 17., 19., 17., 19., 17., 19., 17., 19., 17.,
153 23., 21., 17., 21., 21., 17., 21., 21., 21., 17., 21., 21., 17., 17., 21., 21., 21., 21., 21.,
154 17., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18.
155};
156
157//__________________________________________________________________________
158
159/* interface card lenght (preliminary) [cm] */
160const Float_t AliTOFcalibHisto::fgkInterfaceCardLength[48] = {
161 13.97, 12.57, 14.52, 13.10, 15.44, 13.60, 10.58, 9.14,
162 11.21, 9.76, 12.11, 10.76, 8.67, 7.58, 9.32, 8.09,
163 10.24, 8.4, 5.51, 4.31, 6.54, 5.23, 7.48, 6.28,
164 10.43, 8.76, 11.05, 9.43, 11.72, 10.14, 7.2, 5.69,
165 7.71, 6.26, 8.36, 7.19, 4.85, 4.09, 5.57, 4.35,
166 6.59, 5.12, 2.49, 2.96, 2.70, 2.76, 2.91, 2.55
167};
168
169//__________________________________________________________________________
170
171AliTOFcalibHisto::AliTOFcalibHisto() :
172 TObject(),
173 fCalibConst(),
174 fCalibMap(),
175 fCalibPar()
176{
177 /* default constructor */
178}
179
180//__________________________________________________________________________
181
182AliTOFcalibHisto::~AliTOFcalibHisto()
183{
184 /* default destructor */
185}
186
187//__________________________________________________________________________
188
189void
190AliTOFcalibHisto::LoadHisto(TFile* file, TH1F **histo, const Char_t *name)
191{
192 /* load histo */
193 *histo = (TH1F *)file->Get(name);
194 if (!*histo)
195 AliWarning(Form("error while getting %s histo", name));
196}
197
198//__________________________________________________________________________
199
200void
201AliTOFcalibHisto::CreateHisto(TH1F **histo, const Char_t *name, Int_t size)
202{
203 /* create histo */
204 *histo = new TH1F(name, Form(";index;%s", name), size, 0, size);
205 if (!*histo)
206 AliWarning(Form("error while creating %s histo", name));
207}
208
209//__________________________________________________________________________
210
211void
212AliTOFcalibHisto::WriteHisto(TFile *file, TH1F *histo)
213{
214 /* write histo */
215 if (!file || !file->IsOpen() || !histo)
216 return;
217 file->cd();
218 histo->Write();
219}
220
221//__________________________________________________________________________
222
223void
224AliTOFcalibHisto::SetHisto(TH1F *histo, Int_t index, Float_t value)
225{
226 /* set histo */
227 if (!histo)
228 return;
229 histo->SetBinContent(index + 1, value);
230}
231
232//__________________________________________________________________________
233
234Float_t
235AliTOFcalibHisto::GetHisto(TH1F *histo, Int_t index)
236{
237 /* get histo */
238 if (!histo) {
239 AliWarning("cannot get histo");
240 return 0.;
241 }
242 return histo->GetBinContent(index + 1);
243}
244
245//__________________________________________________________________________
246
247void
248AliTOFcalibHisto::LoadCalibHisto()
249{
250 /* load calib histo */
251
252 if (fgCalibHistoFile && fgCalibHistoFile->IsOpen())
253 AliWarning("calib histo file already open: reloading");
254
255 /* open input file */
256 TFile *fileIn = TFile::Open(GetCalibHistoFileName());
257 if (!fileIn || !fileIn->IsOpen())
258 AliFatal(Form("cannot open input file %s", GetCalibHistoFileName()));
259
260 /* set calib histo file */
261 fgCalibHistoFile = fileIn;
262
263 /* load consts */
264 for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
265 LoadHisto(fileIn, &fCalibConst[iConst], fgkCalibConstName[iConst].Data());
266 /* load maps */
267 for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
268 LoadHisto(fileIn, &fCalibMap[iMap], fgkCalibMapName[iMap].Data());
269}
270
271//__________________________________________________________________________
272
273void
274AliTOFcalibHisto::LoadCalibPar()
275{
276 /* load calib par */
277
278 if (fgCalibParFile && fgCalibParFile->IsOpen())
279 AliWarning("calib par file already open: reloading");
280
281 /* load calib histo */
282 LoadCalibHisto();
283
284 /* open input file */
285 TFile *fileIn = TFile::Open(GetCalibParFileName());
286 if (!fileIn || !fileIn->IsOpen())
287 AliError(Form("cannot open input file %s", GetCalibParFileName()));
288
289 /* set calib par file */
290 fgCalibParFile = fileIn;
291
292 /* load pars */
293 for (Int_t i = 0; i < kNcalibPars; i++)
294 LoadHisto(fileIn, &fCalibPar[i], fgkCalibParName[i].Data());
295
296}
297
298//__________________________________________________________________________
299
300void
301AliTOFcalibHisto::WriteCalibHisto()
302{
303 /* write calib histo */
304
305 /* open output file */
306 TFile *fileOut = TFile::Open(GetCalibHistoFileName(), "RECREATE");
307 if (!fileOut || !fileOut->IsOpen())
308 AliFatal(Form("cannot open output file %s", GetCalibHistoFileName()));
309
310 /* create consts */
311 for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
312 CreateHisto(&fCalibConst[iConst], fgkCalibConstName[iConst].Data(), 1);
313 /* create maps */
314 for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
0e095c11 315 if (iMap == kIndex)
316 CreateHisto(&fCalibMap[iMap], fgkCalibMapName[iMap].Data(), fgkNchannelsEO);
317 else
318 CreateHisto(&fCalibMap[iMap], fgkCalibMapName[iMap].Data(), fgkNchannels);
2cdf778a 319
320 /*** SETUP CONSTS ***/
321
322 SetHisto(fCalibConst[kLHCperiod], 0, fgkLHCperiod);
323 SetHisto(fCalibConst[kAmphenolCableDelay], 0, fgkAmphenolCableDelay);
324 SetHisto(fCalibConst[kFlatCableDelay], 0, fgkFlatCableDelay);
325 SetHisto(fCalibConst[kInterfaceCardDelay], 0, fgkInterfaceCardDelay);
326
327 /*** SETUP MAPS ***/
328
329 AliTOFRawStream rawStream;
0e095c11 330 Int_t indexEO, det[5], dummy, index, sector, plate, strip, sectorStrip, padz, padx, pad, icIndex;
2cdf778a 331
332 /* temporarly disable warnings */
333 AliLog::EType_t logLevel = (AliLog::EType_t)AliLog::GetGlobalLogLevel();
334 AliLog::SetGlobalLogLevel(AliLog::kError);
335
336 /* loop over electronics oriented (EO) indices */
337 for (Int_t ddl = 0; ddl < 72; ddl++)
338 for (Int_t trm = 0; trm < 10; trm++)
339 for (Int_t chain = 0; chain < 2; chain++)
340 for (Int_t tdc = 0; tdc < 15; tdc++)
341 for (Int_t channel = 0; channel < 8; channel++) {
342
343 /* convert EO indices into detector oriented (DO) indices
344 (this call causes some warnings because the loop includes
345 EO indices which are not connected to physical channels) */
346 rawStream.EquipmentId2VolumeId(ddl, trm + 3, chain, tdc, channel, det);
347
348 /* swap det[3] and det[4] */
349 dummy = det[3]; det[3] = det[4]; det[4] = dummy;
350
351 /* check detector indices */
352 if (det[0] < 0 || det[0] > 71 ||
353 det[1] < 0 || det[1] > 4 ||
354 det[2] < 0 || det[2] > 18 ||
355 det[3] < 0 || det[3] > 1 ||
356 det[4] < 0 || det[4] > 47)
357 continue;
358
359 /* setup information */
0e095c11 360 indexEO = GetIndexEO(ddl, trm, chain, tdc, channel);
2cdf778a 361 index = AliTOFGeometry::GetIndex(det);
362 sector = det[0];
363 plate = det[1];
364 strip = det[2];
365 sectorStrip = plate < 3 ? plate * 19 + strip : plate * 19 - 4 + strip;
366 padz = det[3];
367 padx = det[4];
368 pad = padz + 2 * padx;
369 icIndex = pad < 48 ? pad : 95 - pad;
370
371 /* set maps */
372
0e095c11 373 /* main index */
374 SetHisto(fCalibMap[kIndex], indexEO, index);
2cdf778a 375 /* EO indices */
376 SetHisto(fCalibMap[kDDL], index, ddl);
377 SetHisto(fCalibMap[kTRM], index, trm);
378 SetHisto(fCalibMap[kChain], index, chain);
379 SetHisto(fCalibMap[kTDC], index, tdc);
380 SetHisto(fCalibMap[kChannel], index, channel);
381 /* DO indices */
382 SetHisto(fCalibMap[kSector], index, sector);
383 SetHisto(fCalibMap[kPlate], index, plate);
384 SetHisto(fCalibMap[kStrip], index, strip);
385 SetHisto(fCalibMap[kSectorStrip], index, sectorStrip);
386 SetHisto(fCalibMap[kPadZ], index, padz);
387 SetHisto(fCalibMap[kPadX], index, padx);
388 SetHisto(fCalibMap[kPad], index, pad);
389 SetHisto(fCalibMap[kInterfaceCardIndex], index, icIndex);
390 /* calib constants */
391 SetHisto(fCalibMap[kDDLBCshift], index, fgkDDLBCshift[ddl]);
392 SetHisto(fCalibMap[kFlatCableLength], index, fgkFlatCableLength[sectorStrip]);
393 SetHisto(fCalibMap[kInterfaceCardLength], index, fgkInterfaceCardLength[icIndex]);
394 SetHisto(fCalibMap[kAmphenolCableLength], index, AliTOFCableLengthMap::GetCableLength(ddl, trm + 3, chain, tdc));
395
396 } /* loop over electronics oriented (EO) indices */
397
398 /* re-enable warnings */
399 AliLog::SetGlobalLogLevel(logLevel);
400
401 /* write consts */
402 for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
403 WriteHisto(fileOut, fCalibConst[iConst]);
404 /* write maps */
405 for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
406 WriteHisto(fileOut, fCalibMap[iMap]);
407
408 /* close output file */
409 fileOut->Close();
410}
411
412//__________________________________________________________________________
413
414Float_t
415AliTOFcalibHisto::GetCorrection(Int_t corr, Int_t index, Float_t tot)
416{
417 /* apply correction */
418
419 Int_t ddl, chain, tdc, channel, hptdc, pbCh, feaIndex, sector, plate, strip, padx, trm;
420 Float_t slewing;
421
422 switch (corr) {
423 case kDDLBCcorr:
424 return -GetCalibConst(kLHCperiod) * GetCalibMap(kDDLBCshift, index);
425 case kAmphenolCableCorr:
426 return GetCalibConst(kAmphenolCableDelay) * GetCalibMap(kAmphenolCableLength, index);
427 case kFlatCableCorr:
428 return GetCalibConst(kFlatCableDelay) * GetCalibMap(kFlatCableLength, index);
429 case kInterfaceCardCorr:
430 return GetCalibConst(kInterfaceCardDelay) * GetCalibMap(kInterfaceCardLength, index);
431 case kDDLdelayCorr:
432 ddl = (Int_t)GetCalibMap(kDDL, index);
433 return GetCalibPar(kDDLdelayPar, ddl);
434 case kHPTDCdelayCorr:
435 chain = (Int_t)GetCalibMap(kChain, index);
436 tdc = (Int_t)GetCalibMap(kTDC, index);
437 hptdc = tdc + 15 * chain;
438 return GetCalibPar(kHPTDCdelayPar, hptdc);
439 case kFEAchDelayCorr:
440 ddl = (Int_t)GetCalibMap(kDDL, index);
441 tdc = (Int_t)GetCalibMap(kTDC, index);
442 channel = (Int_t)GetCalibMap(kChannel, index);
443 pbCh = channel + 8 * (tdc % 3);
444 if (ddl % 2 == 0)
445 return GetCalibPar(kRightFEAchDelayPar, pbCh);
446 else
447 return GetCalibPar(kLeftFEAchDelayPar, pbCh);
448 case kFEAdelayCorr:
449 sector = (Int_t)GetCalibMap(kSector, index);
450 plate = (Int_t)GetCalibMap(kPlate, index);
451 strip = (Int_t)GetCalibMap(kStrip, index);
452 padx = (Int_t)GetCalibMap(kPadX, index);
453 feaIndex = padx / 12 + 4 * strip + 4 * 19 * plate + 4 * 19 * 5 * sector;
454 return GetCalibPar(kFEAdelayPar, feaIndex);
455 case kTRMdelayCorr:
456 trm = (Int_t)GetCalibMap(kTRM, index);
457 return GetCalibPar(kTRMdelayPar, trm);
458 case kTimeSlewingCorr:
459 slewing = 0.;
460 for (Int_t i = 0; i < fCalibPar[kTimeSlewingPar]->GetNbinsX(); i++)
461 slewing += GetCalibPar(kTimeSlewingPar, i) * TMath::Power(tot, i);
462 return slewing;
463 default:
464 AliWarning(Form("unknown correction flag (%d)", corr));
465 return 0.;
466 }
467}
468
469//__________________________________________________________________________
470
471Float_t
472AliTOFcalibHisto::GetNominalCorrection(Int_t index)
473{
474 /* get nominal correction */
475 Float_t corr = 0;
476 for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
477 corr += GetCorrection(iCorr, index);
478 return corr;
479}
480
481//__________________________________________________________________________
482
483void
484AliTOFcalibHisto::ApplyNominalCorrection(AliESDtrack *track)
485{
486 /* apply nominal correction */
487
488 Double_t rawTime = track->GetTOFsignalRaw();
489 Int_t index = track->GetTOFCalChannel();
490 Double_t time = rawTime - 1.e3 * GetNominalCorrection(index);
491 track->SetTOFsignal(time);
492}
0e095c11 493