improved version from Tomek
[u/mrichter/AliRoot.git] / T0 / AliT0Parameters.cxx
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 //                                                       
27 #include "AliT0.h"
28 #include "AliLog.h"               
29 #include "AliT0Parameters.h"      
30 #include "AliT0CalibData.h"   
31 #include "AliT0CalibWalk.h"   
32 #include "AliT0CalibTimeEq.h"   
33 #include "AliT0LookUpKey.h"
34 #include "AliT0LookUpValue.h"
35 #include <AliCDBManager.h>        
36 #include <AliCDBEntry.h>          
37 #include <AliCDBStorage.h>  
38 #include <TMath.h>
39 #include <TSystem.h>
40 //#include <Riostream.h>
41 #include <TGeoManager.h>
42 #include <TGeoPhysicalNode.h>
43 #include <TGeoMatrix.h>
44 #include <AliGeomManager.h>
45
46 AliT0CalibTimeEq* AliT0Parameters::fgCalibData = 0;
47 AliT0CalibData* AliT0Parameters::fgLookUp = 0;
48 AliT0CalibWalk* AliT0Parameters::fgSlewCorr =0;
49 //====================================================================
50 ClassImp(AliT0Parameters)
51 #if 0
52   ; // This is here to keep Emacs for indenting the next line
53 #endif
54
55 //____________________________________________________________________
56 AliT0Parameters* AliT0Parameters::fgInstance = 0;
57 //____________________________________________________________________
58 AliT0Parameters* AliT0Parameters::Instance() 
59 {
60   // Get static instance 
61   if (!fgInstance) {
62     fgInstance = new AliT0Parameters;
63   }
64   return fgInstance;
65 }
66
67 //____________________________________________________________________
68 AliT0Parameters::AliT0Parameters()
69   :fIsInit(kFALSE),
70    fPh2Mip(0),fmV2Mip(0),
71    fChannelWidth(0),fmV2Channel(0),
72    fQTmin(0),fQTmax(0),
73    fAmpLEDRec(0), 
74    fPMTeff(),
75    fWalk(0),
76    fQTC(0),
77    fAmpLED(0),
78    fTimeDelayCFD(0), 
79  //  fTimeV0(0), 
80    fTimeDelayTVD(0),
81    fMeanT0(512),
82    fMeanVertex(0),
83    fLookUp(0),
84    fNumberOfTRMs(2),
85    fCalibentry(), fLookUpentry(),fSlewCorr()
86
87   
88 {
89   // Default constructor 
90   for (Int_t ipmt=0; ipmt<24; ipmt++)
91     {
92       SetPh2Mip();      
93       SetmV2Mip();      
94       SetChannelWidth();
95       SetmV2channel();
96       SetQTmin();
97       SetQTmax();
98       SetPMTeff(ipmt);
99     }
100   SetTimeDelayTVD();
101   SetZposition();
102     
103 }
104
105 //__________________________________________________________________
106 void
107 AliT0Parameters::Init()
108 {
109   // Initialize the parameters manager.  We need to get stuff from the
110   // CDB here. 
111    if (fIsInit) return;
112
113    AliCDBManager *stor =AliCDBManager::Instance();
114    //time equalizing
115    fCalibentry  = stor->Get("T0/Calib/TimeDelay");
116    if (fCalibentry)
117      fgCalibData  = (AliT0CalibTimeEq*)fCalibentry->GetObject();
118    else {
119          AliFatal(" ALARM !!!! No time delays in CDB "); 
120      fIsInit = kFALSE;
121      return;
122    }
123  //slewing correction
124   fSlewCorr  = stor->Get("T0/Calib/Slewing_Walk");
125   if (fSlewCorr){
126     fgSlewCorr  = (AliT0CalibWalk*)fSlewCorr->GetObject();
127   }
128   else {
129       AliFatal(" ALARM !!!! No slewing correction in CDB "); 
130     fIsInit = kFALSE;
131     return;
132   }
133   //lookup table
134   fLookUpentry  = stor->Get("T0/Calib/LookUp_Table");
135   if (fLookUpentry){
136     fgLookUp  = (AliT0CalibData*)fLookUpentry->GetObject();
137   }
138   else {
139      AliFatal(" ALARM !!!! No Lookup table  in CDB "); 
140     fIsInit = kFALSE;
141     return;
142   }
143   fIsInit = kTRUE;
144 }
145
146
147 //__________________________________________________________________
148
149 void 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);
155
156   if (fIsInit) return;
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.
160    fgLookUp = new AliT0CalibData("T0");
161
162   fNumberOfTRMs = 1;
163  fgLookUp-> SetNumberOfTRMs(fNumberOfTRMs);
164   Int_t trm=7; Int_t tdc=0; Int_t chain=0; Int_t channel=0;
165   for (Int_t ik=0; ik<105; ik++)
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);
176           fgLookUp->GetMapLookup()->Add((TObject*)lookvalue,(TObject*)lookkey); 
177           if (channel<6) channel +=2;
178           else {channel = 0; tdc++;}
179           if(ik==56) { tdc=0; channel=0; chain = 1;}
180
181        }
182   
183   fIsInit=kTRUE;
184 }
185 //__________________________________________________________________
186 Float_t
187 AliT0Parameters::GetTimeDelayCFD(Int_t ipmt) 
188   {
189   // return time delay for CFD channel
190    // 
191   if (!fCalibentry) 
192     {
193       fTimeDelayCFD = 1000+ipmt*100;
194       return fTimeDelayCFD;
195     }
196    
197   return fgCalibData->GetTimeEq(ipmt);
198 }
199 //__________________________________________________________________
200
201 Float_t
202 AliT0Parameters:: GetMeanVertex()
203
204   if (!fCalibentry) 
205     {
206       fMeanVertex=0;
207       return fMeanVertex;
208     }
209    
210   return fgCalibData->GetMeanVertex();
211 }
212 //__________________________________________________________________
213
214 TGraph *AliT0Parameters::GetAmpLEDRec(Int_t ipmt) const
215 {
216    if (!fSlewCorr) {
217      AliError("No slewing correction is available!");
218      return  (TGraph*)fAmpLEDRec.At(ipmt); 
219   } 
220   return fgSlewCorr -> GetAmpLEDRec(ipmt) ;
221 }
222
223 //__________________________________________________________________
224
225 TGraph *AliT0Parameters::GetWalk(Int_t ipmt) const
226 {
227   if (!fSlewCorr) {
228     AliError("No walk correction is available!");
229     return  (TGraph*)fWalk.At(ipmt); 
230   } 
231   return fgSlewCorr -> GetWalk(ipmt) ;
232 }
233
234 //__________________________________________________________________
235
236 TGraph *AliT0Parameters::GetQTC(Int_t ipmt) const
237 {
238   if (!fSlewCorr) {
239     AliError("No walk correction is available!");
240     //    return  (TGraph*)fQTC.At(ipmt); 
241    return  0; 
242   } 
243   return fgSlewCorr -> GetQTC(ipmt) ;
244 }
245
246 //__________________________________________________________________
247 TGraph *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 }
256
257 //__________________________________________________________________
258 void 
259 AliT0Parameters::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 }
277 //________________________________________________________________
278
279 Int_t 
280 AliT0Parameters::GetChannel(Int_t trm,  Int_t tdc, Int_t chain, Int_t channel)
281 {
282
283   if (fgLookUp) {
284     AliT0LookUpValue key(trm,tdc,chain,channel);
285       AliT0LookUpKey *val = (AliT0LookUpKey*) fgLookUp->GetMapLookup()->GetValue((TObject*)&key);
286       // AliT0LookUpKey *val = (AliT0LookUpKey*) fLookUp.GetValue((TObject*)&key);
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!");
296     return -1;
297   }
298
299 }
300 //__________________________________________________________________
301 TMap *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
311 Int_t
312 AliT0Parameters::GetNumberOfTRMs() 
313 {
314   // return number of trms
315   // 
316   if (!fgLookUp) {
317     //  fNumberOfTRMs = 2;
318     return  fNumberOfTRMs;
319   } 
320   return  fgLookUp ->GetNumberOfTRMs();
321 }
322 /*
323 //________________________________________________________________________________
324 Double_t AliT0Parameters::GetZPosition(const char* symname){
325 // Get the global z coordinate of the given T0 alignable volume
326 //
327   Double_t *tr = AliGeomManager::GetMatrix(symname)->GetTranslation();
328
329   return tr[2];
330 }
331 */
332 //________________________________________________________________________________
333 Double_t AliT0Parameters::GetZPosition(const char* symname){
334 // Get the global z coordinate of the given T0 alignable volume
335 //
336   Double_t *tr;
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 }
356 //________________________________________________________________________________
357
358 Double_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();
367
368   return (tr[2]-otr[2]);
369 }
370