calibration Zposition of vertex added
[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    fLookUp(0),
83    fNumberOfTRMs(2),
84    fCalibentry(), fLookUpentry(),fSlewCorr()
85
86   
87 {
88   // Default constructor 
89   for (Int_t ipmt=0; ipmt<24; ipmt++)
90     {
91       SetPh2Mip();      
92       SetmV2Mip();      
93       SetChannelWidth();
94       SetmV2channel();
95       SetQTmin();
96       SetQTmax();
97       SetPMTeff(ipmt);
98     }
99   SetTimeDelayTVD();
100   SetZposition();
101     
102 }
103
104 //__________________________________________________________________
105 void
106 AliT0Parameters::Init()
107 {
108   // Initialize the parameters manager.  We need to get stuff from the
109   // CDB here. 
110    if (fIsInit) return;
111
112    AliCDBManager *stor =AliCDBManager::Instance();
113    //time equalizing
114    fCalibentry  = stor->Get("T0/Calib/TimeDelay");
115    if (fCalibentry)
116      fgCalibData  = (AliT0CalibTimeEq*)fCalibentry->GetObject();
117    else {
118          AliFatal(" ALARM !!!! No time delays in CDB "); 
119      fIsInit = kFALSE;
120      return;
121    }
122  //slewing correction
123   fSlewCorr  = stor->Get("T0/Calib/Slewing_Walk");
124   if (fSlewCorr){
125     fgSlewCorr  = (AliT0CalibWalk*)fSlewCorr->GetObject();
126   }
127   else {
128       AliFatal(" ALARM !!!! No slewing correction in CDB "); 
129     fIsInit = kFALSE;
130     return;
131   }
132   //lookup table
133   fLookUpentry  = stor->Get("T0/Calib/LookUp_Table");
134   if (fLookUpentry){
135     fgLookUp  = (AliT0CalibData*)fLookUpentry->GetObject();
136   }
137   else {
138      AliFatal(" ALARM !!!! No Lookup table  in CDB "); 
139     fIsInit = kFALSE;
140     return;
141   }
142   fIsInit = kTRUE;
143 }
144
145
146 //__________________________________________________________________
147
148 void 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);
154
155   if (fIsInit) return;
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.
159    fgLookUp = new AliT0CalibData("T0");
160
161   fNumberOfTRMs = 1;
162  fgLookUp-> SetNumberOfTRMs(fNumberOfTRMs);
163   Int_t trm=7; Int_t tdc=0; Int_t chain=0; Int_t channel=0;
164   for (Int_t ik=0; ik<105; ik++)
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);
175           fgLookUp->GetMapLookup()->Add((TObject*)lookvalue,(TObject*)lookkey); 
176           if (channel<6) channel +=2;
177           else {channel = 0; tdc++;}
178           if(ik==56) { tdc=0; channel=0; chain = 1;}
179
180        }
181   
182   fIsInit=kTRUE;
183 }
184 //__________________________________________________________________
185 Float_t
186 AliT0Parameters::GetTimeDelayCFD(Int_t ipmt) 
187   {
188   // return time delay for CFD channel
189    // 
190   if (!fCalibentry) 
191     {
192       fTimeDelayCFD = 1000+ipmt*100;
193       return fTimeDelayCFD;
194     }
195    
196   return fgCalibData->GetTimeEq(ipmt);
197 }
198 //__________________________________________________________________
199
200 Float_t
201 AliT0Parameters:: GetMeanVertex()
202
203   if (!fCalibentry) 
204     {
205       fMeanVertex=0;
206       return fMeanVertex;
207     }
208    
209   return fgCalibData->GetMeanVertex();
210 }
211 //__________________________________________________________________
212
213 TGraph *AliT0Parameters::GetAmpLEDRec(Int_t ipmt) const
214 {
215    if (!fSlewCorr) {
216      AliError("No slewing correction is available!");
217      return  (TGraph*)fAmpLEDRec.At(ipmt); 
218   } 
219   return fgSlewCorr -> GetAmpLEDRec(ipmt) ;
220 }
221
222 //__________________________________________________________________
223
224 TGraph *AliT0Parameters::GetWalk(Int_t ipmt) const
225 {
226   if (!fSlewCorr) {
227     AliError("No walk correction is available!");
228     return  (TGraph*)fWalk.At(ipmt); 
229   } 
230   return fgSlewCorr -> GetWalk(ipmt) ;
231 }
232
233 //__________________________________________________________________
234
235 TGraph *AliT0Parameters::GetQTC(Int_t ipmt) const
236 {
237   if (!fSlewCorr) {
238     AliError("No walk correction is available!");
239     //    return  (TGraph*)fQTC.At(ipmt); 
240    return  0; 
241   } 
242   return fgSlewCorr -> GetQTC(ipmt) ;
243 }
244
245 //__________________________________________________________________
246 TGraph *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 }
255
256 //__________________________________________________________________
257 void 
258 AliT0Parameters::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 }
276 //________________________________________________________________
277
278 Int_t 
279 AliT0Parameters::GetChannel(Int_t trm,  Int_t tdc, Int_t chain, Int_t channel)
280 {
281
282   if (fgLookUp) {
283     AliT0LookUpValue key(trm,tdc,chain,channel);
284       AliT0LookUpKey *val = (AliT0LookUpKey*) fgLookUp->GetMapLookup()->GetValue((TObject*)&key);
285       // AliT0LookUpKey *val = (AliT0LookUpKey*) fLookUp.GetValue((TObject*)&key);
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!");
295     return -1;
296   }
297
298 }
299 //__________________________________________________________________
300 TMap *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
310 Int_t
311 AliT0Parameters::GetNumberOfTRMs() 
312 {
313   // return number of trms
314   // 
315   if (!fgLookUp) {
316     //  fNumberOfTRMs = 2;
317     return  fNumberOfTRMs;
318   } 
319   return  fgLookUp ->GetNumberOfTRMs();
320 }
321 /*
322 //________________________________________________________________________________
323 Double_t AliT0Parameters::GetZPosition(const char* symname){
324 // Get the global z coordinate of the given T0 alignable volume
325 //
326   Double_t *tr = AliGeomManager::GetMatrix(symname)->GetTranslation();
327
328   return tr[2];
329 }
330 */
331 //________________________________________________________________________________
332 Double_t AliT0Parameters::GetZPosition(const char* symname){
333 // Get the global z coordinate of the given T0 alignable volume
334 //
335   Double_t *tr;
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 }
355 //________________________________________________________________________________
356
357 Double_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();
366
367   return (tr[2]-otr[2]);
368 }
369