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