]>
Commit | Line | Data |
---|---|---|
29bf19f2 | 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 | ||
4ec8e76d | 16 | /* $Id: AliPIDResponse.cxx 46193 2010-12-21 09:00:14Z wiechula $ */ |
29bf19f2 | 17 | |
18 | //----------------------------------------------------------------- | |
4ec8e76d | 19 | // Base class for handling the pid response // |
20 | // functions of all detectors // | |
21 | // and give access to the nsigmas // | |
22 | // // | |
23 | // Origin: Jens Wiechula, Uni Tuebingen, jens.wiechula@cern.ch // | |
29bf19f2 | 24 | //----------------------------------------------------------------- |
25 | ||
4ec8e76d | 26 | #include <TList.h> |
27 | #include <TObjArray.h> | |
28 | #include <TPRegexp.h> | |
29 | #include <TF1.h> | |
30 | #include <TSpline.h> | |
31 | #include <TFile.h> | |
32 | ||
33 | #include <AliVEvent.h> | |
34 | #include <AliLog.h> | |
35 | #include <AliPID.h> | |
29bf19f2 | 36 | |
37 | #include "AliPIDResponse.h" | |
38 | ||
39 | ClassImp(AliPIDResponse); | |
40 | ||
4ec8e76d | 41 | AliPIDResponse::AliPIDResponse(Bool_t isMC/*=kFALSE*/) : |
42 | TNamed("PIDResponse","PIDResponse"), | |
43 | fITSResponse(isMC), | |
44 | fTPCResponse(), | |
45 | fTRDResponse(), | |
46 | fTOFResponse(), | |
47 | fIsMC(isMC), | |
48 | fOADBPath(), | |
49 | fBeamType("PP"), | |
50 | fLHCperiod(), | |
51 | fMCperiodTPC(), | |
52 | fRecoPass(0), | |
53 | fRun(0), | |
54 | fOldRun(0), | |
55 | fArrPidResponseMaster(0x0), | |
56 | fResolutionCorrection(0x0), | |
57 | fTOFTimeZeroType(kBest_T0), | |
58 | fTOFres(100.) | |
59 | { | |
60 | // | |
61 | // default ctor | |
62 | // | |
63 | AliLog::SetClassDebugLevel("AliPIDResponse",10); | |
64 | AliLog::SetClassDebugLevel("AliESDpid",10); | |
65 | AliLog::SetClassDebugLevel("AliAODpidUtil",10); | |
66 | } | |
67 | ||
68 | //______________________________________________________________________________ | |
69 | AliPIDResponse::~AliPIDResponse() | |
70 | { | |
71 | // | |
72 | // dtor | |
73 | // | |
74 | delete fArrPidResponseMaster; | |
75 | } | |
76 | ||
77 | //______________________________________________________________________________ | |
78 | AliPIDResponse::AliPIDResponse(const AliPIDResponse &other) : | |
79 | TNamed(other), | |
80 | fITSResponse(other.fITSResponse), | |
81 | fTPCResponse(other.fTPCResponse), | |
82 | fTRDResponse(other.fTRDResponse), | |
83 | fTOFResponse(other.fTOFResponse), | |
84 | fIsMC(other.fIsMC), | |
85 | fOADBPath(other.fOADBPath), | |
86 | fBeamType("PP"), | |
87 | fLHCperiod(), | |
88 | fMCperiodTPC(), | |
89 | fRecoPass(0), | |
90 | fRun(0), | |
91 | fOldRun(0), | |
92 | fArrPidResponseMaster(0x0), | |
93 | fResolutionCorrection(0x0), | |
94 | fTOFTimeZeroType(AliPIDResponse::kBest_T0), | |
95 | fTOFres(100.) | |
96 | { | |
97 | // | |
98 | // copy ctor | |
99 | // | |
100 | } | |
101 | ||
102 | //______________________________________________________________________________ | |
103 | AliPIDResponse& AliPIDResponse::operator=(const AliPIDResponse &other) | |
104 | { | |
105 | // | |
106 | // copy ctor | |
107 | // | |
108 | if(this!=&other) { | |
109 | delete fArrPidResponseMaster; | |
110 | TNamed::operator=(other); | |
111 | fITSResponse=other.fITSResponse; | |
112 | fTPCResponse=other.fTPCResponse; | |
113 | fTRDResponse=other.fTRDResponse; | |
114 | fTOFResponse=other.fTOFResponse; | |
115 | fOADBPath=other.fOADBPath; | |
116 | fIsMC=other.fIsMC; | |
117 | fBeamType="PP"; | |
118 | fLHCperiod=""; | |
119 | fMCperiodTPC=""; | |
120 | fRecoPass=0; | |
121 | fRun=0; | |
122 | fOldRun=0; | |
123 | fArrPidResponseMaster=0x0; | |
124 | fResolutionCorrection=0x0; | |
125 | fTOFTimeZeroType=AliPIDResponse::kBest_T0; | |
126 | fTOFres=100.; | |
127 | } | |
128 | return *this; | |
129 | } | |
130 | ||
131 | //______________________________________________________________________________ | |
132 | void AliPIDResponse::InitialiseEvent(AliVEvent *event, Int_t pass) | |
133 | { | |
134 | // | |
135 | // Apply settings for the current event | |
136 | // | |
137 | fRecoPass=pass; | |
138 | ||
139 | if (!event) return; | |
140 | fRun=event->GetRunNumber(); | |
141 | ||
142 | if (fRun!=fOldRun){ | |
143 | ExecNewRun(); | |
144 | fOldRun=fRun; | |
145 | } | |
146 | ||
147 | //TPC resolution parametrisation PbPb | |
148 | if ( fResolutionCorrection ){ | |
149 | Double_t corrSigma=fResolutionCorrection->Eval(GetTPCMultiplicityBin(event)); | |
150 | fTPCResponse.SetSigma(3.79301e-03*corrSigma, 2.21280e+04); | |
151 | } | |
152 | ||
153 | //TOF resolution | |
154 | SetTOFResponse(event, (AliPIDResponse::EStartTimeType_t)fTOFTimeZeroType); | |
155 | ||
156 | } | |
157 | ||
158 | //______________________________________________________________________________ | |
159 | void AliPIDResponse::ExecNewRun() | |
160 | { | |
161 | // | |
162 | // Things to Execute upon a new run | |
163 | // | |
164 | SetRecoInfo(); | |
165 | ||
166 | SetITSParametrisation(); | |
167 | ||
168 | SetTPCPidResponseMaster(); | |
169 | SetTPCParametrisation(); | |
170 | ||
171 | fTOFResponse.SetTimeResolution(fTOFres); | |
172 | } | |
173 | ||
174 | //_____________________________________________________ | |
175 | Double_t AliPIDResponse::GetTPCMultiplicityBin(const AliVEvent * const event) | |
176 | { | |
177 | // | |
178 | // Get TPC multiplicity in bins of 150 | |
179 | // | |
180 | ||
181 | const AliVVertex* vertexTPC = event->GetPrimaryVertex(); | |
182 | Double_t tpcMulti=0.; | |
183 | if(vertexTPC){ | |
184 | Double_t vertexContribTPC=vertexTPC->GetNContributors(); | |
185 | tpcMulti=vertexContribTPC/150.; | |
186 | if (tpcMulti>20.) tpcMulti=20.; | |
187 | } | |
188 | ||
189 | return tpcMulti; | |
190 | } | |
191 | ||
192 | //______________________________________________________________________________ | |
193 | void AliPIDResponse::SetRecoInfo() | |
194 | { | |
195 | // | |
196 | // Set reconstruction information | |
197 | // | |
198 | ||
199 | //reset information | |
200 | fLHCperiod=""; | |
201 | fMCperiodTPC=""; | |
202 | ||
203 | fBeamType=""; | |
204 | ||
205 | fBeamType="PP"; | |
206 | ||
207 | //find the period by run number (UGLY, but not stored in ESD and AOD... ) | |
208 | if (fRun>=114737&&fRun<=117223) { fLHCperiod="LHC10B"; fMCperiodTPC="LHC10D1"; } | |
209 | else if (fRun>=118503&&fRun<=121040) { fLHCperiod="LHC10C"; fMCperiodTPC="LHC10D1"; } | |
210 | else if (fRun>=122195&&fRun<=126437) { fLHCperiod="LHC10D"; fMCperiodTPC="LHC10F6A"; } | |
211 | else if (fRun>=127719&&fRun<=130850) { fLHCperiod="LHC10E"; fMCperiodTPC="LHC10F6A"; } | |
212 | else if (fRun>=133004&&fRun<=135029) { fLHCperiod="LHC10F"; fMCperiodTPC="LHC10F6A"; } | |
213 | else if (fRun>=135654&&fRun<=136377) { fLHCperiod="LHC10G"; fMCperiodTPC="LHC10F6A"; } | |
214 | else if (fRun>=136851&&fRun<=139517) { fLHCperiod="LHC10H"; fMCperiodTPC="LHC10H8"; fBeamType="PBPB"; } | |
215 | else if (fRun>=139699) { fLHCperiod="LHC11A"; fMCperiodTPC="LHC10F6A"; } | |
216 | ||
217 | } | |
218 | ||
219 | //______________________________________________________________________________ | |
220 | void AliPIDResponse::SetITSParametrisation() | |
221 | { | |
222 | // | |
223 | // Set the ITS parametrisation | |
224 | // | |
225 | } | |
226 | ||
227 | //______________________________________________________________________________ | |
228 | void AliPIDResponse::SetTPCPidResponseMaster() | |
229 | { | |
230 | // | |
231 | // Load the TPC pid response functions from the OADB | |
232 | // | |
09b50a42 | 233 | //don't load twice for the moment |
234 | if (fArrPidResponseMaster) return; | |
235 | ||
236 | ||
4ec8e76d | 237 | //reset the PID response functions |
238 | delete fArrPidResponseMaster; | |
239 | fArrPidResponseMaster=0x0; | |
240 | ||
241 | TString fileName(Form("%s/COMMON/PID/data/TPCPIDResponse.root", fOADBPath.Data())); | |
242 | ||
243 | TFile f(fileName.Data()); | |
244 | if (f.IsOpen() && !f.IsZombie()){ | |
245 | fArrPidResponseMaster=dynamic_cast<TObjArray*>(f.Get("TPCPIDResponse")); | |
246 | f.Close(); | |
247 | } | |
248 | ||
249 | if (!fArrPidResponseMaster){ | |
250 | AliFatal(Form("Could not retrieve the TPC pid response from: %s",fileName.Data())); | |
251 | return; | |
252 | } | |
253 | fArrPidResponseMaster->SetOwner(); | |
254 | } | |
255 | ||
256 | //______________________________________________________________________________ | |
257 | void AliPIDResponse::SetTPCParametrisation() | |
258 | { | |
259 | // | |
260 | // Change BB parametrisation for current run | |
261 | // | |
262 | ||
263 | if (fLHCperiod.IsNull()) { | |
264 | AliFatal("No period set, not changing parametrisation"); | |
265 | return; | |
266 | } | |
267 | ||
268 | // | |
269 | // Set default parametrisations for data and MC | |
270 | // | |
271 | ||
272 | //data type | |
273 | TString datatype="DATA"; | |
274 | //in case of mc fRecoPass is per default 1 | |
275 | if (fIsMC) { | |
276 | datatype="MC"; | |
277 | fRecoPass=1; | |
278 | } | |
279 | ||
280 | // | |
281 | //reset old splines | |
282 | // | |
283 | for (Int_t ispec=0; ispec<AliPID::kSPECIES; ++ispec){ | |
284 | fTPCResponse.SetResponseFunction((AliPID::EParticleType)ispec,0x0); | |
285 | } | |
286 | ||
287 | // | |
288 | //set the new PID splines | |
289 | // | |
290 | TString period=fLHCperiod; | |
291 | if (fArrPidResponseMaster){ | |
292 | TObject *grAll=0x0; | |
293 | //for MC don't use period information | |
294 | // if (fIsMC) period="[A-Z0-9]*"; | |
295 | //for MC use MC period information | |
296 | if (fIsMC) period=fMCperiodTPC; | |
297 | //pattern for the default entry (valid for all particles) | |
298 | TPRegexp reg(Form("TSPLINE3_%s_([A-Z]*)_%s_PASS%d_%s_MEAN",datatype.Data(),period.Data(),fRecoPass,fBeamType.Data())); | |
299 | ||
300 | //loop over entries and filter them | |
301 | for (Int_t iresp=0; iresp<fArrPidResponseMaster->GetEntriesFast();++iresp){ | |
302 | TObject *responseFunction=fArrPidResponseMaster->At(iresp); | |
303 | if (responseFunction==0x0) continue; | |
304 | TString responseName=responseFunction->GetName(); | |
305 | ||
306 | if (!reg.MatchB(responseName)) continue; | |
307 | ||
308 | TObjArray *arr=reg.MatchS(responseName); | |
309 | TString particleName=arr->At(1)->GetName(); | |
310 | delete arr; | |
311 | if (particleName.IsNull()) continue; | |
312 | if (particleName=="ALL") grAll=responseFunction; | |
313 | else { | |
314 | //find particle id | |
315 | for (Int_t ispec=0; ispec<AliPID::kSPECIES; ++ispec){ | |
316 | TString particle=AliPID::ParticleName(ispec); | |
317 | particle.ToUpper(); | |
318 | if ( particle == particleName ){ | |
319 | fTPCResponse.SetResponseFunction((AliPID::EParticleType)ispec,responseFunction); | |
320 | fTPCResponse.SetUseDatabase(kTRUE); | |
321 | AliInfo(Form("Adding graph: %d - %s",ispec,responseFunction->GetName())); | |
322 | break; | |
323 | } | |
324 | } | |
325 | } | |
326 | } | |
327 | ||
328 | //set default response function to all particles which don't have a specific one | |
329 | if (grAll){ | |
330 | for (Int_t ispec=0; ispec<AliPID::kSPECIES; ++ispec){ | |
331 | if (!fTPCResponse.GetResponseFunction((AliPID::EParticleType)ispec)){ | |
332 | fTPCResponse.SetResponseFunction((AliPID::EParticleType)ispec,grAll); | |
333 | AliInfo(Form("Adding graph: %d - %s",ispec,grAll->GetName())); | |
334 | } | |
335 | } | |
336 | } | |
337 | } | |
338 | ||
339 | // | |
340 | // Setup resolution parametrisation | |
341 | // | |
342 | ||
343 | //default | |
344 | fTPCResponse.SetSigma(3.79301e-03, 2.21280e+04); | |
345 | ||
346 | if (fRun>=122195){ | |
347 | fTPCResponse.SetSigma(2.30176e-02, 5.60422e+02); | |
348 | } | |
23425eb2 | 349 | if (fArrPidResponseMaster) |
4ec8e76d | 350 | fResolutionCorrection=(TF1*)fArrPidResponseMaster->FindObject(Form("TF1_%s_ALL_%s_PASS%d_%s_SIGMA",datatype.Data(),period.Data(),fRecoPass,fBeamType.Data())); |
351 | ||
352 | if (fResolutionCorrection) AliInfo(Form("Setting multiplicity correction function: %s",fResolutionCorrection->GetName())); | |
353 | } | |
354 |