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