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 **************************************************************************/
16 /*************************************************************************
18 * AliTOFcalibHisto - class to handle TOF calibration histograms,
19 * map histograms and more
21 * autors: Roberto Preghenella (R+)
22 * concacts: preghenella@bo.infn.it
24 *************************************************************************/
26 #include "AliTOFcalibHisto.h"
30 #include "AliTOFRawStream.h"
31 #include "AliTOFCableLengthMap.h"
32 #include "AliESDtrack.h"
34 ClassImp(AliTOFcalibHisto)
36 //__________________________________________________________________________
38 TFile *AliTOFcalibHisto::fgCalibHistoFile = NULL;
39 TFile *AliTOFcalibHisto::fgCalibParFile = NULL;
41 //__________________________________________________________________________
43 TString AliTOFcalibHisto::fgCalibHistoFileName = "$ALICE_ROOT/TOF/data/AliTOFcalibHisto.root";
44 TString AliTOFcalibHisto::fgCalibParFileName = "$ALICE_ROOT/TOF/data/AliTOFcalibPar.root";
46 //__________________________________________________________________________
48 const TString AliTOFcalibHisto::fgkCalibConstName[kNcalibConsts] = {
55 //__________________________________________________________________________
57 const TString AliTOFcalibHisto::fgkCalibMapName[kNcalibMaps] = {
78 "InterfaceCardLength",
82 //__________________________________________________________________________
84 const TString AliTOFcalibHisto::fgkCalibParName[kNcalibPars] = {
94 //__________________________________________________________________________
96 /* LHC clock period [ns] */
97 const Float_t AliTOFcalibHisto::fgkLHCperiod = 25.; /* SET THE CORRECT VALUE !!! */
99 //__________________________________________________________________________
101 /* Amphenol cable delay [ns/cm] */
102 const Float_t AliTOFcalibHisto::fgkAmphenolCableDelay = 5.13e-2; /* from measurement */
104 //__________________________________________________________________________
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 */
110 //__________________________________________________________________________
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 */
116 //__________________________________________________________________________
118 /* number of readout channels (DO/EO) */
119 const Int_t AliTOFcalibHisto::fgkNchannels = 157248;
120 const Int_t AliTOFcalibHisto::fgkNchannelsEO = 172800;
122 //__________________________________________________________________________
124 /* DDL BC shifts due to TTC fibers [LHCperiod] */
125 const Int_t AliTOFcalibHisto::fgkDDLBCshift[72] = {
146 //__________________________________________________________________________
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.
157 //__________________________________________________________________________
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
169 //__________________________________________________________________________
171 AliTOFcalibHisto::AliTOFcalibHisto() :
177 /* default constructor */
180 //__________________________________________________________________________
182 AliTOFcalibHisto::~AliTOFcalibHisto()
184 /* default destructor */
187 //__________________________________________________________________________
190 AliTOFcalibHisto::LoadHisto(TFile* file, TH1F **histo, const Char_t *name)
193 *histo = (TH1F *)file->Get(name);
195 AliWarning(Form("error while getting %s histo", name));
198 //__________________________________________________________________________
201 AliTOFcalibHisto::CreateHisto(TH1F **histo, const Char_t *name, Int_t size)
204 *histo = new TH1F(name, Form(";index;%s", name), size, 0, size);
206 AliWarning(Form("error while creating %s histo", name));
209 //__________________________________________________________________________
212 AliTOFcalibHisto::WriteHisto(TFile *file, TH1F *histo)
215 if (!file || !file->IsOpen() || !histo)
221 //__________________________________________________________________________
224 AliTOFcalibHisto::SetHisto(TH1F *histo, Int_t index, Float_t value)
229 histo->SetBinContent(index + 1, value);
232 //__________________________________________________________________________
235 AliTOFcalibHisto::GetHisto(TH1F *histo, Int_t index)
239 AliWarning("cannot get histo");
242 return histo->GetBinContent(index + 1);
245 //__________________________________________________________________________
248 AliTOFcalibHisto::LoadCalibHisto()
250 /* load calib histo */
252 if (fgCalibHistoFile && fgCalibHistoFile->IsOpen())
253 AliWarning("calib histo file already open: reloading");
255 /* open input file */
256 TFile *fileIn = TFile::Open(GetCalibHistoFileName());
257 if (!fileIn || !fileIn->IsOpen())
258 AliFatal(Form("cannot open input file %s", GetCalibHistoFileName()));
260 /* set calib histo file */
261 fgCalibHistoFile = fileIn;
264 for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
265 LoadHisto(fileIn, &fCalibConst[iConst], fgkCalibConstName[iConst].Data());
267 for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
268 LoadHisto(fileIn, &fCalibMap[iMap], fgkCalibMapName[iMap].Data());
271 //__________________________________________________________________________
274 AliTOFcalibHisto::LoadCalibPar()
278 if (fgCalibParFile && fgCalibParFile->IsOpen())
279 AliWarning("calib par file already open: reloading");
281 /* load calib histo */
284 /* open input file */
285 TFile *fileIn = TFile::Open(GetCalibParFileName());
286 if (!fileIn || !fileIn->IsOpen())
287 AliError(Form("cannot open input file %s", GetCalibParFileName()));
289 /* set calib par file */
290 fgCalibParFile = fileIn;
293 for (Int_t i = 0; i < kNcalibPars; i++)
294 LoadHisto(fileIn, &fCalibPar[i], fgkCalibParName[i].Data());
298 //__________________________________________________________________________
301 AliTOFcalibHisto::WriteCalibHisto()
303 /* write calib histo */
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()));
311 for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
312 CreateHisto(&fCalibConst[iConst], fgkCalibConstName[iConst].Data(), 1);
314 for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
316 CreateHisto(&fCalibMap[iMap], fgkCalibMapName[iMap].Data(), fgkNchannelsEO);
318 CreateHisto(&fCalibMap[iMap], fgkCalibMapName[iMap].Data(), fgkNchannels);
320 /*** SETUP CONSTS ***/
322 SetHisto(fCalibConst[kLHCperiod], 0, fgkLHCperiod);
323 SetHisto(fCalibConst[kAmphenolCableDelay], 0, fgkAmphenolCableDelay);
324 SetHisto(fCalibConst[kFlatCableDelay], 0, fgkFlatCableDelay);
325 SetHisto(fCalibConst[kInterfaceCardDelay], 0, fgkInterfaceCardDelay);
329 AliTOFRawStream rawStream;
330 Int_t indexEO, det[5], dummy, index, sector, plate, strip, sectorStrip, padz, padx, pad, icIndex;
332 /* temporarly disable warnings */
333 AliLog::EType_t logLevel = (AliLog::EType_t)AliLog::GetGlobalLogLevel();
334 AliLog::SetGlobalLogLevel(AliLog::kError);
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++) {
343 /* compute index EO */
344 indexEO = GetIndexEO(ddl, trm, chain, tdc, channel);
346 /* convert EO indices into detector oriented (DO) indices
347 (this call causes some warnings because the loop includes
348 EO indices which are not connected to physical channels) */
349 rawStream.EquipmentId2VolumeId(ddl, trm + 3, chain, tdc, channel, det);
351 /* swap det[3] and det[4] */
352 dummy = det[3]; det[3] = det[4]; det[4] = dummy;
354 /* check detector indices */
355 if (det[0] < 0 || det[0] > 71 ||
356 det[1] < 0 || det[1] > 4 ||
357 det[2] < 0 || det[2] > 18 ||
358 det[3] < 0 || det[3] > 1 ||
359 det[4] < 0 || det[4] > 47) {
360 SetHisto(fCalibMap[kIndex], indexEO, -1);
364 /* setup information */
365 index = AliTOFGeometry::GetIndex(det);
369 sectorStrip = plate < 3 ? plate * 19 + strip : plate * 19 - 4 + strip;
372 pad = padz + 2 * padx;
373 icIndex = pad < 48 ? pad : 95 - pad;
378 SetHisto(fCalibMap[kIndex], indexEO, index);
380 SetHisto(fCalibMap[kDDL], index, ddl);
381 SetHisto(fCalibMap[kTRM], index, trm);
382 SetHisto(fCalibMap[kChain], index, chain);
383 SetHisto(fCalibMap[kTDC], index, tdc);
384 SetHisto(fCalibMap[kChannel], index, channel);
386 SetHisto(fCalibMap[kSector], index, sector);
387 SetHisto(fCalibMap[kPlate], index, plate);
388 SetHisto(fCalibMap[kStrip], index, strip);
389 SetHisto(fCalibMap[kSectorStrip], index, sectorStrip);
390 SetHisto(fCalibMap[kPadZ], index, padz);
391 SetHisto(fCalibMap[kPadX], index, padx);
392 SetHisto(fCalibMap[kPad], index, pad);
393 SetHisto(fCalibMap[kInterfaceCardIndex], index, icIndex);
394 /* calib constants */
395 SetHisto(fCalibMap[kDDLBCshift], index, fgkDDLBCshift[ddl]);
396 SetHisto(fCalibMap[kFlatCableLength], index, fgkFlatCableLength[sectorStrip]);
397 SetHisto(fCalibMap[kInterfaceCardLength], index, fgkInterfaceCardLength[icIndex]);
398 SetHisto(fCalibMap[kAmphenolCableLength], index, AliTOFCableLengthMap::GetCableLength(ddl, trm + 3, chain, tdc));
400 } /* loop over electronics oriented (EO) indices */
402 /* re-enable warnings */
403 AliLog::SetGlobalLogLevel(logLevel);
406 for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
407 WriteHisto(fileOut, fCalibConst[iConst]);
409 for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
410 WriteHisto(fileOut, fCalibMap[iMap]);
412 /* close output file */
416 //__________________________________________________________________________
419 AliTOFcalibHisto::GetCorrection(Int_t corr, Int_t index, Float_t tot)
421 /* apply correction */
423 Int_t ddl, chain, tdc, channel, hptdc, pbCh, feaIndex, sector, plate, strip, padx, trm;
428 return -GetCalibConst(kLHCperiod) * GetCalibMap(kDDLBCshift, index);
429 case kAmphenolCableCorr:
430 return GetCalibConst(kAmphenolCableDelay) * GetCalibMap(kAmphenolCableLength, index);
432 return GetCalibConst(kFlatCableDelay) * GetCalibMap(kFlatCableLength, index);
433 case kInterfaceCardCorr:
434 return GetCalibConst(kInterfaceCardDelay) * GetCalibMap(kInterfaceCardLength, index);
436 ddl = (Int_t)GetCalibMap(kDDL, index);
437 return GetCalibPar(kDDLdelayPar, ddl);
438 case kHPTDCdelayCorr:
439 chain = (Int_t)GetCalibMap(kChain, index);
440 tdc = (Int_t)GetCalibMap(kTDC, index);
441 hptdc = tdc + 15 * chain;
442 return GetCalibPar(kHPTDCdelayPar, hptdc);
443 case kFEAchDelayCorr:
444 ddl = (Int_t)GetCalibMap(kDDL, index);
445 tdc = (Int_t)GetCalibMap(kTDC, index);
446 channel = (Int_t)GetCalibMap(kChannel, index);
447 pbCh = channel + 8 * (tdc % 3);
449 return GetCalibPar(kRightFEAchDelayPar, pbCh);
451 return GetCalibPar(kLeftFEAchDelayPar, pbCh);
453 sector = (Int_t)GetCalibMap(kSector, index);
454 plate = (Int_t)GetCalibMap(kPlate, index);
455 strip = (Int_t)GetCalibMap(kStrip, index);
456 padx = (Int_t)GetCalibMap(kPadX, index);
457 feaIndex = padx / 12 + 4 * strip + 4 * 19 * plate + 4 * 19 * 5 * sector;
458 return GetCalibPar(kFEAdelayPar, feaIndex);
460 trm = (Int_t)GetCalibMap(kTRM, index);
461 return GetCalibPar(kTRMdelayPar, trm);
462 case kTimeSlewingCorr:
464 for (Int_t i = 0; i < fCalibPar[kTimeSlewingPar]->GetNbinsX(); i++)
465 slewing += GetCalibPar(kTimeSlewingPar, i) * TMath::Power(tot, i);
468 AliWarning(Form("unknown correction flag (%d)", corr));
473 //__________________________________________________________________________
476 AliTOFcalibHisto::GetNominalCorrection(Int_t index)
478 /* get nominal correction */
480 for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
481 corr += GetCorrection(iCorr, index);
485 //__________________________________________________________________________
488 AliTOFcalibHisto::ApplyNominalCorrection(AliESDtrack *track)
490 /* apply nominal correction */
492 Double_t rawTime = track->GetTOFsignalRaw();
493 Int_t index = track->GetTOFCalChannel();
494 Double_t time = rawTime - 1.e3 * GetNominalCorrection(index);
495 track->SetTOFsignal(time);