]> git.uio.no Git - u/mrichter/AliRoot.git/blame - T0/AliT0Parameters.cxx
expantion of recoParam (Markus) and fix bug in HLT mode
[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),
c2337900 76 fQTC(0),
77 fAmpLED(0),
29d3e0eb 78 fTimeDelayCFD(0),
82ee3b37 79 // fTimeV0(0),
29d3e0eb 80 fTimeDelayTVD(0),
494f5042 81 fMeanT0(512),
29d3e0eb 82 fLookUp(0),
83 fNumberOfTRMs(2),
84 fCalibentry(), fLookUpentry(),fSlewCorr()
85
74adb36a 86
dc7ca31d 87{
88 // Default constructor
dc7ca31d 89 for (Int_t ipmt=0; ipmt<24; ipmt++)
90 {
dc7ca31d 91 SetPh2Mip();
92 SetmV2Mip();
93 SetChannelWidth();
94 SetmV2channel();
dc7ca31d 95 SetQTmin();
96 SetQTmax();
97 SetPMTeff(ipmt);
74adb36a 98 }
dc7ca31d 99 SetTimeDelayTVD();
100 SetZposition();
74adb36a 101
dc7ca31d 102}
103
104//__________________________________________________________________
105void
106AliT0Parameters::Init()
107{
108 // Initialize the parameters manager. We need to get stuff from the
109 // CDB here.
94c27e4f 110 if (fIsInit) return;
6ba20b30 111
74adb36a 112 AliCDBManager *stor =AliCDBManager::Instance();
74adb36a 113 //time equalizing
256d4943 114 fCalibentry = stor->Get("T0/Calib/TimeDelay");
115 if (fCalibentry)
82ee3b37 116 fgCalibData = (AliT0CalibTimeEq*)fCalibentry->GetObject();
256d4943 117 else {
118 AliFatal(" ALARM !!!! No time delays in CDB ");
119 fIsInit = kFALSE;
120 return;
121 }
c41ceaac 122 //slewing correction
74adb36a 123 fSlewCorr = stor->Get("T0/Calib/Slewing_Walk");
5325480c 124 if (fSlewCorr){
82ee3b37 125 fgSlewCorr = (AliT0CalibWalk*)fSlewCorr->GetObject();
c41ceaac 126 }
3b7f37fd 127 else {
256d4943 128 AliFatal(" ALARM !!!! No slewing correction in CDB ");
3b7f37fd 129 fIsInit = kFALSE;
130 return;
131 }
74adb36a 132 //lookup table
6eac39a1 133 fLookUpentry = stor->Get("T0/Calib/LookUp_Table");
e0bba6cc 134 if (fLookUpentry){
135 fgLookUp = (AliT0CalibData*)fLookUpentry->GetObject();
e0bba6cc 136 }
3b7f37fd 137 else {
256d4943 138 AliFatal(" ALARM !!!! No Lookup table in CDB ");
3b7f37fd 139 fIsInit = kFALSE;
140 return;
141 }
dc7ca31d 142 fIsInit = kTRUE;
143}
144
145
dc7ca31d 146//__________________________________________________________________
f8bea420 147
148void AliT0Parameters::InitIfOnline()
149{
150// should be used in online
151// for switching to this one should write
152 // AliT0RawReader myrawreader(rawReader);
153// myrawreader.SetOnlineMode(kTRUE);
700e6b36 154
0d82bd92 155 if (fIsInit) return;
29d3e0eb 156 //standart configuration (used for simulation)
157 //Int_t trm=0; Int_t tdc=0; Int_t chain=0; Int_t channel=0;
158 // configuration for test Jun07.
d9cae8af 159 fgLookUp = new AliT0CalibData("T0");
dd9fd8d6 160
0d72dc5b 161 fNumberOfTRMs = 1;
d9cae8af 162 fgLookUp-> SetNumberOfTRMs(fNumberOfTRMs);
0d72dc5b 163 Int_t trm=7; Int_t tdc=0; Int_t chain=0; Int_t channel=0;
79e04c5f 164 for (Int_t ik=0; ik<105; ik++)
f8bea420 165 {
166 AliT0LookUpKey * lookkey= new AliT0LookUpKey();
167 AliT0LookUpValue * lookvalue= new AliT0LookUpValue();
168
169
170 lookvalue->SetTRM(trm);
171 lookvalue->SetTDC(tdc);
172 lookvalue->SetChain(chain);
173 lookvalue->SetChannel(channel);
174 lookkey->SetKey(ik);
0d82bd92 175 fgLookUp->GetMapLookup()->Add((TObject*)lookvalue,(TObject*)lookkey);
663b10cd 176 if (channel<6) channel +=2;
177 else {channel = 0; tdc++;}
0d82bd92 178 if(ik==56) { tdc=0; channel=0; chain = 1;}
dd9fd8d6 179
f8bea420 180 }
74adb36a 181
182 fIsInit=kTRUE;
f8bea420 183}
184//__________________________________________________________________
dc7ca31d 185Float_t
186AliT0Parameters::GetTimeDelayCFD(Int_t ipmt)
82ee3b37 187 {
dc7ca31d 188 // return time delay for CFD channel
189 //
190 if (!fCalibentry)
191 {
c41ceaac 192 fTimeDelayCFD = 1000+ipmt*100;
193 return fTimeDelayCFD;
dc7ca31d 194 }
195
82ee3b37 196 return fgCalibData->GetTimeEq(ipmt);
dc7ca31d 197}
dc7ca31d 198//__________________________________________________________________
199
b95e8d87 200Float_t
201AliT0Parameters:: GetMeanVertex()
202{
203 if (!fCalibentry)
204 {
205 fMeanVertex=0;
206 return fMeanVertex;
207 }
208
209 return fgCalibData->GetMeanVertex();
210}
211//__________________________________________________________________
212
74adb36a 213TGraph *AliT0Parameters::GetAmpLEDRec(Int_t ipmt) const
dc7ca31d 214{
74adb36a 215 if (!fSlewCorr) {
29d3e0eb 216 AliError("No slewing correction is available!");
217 return (TGraph*)fAmpLEDRec.At(ipmt);
dc7ca31d 218 }
74adb36a 219 return fgSlewCorr -> GetAmpLEDRec(ipmt) ;
dc7ca31d 220}
221
222//__________________________________________________________________
223
c41ceaac 224TGraph *AliT0Parameters::GetWalk(Int_t ipmt) const
225{
74adb36a 226 if (!fSlewCorr) {
29d3e0eb 227 AliError("No walk correction is available!");
c41ceaac 228 return (TGraph*)fWalk.At(ipmt);
229 }
74adb36a 230 return fgSlewCorr -> GetWalk(ipmt) ;
c41ceaac 231}
232
233//__________________________________________________________________
234
c883fdf2 235TGraph *AliT0Parameters::GetQTC(Int_t ipmt) const
c41ceaac 236{
0d82bd92 237 if (!fSlewCorr) {
c883fdf2 238 AliError("No walk correction is available!");
239 // return (TGraph*)fQTC.At(ipmt);
240 return 0;
c41ceaac 241 }
c883fdf2 242 return fgSlewCorr -> GetQTC(ipmt) ;
c41ceaac 243}
244
c883fdf2 245//__________________________________________________________________
246TGraph *AliT0Parameters::GetAmpLED(Int_t ipmt) const
247{
248 if (!fSlewCorr) {
249 AliError("No walk correction is available!");
250 // return (TGraph*)fQTC.At(ipmt);
251 return 0;
252 }
253 return fgSlewCorr -> GetAmpLED(ipmt) ;
254}
c41ceaac 255
dc7ca31d 256//__________________________________________________________________
257void
258AliT0Parameters::SetPMTeff(Int_t ipmt)
259{
260 Float_t lambda[50];
261 Float_t eff[50 ] = {0, 0, 0.23619, 0.202909, 0.177913,
262 0.175667, 0.17856, 0.190769, 0.206667, 0.230286,
263 0.252276, 0.256267,0.26, 0.27125, 0.281818,
264 0.288118, 0.294057,0.296222, 0.301622, 0.290421,
265 0.276615, 0.2666, 0.248, 0.23619, 0.227814,
266 0.219818, 0.206667,0.194087, 0.184681, 0.167917,
267 0.154367, 0.1364, 0.109412, 0.0834615,0.0725283,
268 0.0642963,0.05861, 0.0465, 0.0413333,0.032069,
269 0.0252203,0.02066, 0.016262, 0.012, 0.00590476,
270 0.003875, 0.00190, 0, 0, 0 } ;
271 for (Int_t i=0; i<50; i++) lambda[i]=200+10*i;
272
273 TGraph* gr = new TGraph(50,lambda,eff);
274 fPMTeff.AddAtAndExpand(gr,ipmt);
275}
e0bba6cc 276//________________________________________________________________
277
278Int_t
279AliT0Parameters::GetChannel(Int_t trm, Int_t tdc, Int_t chain, Int_t channel)
280{
281
e30bc492 282 if (fgLookUp) {
283 AliT0LookUpValue key(trm,tdc,chain,channel);
3a06b1d2 284 AliT0LookUpKey *val = (AliT0LookUpKey*) fgLookUp->GetMapLookup()->GetValue((TObject*)&key);
285 // AliT0LookUpKey *val = (AliT0LookUpKey*) fLookUp.GetValue((TObject*)&key);
e30bc492 286 if (val )
287 return val->GetKey();
288 else {
289 AliWarning(Form("No such address (%d %d %d %d)!",trm,tdc,chain,channel));
290 return -1;
291 }
292 }
293 else {
294 AliError("No look up table has been loader!");
29d3e0eb 295 return -1;
e0bba6cc 296 }
e0bba6cc 297
298}
5325480c 299//__________________________________________________________________
29d3e0eb 300TMap *AliT0Parameters::GetMapLookup()
301{
302 if (!fgLookUp){
303 cout<<" No look up table in OCDB";
304 return 0;
305 }
306 return fgLookUp->GetMapLookup();
307}
308//__________________________________________________________________
309
5325480c 310Int_t
311AliT0Parameters::GetNumberOfTRMs()
312{
313 // return number of trms
314 //
315 if (!fgLookUp) {
29d3e0eb 316 // fNumberOfTRMs = 2;
5325480c 317 return fNumberOfTRMs;
318 }
319 return fgLookUp ->GetNumberOfTRMs();
320}
256d4943 321/*
5325480c 322//________________________________________________________________________________
323Double_t AliT0Parameters::GetZPosition(const char* symname){
324// Get the global z coordinate of the given T0 alignable volume
325//
29d3e0eb 326 Double_t *tr = AliGeomManager::GetMatrix(symname)->GetTranslation();
5325480c 327
5325480c 328 return tr[2];
29d3e0eb 329}
256d4943 330*/
331//________________________________________________________________________________
332Double_t AliT0Parameters::GetZPosition(const char* symname){
333// Get the global z coordinate of the given T0 alignable volume
334//
335 Double_t *tr;
256d4943 336 TGeoPNEntry *pne = gGeoManager->GetAlignableEntry(symname);
337 if (!pne) return 0;
338
339
340 TGeoPhysicalNode *pnode = pne->GetPhysicalNode();
341 if(pnode){
342 TGeoHMatrix* hm = pnode->GetMatrix();
343 tr = hm->GetTranslation();
344 }else{
345 const char* path = pne->GetTitle();
346 if(!gGeoManager->cd(path)){
347 AliErrorClass(Form("Volume path %s not valid!",path));
348 return 0;
349 }
350 tr = gGeoManager->GetCurrentMatrix()->GetTranslation();
351 }
352 return tr[2];
353
354}
29d3e0eb 355//________________________________________________________________________________
356
357Double_t AliT0Parameters::GetZPositionShift(const char* symname)
358{
359// Get the global z coordinate of the given T0 alignable volume
360//
361 Double_t *tr = AliGeomManager::GetMatrix(symname)->GetTranslation();
362
363 TGeoHMatrix origmat;
364 AliGeomManager::GetOrigGlobalMatrix(symname,origmat);
365 Double_t *otr = origmat.GetTranslation();
5325480c 366
29d3e0eb 367 return (tr[2]-otr[2]);
5325480c 368}
369