]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/Cal/AliTRDCalPID.cxx
Change treatment of high and low momentum tracks in PID procedure
[u/mrichter/AliRoot.git] / TRD / Cal / AliTRDCalPID.cxx
CommitLineData
720a0a16 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// Container for the distributions of dE/dx and the time bin of the //
21// max. cluster for electrons and pions //
22// //
23// Authors: //
24// Prashant Shukla <shukla@pi0.physi.uni-heidelberg.de> //
25// Alex Bercuci <a.bercuci@gsi.de> //
26// //
27//////////////////////////////////////////////////////////////////////////
28
29#include <TH1F.h>
30#include <TH2F.h>
31#include <TFile.h>
32#include <TROOT.h>
33
34#include "AliLog.h"
35#include "AliPID.h"
36#include "AliESD.h"
37#include "AliESDtrack.h"
38
39#include "AliTRDCalPID.h"
40#include "AliTRDcalibDB.h"
41
42ClassImp(AliTRDCalPID)
43
44Char_t* AliTRDCalPID::fpartName[AliPID::kSPECIES] = {"electron", "muon", "pion", "kaon", "proton"};
45
46Char_t* AliTRDCalPID::fpartSymb[AliPID::kSPECIES] = {"EL", "MU", "PI", "KA", "PR"};
47
48Float_t AliTRDCalPID::fTrackMomentum[kNMom] = {0.6, 0.8, 1.0, 1.5, 2.0, 3.0, 4.0, 5.0, 6.0, 8.0, 10.0};
49
50Float_t AliTRDCalPID::fTrackSegLength[kNLength] = {3.7, 3.9, 4.2, 5.0};
51
52
53//_________________________________________________________________________
54AliTRDCalPID::AliTRDCalPID()
55 :TNamed("pid", "PID for TRD")
56 ,fMeanChargeRatio(0)
57 ,fHistdEdx(0x0)
58 ,fHistTimeBin(0x0)
59{
60 //
61 // The Default constructor
62 //
63
64 Init();
65
66}
67
68//_________________________________________________________________________
69AliTRDCalPID::AliTRDCalPID(const Text_t *name, const Text_t *title)
70 :TNamed(name,title)
71 ,fMeanChargeRatio(0)
72 ,fHistdEdx(0x0)
73 ,fHistTimeBin(0x0)
74{
75 //
76 // The main constructor
77 //
78
79 Init();
80
81}
82
83//_____________________________________________________________________________
84AliTRDCalPID::AliTRDCalPID(const AliTRDCalPID &c)
85 :TNamed(c)
86 ,fMeanChargeRatio(c.fMeanChargeRatio)
87 ,fHistdEdx(0x0)
88 ,fHistTimeBin(0x0)
89{
90 //
91 // Copy constructor
92 //
93
94 if (this != &c) ((AliTRDCalPID &) c).Copy(*this);
95
96}
97
98//_________________________________________________________________________
99AliTRDCalPID::~AliTRDCalPID()
100{
101 //
102 // Destructor
103 //
104
105 CleanUp();
106
107}
108
109//_________________________________________________________________________
110void AliTRDCalPID::CleanUp()
111{
112 //
113 // Delets all newly created objects
114 //
115
116 if (fHistdEdx) {
117 delete fHistdEdx;
118 fHistdEdx = 0x0;
119 }
120
121 if (fHistTimeBin) {
122 delete fHistTimeBin;
123 fHistTimeBin = 0x0;
124 }
125}
126
127//_____________________________________________________________________________
128AliTRDCalPID &AliTRDCalPID::operator=(const AliTRDCalPID &c)
129{
130 //
131 // Assignment operator
132 //
133
134 if (this != &c) ((AliTRDCalPID &) c).Copy(*this);
135 return *this;
136
137}
138
139//_____________________________________________________________________________
140void AliTRDCalPID::Copy(TObject &c) const
141{
142 //
143 // Copy function
144 //
145
146 AliTRDCalPID& target = (AliTRDCalPID &) c;
147
148 target.CleanUp();
149
150 target.fMeanChargeRatio = fMeanChargeRatio;
151
152 if (fHistdEdx) {
153 target.fHistdEdx = (TObjArray*) fHistdEdx->Clone();
154 }
155 if (fHistTimeBin) {
156 target.fHistTimeBin = (TObjArray*) fHistTimeBin->Clone();
157 }
158
159 TObject::Copy(c);
160
161}
162
163//_________________________________________________________________________
164void AliTRDCalPID::Init()
165{
166 //
167 // Initialization
168 //
169
170 fHistdEdx = new TObjArray(AliPID::kSPECIES * kNMom/* * kNLength*/);
171 fHistdEdx->SetOwner();
172 fHistTimeBin = new TObjArray(2 * kNMom);
173 fHistTimeBin->SetOwner();
174
175 // Initialization of estimator at object instantiation because late
176 // initialization in function GetProbability() is not working due to
177 // constantness of this function.
178 // fEstimator = new AliTRDCalPIDRefMaker();
179
180 // ADC Gain normalization
181 fMeanChargeRatio = 1.0;
182}
183
184//_________________________________________________________________________
185Bool_t AliTRDCalPID::LoadLQReferences(Char_t *refFile)
186{
187 //
188 // Read the TRD dEdx histograms.
189 //
190
191 Int_t nTimeBins = 22;
192 // Get number of time bins from CDB
193 AliTRDcalibDB *calibration = AliTRDcalibDB::Instance();
194 if(!calibration){
195 AliWarning(Form("No AliTRDcalibDB available. Using %d time bins.", nTimeBins));
196 }else{
197 if(calibration->GetRun() > -1) nTimeBins = calibration->GetNumberOfTimeBins();
198 else AliWarning(Form("Run number not set. Using %d time bins.", nTimeBins));
199 }
200
201
202 // Read histogram Root file
203 TFile *histFile = TFile::Open(refFile, "READ");
204 if (!histFile || !histFile->IsOpen()) {
205 AliError(Form("Opening TRD histgram file %s failed", refFile));
206 return kFALSE;
207 }
208 gROOT->cd();
209
210 // Read histograms
211 for (Int_t iparticle = 0; iparticle < AliPID::kSPECIES; iparticle++){
212 for (Int_t imom = 0; imom < kNMom; imom++){
213 TH2D* hist = (TH2D*)histFile->Get(Form("h2dEdx%s%02d", fpartSymb[iparticle], imom/*, ilength*/))->Clone();
214 hist->Scale(1./hist->Integral());
215 fHistdEdx->AddAt(hist, GetHistID(iparticle, imom));
216
217 if (iparticle != AliPID::kElectron && iparticle != AliPID::kPion) continue;
218
219 TH1F* ht = (TH1F*)histFile->Get(Form("h1MaxTB%s%02d", fpartSymb[iparticle], imom))->Clone();
220 if(ht->GetNbinsX() != nTimeBins) AliWarning(Form("The number of time bins %d defined in h1MaxTB%s%02d differs from calibration value of %d. This may lead to erroneous results.", ht->GetNbinsX(), fpartSymb[iparticle], imom, nTimeBins));
221 ht->Scale(1./ht->Integral());
222 fHistTimeBin->AddAt(ht, ((iparticle==AliPID::kElectron)?0:1)*kNMom + imom);
223 }
224 }
225
226 histFile->Close();
227 delete histFile;
228
229 // Number of bins and bin size
230 //TH1F* hist = (TH1F*) fHistdEdx->At(GetHistID(AliPID::kPion, 1));
231 //fNbins = hist->GetNbinsX();
232 //fBinSize = hist->GetBinWidth(1);
233
234 return kTRUE;
235
236}
237
238// //_________________________________________________________________________
239// Double_t AliTRDCalPID::GetMean(Int_t k, Int_t ip) const
240// {
241// //
242// // Gets mean of de/dx dist. of e
243// //
244//
245// AliInfo(Form("Mean for particle = %s and momentum = %.2f is:\n"
246// ,fpartName[k]
247// ,fTrackMomentum[ip]));
248// if (k < 0 || k > AliPID::kSPECIES) {
249// return 0;
250// }
251//
252// return ((TH1F*) fHistdEdx->At(GetHistID(k,ip)))->GetMean();
253//
254// }
255//
256// //_________________________________________________________________________
257// Double_t AliTRDCalPID::GetNormalization(Int_t k, Int_t ip) const
258// {
259// //
260// // Gets Normalization of de/dx dist. of e
261// //
262//
263// AliInfo(Form("Normalization for particle = %s and momentum = %.2f is:\n"
264// ,fpartName[k]
265// ,fTrackMomentum[ip]));
266// if (k < 0 || k > AliPID::kSPECIES) {
267// return 0;
268// }
269//
270// return ((TH1F*) fHistdEdx->At(GetHistID(k,ip)))->Integral();
271//
272// }
273
274//_________________________________________________________________________
275TH1* AliTRDCalPID::GetHistogram(Int_t k, Int_t ip/*, Int_t il*/) const
276{
277 //
278 // Returns one selected dEdx histogram
279 //
280
281 if (k < 0 || k >= AliPID::kSPECIES) return 0x0;
282 if(ip<0 || ip>= kNMom ) return 0x0;
283
284 AliInfo(Form("Retrive dEdx histogram for %s of %5.2f GeV/c", fpartName[k], fTrackMomentum[ip]));
285
286 return (TH1*)fHistdEdx->At(GetHistID(k, ip));
287
288}
289
290//_________________________________________________________________________
291TH1* AliTRDCalPID::GetHistogramT(Int_t k, Int_t ip) const
292{
293 //
294 // Returns one selected time bin max histogram
295 //
296
297 if (k < 0 || k >= AliPID::kSPECIES) return 0x0;
298 if(ip<0 || ip>= kNMom ) return 0x0;
299
300 AliInfo(Form("Retrive MaxTB histogram for %s of %5.2f GeV/c", fpartName[k], fTrackMomentum[ip]));
301
302 return (TH1*)fHistTimeBin->At(((k==AliPID::kElectron)?0:1)*kNMom+ip);
303}
304
305
306
307//_________________________________________________________________________
308Double_t AliTRDCalPID::GetProbability(Int_t spec, Float_t mom, Float_t *dedx, Float_t length) const
309{
310 //
311 // Core function of AliTRDCalPID class for calculating the
312 // likelihood for species "spec" (see AliTRDtrack::kNspecie) of a
313 // given momentum "mom" and a given dE/dx (slice "dedx") yield per
314 // layer
315 //
316
317 if (spec < 0 || spec >= AliPID::kSPECIES) return 0.;
318
319 //Double_t dedx = dedx1/fMeanChargeRatio;
320
321 // find the interval in momentum and track segment length which applies for this data
322 Int_t ilength = 1;
323 while(ilength<kNLength-1 && length>fTrackSegLength[ilength]){
324 ilength++;
325 }
326 Int_t imom = 1;
327 while(imom<kNMom-1 && mom>fTrackMomentum[imom]) imom++;
79143cbf 328
720a0a16 329 Int_t nbinsx, nbinsy;
330 TAxis *ax = 0x0, *ay = 0x0;
331 Double_t LQ1, LQ2;
332 Double_t mom1 = fTrackMomentum[imom-1], mom2 = fTrackMomentum[imom];
333 TH2 *hist = 0x0;
334 if(!(hist = (TH2D*)fHistdEdx->At(GetHistID(spec, imom-1/*, ilength*/)))){
335 AliInfo(Form("Looking for spec(%d) mom(%f) Ex(%f) Ey(%f) length(%f)", spec, mom, dedx[0], dedx[1], length));
336 AliError(Form("EHistogram id %d not found in DB.", GetHistID(spec, imom-1)));
337 return 0.;
338 }
339 ax = hist->GetXaxis(); nbinsx = ax->GetNbins();
340 ay = hist->GetYaxis(); nbinsy = ay->GetNbins();
341 Float_t x = dedx[0]+dedx[1], y = dedx[2];
79143cbf 342 Bool_t kX = (x < ax->GetBinUpEdge(nbinsx));
720a0a16 343 Bool_t kY = (y < ay->GetBinUpEdge(nbinsy));
344 if(kX)
345 if(kY) LQ1 = hist->GetBinContent( hist->FindBin(x, y));
346 //fEstimator->Estimate2D2(hist, x, y);
347 else LQ1 = hist->GetBinContent(ax->FindBin(x), nbinsy);
348 else
349 if(kY) LQ1 = hist->GetBinContent(nbinsx, ay->FindBin(y));
350 else LQ1 = hist->GetBinContent(nbinsx, nbinsy);
351
352
353 if(!(hist = (TH2D*)fHistdEdx->At(GetHistID(spec, imom/*, ilength*/)))){
354 AliInfo(Form("Looking for spec(%d) mom(%f) Ex(%f) Ey(%f) length(%f)", spec, mom, dedx[0], dedx[1], length));
355 AliError(Form("EHistogram id %d not found in DB.", GetHistID(spec, imom)));
356 return LQ1;
357 }
358 if(kX)
359 if(kY) LQ2 = hist->GetBinContent( hist->FindBin(x, y));
360 //fEstimator->Estimate2D2(hist, x, y);
361 else LQ2 = hist->GetBinContent(ax->FindBin(x), nbinsy);
362 else
363 if(kY) LQ2 = hist->GetBinContent(nbinsx, ay->FindBin(y));
364 else LQ2 = hist->GetBinContent(nbinsx, nbinsy);
720a0a16 365
79143cbf 366 // return interpolation over momentum binning
367 if(mom < fTrackMomentum[0]) return LQ1;
368 else if(mom > fTrackMomentum[kNMom-1]) return LQ2;
369 else return LQ1 + (LQ2 - LQ1)*(mom - mom1)/(mom2 - mom1);
720a0a16 370
371}
372
373//_________________________________________________________________________
374Double_t AliTRDCalPID::GetProbabilityT(Int_t spec, Double_t mom, Int_t timbin) const
375{
376 //
377 // Gets the Probability of having timbin at a given momentum (mom)
378 // and particle type (spec) (0 for e) and (2 for pi)
379 // from the precalculated timbin distributions
380 //
381
382 if (spec < 0 || spec >= AliPID::kSPECIES) return 0.;
383
384 Int_t iTBin = timbin+1;
385
386 // Everything which is not an electron counts as a pion for time bin max
387 //if(spec != AliPID::kElectron) spec = AliPID::kPion;
388
389
390
391 Int_t imom = 1;
392 while(imom<kNMom-1 && mom>fTrackMomentum[imom]) imom++;
393
394 Double_t mom1 = fTrackMomentum[imom-1], mom2 = fTrackMomentum[imom];
395 TH1F *hist = 0x0;
396 if(!(hist = (TH1F*) fHistTimeBin->At(((spec==AliPID::kElectron)?0:1)*kNMom+imom-1))){
397 AliInfo(Form("Looking for spec(%d) mom(%f) timbin(%d)", spec, mom, timbin));
398 AliError(Form("THistogram id %d not found in DB.", ((spec==AliPID::kElectron)?0:1)*kNMom+imom-1));
399 return 0.;
400 }
401 Double_t LQ1 = hist->GetBinContent(iTBin);
402
403 if(!(hist = (TH1F*) fHistTimeBin->At(((spec==AliPID::kElectron)?0:1)*kNMom+imom))){
404 AliInfo(Form("Looking for spec(%d) mom(%f) timbin(%d)", spec, mom, timbin));
405 AliError(Form("THistogram id %d not found in DB.", ((spec==AliPID::kElectron)?0:1)*kNMom+imom));
406 return LQ1;
407 }
408 Double_t LQ2 = hist->GetBinContent(iTBin);
409
410 // return interpolation over momentum binning
411 return LQ1 + (LQ2 - LQ1)*(mom - mom1)/(mom2 - mom1);
412}
413