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] = {
76 "InterfaceCardLength",
80 //__________________________________________________________________________
82 const TString AliTOFcalibHisto::fgkCalibParName[kNcalibPars] = {
92 //__________________________________________________________________________
94 /* LHC clock period [ns] */
95 const Float_t AliTOFcalibHisto::fgkLHCperiod = 25.; /* SET THE CORRECT VALUE !!! */
97 //__________________________________________________________________________
99 /* Amphenol cable delay [ns/cm] */
100 const Float_t AliTOFcalibHisto::fgkAmphenolCableDelay = 5.13e-2; /* from measurement */
102 //__________________________________________________________________________
104 /* flat cable delay [ns/cm] */
105 //const Float_t AliTOFcalibHisto::fgkFlatCableDelay = 5.3e-2; /* from Amphenol 132-2829 series data-sheet */
106 const Float_t AliTOFcalibHisto::fgkFlatCableDelay = 5.124e-2; /* from LHC08d calibration */
108 //__________________________________________________________________________
110 /* interface card delay [ns/cm] */
111 //const Float_t AliTOFcalibHisto::fgkInterfaceCardDelay = 6.9e-2; /* from HyperLinx simulation */
112 const Float_t AliTOFcalibHisto::fgkInterfaceCardDelay = 5.7898e-2; /* from LHC08d calibration */
114 //__________________________________________________________________________
116 /* number of readout channels */
117 const Int_t AliTOFcalibHisto::fgkNchannels = 157248;
119 //__________________________________________________________________________
121 /* DDL BC shifts due to TTC fibers [LHCperiod] */
122 const Int_t AliTOFcalibHisto::fgkDDLBCshift[72] = {
143 //__________________________________________________________________________
145 /* strip flat-cable length (preliminary) [cm] */
146 const Float_t AliTOFcalibHisto::fgkFlatCableLength[91] = {
147 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 17.,
148 21., 21., 21., 21., 21., 17., 17., 21., 21., 17., 21., 21., 21., 17., 21., 21., 17., 21., 23.,
149 17., 19., 17., 19., 17., 19., 17., 19., 17., 19., 17., 19., 17., 19., 17.,
150 23., 21., 17., 21., 21., 17., 21., 21., 21., 17., 21., 21., 17., 17., 21., 21., 21., 21., 21.,
151 17., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18., 18.
154 //__________________________________________________________________________
156 /* interface card lenght (preliminary) [cm] */
157 const Float_t AliTOFcalibHisto::fgkInterfaceCardLength[48] = {
158 13.97, 12.57, 14.52, 13.10, 15.44, 13.60, 10.58, 9.14,
159 11.21, 9.76, 12.11, 10.76, 8.67, 7.58, 9.32, 8.09,
160 10.24, 8.4, 5.51, 4.31, 6.54, 5.23, 7.48, 6.28,
161 10.43, 8.76, 11.05, 9.43, 11.72, 10.14, 7.2, 5.69,
162 7.71, 6.26, 8.36, 7.19, 4.85, 4.09, 5.57, 4.35,
163 6.59, 5.12, 2.49, 2.96, 2.70, 2.76, 2.91, 2.55
166 //__________________________________________________________________________
168 AliTOFcalibHisto::AliTOFcalibHisto() :
174 /* default constructor */
177 //__________________________________________________________________________
179 AliTOFcalibHisto::~AliTOFcalibHisto()
181 /* default destructor */
184 //__________________________________________________________________________
187 AliTOFcalibHisto::LoadHisto(TFile* file, TH1F **histo, const Char_t *name)
190 *histo = (TH1F *)file->Get(name);
192 AliWarning(Form("error while getting %s histo", name));
195 //__________________________________________________________________________
198 AliTOFcalibHisto::CreateHisto(TH1F **histo, const Char_t *name, Int_t size)
201 *histo = new TH1F(name, Form(";index;%s", name), size, 0, size);
203 AliWarning(Form("error while creating %s histo", name));
206 //__________________________________________________________________________
209 AliTOFcalibHisto::WriteHisto(TFile *file, TH1F *histo)
212 if (!file || !file->IsOpen() || !histo)
218 //__________________________________________________________________________
221 AliTOFcalibHisto::SetHisto(TH1F *histo, Int_t index, Float_t value)
226 histo->SetBinContent(index + 1, value);
229 //__________________________________________________________________________
232 AliTOFcalibHisto::GetHisto(TH1F *histo, Int_t index)
236 AliWarning("cannot get histo");
239 return histo->GetBinContent(index + 1);
242 //__________________________________________________________________________
245 AliTOFcalibHisto::LoadCalibHisto()
247 /* load calib histo */
249 if (fgCalibHistoFile && fgCalibHistoFile->IsOpen())
250 AliWarning("calib histo file already open: reloading");
252 /* open input file */
253 TFile *fileIn = TFile::Open(GetCalibHistoFileName());
254 if (!fileIn || !fileIn->IsOpen())
255 AliFatal(Form("cannot open input file %s", GetCalibHistoFileName()));
257 /* set calib histo file */
258 fgCalibHistoFile = fileIn;
261 for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
262 LoadHisto(fileIn, &fCalibConst[iConst], fgkCalibConstName[iConst].Data());
264 for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
265 LoadHisto(fileIn, &fCalibMap[iMap], fgkCalibMapName[iMap].Data());
268 //__________________________________________________________________________
271 AliTOFcalibHisto::LoadCalibPar()
275 if (fgCalibParFile && fgCalibParFile->IsOpen())
276 AliWarning("calib par file already open: reloading");
278 /* load calib histo */
281 /* open input file */
282 TFile *fileIn = TFile::Open(GetCalibParFileName());
283 if (!fileIn || !fileIn->IsOpen())
284 AliError(Form("cannot open input file %s", GetCalibParFileName()));
286 /* set calib par file */
287 fgCalibParFile = fileIn;
290 for (Int_t i = 0; i < kNcalibPars; i++)
291 LoadHisto(fileIn, &fCalibPar[i], fgkCalibParName[i].Data());
295 //__________________________________________________________________________
298 AliTOFcalibHisto::WriteCalibHisto()
300 /* write calib histo */
302 /* open output file */
303 TFile *fileOut = TFile::Open(GetCalibHistoFileName(), "RECREATE");
304 if (!fileOut || !fileOut->IsOpen())
305 AliFatal(Form("cannot open output file %s", GetCalibHistoFileName()));
308 for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
309 CreateHisto(&fCalibConst[iConst], fgkCalibConstName[iConst].Data(), 1);
311 for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
312 CreateHisto(&fCalibMap[iMap], fgkCalibMapName[iMap].Data(), fgkNchannels);
314 /*** SETUP CONSTS ***/
316 SetHisto(fCalibConst[kLHCperiod], 0, fgkLHCperiod);
317 SetHisto(fCalibConst[kAmphenolCableDelay], 0, fgkAmphenolCableDelay);
318 SetHisto(fCalibConst[kFlatCableDelay], 0, fgkFlatCableDelay);
319 SetHisto(fCalibConst[kInterfaceCardDelay], 0, fgkInterfaceCardDelay);
323 AliTOFRawStream rawStream;
324 Int_t det[5], dummy, index, sector, plate, strip, sectorStrip, padz, padx, pad, icIndex;
326 /* temporarly disable warnings */
327 AliLog::EType_t logLevel = (AliLog::EType_t)AliLog::GetGlobalLogLevel();
328 AliLog::SetGlobalLogLevel(AliLog::kError);
330 /* loop over electronics oriented (EO) indices */
331 for (Int_t ddl = 0; ddl < 72; ddl++)
332 for (Int_t trm = 0; trm < 10; trm++)
333 for (Int_t chain = 0; chain < 2; chain++)
334 for (Int_t tdc = 0; tdc < 15; tdc++)
335 for (Int_t channel = 0; channel < 8; channel++) {
337 /* convert EO indices into detector oriented (DO) indices
338 (this call causes some warnings because the loop includes
339 EO indices which are not connected to physical channels) */
340 rawStream.EquipmentId2VolumeId(ddl, trm + 3, chain, tdc, channel, det);
342 /* swap det[3] and det[4] */
343 dummy = det[3]; det[3] = det[4]; det[4] = dummy;
345 /* check detector indices */
346 if (det[0] < 0 || det[0] > 71 ||
347 det[1] < 0 || det[1] > 4 ||
348 det[2] < 0 || det[2] > 18 ||
349 det[3] < 0 || det[3] > 1 ||
350 det[4] < 0 || det[4] > 47)
353 /* setup information */
354 index = AliTOFGeometry::GetIndex(det);
358 sectorStrip = plate < 3 ? plate * 19 + strip : plate * 19 - 4 + strip;
361 pad = padz + 2 * padx;
362 icIndex = pad < 48 ? pad : 95 - pad;
367 SetHisto(fCalibMap[kDDL], index, ddl);
368 SetHisto(fCalibMap[kTRM], index, trm);
369 SetHisto(fCalibMap[kChain], index, chain);
370 SetHisto(fCalibMap[kTDC], index, tdc);
371 SetHisto(fCalibMap[kChannel], index, channel);
373 SetHisto(fCalibMap[kSector], index, sector);
374 SetHisto(fCalibMap[kPlate], index, plate);
375 SetHisto(fCalibMap[kStrip], index, strip);
376 SetHisto(fCalibMap[kSectorStrip], index, sectorStrip);
377 SetHisto(fCalibMap[kPadZ], index, padz);
378 SetHisto(fCalibMap[kPadX], index, padx);
379 SetHisto(fCalibMap[kPad], index, pad);
380 SetHisto(fCalibMap[kInterfaceCardIndex], index, icIndex);
381 /* calib constants */
382 SetHisto(fCalibMap[kDDLBCshift], index, fgkDDLBCshift[ddl]);
383 SetHisto(fCalibMap[kFlatCableLength], index, fgkFlatCableLength[sectorStrip]);
384 SetHisto(fCalibMap[kInterfaceCardLength], index, fgkInterfaceCardLength[icIndex]);
385 SetHisto(fCalibMap[kAmphenolCableLength], index, AliTOFCableLengthMap::GetCableLength(ddl, trm + 3, chain, tdc));
387 } /* loop over electronics oriented (EO) indices */
389 /* re-enable warnings */
390 AliLog::SetGlobalLogLevel(logLevel);
393 for (Int_t iConst = 0; iConst < kNcalibConsts; iConst++)
394 WriteHisto(fileOut, fCalibConst[iConst]);
396 for (Int_t iMap = 0; iMap < kNcalibMaps; iMap++)
397 WriteHisto(fileOut, fCalibMap[iMap]);
399 /* close output file */
403 //__________________________________________________________________________
406 AliTOFcalibHisto::GetCorrection(Int_t corr, Int_t index, Float_t tot)
408 /* apply correction */
410 Int_t ddl, chain, tdc, channel, hptdc, pbCh, feaIndex, sector, plate, strip, padx, trm;
415 return -GetCalibConst(kLHCperiod) * GetCalibMap(kDDLBCshift, index);
416 case kAmphenolCableCorr:
417 return GetCalibConst(kAmphenolCableDelay) * GetCalibMap(kAmphenolCableLength, index);
419 return GetCalibConst(kFlatCableDelay) * GetCalibMap(kFlatCableLength, index);
420 case kInterfaceCardCorr:
421 return GetCalibConst(kInterfaceCardDelay) * GetCalibMap(kInterfaceCardLength, index);
423 ddl = (Int_t)GetCalibMap(kDDL, index);
424 return GetCalibPar(kDDLdelayPar, ddl);
425 case kHPTDCdelayCorr:
426 chain = (Int_t)GetCalibMap(kChain, index);
427 tdc = (Int_t)GetCalibMap(kTDC, index);
428 hptdc = tdc + 15 * chain;
429 return GetCalibPar(kHPTDCdelayPar, hptdc);
430 case kFEAchDelayCorr:
431 ddl = (Int_t)GetCalibMap(kDDL, index);
432 tdc = (Int_t)GetCalibMap(kTDC, index);
433 channel = (Int_t)GetCalibMap(kChannel, index);
434 pbCh = channel + 8 * (tdc % 3);
436 return GetCalibPar(kRightFEAchDelayPar, pbCh);
438 return GetCalibPar(kLeftFEAchDelayPar, pbCh);
440 sector = (Int_t)GetCalibMap(kSector, index);
441 plate = (Int_t)GetCalibMap(kPlate, index);
442 strip = (Int_t)GetCalibMap(kStrip, index);
443 padx = (Int_t)GetCalibMap(kPadX, index);
444 feaIndex = padx / 12 + 4 * strip + 4 * 19 * plate + 4 * 19 * 5 * sector;
445 return GetCalibPar(kFEAdelayPar, feaIndex);
447 trm = (Int_t)GetCalibMap(kTRM, index);
448 return GetCalibPar(kTRMdelayPar, trm);
449 case kTimeSlewingCorr:
451 for (Int_t i = 0; i < fCalibPar[kTimeSlewingPar]->GetNbinsX(); i++)
452 slewing += GetCalibPar(kTimeSlewingPar, i) * TMath::Power(tot, i);
455 AliWarning(Form("unknown correction flag (%d)", corr));
460 //__________________________________________________________________________
463 AliTOFcalibHisto::GetNominalCorrection(Int_t index)
465 /* get nominal correction */
467 for (Int_t iCorr = 0; iCorr < kNcorrections; iCorr++)
468 corr += GetCorrection(iCorr, index);
472 //__________________________________________________________________________
475 AliTOFcalibHisto::ApplyNominalCorrection(AliESDtrack *track)
477 /* apply nominal correction */
479 Double_t rawTime = track->GetTOFsignalRaw();
480 Int_t index = track->GetTOFCalChannel();
481 Double_t time = rawTime - 1.e3 * GetNominalCorrection(index);
482 track->SetTOFsignal(time);