First version of the TenderSupplies for TPC/TOF/TRD
[u/mrichter/AliRoot.git] / ANALYSIS / TenderSupplies / AliTPCTenderSupply.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
17 ///////////////////////////////////////////////////////////////////////////////
18 //                                                                           //
19 // TPC tender: reapply pid on the fly                                        //
20 //                                                                           //
21 ///////////////////////////////////////////////////////////////////////////////
22
23 #include <TList.h>
24 #include <TObjString.h>
25 #include <TChain.h>
26
27 #include <AliDCSSensor.h>
28 #include <AliGRPObject.h>
29 #include <AliESDpid.h>
30 #include <AliLog.h>
31 #include <AliESDEvent.h>
32 #include <AliESDtrack.h>
33 #include <AliESDInputHandler.h>
34 #include <AliAnalysisManager.h>
35 #include <AliSplineFit.h>
36 #include <AliCDBId.h>
37 #include <AliCDBManager.h>
38 #include <AliCDBEntry.h>
39 #include <AliTender.h>
40
41 #include "AliTPCTenderSupply.h"
42
43
44 AliTPCTenderSupply::AliTPCTenderSupply() :
45   AliTenderSupply(),
46   fESDpid(0x0),
47   fGainNew(0x0),
48   fGainOld(0x0),
49   fGainCorrection(kTRUE),
50   fGRP(0x0)
51 {
52   //
53   // default ctor
54   //
55 }
56
57 //_____________________________________________________
58 AliTPCTenderSupply::AliTPCTenderSupply(const char *name, const AliTender *tender) :
59   AliTenderSupply(name,tender),
60   fESDpid(0x0),
61   fGainNew(0x0),
62   fGainOld(0x0),
63   fGainCorrection(kTRUE),
64   fGRP(0x0)
65 {
66   //
67   // named ctor
68   //
69 }
70
71 //_____________________________________________________
72 void AliTPCTenderSupply::Init()
73 {
74   //
75   // Initialise TPC tender
76   //
77
78   AliAnalysisManager *mgr=AliAnalysisManager::GetAnalysisManager();
79   //
80   // Setup PID object
81   //
82   
83   // Check if another detector already created the esd pid object
84   // if not we create it and set it to the ESD input handler
85   fESDpid=fTender->GetESDhandler()->GetESDpid();
86   if (!fESDpid) {
87     fESDpid=new AliESDpid;
88     fTender->GetESDhandler()->SetESDpid(fESDpid);
89   }
90   
91   //
92   //set bethe bloch parameters depending on whether we have MC or real data
93   //
94   // for the moment we set the values hardwired. In future they should be stored either in
95   // the OCDB or an equivalent calibration data base
96   //
97   Double_t alephParameters[5];
98   // simulation
99   alephParameters[0] = 2.15898e+00/50.;
100   alephParameters[1] = 1.75295e+01;
101   alephParameters[2] = 3.40030e-09;
102   alephParameters[3] = 1.96178e+00;
103   alephParameters[4] = 3.91720e+00;
104   
105     // assume data if there is no mc handler
106   if (!mgr->GetMCtruthEventHandler()){
107     alephParameters[0] = 0.0283086/0.97;
108     //alephParameters[0] = 0.0283086;
109     alephParameters[1] = 2.63394e+01;
110     alephParameters[2] = 5.04114e-11;
111     alephParameters[3] = 2.12543e+00;
112     alephParameters[4] = 4.88663e+00;
113     //temporary solution
114     fESDpid->GetTPCResponse().SetMip(47.9);
115     //fESDpid->GetTPCResponse().SetMip(49.2);
116   } else {
117     //force no gain correction in MC
118     fGainCorrection=kFALSE;
119   }
120   
121   fESDpid->GetTPCResponse().SetBetheBlochParameters(
122     alephParameters[0],alephParameters[1],alephParameters[2],
123     alephParameters[3],alephParameters[4]);
124
125   //set detector resolution parametrisation
126   fESDpid->GetTPCResponse().SetSigma(3.79301e-03, 2.21280e+04);
127 }
128
129 //_____________________________________________________
130 void AliTPCTenderSupply::ProcessEvent()
131 {
132   //
133   // Reapply pid information
134   //
135
136   AliESDEvent *event=fTender->GetEvent();
137   if (!event) return;
138   
139   //load gain correction if run has changed
140   if (fTender->RunChanged()){
141     if (fGainCorrection) SetSplines();
142   }
143   
144   //
145   // get gain correction factor
146   //
147   Double_t corrFactor = GetGainCorrection();
148   
149   //
150   // - correct TPC signals
151   // - recalculate PID probabilities for TPC
152   //
153   Int_t ntracks=event->GetNumberOfTracks();
154   for(Int_t itrack = 0; itrack < ntracks; itrack++){
155     AliESDtrack *track=event->GetTrack(itrack);
156     if (fGainCorrection)
157       track->SetTPCsignal(track->GetTPCsignal()*corrFactor,track->GetTPCsignalSigma(),track->GetTPCsignalN());
158     fESDpid->MakeTPCPID(track);
159   }
160   
161 }
162
163 //_____________________________________________________
164 void AliTPCTenderSupply::SetSplines()
165 {
166   //
167   // Get Gain splines from OCDB
168   //
169
170   AliInfo("Update Gain splines");
171
172   //
173   // Get GPR info for pressure correction
174   //
175   AliCDBEntry *entryGRP=fTender->GetCDBManager()->Get("GRP/GRP/Data",fTender->GetRun());
176   if (!entryGRP) {
177     AliError("No new GRP entry found");
178   } else {
179     fGRP = (AliGRPObject*)entryGRP->GetObject();
180   }
181   
182   fGainNew=0x0;
183   fGainOld=0x0;
184   //
185   //find previous entry from the UserInfo
186   //
187   TTree *tree=((TChain*)fTender->GetInputData(0))->GetTree();
188   if (!tree) {
189     AliError("Tree not found in ESDhandler");
190     return;
191   }
192   
193   TList *userInfo=(TList*)tree->GetUserInfo();
194   if (!userInfo) {
195     AliError("No UserInfo found in tree");
196     return;
197   }
198
199   TList *cdbList=(TList*)userInfo->FindObject("cdbList");
200   if (!cdbList) {
201     AliError("No cdbList found in UserInfo");
202     if (AliLog::GetGlobalLogLevel()>=AliLog::kError) userInfo->Print();
203     return;
204   }
205
206   TIter nextCDB(cdbList);
207   TObjString *os=0x0;
208   while ( (os=(TObjString*)nextCDB()) ){
209     if (!(os->GetString().Contains("TPC/Calib/TimeGain"))) continue;
210     AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
211     
212     AliCDBEntry *entry=fTender->GetCDBManager()->Get(*id);
213     if (!entry) {
214       AliError("No previous gain calibration entry found");
215       return;
216     }
217     
218     TObjArray *arr=(TObjArray *)entry->GetObject();
219     if (!arr) {
220       AliError("Gain Splines array not found in calibration entry");
221       return;
222     }
223     
224     AliSplineFit *fit=(AliSplineFit*)arr->At(0);
225     if (!fit) {
226       AliError("Spline fit not found in array");
227       return;
228     }
229     
230     fGainOld = fit;
231     delete id;
232     break;
233   }
234
235   //
236   //new gain correction
237   //
238   AliCDBEntry *entryNew=fTender->GetCDBManager()->Get("TPC/Calib/TimeGain",fTender->GetRun());
239   if (!entryNew) {
240     AliError("No new gain calibration entry found");
241     return;
242   }
243   
244   TObjArray *arrSplines=(TObjArray *)entryNew->GetObject();
245   if (!arrSplines) {
246     AliError("Gain Splines array not found in new calibration entry");
247     return;
248   }
249   
250   fGainNew = (AliSplineFit*)arrSplines->At(0);
251   
252   if (!fGainNew) AliError("No recent spline fit object found");
253 }
254
255 //_____________________________________________________
256 Double_t AliTPCTenderSupply::GetGainCorrection()
257 {
258   //
259   // Calculate gain correction factor
260   //
261   AliESDEvent *event=fTender->GetEvent();
262   UInt_t time=event->GetTimeStamp();
263   
264   Double_t gain = 1;
265   if (fGainNew && fGainOld) gain = fGainOld->Eval(time)/fGainNew->Eval(time);
266   
267   //If there is no new calibration, at least apply correction for pressure
268   if (TMath::Abs(gain-1)<1e-20){
269     if (fGRP) {
270       Double_t pressure=fGRP->GetCavernAtmosPressure()->GetValue(time);
271       gain=fGainOld->Eval(time)/(7.03814-0.00459798*pressure)/49.53*48.2;
272     }
273   }
274   
275   return gain;
276 }
277