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