1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 //____________________________________________________________________
22 // This class is a singleton that handles various parameters of
24 // Eventually, this class will use the Conditions DB to get the
25 // various parameters, which code can then request from here.
28 #include "AliT0Parameters.h"
29 #include "AliT0CalibData.h"
30 #include "AliT0LookUpValue.h"
31 #include <AliCDBManager.h>
32 #include <AliCDBEntry.h>
33 #include <AliCDBStorage.h>
36 #include <Riostream.h>
37 #include <TGeoManager.h>
38 #include <TGeoPhysicalNode.h>
40 AliT0CalibData* AliT0Parameters::fgCalibData = 0;
41 AliT0CalibData* AliT0Parameters::fgLookUp = 0;
42 AliT0CalibData* AliT0Parameters::fgSlewCorr =0;
43 //====================================================================
44 ClassImp(AliT0Parameters)
46 ; // This is here to keep Emacs for indenting the next line
49 //____________________________________________________________________
50 AliT0Parameters* AliT0Parameters::fgInstance = 0;
51 //____________________________________________________________________
52 AliT0Parameters* AliT0Parameters::Instance()
54 // Get static instance
56 fgInstance = new AliT0Parameters;
57 // fgInstance->Init();
62 //____________________________________________________________________
63 AliT0Parameters::AliT0Parameters()
65 fPh2Mip(0),fmV2Mip(0),
66 fChannelWidth(0),fmV2Channel(0),
68 fSlewingLED(),fSlewingRec(),
70 fTimeDelayDA(0),fTimeDelayCFD(0),fTimeDelayTVD(0),fMeanT0(499),
71 fCalibentry(), fLookUpentry(),fSlewCorr(),
72 fLookUp(0), fNumberOfTRMs(0)
75 // Default constructor
77 for (Int_t ipmt=0; ipmt<24; ipmt++)
97 //__________________________________________________________________
99 AliT0Parameters::Init()
101 // Initialize the parameters manager. We need to get stuff from the
106 AliCDBManager *stor =AliCDBManager::Instance();
108 AliCDBEntry* fCalibentry = stor->Get("T0/Calib/TimeDelay");
110 fgCalibData = (AliT0CalibData*)fCalibentry->GetObject();
112 AliError(" ALARM !!!! No time delays in CDB ");
117 AliCDBEntry* fSlewCorr = stor->Get("T0/Calib/Slewing_Walk");
119 fgSlewCorr = (AliT0CalibData*)fSlewCorr->GetObject();
122 AliError(" ALARM !!!! No slewing correction in CDB ");
127 fLookUpentry = stor->Get("T0/Calib/LookUp_Table");
129 fgLookUp = (AliT0CalibData*)fLookUpentry->GetObject();
132 AliError(" ALARM !!!! No Lookup table in CDB ");
139 const char * filename = gSystem->ExpandPathName("$ALICE_ROOT/T0/lookUpTable.txt");
140 ifstream inFile(filename);
141 fgLookUp->ReadAsciiLookup(filename);
148 //__________________________________________________________________
150 AliT0Parameters::GetTimeDelayDA(Int_t ipmt)
152 // return time delay for LED channel
158 return fgCalibData ->GetTimeDelayDA(ipmt);
160 //__________________________________________________________________
162 AliT0Parameters::GetTimeDelayCFD(Int_t ipmt)
164 // return time delay for CFD channel
168 fTimeDelayCFD = 1000+ipmt*100;
169 return fTimeDelayCFD;
172 return fgCalibData->GetTimeDelayCFD(ipmt);
175 //__________________________________________________________________
177 AliT0Parameters::GetMeanT0()
179 // return mean of T0 distrubution with vertex=0
186 return fgCalibData->GetMeanT0();
188 //__________________________________________________________________
191 AliT0Parameters::SetSlewingLED(Int_t ipmt)
193 // Set Slweing Correction for LED channel
194 Float_t mv[23] = {25, 30,40,60, 80,100,150,200,250,300,
195 400,500,600,800,1000,1500, 2000, 3000, 4000, 5500,
197 Float_t y[23] = {5044, 4719, 3835, 3224, 2847, 2691,2327, 2067, 1937, 1781,
198 1560, 1456 ,1339, 1163.5, 1027, 819, 650, 520, 370.5, 234,
201 TGraph* gr = new TGraph(23,mv,y);
202 fSlewingLED.AddAtAndExpand(gr,ipmt);
204 //__________________________________________________________________
206 Float_t AliT0Parameters::GetSlewingLED(Int_t ipmt, Float_t mv) const
209 return ((TGraph*)fSlewingLED.At(ipmt))->Eval(mv);
211 return fgCalibData->GetSlewingLED(ipmt, mv) ;
215 //__________________________________________________________________
217 TGraph *AliT0Parameters::GetSlew(Int_t ipmt) const
220 return (TGraph*)fSlewingLED.At(ipmt);
222 return fgCalibData -> GetSlew(ipmt) ;
225 //__________________________________________________________________
229 AliT0Parameters::SetSlewingRec(Int_t ipmt)
231 // Set Slweing Correction for LED channel
232 Float_t mv[23] = {25, 30, 40,60, 80,100,150,200,250,300,
233 400,500,600,800,1000,1500, 2000, 3000, 4000, 5500,
235 Float_t y[23] = {5044, 4719, 3835, 3224, 2847, 2691,2327, 2067, 1937, 1781,
236 1560, 1456 ,1339, 1163.5, 1027, 819, 650, 520, 370.5, 234,
238 Float_t y1[23], mv1[23];
239 for (Int_t i=0; i<23; i++){
240 y1[i] = y[22-i]; mv1[i] = mv[22-i];}
242 TGraph* gr = new TGraph(23,y1,mv1);
243 fSlewingRec.AddAtAndExpand(gr,ipmt);
246 //__________________________________________________________________
248 Float_t AliT0Parameters::GetSlewingRec(Int_t ipmt, Float_t mv) const
251 return ((TGraph*)fSlewingRec.At(ipmt))->Eval(mv);
253 return fgCalibData -> GetSlewingRec(ipmt, mv) ;
256 //__________________________________________________________________
258 TGraph *AliT0Parameters::GetSlewRec(Int_t ipmt) const
261 return (TGraph*)fSlewingRec.At(ipmt);
263 return fgCalibData -> GetSlewRec(ipmt) ;
267 //________________________________________________________________
268 void AliT0Parameters::SetWalk(Int_t ipmt)
272 Int_t x[70000], y[70000], index[70000];
273 Float_t time[10000],amplitude[10000];
277 const char * filename = gSystem->ExpandPathName("$ALICE_ROOT/T0/data/CFD-Amp.txt");
278 ifstream inFile(filename);
279 // if(!inFile) AliError(Form("Cannot open file %s !",filename));
282 while(getline(inFile,buffer)){
290 TMath::Sort(i, y, index,down);
291 Int_t amp=0, iin=0, isum=0, sum=0;
293 for (Int_t ii=0; ii<i; ii++)
304 time[isum] = Float_t (sum/(iin));
306 time[isum] =Float_t (x[ind]);
307 amplitude[isum] = Float_t (amp);
309 // cout<<ii<<" "<<ind<<" "<<y[ind]<<" "<<x[ind]<<" iin "<<iin<<" mean "<<time[isum]<<" amp "<< amplitude[isum]<<" "<<isum<<endl;
320 TGraph* gr = new TGraph(isum, amplitude, time);
321 fWalk.AddAtAndExpand(gr,ipmt);
325 //__________________________________________________________________
327 TGraph *AliT0Parameters::GetWalk(Int_t ipmt) const
330 return (TGraph*)fWalk.At(ipmt);
332 return fgCalibData -> GetWalk(ipmt) ;
335 //__________________________________________________________________
337 Float_t AliT0Parameters::GetWalkVal(Int_t ipmt, Float_t mv) const
340 return ((TGraph*)fWalk.At(ipmt))->Eval(mv);
342 return fgCalibData -> GetWalkVal(ipmt, mv) ;
346 //__________________________________________________________________
348 AliT0Parameters::SetPMTeff(Int_t ipmt)
351 Float_t eff[50 ] = {0, 0, 0.23619, 0.202909, 0.177913,
352 0.175667, 0.17856, 0.190769, 0.206667, 0.230286,
353 0.252276, 0.256267,0.26, 0.27125, 0.281818,
354 0.288118, 0.294057,0.296222, 0.301622, 0.290421,
355 0.276615, 0.2666, 0.248, 0.23619, 0.227814,
356 0.219818, 0.206667,0.194087, 0.184681, 0.167917,
357 0.154367, 0.1364, 0.109412, 0.0834615,0.0725283,
358 0.0642963,0.05861, 0.0465, 0.0413333,0.032069,
359 0.0252203,0.02066, 0.016262, 0.012, 0.00590476,
360 0.003875, 0.00190, 0, 0, 0 } ;
361 for (Int_t i=0; i<50; i++) lambda[i]=200+10*i;
363 TGraph* gr = new TGraph(50,lambda,eff);
364 fPMTeff.AddAtAndExpand(gr,ipmt);
366 //________________________________________________________________
369 AliT0Parameters::GetChannel(Int_t trm, Int_t tdc, Int_t chain, Int_t channel)
373 AliT0LookUpKey * lookkey; //= new AliT0LookUpKey();
374 AliT0LookUpValue * lookvalue= new AliT0LookUpValue(trm,tdc,chain,channel);
376 lookkey = (AliT0LookUpKey*) fgLookUp->GetMapLookup()->GetValue((TObject*)lookvalue);
378 cout<<" no such address "<<endl; return -1;
382 //cout<<"AliT0Parameters:: key "<<lookkey->GetKey()<<endl;
383 return lookkey->GetKey();
387 //__________________________________________________________________
389 AliT0Parameters::GetNumberOfTRMs()
391 // return number of trms
395 return fNumberOfTRMs;
397 return fgLookUp ->GetNumberOfTRMs();
399 //________________________________________________________________________________
400 Double_t AliT0Parameters::GetZPosition(const char* symname){
401 // Get the global z coordinate of the given T0 alignable volume
406 TGeoPNEntry *pne = gGeoManager->GetAlignableEntry(symname);
410 TGeoPhysicalNode *pnode = pne->GetPhysicalNode();
412 TGeoHMatrix* hm = pnode->GetMatrix();
413 tr = hm->GetTranslation();
415 const char* path = pne->GetTitle();
416 if(!gGeoManager->cd(path)){
417 AliErrorClass(Form("Volume path %s not valid!",path));
420 tr = gGeoManager->GetCurrentMatrix()->GetTranslation();