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