]> git.uio.no Git - u/mrichter/AliRoot.git/blame - T0/AliT0Parameters.cxx
Bug fixed after effc++ corrections
[u/mrichter/AliRoot.git] / T0 / AliT0Parameters.cxx
CommitLineData
dc7ca31d 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/* $Id: */
17
18//____________________________________________________________________
19//
20// T0 - T0.
21//
22// This class is a singleton that handles various parameters of
23// the T0 detectors.
24// Eventually, this class will use the Conditions DB to get the
25// various parameters, which code can then request from here.
26//
6b7d32f7 27#include "AliT0.h"
dc7ca31d 28#include "AliLog.h"
29#include "AliT0Parameters.h"
30#include "AliT0CalibData.h"
82ee3b37 31#include "AliT0CalibWalk.h"
32#include "AliT0CalibTimeEq.h"
2d3bfdf7 33#include "AliT0LookUpKey.h"
e0bba6cc 34#include "AliT0LookUpValue.h"
dc7ca31d 35#include <AliCDBManager.h>
36#include <AliCDBEntry.h>
0d82bd92 37#include <AliCDBStorage.h>
aae44346 38#include <TMath.h>
0d82bd92 39#include <TSystem.h>
700e6b36 40//#include <Riostream.h>
5325480c 41#include <TGeoManager.h>
42#include <TGeoPhysicalNode.h>
212239a1 43#include <TGeoMatrix.h>
0d82bd92 44#include <AliGeomManager.h>
dc7ca31d 45
82ee3b37 46AliT0CalibTimeEq* AliT0Parameters::fgCalibData = 0;
e0bba6cc 47AliT0CalibData* AliT0Parameters::fgLookUp = 0;
82ee3b37 48AliT0CalibWalk* AliT0Parameters::fgSlewCorr =0;
dc7ca31d 49//====================================================================
50ClassImp(AliT0Parameters)
51#if 0
52 ; // This is here to keep Emacs for indenting the next line
53#endif
54
55//____________________________________________________________________
56AliT0Parameters* AliT0Parameters::fgInstance = 0;
57//____________________________________________________________________
3b7f37fd 58AliT0Parameters* AliT0Parameters::Instance()
dc7ca31d 59{
60 // Get static instance
76f3b07a 61 if (!fgInstance) {
62 fgInstance = new AliT0Parameters;
76f3b07a 63 }
dc7ca31d 64 return fgInstance;
65}
66
67//____________________________________________________________________
68AliT0Parameters::AliT0Parameters()
5325480c 69 :fIsInit(kFALSE),
70 fPh2Mip(0),fmV2Mip(0),
71 fChannelWidth(0),fmV2Channel(0),
72 fQTmin(0),fQTmax(0),
29d3e0eb 73 fAmpLEDRec(0),
5325480c 74 fPMTeff(),
29d3e0eb 75 fWalk(0),
29d3e0eb 76 fTimeDelayCFD(0),
82ee3b37 77 // fTimeV0(0),
29d3e0eb 78 fTimeDelayTVD(0),
494f5042 79 fMeanT0(512),
29d3e0eb 80 fLookUp(0),
81 fNumberOfTRMs(2),
82 fCalibentry(), fLookUpentry(),fSlewCorr()
83
74adb36a 84
dc7ca31d 85{
86 // Default constructor
dc7ca31d 87 for (Int_t ipmt=0; ipmt<24; ipmt++)
88 {
dc7ca31d 89 SetPh2Mip();
90 SetmV2Mip();
91 SetChannelWidth();
92 SetmV2channel();
dc7ca31d 93 SetQTmin();
94 SetQTmax();
95 SetPMTeff(ipmt);
74adb36a 96 }
dc7ca31d 97 SetTimeDelayTVD();
98 SetZposition();
74adb36a 99
dc7ca31d 100}
101
102//__________________________________________________________________
103void
104AliT0Parameters::Init()
105{
106 // Initialize the parameters manager. We need to get stuff from the
107 // CDB here.
94c27e4f 108 if (fIsInit) return;
6ba20b30 109
74adb36a 110 AliCDBManager *stor =AliCDBManager::Instance();
74adb36a 111 //time equalizing
256d4943 112 fCalibentry = stor->Get("T0/Calib/TimeDelay");
113 if (fCalibentry)
82ee3b37 114 fgCalibData = (AliT0CalibTimeEq*)fCalibentry->GetObject();
256d4943 115 else {
116 AliFatal(" ALARM !!!! No time delays in CDB ");
117 fIsInit = kFALSE;
118 return;
119 }
c41ceaac 120 //slewing correction
74adb36a 121 fSlewCorr = stor->Get("T0/Calib/Slewing_Walk");
5325480c 122 if (fSlewCorr){
82ee3b37 123 fgSlewCorr = (AliT0CalibWalk*)fSlewCorr->GetObject();
c41ceaac 124 }
3b7f37fd 125 else {
256d4943 126 AliFatal(" ALARM !!!! No slewing correction in CDB ");
3b7f37fd 127 fIsInit = kFALSE;
128 return;
129 }
74adb36a 130 //lookup table
6eac39a1 131 fLookUpentry = stor->Get("T0/Calib/LookUp_Table");
e0bba6cc 132 if (fLookUpentry){
133 fgLookUp = (AliT0CalibData*)fLookUpentry->GetObject();
e0bba6cc 134 }
3b7f37fd 135 else {
256d4943 136 AliFatal(" ALARM !!!! No Lookup table in CDB ");
3b7f37fd 137 fIsInit = kFALSE;
138 return;
139 }
dc7ca31d 140 fIsInit = kTRUE;
141}
142
143
dc7ca31d 144//__________________________________________________________________
f8bea420 145
146void AliT0Parameters::InitIfOnline()
147{
148// should be used in online
149// for switching to this one should write
150 // AliT0RawReader myrawreader(rawReader);
151// myrawreader.SetOnlineMode(kTRUE);
700e6b36 152
0d82bd92 153 if (fIsInit) return;
29d3e0eb 154 //standart configuration (used for simulation)
155 //Int_t trm=0; Int_t tdc=0; Int_t chain=0; Int_t channel=0;
156 // configuration for test Jun07.
d9cae8af 157 fgLookUp = new AliT0CalibData("T0");
dd9fd8d6 158
0d72dc5b 159 fNumberOfTRMs = 1;
d9cae8af 160 fgLookUp-> SetNumberOfTRMs(fNumberOfTRMs);
0d72dc5b 161 Int_t trm=7; Int_t tdc=0; Int_t chain=0; Int_t channel=0;
79e04c5f 162 for (Int_t ik=0; ik<105; ik++)
f8bea420 163 {
164 AliT0LookUpKey * lookkey= new AliT0LookUpKey();
165 AliT0LookUpValue * lookvalue= new AliT0LookUpValue();
166
167
168 lookvalue->SetTRM(trm);
169 lookvalue->SetTDC(tdc);
170 lookvalue->SetChain(chain);
171 lookvalue->SetChannel(channel);
172 lookkey->SetKey(ik);
0d82bd92 173 fgLookUp->GetMapLookup()->Add((TObject*)lookvalue,(TObject*)lookkey);
663b10cd 174 if (channel<6) channel +=2;
175 else {channel = 0; tdc++;}
0d82bd92 176 if(ik==56) { tdc=0; channel=0; chain = 1;}
dd9fd8d6 177
f8bea420 178 }
74adb36a 179
180 fIsInit=kTRUE;
f8bea420 181}
182//__________________________________________________________________
dc7ca31d 183Float_t
184AliT0Parameters::GetTimeDelayCFD(Int_t ipmt)
82ee3b37 185 {
dc7ca31d 186 // return time delay for CFD channel
187 //
188 if (!fCalibentry)
189 {
c41ceaac 190 fTimeDelayCFD = 1000+ipmt*100;
191 return fTimeDelayCFD;
dc7ca31d 192 }
193
82ee3b37 194 return fgCalibData->GetTimeEq(ipmt);
dc7ca31d 195}
dc7ca31d 196//__________________________________________________________________
197
74adb36a 198TGraph *AliT0Parameters::GetAmpLEDRec(Int_t ipmt) const
dc7ca31d 199{
74adb36a 200 if (!fSlewCorr) {
29d3e0eb 201 AliError("No slewing correction is available!");
202 return (TGraph*)fAmpLEDRec.At(ipmt);
dc7ca31d 203 }
74adb36a 204 return fgSlewCorr -> GetAmpLEDRec(ipmt) ;
dc7ca31d 205}
206
207//__________________________________________________________________
208
c41ceaac 209TGraph *AliT0Parameters::GetWalk(Int_t ipmt) const
210{
74adb36a 211 if (!fSlewCorr) {
29d3e0eb 212 AliError("No walk correction is available!");
c41ceaac 213 return (TGraph*)fWalk.At(ipmt);
214 }
74adb36a 215 return fgSlewCorr -> GetWalk(ipmt) ;
c41ceaac 216}
217
218//__________________________________________________________________
219
220Float_t AliT0Parameters::GetWalkVal(Int_t ipmt, Float_t mv) const
221{
0d82bd92 222 if (!fSlewCorr) {
c41ceaac 223 return ((TGraph*)fWalk.At(ipmt))->Eval(mv);
224 }
74adb36a 225 return fgSlewCorr -> GetWalkVal(ipmt, mv) ;
c41ceaac 226}
227
c41ceaac 228
dc7ca31d 229//__________________________________________________________________
230void
231AliT0Parameters::SetPMTeff(Int_t ipmt)
232{
233 Float_t lambda[50];
234 Float_t eff[50 ] = {0, 0, 0.23619, 0.202909, 0.177913,
235 0.175667, 0.17856, 0.190769, 0.206667, 0.230286,
236 0.252276, 0.256267,0.26, 0.27125, 0.281818,
237 0.288118, 0.294057,0.296222, 0.301622, 0.290421,
238 0.276615, 0.2666, 0.248, 0.23619, 0.227814,
239 0.219818, 0.206667,0.194087, 0.184681, 0.167917,
240 0.154367, 0.1364, 0.109412, 0.0834615,0.0725283,
241 0.0642963,0.05861, 0.0465, 0.0413333,0.032069,
242 0.0252203,0.02066, 0.016262, 0.012, 0.00590476,
243 0.003875, 0.00190, 0, 0, 0 } ;
244 for (Int_t i=0; i<50; i++) lambda[i]=200+10*i;
245
246 TGraph* gr = new TGraph(50,lambda,eff);
247 fPMTeff.AddAtAndExpand(gr,ipmt);
248}
e0bba6cc 249//________________________________________________________________
250
251Int_t
252AliT0Parameters::GetChannel(Int_t trm, Int_t tdc, Int_t chain, Int_t channel)
253{
254
e30bc492 255 if (fgLookUp) {
256 AliT0LookUpValue key(trm,tdc,chain,channel);
3a06b1d2 257 AliT0LookUpKey *val = (AliT0LookUpKey*) fgLookUp->GetMapLookup()->GetValue((TObject*)&key);
258 // AliT0LookUpKey *val = (AliT0LookUpKey*) fLookUp.GetValue((TObject*)&key);
e30bc492 259 if (val )
260 return val->GetKey();
261 else {
262 AliWarning(Form("No such address (%d %d %d %d)!",trm,tdc,chain,channel));
263 return -1;
264 }
265 }
266 else {
267 AliError("No look up table has been loader!");
29d3e0eb 268 return -1;
e0bba6cc 269 }
e0bba6cc 270
271}
5325480c 272//__________________________________________________________________
29d3e0eb 273TMap *AliT0Parameters::GetMapLookup()
274{
275 if (!fgLookUp){
276 cout<<" No look up table in OCDB";
277 return 0;
278 }
279 return fgLookUp->GetMapLookup();
280}
281//__________________________________________________________________
282
5325480c 283Int_t
284AliT0Parameters::GetNumberOfTRMs()
285{
286 // return number of trms
287 //
288 if (!fgLookUp) {
29d3e0eb 289 // fNumberOfTRMs = 2;
5325480c 290 return fNumberOfTRMs;
291 }
292 return fgLookUp ->GetNumberOfTRMs();
293}
256d4943 294/*
5325480c 295//________________________________________________________________________________
296Double_t AliT0Parameters::GetZPosition(const char* symname){
297// Get the global z coordinate of the given T0 alignable volume
298//
29d3e0eb 299 Double_t *tr = AliGeomManager::GetMatrix(symname)->GetTranslation();
5325480c 300
5325480c 301 return tr[2];
29d3e0eb 302}
256d4943 303*/
304//________________________________________________________________________________
305Double_t AliT0Parameters::GetZPosition(const char* symname){
306// Get the global z coordinate of the given T0 alignable volume
307//
308 Double_t *tr;
256d4943 309 TGeoPNEntry *pne = gGeoManager->GetAlignableEntry(symname);
310 if (!pne) return 0;
311
312
313 TGeoPhysicalNode *pnode = pne->GetPhysicalNode();
314 if(pnode){
315 TGeoHMatrix* hm = pnode->GetMatrix();
316 tr = hm->GetTranslation();
317 }else{
318 const char* path = pne->GetTitle();
319 if(!gGeoManager->cd(path)){
320 AliErrorClass(Form("Volume path %s not valid!",path));
321 return 0;
322 }
323 tr = gGeoManager->GetCurrentMatrix()->GetTranslation();
324 }
325 return tr[2];
326
327}
29d3e0eb 328//________________________________________________________________________________
329
330Double_t AliT0Parameters::GetZPositionShift(const char* symname)
331{
332// Get the global z coordinate of the given T0 alignable volume
333//
334 Double_t *tr = AliGeomManager::GetMatrix(symname)->GetTranslation();
335
336 TGeoHMatrix origmat;
337 AliGeomManager::GetOrigGlobalMatrix(symname,origmat);
338 Double_t *otr = origmat.GetTranslation();
5325480c 339
29d3e0eb 340 return (tr[2]-otr[2]);
5325480c 341}
342