]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TOF/AliTOFcalibHisto.cxx
2c4cd36af9a00ad77cffed57a3f2c8499613c332
[u/mrichter/AliRoot.git] / TOF / AliTOFcalibHisto.cxx
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
34 ClassImp(AliTOFcalibHisto)
35
36 //__________________________________________________________________________
37
38 TFile *AliTOFcalibHisto::fgCalibHistoFile = NULL;
39 TFile *AliTOFcalibHisto::fgCalibParFile = NULL;
40
41 //__________________________________________________________________________
42
43 TString AliTOFcalibHisto::fgCalibHistoFileName = "$ALICE_ROOT/TOF/data/AliTOFcalibHisto.root";
44 TString AliTOFcalibHisto::fgCalibParFileName = "$ALICE_ROOT/TOF/data/AliTOFcalibPar.root";
45
46 //__________________________________________________________________________
47
48 const TString AliTOFcalibHisto::fgkCalibConstName[kNcalibConsts] = {
49   "LHCperiod",
50   "AmphenolCableDelay",
51   "FlatCableDelay",
52   "InterfaceCardDelay"
53 };
54
55 //__________________________________________________________________________
56
57 const TString AliTOFcalibHisto::fgkCalibMapName[kNcalibMaps] = {
58   /* main index */
59   "Index",
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
84 const 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] */
97 const Float_t AliTOFcalibHisto::fgkLHCperiod = 25.; /* SET THE CORRECT VALUE !!! */
98
99 //__________________________________________________________________________
100
101 /* Amphenol cable delay [ns/cm] */
102 const 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 */
108 const 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 */
114 const Float_t AliTOFcalibHisto::fgkInterfaceCardDelay = 5.7898e-2; /* from LHC08d calibration */
115
116 //__________________________________________________________________________
117
118 /* number of readout channels (DO/EO) */
119 const Int_t AliTOFcalibHisto::fgkNchannels = 157248;
120 const Int_t AliTOFcalibHisto::fgkNchannelsEO = 172800;
121
122 //__________________________________________________________________________
123
124 /* DDL BC shifts due to TTC fibers [LHCperiod] */
125 const 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] */
149 const 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] */
160 const 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
171 Bool_t AliTOFcalibHisto::fgCableCorrectionFlag[kNcorrections] = {
172   kFALSE, // kDDLBCcorr
173   kTRUE, // kAmphenolCableCorr
174   kTRUE, // kFlatCableCorr
175   kTRUE, // kInterfaceCardCorr
176   kFALSE, // kDDLdelayCorr
177   kFALSE, // kHPTDCdelayCorr
178   kFALSE, // kFEAchDelayCorr
179   kFALSE, // kFEAdelayCorr
180   kFALSE, // kTRMdelayCorr
181   kFALSE, // kTimeSlewingCorr
182 };
183
184 //__________________________________________________________________________
185
186 Bool_t AliTOFcalibHisto::fgFullCorrectionFlag[kNcorrections] = {
187   kFALSE, // kDDLBCcorr
188   kTRUE, // kAmphenolCableCorr
189   kTRUE, // kFlatCableCorr
190   kTRUE, // kInterfaceCardCorr
191   kTRUE, // kDDLdelayCorr
192   kTRUE, // kHPTDCdelayCorr
193   kTRUE, // kFEAchDelayCorr
194   kTRUE, // kFEAdelayCorr
195   kTRUE, // kTRMdelayCorr
196   kFALSE, // kTimeSlewingCorr
197 };
198
199 //__________________________________________________________________________
200
201 AliTOFcalibHisto::AliTOFcalibHisto() :
202   TObject(),
203   fCalibConst(),
204   fCalibMap(),
205   fCalibPar()
206 {
207   /* default constructor */
208 }
209
210 //__________________________________________________________________________
211
212 AliTOFcalibHisto::~AliTOFcalibHisto()
213 {
214   /* default destructor */
215 }
216
217 //__________________________________________________________________________
218
219 void 
220 AliTOFcalibHisto::LoadHisto(TFile* file, TH1F **histo, const Char_t *name) 
221 {
222   /* load histo */
223   *histo = (TH1F *)file->Get(name);
224   if (!*histo)
225     AliWarning(Form("error while getting %s histo", name));
226 }
227
228 //__________________________________________________________________________
229
230 void 
231 AliTOFcalibHisto::CreateHisto(TH1F **histo, const Char_t *name, Int_t size) 
232 {
233   /* create histo */
234   *histo = new TH1F(name, Form(";index;%s", name), size, 0, size);
235   if (!*histo)
236     AliWarning(Form("error while creating %s histo", name));
237 }
238
239 //__________________________________________________________________________
240
241 void 
242 AliTOFcalibHisto::WriteHisto(TFile *file, TH1F *histo) 
243 {
244   /* write histo */
245   if (!file || !file->IsOpen() || !histo)
246     return;
247   file->cd(); 
248   histo->Write();
249 }
250
251 //__________________________________________________________________________
252
253 void
254 AliTOFcalibHisto::SetHisto(TH1F *histo, Int_t index, Float_t value)
255 {
256   /* set histo */
257   if (!histo)
258     return;
259   histo->SetBinContent(index + 1, value);
260 }
261
262 //__________________________________________________________________________
263
264 Float_t
265 AliTOFcalibHisto::GetHisto(TH1F *histo, Int_t index)
266 {
267   /* get histo */
268   if (!histo) {
269     AliWarning("cannot get histo");
270     return 0.;
271   }
272   return histo->GetBinContent(index + 1);
273 }
274
275 //__________________________________________________________________________
276
277 void
278 AliTOFcalibHisto::LoadCalibHisto()
279 {
280   /* load calib histo */
281
282   if (fgCalibHistoFile && fgCalibHistoFile->IsOpen())
283     AliWarning("calib histo file already open: reloading"); 
284
285   /* open input file */
286   TFile *fileIn = TFile::Open(GetCalibHistoFileName());
287   if (!fileIn || !fileIn->IsOpen())
288     AliFatal(Form("cannot open input file %s", GetCalibHistoFileName()));
289
290   /* set calib histo file */
291   fgCalibHistoFile = fileIn;
292
293   /* load consts */
294   for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
295     LoadHisto(fileIn, &fCalibConst[iConst], fgkCalibConstName[iConst].Data());
296   /* load maps */
297   for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
298     LoadHisto(fileIn, &fCalibMap[iMap], fgkCalibMapName[iMap].Data());
299 }
300
301 //__________________________________________________________________________
302
303 void
304 AliTOFcalibHisto::LoadCalibPar()
305 {
306   /* load calib par */
307
308   if (fgCalibParFile && fgCalibParFile->IsOpen())
309     AliWarning("calib par file already open: reloading"); 
310
311   /* load calib histo */
312   LoadCalibHisto();
313
314   /* open input file */
315   TFile *fileIn = TFile::Open(GetCalibParFileName());
316   if (!fileIn || !fileIn->IsOpen())
317     AliError(Form("cannot open input file %s", GetCalibParFileName()));
318
319   /* set calib par file */
320   fgCalibParFile = fileIn;
321
322   /* load pars */
323   for (Int_t i = 0; i < kNcalibPars; i++)
324     LoadHisto(fileIn, &fCalibPar[i], fgkCalibParName[i].Data());
325
326 }
327
328 //__________________________________________________________________________
329
330 void
331 AliTOFcalibHisto::WriteCalibHisto()
332 {
333   /* write calib histo */
334
335   /* open output file */
336   TFile *fileOut = TFile::Open(GetCalibHistoFileName(), "RECREATE");
337   if (!fileOut || !fileOut->IsOpen())
338     AliFatal(Form("cannot open output file %s", GetCalibHistoFileName()));
339
340   /* create consts */
341   for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
342     CreateHisto(&fCalibConst[iConst], fgkCalibConstName[iConst].Data(), 1);
343   /* create maps */
344   for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
345     if (iMap == kIndex)
346       CreateHisto(&fCalibMap[iMap], fgkCalibMapName[iMap].Data(), fgkNchannelsEO);
347     else
348       CreateHisto(&fCalibMap[iMap], fgkCalibMapName[iMap].Data(), fgkNchannels);
349
350   /*** SETUP CONSTS ***/
351
352   SetHisto(fCalibConst[kLHCperiod], 0, fgkLHCperiod);
353   SetHisto(fCalibConst[kAmphenolCableDelay], 0, fgkAmphenolCableDelay);
354   SetHisto(fCalibConst[kFlatCableDelay], 0, fgkFlatCableDelay);
355   SetHisto(fCalibConst[kInterfaceCardDelay], 0, fgkInterfaceCardDelay);
356   
357   /***  SETUP MAPS  ***/
358
359   AliTOFRawStream rawStream;
360   Int_t indexEO, det[5], dummy, index, sector, plate, strip, sectorStrip, padz, padx, pad, icIndex;
361
362   /* temporarly disable warnings */
363   AliLog::EType_t logLevel = (AliLog::EType_t)AliLog::GetGlobalLogLevel();
364   AliLog::SetGlobalLogLevel(AliLog::kError);
365
366   /* loop over electronics oriented (EO) indices */
367   for (Int_t ddl = 0; ddl < 72; ddl++)
368     for (Int_t trm = 0; trm < 10; trm++)
369       for (Int_t chain = 0; chain < 2; chain++)
370         for (Int_t tdc = 0; tdc < 15; tdc++)
371           for (Int_t channel = 0; channel < 8; channel++) {
372             
373             /* compute index EO */
374             indexEO = GetIndexEO(ddl, trm, chain, tdc, channel);
375
376             /* convert EO indices into detector oriented (DO) indices
377                (this call causes some warnings because the loop includes
378                EO indices which are not connected to physical channels) */
379             rawStream.EquipmentId2VolumeId(ddl, trm + 3, chain, tdc, channel, det);
380             
381             /* swap det[3] and det[4] */
382             dummy = det[3]; det[3] = det[4]; det[4] = dummy;
383             
384             /* check detector indices */
385             if (det[0] < 0 || det[0] > 71 ||
386                 det[1] < 0 || det[1] > 4 ||
387                 det[2] < 0 || det[2] > 18 ||
388                 det[3] < 0 || det[3] > 1 ||
389                 det[4] < 0 || det[4] > 47) {
390               SetHisto(fCalibMap[kIndex], indexEO, -1);
391               continue;
392             }
393             
394             /* setup information */
395             index = AliTOFGeometry::GetIndex(det);
396             sector = det[0];
397             plate = det[1];
398             strip = det[2];
399             sectorStrip = plate < 3 ? plate * 19 + strip : plate * 19 - 4 + strip;
400             padz = det[3];
401             padx = det[4];
402             pad = padz + 2 * padx;
403             icIndex = pad < 48 ? pad : 95 - pad;
404
405             /* set maps */
406
407             /* main index */
408             SetHisto(fCalibMap[kIndex], indexEO, index);
409             /* EO indices */
410             SetHisto(fCalibMap[kDDL], index, ddl);
411             SetHisto(fCalibMap[kTRM], index, trm);
412             SetHisto(fCalibMap[kChain], index, chain);
413             SetHisto(fCalibMap[kTDC], index, tdc);
414             SetHisto(fCalibMap[kChannel], index, channel);
415             /* DO indices */
416             SetHisto(fCalibMap[kSector], index, sector);
417             SetHisto(fCalibMap[kPlate], index, plate);
418             SetHisto(fCalibMap[kStrip], index, strip);
419             SetHisto(fCalibMap[kSectorStrip], index, sectorStrip);
420             SetHisto(fCalibMap[kPadZ], index, padz);
421             SetHisto(fCalibMap[kPadX], index, padx);
422             SetHisto(fCalibMap[kPad], index, pad);
423             SetHisto(fCalibMap[kInterfaceCardIndex], index, icIndex);
424             /* calib constants */
425             SetHisto(fCalibMap[kDDLBCshift], index, fgkDDLBCshift[ddl]);
426             SetHisto(fCalibMap[kFlatCableLength], index, fgkFlatCableLength[sectorStrip]);
427             SetHisto(fCalibMap[kInterfaceCardLength], index, fgkInterfaceCardLength[icIndex]);
428             SetHisto(fCalibMap[kAmphenolCableLength], index, AliTOFCableLengthMap::GetCableLength(ddl, trm + 3, chain, tdc));
429             
430           } /* loop over electronics oriented (EO) indices */
431
432   /* re-enable warnings */
433   AliLog::SetGlobalLogLevel(logLevel);
434
435   /* write consts */
436   for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
437     WriteHisto(fileOut, fCalibConst[iConst]);
438   /* write maps */
439   for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
440     WriteHisto(fileOut, fCalibMap[iMap]);
441
442   /* close output file */
443   fileOut->Close();
444 }
445
446 //__________________________________________________________________________
447
448 Float_t
449 AliTOFcalibHisto::GetCorrection(Int_t corr, Int_t index, Float_t tot)
450 {
451   /* apply correction */
452
453   Int_t ddl, chain, tdc, channel, hptdc, pbCh, feaIndex, sector, plate, strip, padx, trm;
454   Float_t slewing;
455   
456   switch (corr) {
457   case kDDLBCcorr:
458     return -GetCalibConst(kLHCperiod) * GetCalibMap(kDDLBCshift, index);
459   case kAmphenolCableCorr:
460     return GetCalibConst(kAmphenolCableDelay) * GetCalibMap(kAmphenolCableLength, index);
461   case kFlatCableCorr:
462     return GetCalibConst(kFlatCableDelay) * GetCalibMap(kFlatCableLength, index);
463   case kInterfaceCardCorr:
464     return GetCalibConst(kInterfaceCardDelay) * GetCalibMap(kInterfaceCardLength, index);
465   case kDDLdelayCorr:
466     ddl = (Int_t)GetCalibMap(kDDL, index);
467     return GetCalibPar(kDDLdelayPar, ddl);
468   case kHPTDCdelayCorr:
469     chain = (Int_t)GetCalibMap(kChain, index);
470     tdc = (Int_t)GetCalibMap(kTDC, index);
471     hptdc = tdc + 15 * chain;
472     return GetCalibPar(kHPTDCdelayPar, hptdc);
473   case kFEAchDelayCorr:
474     ddl = (Int_t)GetCalibMap(kDDL, index);
475     tdc = (Int_t)GetCalibMap(kTDC, index);
476     channel = (Int_t)GetCalibMap(kChannel, index);
477     pbCh = channel + 8 * (tdc % 3);
478     if (ddl % 2 == 0)
479       return GetCalibPar(kRightFEAchDelayPar, pbCh);
480     else
481       return GetCalibPar(kLeftFEAchDelayPar, pbCh);
482   case kFEAdelayCorr:
483     sector = (Int_t)GetCalibMap(kSector, index);
484     plate = (Int_t)GetCalibMap(kPlate, index);
485     strip = (Int_t)GetCalibMap(kStrip, index);
486     padx = (Int_t)GetCalibMap(kPadX, index);
487     feaIndex = padx / 12 + 4 * strip + 4 * 19 * plate + 4 * 19 * 5 * sector;      
488     return GetCalibPar(kFEAdelayPar, feaIndex);
489   case kTRMdelayCorr:
490     trm = (Int_t)GetCalibMap(kTRM, index);
491     return GetCalibPar(kTRMdelayPar, trm);
492   case kTimeSlewingCorr:
493     slewing = 0.;
494     for (Int_t i = 0; i < fCalibPar[kTimeSlewingPar]->GetNbinsX(); i++)
495       slewing += GetCalibPar(kTimeSlewingPar, i) * TMath::Power(tot, i);
496     return slewing;
497   default:
498     AliWarning(Form("unknown correction flag (%d)", corr));
499     return 0.;
500   }
501 }
502
503 //__________________________________________________________________________
504
505 Float_t
506 AliTOFcalibHisto::GetNominalCorrection(Int_t index)
507 {
508   /* get nominal correction */
509   Float_t corr = 0;
510   for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
511     corr += GetCorrection(iCorr, index);
512   return corr;
513 }
514
515 //__________________________________________________________________________
516
517 void
518 AliTOFcalibHisto::ApplyNominalCorrection(AliESDtrack *track)
519 {
520   /* apply nominal correction */
521   
522   Double_t rawTime = track->GetTOFsignalRaw();
523   Int_t index = track->GetTOFCalChannel();
524   Double_t time = rawTime - 1.e3 * GetNominalCorrection(index);
525   track->SetTOFsignal(time);
526 }
527
528 //__________________________________________________________________________
529
530 Float_t
531 AliTOFcalibHisto::GetCableCorrection(Int_t index)
532 {
533   /* get cable correction */
534   Float_t corr = 0;
535   for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
536     if (fgCableCorrectionFlag[iCorr])
537       corr += GetCorrection(iCorr, index);
538   return corr;
539 }
540
541 //__________________________________________________________________________
542
543 Float_t
544 AliTOFcalibHisto::GetFullCorrection(Int_t index)
545 {
546   /* get full correction */
547   Float_t corr = 0;
548   for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
549     if (fgFullCorrectionFlag[iCorr])
550       corr += GetCorrection(iCorr, index);
551   return corr;
552 }
553