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 //____________________________________________________________________
53 AliT0Parameters::Instance()
55 // Get static instance
56 if (!fgInstance) fgInstance = new AliT0Parameters;
60 //____________________________________________________________________
61 AliT0Parameters::AliT0Parameters()
63 fPh2Mip(0),fmV2Mip(0),
64 fChannelWidth(0),fmV2Channel(0),
66 fSlewingLED(),fSlewingRec(),
68 fTimeDelayLED(0),fTimeDelayCFD(0),fTimeDelayTVD(0),
69 fCalibentry(), fLookUpentry(),fSlewCorr()
71 // Default constructor
73 for (Int_t ipmt=0; ipmt<24; ipmt++)
93 //__________________________________________________________________
95 AliT0Parameters::Init()
97 // Initialize the parameters manager. We need to get stuff from the
99 // if (fIsInit) return;
102 AliCDBStorage *stor =AliCDBManager::Instance()->GetStorage("local://$ALICE_ROOT");
104 AliCDBEntry* fCalibentry = stor->Get("T0/Calib/TimeDelay",0);
106 fgCalibData = (AliT0CalibData*)fCalibentry->GetObject();
108 AliError(" ALARM !!!! No time delays in CDB ");
110 AliCDBEntry* fSlewCorr = stor->Get("T0/Calib/Slewing_Walk",0);
112 fgSlewCorr = (AliT0CalibData*)fSlewCorr->GetObject();
114 fLookUpentry = stor->Get("T0/Calib/LookUp_Table",0);
116 fgLookUp = (AliT0CalibData*)fLookUpentry->GetObject();
119 const char * filename = gSystem->ExpandPathName("$ALICE_ROOT/T0/lookUpTable.txt");
120 ifstream inFile(filename);
121 fgLookUp->ReadAsciiLookup(filename);
128 //__________________________________________________________________
130 AliT0Parameters::GetTimeDelayLED(Int_t ipmt)
132 // return time delay for LED channel
136 return fTimeDelayLED;
138 return fgCalibData ->GetTimeDelayLED(ipmt);
140 //__________________________________________________________________
142 AliT0Parameters::GetTimeDelayCFD(Int_t ipmt)
144 // return time delay for CFD channel
148 fTimeDelayCFD = 1000+ipmt*100;
149 return fTimeDelayCFD;
152 return fgCalibData->GetTimeDelayCFD(ipmt);
155 //__________________________________________________________________
158 AliT0Parameters::SetSlewingLED(Int_t ipmt)
160 // Set Slweing Correction for LED channel
161 Float_t mv[23] = {25, 30,40,60, 80,100,150,200,250,300,
162 400,500,600,800,1000,1500, 2000, 3000, 4000, 5500,
164 Float_t y[23] = {5044, 4719, 3835, 3224, 2847, 2691,2327, 2067, 1937, 1781,
165 1560, 1456 ,1339, 1163.5, 1027, 819, 650, 520, 370.5, 234,
168 TGraph* gr = new TGraph(23,mv,y);
169 fSlewingLED.AddAtAndExpand(gr,ipmt);
171 //__________________________________________________________________
173 Float_t AliT0Parameters::GetSlewingLED(Int_t ipmt, Float_t mv) const
176 return ((TGraph*)fSlewingLED.At(ipmt))->Eval(mv);
178 return fgCalibData->GetSlewingLED(ipmt, mv) ;
182 //__________________________________________________________________
184 TGraph *AliT0Parameters::GetSlew(Int_t ipmt) const
187 return (TGraph*)fSlewingLED.At(ipmt);
189 return fgCalibData -> GetSlew(ipmt) ;
192 //__________________________________________________________________
196 AliT0Parameters::SetSlewingRec(Int_t ipmt)
198 // Set Slweing Correction for LED channel
199 Float_t mv[23] = {25, 30, 40,60, 80,100,150,200,250,300,
200 400,500,600,800,1000,1500, 2000, 3000, 4000, 5500,
202 Float_t y[23] = {5044, 4719, 3835, 3224, 2847, 2691,2327, 2067, 1937, 1781,
203 1560, 1456 ,1339, 1163.5, 1027, 819, 650, 520, 370.5, 234,
205 Float_t y1[23], mv1[23];
206 for (Int_t i=0; i<23; i++){
207 y1[i] = y[22-i]; mv1[i] = mv[22-i];}
209 TGraph* gr = new TGraph(23,y1,mv1);
210 fSlewingRec.AddAtAndExpand(gr,ipmt);
213 //__________________________________________________________________
215 Float_t AliT0Parameters::GetSlewingRec(Int_t ipmt, Float_t mv) const
218 return ((TGraph*)fSlewingRec.At(ipmt))->Eval(mv);
220 return fgCalibData -> GetSlewingRec(ipmt, mv) ;
223 //__________________________________________________________________
225 TGraph *AliT0Parameters::GetSlewRec(Int_t ipmt) const
228 return (TGraph*)fSlewingRec.At(ipmt);
230 return fgCalibData -> GetSlewRec(ipmt) ;
234 //________________________________________________________________
235 void AliT0Parameters::SetWalk(Int_t ipmt)
239 Int_t x[70000], y[70000], index[70000];
240 Float_t time[10000],amplitude[10000];
244 const char * filename = gSystem->ExpandPathName("$ALICE_ROOT/T0/data/CFD-Amp.txt");
245 ifstream inFile(filename);
246 // if(!inFile) AliError(Form("Cannot open file %s !",filename));
249 while(getline(inFile,buffer)){
257 TMath::Sort(i, y, index,down);
258 Int_t amp=0, iin=0, isum=0, sum=0;
260 for (Int_t ii=0; ii<i; ii++)
271 time[isum] = Float_t (sum/(iin));
273 time[isum] =Float_t (x[ind]);
274 amplitude[isum] = Float_t (amp);
276 // cout<<ii<<" "<<ind<<" "<<y[ind]<<" "<<x[ind]<<" iin "<<iin<<" mean "<<time[isum]<<" amp "<< amplitude[isum]<<" "<<isum<<endl;
287 TGraph* gr = new TGraph(isum, amplitude, time);
288 fWalk.AddAtAndExpand(gr,ipmt);
292 //__________________________________________________________________
294 TGraph *AliT0Parameters::GetWalk(Int_t ipmt) const
297 return (TGraph*)fWalk.At(ipmt);
299 return fgCalibData -> GetWalk(ipmt) ;
302 //__________________________________________________________________
304 Float_t AliT0Parameters::GetWalkVal(Int_t ipmt, Float_t mv) const
307 return ((TGraph*)fWalk.At(ipmt))->Eval(mv);
309 return fgCalibData -> GetWalkVal(ipmt, mv) ;
313 //__________________________________________________________________
315 AliT0Parameters::SetPMTeff(Int_t ipmt)
318 Float_t eff[50 ] = {0, 0, 0.23619, 0.202909, 0.177913,
319 0.175667, 0.17856, 0.190769, 0.206667, 0.230286,
320 0.252276, 0.256267,0.26, 0.27125, 0.281818,
321 0.288118, 0.294057,0.296222, 0.301622, 0.290421,
322 0.276615, 0.2666, 0.248, 0.23619, 0.227814,
323 0.219818, 0.206667,0.194087, 0.184681, 0.167917,
324 0.154367, 0.1364, 0.109412, 0.0834615,0.0725283,
325 0.0642963,0.05861, 0.0465, 0.0413333,0.032069,
326 0.0252203,0.02066, 0.016262, 0.012, 0.00590476,
327 0.003875, 0.00190, 0, 0, 0 } ;
328 for (Int_t i=0; i<50; i++) lambda[i]=200+10*i;
330 TGraph* gr = new TGraph(50,lambda,eff);
331 fPMTeff.AddAtAndExpand(gr,ipmt);
333 //________________________________________________________________
336 AliT0Parameters::GetChannel(Int_t trm, Int_t tdc, Int_t chain, Int_t channel)
340 AliT0LookUpKey * lookkey; //= new AliT0LookUpKey();
341 AliT0LookUpValue * lookvalue= new AliT0LookUpValue(trm,tdc,chain,channel);
343 lookkey = (AliT0LookUpKey*) fgLookUp->GetMapLookup()->GetValue((TObject*)lookvalue);
345 cout<<" no such address "<<endl; return -1;
349 //cout<<"AliT0Parameters:: key "<<lookkey->GetKey()<<endl;
350 return lookkey->GetKey();
354 //__________________________________________________________________
356 AliT0Parameters::GetNumberOfTRMs()
358 // return number of trms
362 return fNumberOfTRMs;
364 return fgLookUp ->GetNumberOfTRMs();
366 //________________________________________________________________________________
367 Double_t AliT0Parameters::GetZPosition(const char* symname){
368 // Get the global z coordinate of the given T0 alignable volume
373 TGeoPNEntry *pne = gGeoManager->GetAlignableEntry(symname);
377 TGeoPhysicalNode *pnode = pne->GetPhysicalNode();
379 TGeoHMatrix* hm = pnode->GetMatrix();
380 tr = hm->GetTranslation();
382 const char* path = pne->GetTitle();
383 if(!gGeoManager->cd(path)){
384 AliErrorClass(Form("Volume path %s not valid!",path));
387 tr = gGeoManager->GetCurrentMatrix()->GetTranslation();