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