]> git.uio.no Git - u/mrichter/AliRoot.git/blame - T0/AliT0Parameters.cxx
Handle missing rec-point tree in a uniform way: return null pointer to TEvePointSet.
[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
c883fdf2 220TGraph *AliT0Parameters::GetQTC(Int_t ipmt) const
c41ceaac 221{
0d82bd92 222 if (!fSlewCorr) {
c883fdf2 223 AliError("No walk correction is available!");
224 // return (TGraph*)fQTC.At(ipmt);
225 return 0;
c41ceaac 226 }
c883fdf2 227 return fgSlewCorr -> GetQTC(ipmt) ;
c41ceaac 228}
229
c883fdf2 230//__________________________________________________________________
231TGraph *AliT0Parameters::GetAmpLED(Int_t ipmt) const
232{
233 if (!fSlewCorr) {
234 AliError("No walk correction is available!");
235 // return (TGraph*)fQTC.At(ipmt);
236 return 0;
237 }
238 return fgSlewCorr -> GetAmpLED(ipmt) ;
239}
c41ceaac 240
dc7ca31d 241//__________________________________________________________________
242void
243AliT0Parameters::SetPMTeff(Int_t ipmt)
244{
245 Float_t lambda[50];
246 Float_t eff[50 ] = {0, 0, 0.23619, 0.202909, 0.177913,
247 0.175667, 0.17856, 0.190769, 0.206667, 0.230286,
248 0.252276, 0.256267,0.26, 0.27125, 0.281818,
249 0.288118, 0.294057,0.296222, 0.301622, 0.290421,
250 0.276615, 0.2666, 0.248, 0.23619, 0.227814,
251 0.219818, 0.206667,0.194087, 0.184681, 0.167917,
252 0.154367, 0.1364, 0.109412, 0.0834615,0.0725283,
253 0.0642963,0.05861, 0.0465, 0.0413333,0.032069,
254 0.0252203,0.02066, 0.016262, 0.012, 0.00590476,
255 0.003875, 0.00190, 0, 0, 0 } ;
256 for (Int_t i=0; i<50; i++) lambda[i]=200+10*i;
257
258 TGraph* gr = new TGraph(50,lambda,eff);
259 fPMTeff.AddAtAndExpand(gr,ipmt);
260}
e0bba6cc 261//________________________________________________________________
262
263Int_t
264AliT0Parameters::GetChannel(Int_t trm, Int_t tdc, Int_t chain, Int_t channel)
265{
266
e30bc492 267 if (fgLookUp) {
268 AliT0LookUpValue key(trm,tdc,chain,channel);
3a06b1d2 269 AliT0LookUpKey *val = (AliT0LookUpKey*) fgLookUp->GetMapLookup()->GetValue((TObject*)&key);
270 // AliT0LookUpKey *val = (AliT0LookUpKey*) fLookUp.GetValue((TObject*)&key);
e30bc492 271 if (val )
272 return val->GetKey();
273 else {
274 AliWarning(Form("No such address (%d %d %d %d)!",trm,tdc,chain,channel));
275 return -1;
276 }
277 }
278 else {
279 AliError("No look up table has been loader!");
29d3e0eb 280 return -1;
e0bba6cc 281 }
e0bba6cc 282
283}
5325480c 284//__________________________________________________________________
29d3e0eb 285TMap *AliT0Parameters::GetMapLookup()
286{
287 if (!fgLookUp){
288 cout<<" No look up table in OCDB";
289 return 0;
290 }
291 return fgLookUp->GetMapLookup();
292}
293//__________________________________________________________________
294
5325480c 295Int_t
296AliT0Parameters::GetNumberOfTRMs()
297{
298 // return number of trms
299 //
300 if (!fgLookUp) {
29d3e0eb 301 // fNumberOfTRMs = 2;
5325480c 302 return fNumberOfTRMs;
303 }
304 return fgLookUp ->GetNumberOfTRMs();
305}
256d4943 306/*
5325480c 307//________________________________________________________________________________
308Double_t AliT0Parameters::GetZPosition(const char* symname){
309// Get the global z coordinate of the given T0 alignable volume
310//
29d3e0eb 311 Double_t *tr = AliGeomManager::GetMatrix(symname)->GetTranslation();
5325480c 312
5325480c 313 return tr[2];
29d3e0eb 314}
256d4943 315*/
316//________________________________________________________________________________
317Double_t AliT0Parameters::GetZPosition(const char* symname){
318// Get the global z coordinate of the given T0 alignable volume
319//
320 Double_t *tr;
256d4943 321 TGeoPNEntry *pne = gGeoManager->GetAlignableEntry(symname);
322 if (!pne) return 0;
323
324
325 TGeoPhysicalNode *pnode = pne->GetPhysicalNode();
326 if(pnode){
327 TGeoHMatrix* hm = pnode->GetMatrix();
328 tr = hm->GetTranslation();
329 }else{
330 const char* path = pne->GetTitle();
331 if(!gGeoManager->cd(path)){
332 AliErrorClass(Form("Volume path %s not valid!",path));
333 return 0;
334 }
335 tr = gGeoManager->GetCurrentMatrix()->GetTranslation();
336 }
337 return tr[2];
338
339}
29d3e0eb 340//________________________________________________________________________________
341
342Double_t AliT0Parameters::GetZPositionShift(const char* symname)
343{
344// Get the global z coordinate of the given T0 alignable volume
345//
346 Double_t *tr = AliGeomManager::GetMatrix(symname)->GetTranslation();
347
348 TGeoHMatrix origmat;
349 AliGeomManager::GetOrigGlobalMatrix(symname,origmat);
350 Double_t *otr = origmat.GetTranslation();
5325480c 351
29d3e0eb 352 return (tr[2]-otr[2]);
5325480c 353}
354