]> git.uio.no Git - u/mrichter/AliRoot.git/blob - T0/AliT0Parameters.cxx
improved time-amplitude corretion
[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    fTimeDelayCFD(0), 
77  //  fTimeV0(0), 
78    fTimeDelayTVD(0),
79    fMeanT0(512),
80    fLookUp(0),
81    fNumberOfTRMs(2),
82    fCalibentry(), fLookUpentry(),fSlewCorr()
83
84   
85 {
86   // Default constructor 
87   for (Int_t ipmt=0; ipmt<24; ipmt++)
88     {
89       SetPh2Mip();      
90       SetmV2Mip();      
91       SetChannelWidth();
92       SetmV2channel();
93       SetQTmin();
94       SetQTmax();
95       SetPMTeff(ipmt);
96     }
97   SetTimeDelayTVD();
98   SetZposition();
99     
100 }
101
102 //__________________________________________________________________
103 void
104 AliT0Parameters::Init()
105 {
106   // Initialize the parameters manager.  We need to get stuff from the
107   // CDB here. 
108    if (fIsInit) return;
109
110    AliCDBManager *stor =AliCDBManager::Instance();
111    //time equalizing
112    fCalibentry  = stor->Get("T0/Calib/TimeDelay");
113    if (fCalibentry)
114      fgCalibData  = (AliT0CalibTimeEq*)fCalibentry->GetObject();
115    else {
116          AliFatal(" ALARM !!!! No time delays in CDB "); 
117      fIsInit = kFALSE;
118      return;
119    }
120  //slewing correction
121   fSlewCorr  = stor->Get("T0/Calib/Slewing_Walk");
122   if (fSlewCorr){
123     fgSlewCorr  = (AliT0CalibWalk*)fSlewCorr->GetObject();
124   }
125   else {
126       AliFatal(" ALARM !!!! No slewing correction in CDB "); 
127     fIsInit = kFALSE;
128     return;
129   }
130   //lookup table
131   fLookUpentry  = stor->Get("T0/Calib/LookUp_Table");
132   if (fLookUpentry){
133     fgLookUp  = (AliT0CalibData*)fLookUpentry->GetObject();
134   }
135   else {
136      AliFatal(" ALARM !!!! No Lookup table  in CDB "); 
137     fIsInit = kFALSE;
138     return;
139   }
140   fIsInit = kTRUE;
141 }
142
143
144 //__________________________________________________________________
145
146 void 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);
152
153   if (fIsInit) return;
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.
157    fgLookUp = new AliT0CalibData("T0");
158
159   fNumberOfTRMs = 1;
160  fgLookUp-> SetNumberOfTRMs(fNumberOfTRMs);
161   Int_t trm=7; Int_t tdc=0; Int_t chain=0; Int_t channel=0;
162   for (Int_t ik=0; ik<105; ik++)
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);
173           fgLookUp->GetMapLookup()->Add((TObject*)lookvalue,(TObject*)lookkey); 
174           if (channel<6) channel +=2;
175           else {channel = 0; tdc++;}
176           if(ik==56) { tdc=0; channel=0; chain = 1;}
177
178        }
179   
180   fIsInit=kTRUE;
181 }
182 //__________________________________________________________________
183 Float_t
184 AliT0Parameters::GetTimeDelayCFD(Int_t ipmt) 
185   {
186   // return time delay for CFD channel
187    // 
188   if (!fCalibentry) 
189     {
190       fTimeDelayCFD = 1000+ipmt*100;
191       return fTimeDelayCFD;
192     }
193    
194   return fgCalibData->GetTimeEq(ipmt);
195 }
196 //__________________________________________________________________
197
198 TGraph *AliT0Parameters::GetAmpLEDRec(Int_t ipmt) const
199 {
200    if (!fSlewCorr) {
201      AliError("No slewing correction is available!");
202      return  (TGraph*)fAmpLEDRec.At(ipmt); 
203   } 
204   return fgSlewCorr -> GetAmpLEDRec(ipmt) ;
205 }
206
207 //__________________________________________________________________
208
209 TGraph *AliT0Parameters::GetWalk(Int_t ipmt) const
210 {
211   if (!fSlewCorr) {
212     AliError("No walk correction is available!");
213     return  (TGraph*)fWalk.At(ipmt); 
214   } 
215   return fgSlewCorr -> GetWalk(ipmt) ;
216 }
217
218 //__________________________________________________________________
219
220 TGraph *AliT0Parameters::GetQTC(Int_t ipmt) const
221 {
222   if (!fSlewCorr) {
223     AliError("No walk correction is available!");
224     //    return  (TGraph*)fQTC.At(ipmt); 
225    return  0; 
226   } 
227   return fgSlewCorr -> GetQTC(ipmt) ;
228 }
229
230 //__________________________________________________________________
231 TGraph *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 }
240
241 //__________________________________________________________________
242 void 
243 AliT0Parameters::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 }
261 //________________________________________________________________
262
263 Int_t 
264 AliT0Parameters::GetChannel(Int_t trm,  Int_t tdc, Int_t chain, Int_t channel)
265 {
266
267   if (fgLookUp) {
268     AliT0LookUpValue key(trm,tdc,chain,channel);
269       AliT0LookUpKey *val = (AliT0LookUpKey*) fgLookUp->GetMapLookup()->GetValue((TObject*)&key);
270       // AliT0LookUpKey *val = (AliT0LookUpKey*) fLookUp.GetValue((TObject*)&key);
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!");
280     return -1;
281   }
282
283 }
284 //__________________________________________________________________
285 TMap *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
295 Int_t
296 AliT0Parameters::GetNumberOfTRMs() 
297 {
298   // return number of trms
299   // 
300   if (!fgLookUp) {
301     //  fNumberOfTRMs = 2;
302     return  fNumberOfTRMs;
303   } 
304   return  fgLookUp ->GetNumberOfTRMs();
305 }
306 /*
307 //________________________________________________________________________________
308 Double_t AliT0Parameters::GetZPosition(const char* symname){
309 // Get the global z coordinate of the given T0 alignable volume
310 //
311   Double_t *tr = AliGeomManager::GetMatrix(symname)->GetTranslation();
312
313   return tr[2];
314 }
315 */
316 //________________________________________________________________________________
317 Double_t AliT0Parameters::GetZPosition(const char* symname){
318 // Get the global z coordinate of the given T0 alignable volume
319 //
320   Double_t *tr;
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 }
340 //________________________________________________________________________________
341
342 Double_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();
351
352   return (tr[2]-otr[2]);
353 }
354