d28c2674bc15927d08708a8b5dfdb2ea5279ce1a
[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 "AliT0LookUpValue.h"
34 #include <AliCDBManager.h>        
35 #include <AliCDBEntry.h>          
36 #include <AliCDBStorage.h>  
37 #include <TMath.h>
38 #include <TSystem.h>
39 #include <Riostream.h>
40 #include <TGeoManager.h>
41 #include <TGeoPhysicalNode.h>
42 #include <AliGeomManager.h>
43
44 AliT0CalibTimeEq* AliT0Parameters::fgCalibData = 0;
45 AliT0CalibData* AliT0Parameters::fgLookUp = 0;
46 AliT0CalibWalk* AliT0Parameters::fgSlewCorr =0;
47 //====================================================================
48 ClassImp(AliT0Parameters)
49 #if 0
50   ; // This is here to keep Emacs for indenting the next line
51 #endif
52
53 //____________________________________________________________________
54 AliT0Parameters* AliT0Parameters::fgInstance = 0;
55 //____________________________________________________________________
56 AliT0Parameters* AliT0Parameters::Instance() 
57 {
58   // Get static instance 
59   if (!fgInstance) {
60     fgInstance = new AliT0Parameters;
61   }
62   return fgInstance;
63 }
64
65 //____________________________________________________________________
66 AliT0Parameters::AliT0Parameters()
67   :fIsInit(kFALSE),
68    fPh2Mip(0),fmV2Mip(0),
69    fChannelWidth(0),fmV2Channel(0),
70    fQTmin(0),fQTmax(0),
71    fAmpLEDRec(0), 
72    fPMTeff(),
73    fWalk(0),
74    fTimeDelayCFD(0), 
75  //  fTimeV0(0), 
76    fTimeDelayTVD(0),
77    fMeanT0(512),
78    fLookUp(0),
79    fNumberOfTRMs(2),
80    fCalibentry(), fLookUpentry(),fSlewCorr()
81
82   
83 {
84   // Default constructor 
85   for (Int_t ipmt=0; ipmt<24; ipmt++)
86     {
87       SetPh2Mip();      
88       SetmV2Mip();      
89       SetChannelWidth();
90       SetmV2channel();
91       SetQTmin();
92       SetQTmax();
93       SetPMTeff(ipmt);
94     }
95   SetTimeDelayTVD();
96   SetZposition();
97     
98 }
99
100 //__________________________________________________________________
101 void
102 AliT0Parameters::Init()
103 {
104   // Initialize the parameters manager.  We need to get stuff from the
105   // CDB here. 
106    if (fIsInit) return;
107
108    AliCDBManager *stor =AliCDBManager::Instance();
109    //time equalizing
110    fCalibentry  = stor->Get("T0/Calib/TimeDelay");
111    if (fCalibentry)
112      fgCalibData  = (AliT0CalibTimeEq*)fCalibentry->GetObject();
113    else {
114          AliFatal(" ALARM !!!! No time delays in CDB "); 
115      fIsInit = kFALSE;
116      return;
117    }
118  //slewing correction
119   fSlewCorr  = stor->Get("T0/Calib/Slewing_Walk");
120   if (fSlewCorr){
121     fgSlewCorr  = (AliT0CalibWalk*)fSlewCorr->GetObject();
122   }
123   else {
124       AliFatal(" ALARM !!!! No slewing correction in CDB "); 
125     fIsInit = kFALSE;
126     return;
127   }
128   //lookup table
129   fLookUpentry  = stor->Get("T0/Calib/LookUp_Table");
130   if (fLookUpentry){
131     fgLookUp  = (AliT0CalibData*)fLookUpentry->GetObject();
132   }
133   else {
134      AliFatal(" ALARM !!!! No Lookup table  in CDB "); 
135     fIsInit = kFALSE;
136     return;
137   }
138   fIsInit = kTRUE;
139 }
140
141
142 //__________________________________________________________________
143
144 void AliT0Parameters::InitIfOnline()
145 {
146 // should be used in online
147 // for switching to this one should write
148   // AliT0RawReader myrawreader(rawReader);
149 //      myrawreader.SetOnlineMode(kTRUE);
150 cout<<" AliT0Parameters::InitIfOnline() "<<endl;
151   if (fIsInit) return;
152    //standart configuration (used for simulation)
153    //Int_t trm=0; Int_t tdc=0; Int_t chain=0; Int_t channel=0;
154   // configuration for test Jun07.
155    fgLookUp = new AliT0CalibData("T0");
156
157   fNumberOfTRMs = 1;
158  fgLookUp-> SetNumberOfTRMs(fNumberOfTRMs);
159   Int_t trm=7; Int_t tdc=0; Int_t chain=0; Int_t channel=0;
160   for (Int_t ik=0; ik<105; ik++)
161         {
162          AliT0LookUpKey * lookkey= new AliT0LookUpKey();
163          AliT0LookUpValue * lookvalue= new AliT0LookUpValue();
164
165
166           lookvalue->SetTRM(trm);
167           lookvalue->SetTDC(tdc);
168           lookvalue->SetChain(chain);
169           lookvalue->SetChannel(channel);
170           lookkey->SetKey(ik);
171           if (channel<6) channel +=2;
172           else {channel = 0; tdc++;}
173           if(ik==57) { tdc=0; channel=0; chain = 1;}
174
175           fgLookUp->GetMapLookup()->Add((TObject*)lookvalue,(TObject*)lookkey); 
176        }
177   
178   fIsInit=kTRUE;
179 }
180 //__________________________________________________________________
181 Float_t
182 AliT0Parameters::GetTimeDelayCFD(Int_t ipmt) 
183   {
184   // return time delay for CFD channel
185    // 
186   if (!fCalibentry) 
187     {
188       fTimeDelayCFD = 1000+ipmt*100;
189       return fTimeDelayCFD;
190     }
191    
192   return fgCalibData->GetTimeEq(ipmt);
193 }
194 //__________________________________________________________________
195
196 TGraph *AliT0Parameters::GetAmpLEDRec(Int_t ipmt) const
197 {
198    if (!fSlewCorr) {
199      AliError("No slewing correction is available!");
200      return  (TGraph*)fAmpLEDRec.At(ipmt); 
201   } 
202   return fgSlewCorr -> GetAmpLEDRec(ipmt) ;
203 }
204
205 //__________________________________________________________________
206
207 TGraph *AliT0Parameters::GetWalk(Int_t ipmt) const
208 {
209   if (!fSlewCorr) {
210     AliError("No walk correction is available!");
211     return  (TGraph*)fWalk.At(ipmt); 
212   } 
213   return fgSlewCorr -> GetWalk(ipmt) ;
214 }
215
216 //__________________________________________________________________
217
218 Float_t AliT0Parameters::GetWalkVal(Int_t ipmt, Float_t mv) const
219 {
220   if (!fSlewCorr) {
221     return ((TGraph*)fWalk.At(ipmt))->Eval(mv); 
222   } 
223   return fgSlewCorr -> GetWalkVal(ipmt, mv) ;
224 }
225
226
227 //__________________________________________________________________
228 void 
229 AliT0Parameters::SetPMTeff(Int_t ipmt)
230 {
231   Float_t lambda[50];
232   Float_t eff[50 ] = {0,        0,       0.23619,  0.202909, 0.177913, 
233                     0.175667, 0.17856, 0.190769, 0.206667, 0.230286,
234                     0.252276, 0.256267,0.26,     0.27125,  0.281818,
235                     0.288118, 0.294057,0.296222, 0.301622, 0.290421, 
236                     0.276615, 0.2666,  0.248,    0.23619,  0.227814, 
237                     0.219818, 0.206667,0.194087, 0.184681, 0.167917, 
238                     0.154367, 0.1364,  0.109412, 0.0834615,0.0725283, 
239                     0.0642963,0.05861, 0.0465,   0.0413333,0.032069, 
240                     0.0252203,0.02066, 0.016262, 0.012,    0.00590476,
241                     0.003875, 0.00190, 0,        0,        0          } ;
242   for (Int_t i=0; i<50; i++) lambda[i]=200+10*i; 
243
244   TGraph* gr = new TGraph(50,lambda,eff);
245   fPMTeff.AddAtAndExpand(gr,ipmt);
246 }
247 //________________________________________________________________
248
249 Int_t 
250 AliT0Parameters::GetChannel(Int_t trm,  Int_t tdc, Int_t chain, Int_t channel)
251 {
252
253   if (fgLookUp) {
254     AliT0LookUpValue key(trm,tdc,chain,channel);
255       AliT0LookUpKey *val = (AliT0LookUpKey*) fgLookUp->GetMapLookup()->GetValue((TObject*)&key);
256       // AliT0LookUpKey *val = (AliT0LookUpKey*) fLookUp.GetValue((TObject*)&key);
257     if (val )
258       return val->GetKey();
259     else {
260       AliWarning(Form("No such address (%d %d %d %d)!",trm,tdc,chain,channel));
261       return -1;
262     }
263   }
264   else {
265     AliError("No look up table has been loader!");
266     return -1;
267   }
268
269 }
270 //__________________________________________________________________
271 TMap *AliT0Parameters::GetMapLookup()
272 {
273   if (!fgLookUp){
274     cout<<" No look up table in OCDB";
275     return 0;
276   }
277   return   fgLookUp->GetMapLookup();
278 }
279 //__________________________________________________________________
280
281 Int_t
282 AliT0Parameters::GetNumberOfTRMs() 
283 {
284   // return number of trms
285   // 
286   if (!fgLookUp) {
287     //  fNumberOfTRMs = 2;
288     return  fNumberOfTRMs;
289   } 
290   return  fgLookUp ->GetNumberOfTRMs();
291 }
292 /*
293 //________________________________________________________________________________
294 Double_t AliT0Parameters::GetZPosition(const char* symname){
295 // Get the global z coordinate of the given T0 alignable volume
296 //
297   Double_t *tr = AliGeomManager::GetMatrix(symname)->GetTranslation();
298
299   return tr[2];
300 }
301 */
302 //________________________________________________________________________________
303 Double_t AliT0Parameters::GetZPosition(const char* symname){
304 // Get the global z coordinate of the given T0 alignable volume
305 //
306   Double_t *tr;
307   TGeoPNEntry *pne = gGeoManager->GetAlignableEntry(symname);
308   if (!pne) return 0;
309   
310
311   TGeoPhysicalNode *pnode = pne->GetPhysicalNode();
312   if(pnode){
313           TGeoHMatrix* hm = pnode->GetMatrix();
314            tr = hm->GetTranslation();
315   }else{
316           const char* path = pne->GetTitle();
317           if(!gGeoManager->cd(path)){
318                   AliErrorClass(Form("Volume path %s not valid!",path));
319                   return 0;
320           }
321          tr = gGeoManager->GetCurrentMatrix()->GetTranslation();
322   }
323   return tr[2];
324
325 }
326 //________________________________________________________________________________
327
328 Double_t AliT0Parameters::GetZPositionShift(const char* symname)
329 {
330 // Get the global z coordinate of the given T0 alignable volume
331 //
332   Double_t *tr = AliGeomManager::GetMatrix(symname)->GetTranslation();
333
334   TGeoHMatrix origmat;
335   AliGeomManager::GetOrigGlobalMatrix(symname,origmat);
336   Double_t *otr = origmat.GetTranslation();
337
338   return (tr[2]-otr[2]);
339 }
340