]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ITS/AliITSPident.cxx
Coding conventions
[u/mrichter/AliRoot.git] / ITS / AliITSPident.cxx
CommitLineData
e62c1aea 1//////////////////////////////////////////////////////////////////////////
2// USER Class for PID in the ITS //
3//The PID is based on the likelihood of all the four ITS' layers, //
4//without using the truncated mean for the dE/dx. The response //
5//functions for each layer are convoluted Landau-Gaussian functions. //
6// Origin: Elena Bruna bruna@to.infn.it,, Massimo Masera masera@to.infn.it//
7//////////////////////////////////////////////////////////////////////////
8#include "AliITSPident.h"
9
10ClassImp(AliITSPident)
11 //_______________________________________________________________________
94631b2f 12AliITSPident::AliITSPident():
13fMom(0),
14fdEdx(0),
15fPBayesp(0),
16fPBayesk(0),
17fPBayespi(0),
18fPPriorip(0),
19fPPriorik(0),
20fPPrioripi(0),
21fPPriorie(0),
22fInvPt(0)
23{
e62c1aea 24 // default constructor
e62c1aea 25 for (Int_t i=0;i<4;i++){
26 fCondFunProLay[i]=0;
27 fCondFunKLay[i]=0;
28 fCondFunPiLay[i]=0;
29 }
30}
31//_______________________________________________________________________
32AliITSPident::~AliITSPident(){
33 // destructor
34}
35//______________________________________________________________________
94631b2f 36AliITSPident::AliITSPident(const AliITSPident &ob) :TObject(ob),
37fMom(ob.fMom),
38fdEdx(ob.fdEdx),
39fPBayesp(ob.fPBayesp),
40fPBayesk(ob.fPBayesk),
41fPBayespi(ob.fPBayespi),
42fPPriorip(ob.fPPriorip),
43fPPriorik(ob.fPPriorik),
44fPPrioripi(ob.fPPrioripi),
45fPPriorie(ob.fPPriorie),
46fInvPt(ob.fInvPt)
47{
e62c1aea 48 // Copy constructor
e62c1aea 49}
50
51//______________________________________________________________________
94631b2f 52AliITSPident& AliITSPident::operator=(const AliITSPident& ob){
e62c1aea 53 // Assignment operator
94631b2f 54 this->~AliITSPident();
55 new(this) AliITSPident(ob);
e62c1aea 56 return *this;
57}
58
59
60//_______________________________________________________________________
94631b2f 61AliITSPident::AliITSPident(Double_t mom,Double_t invPt,Double_t dEdx,AliITSSteerPid *sp,Float_t *Qlay,Float_t priorip,Float_t priorik,Float_t prioripi,Float_t priorie):
62fMom(mom),
63fdEdx(dEdx),
64fPBayesp(0),
65fPBayesk(0),
66fPBayespi(0),
67fPPriorip(priorip),
68fPPriorik(priorik),
69fPPrioripi(prioripi),
70fPPriorie(priorie),
71fInvPt(invPt){
e62c1aea 72
73 //test
74
e62c1aea 75 for(Int_t la=0;la<4;la++){//loop on layers
76 Double_t parp[3];Double_t park[3];Double_t parpi[3];
77 sp->GetParFitLayer(la,fMom,parp,park,parpi);
149c4c59 78
e62c1aea 79 Double_t range[6];
80 range[0]=0.3*parp[1];
81 range[1]=2.*parp[1];
82
83 range[2]=0.3*park[1];
84 range[3]=2.*park[1];
85
86 range[4]=0.3*parpi[1];
87 range[5]=2.*parpi[1];
88 CookFunItsLay(la,0,parp,Qlay[la],fMom,range[0],range[1],"fPro");
89 CookFunItsLay(la,1,park,Qlay[la],fMom,range[2],range[3],"fKao");
90 CookFunItsLay(la,2,parpi,Qlay[la],fMom,range[4],range[5],"fPi");
91
92 }
e62c1aea 93
94 Float_t prior[4];Double_t condFun[4][3];
95
96 prior[0]=fPPriorip;
97 prior[1]=fPPriorik;
98 prior[2]=fPPrioripi;
99 prior[3]=fPPriorie;
100 for(Int_t la=0;la<4;la++){
101 condFun[la][0]= fCondFunProLay[la];
102 condFun[la][1]= fCondFunKLay[la];
103 condFun[la][2]= fCondFunPiLay[la];
104
105 }
106
e62c1aea 107 fPBayesp=CookCombinedBayes(condFun,prior,0);
e62c1aea 108 fPBayesk=CookCombinedBayes(condFun,prior,1);
e62c1aea 109 fPBayespi=CookCombinedBayes(condFun,prior,2);
94631b2f 110 }
e62c1aea 111
112
113//_______________________________________________________________________
94631b2f 114AliITSPident::AliITSPident(AliITStrackV2 *trackITS,AliITSSteerPid *sp,Float_t *Qlay,Float_t priorip,Float_t priorik,Float_t prioripi,Float_t priorie):
115fMom(0),
116fdEdx(0),
117fPBayesp(0),
118fPBayesk(0),
119fPBayespi(0),
120fPPriorip(priorip),
121fPPriorik(priorik),
122fPPrioripi(prioripi),
123fPPriorie(priorie),
124fInvPt(0)
125{
e62c1aea 126 //
127 Double_t xr;
128 Double_t par[5];
129 trackITS->GetExternalParameters(xr,par);
130 if (par[4]!=0) {
131 Float_t lamb=TMath::ATan(par[3]);
132 fMom=1/(TMath::Abs(par[4])*TMath::Cos(lamb));
133 }
134
135 fInvPt=par[4];
136
137 for(Int_t la=0;la<4;la++){//loop on layers
138 Double_t parp[3];Double_t park[3];Double_t parpi[3];
139 sp->GetParFitLayer(la,fMom,parp,park,parpi);
140 Double_t range[8];
141 range[0]=0.3*parp[1];
142 range[1]=2.*parp[1];
143
144 range[2]=0.3*park[1];
145 range[3]=2.*park[1];
146
147 range[4]=0.3*parpi[1];
148 range[5]=2.*parpi[1];
149 CookFunItsLay(la,0,parp,Qlay[la],fMom,range[0],range[1],"fPro");
150 CookFunItsLay(la,1,park,Qlay[la],fMom,range[2],range[3],"fKao");
151 CookFunItsLay(la,2,parpi,Qlay[la],fMom,range[4],range[5],"fPi");
152 }
e62c1aea 153
154 Float_t prior[4];Double_t condFun[4][3];
155
156 prior[0]=fPPriorip;
157 prior[1]=fPPriorik;
158 prior[2]=fPPrioripi;
159 prior[3]=fPPriorie;
160 for(Int_t la=0;la<4;la++){
161 condFun[la][0]= fCondFunProLay[la];
162 condFun[la][1]= fCondFunKLay[la];
163 condFun[la][2]= fCondFunPiLay[la];
164
165 }
166
e62c1aea 167 fPBayesp=CookCombinedBayes(condFun,prior,0);
e62c1aea 168 fPBayesk=CookCombinedBayes(condFun,prior,1);
e62c1aea 169 fPBayespi=CookCombinedBayes(condFun,prior,2);
e62c1aea 170 fdEdx=trackITS->GetdEdx();
171
172}
173//_______________________________________________________________________
174void AliITSPident::PrintParameters() const{
175 //print parameters
176 cout<<"___________________________\n";
177 cout<<"Track Local Momentum = "<<" "<<fMom<<endl;
178 cout<<"Track dEdx = "<<" "<<fdEdx<<endl;
179 cout<<"Inv Pt = "<<fInvPt<<endl;
180}
181
182//_______________________________________________________________________
183Double_t AliITSPident::Langaufun(Double_t *x, Double_t *par) {
184
185 //Fit parameters:
186 //par[0]=Width (scale) parameter of Landau density
187 //par[1]=Most Probable (MP, location) parameter of Landau density
188 //par[2]=Total area (integral -inf to inf, normalization constant)
189 //par[3]=Width (sigma) of convoluted Gaussian function
190 //
191 //In the Landau distribution (represented by the CERNLIB approximation),
192 //the maximum is located at x=-0.22278298 with the location parameter=0.
193 //This shift is corrected within this function, so that the actual
194 //maximum is identical to the MP parameter.
195
196 // Numeric constants
197 Double_t invsq2pi = 0.3989422804014; // (2 pi)^(-1/2)
198 Double_t mpshift = -0.22278298; // Landau maximum location
199
200 // Control constants
201 Double_t np = 100.0; // number of convolution steps
202 Double_t sc = 5.0; // convolution extends to +-sc Gaussian sigmas
203
204 // Variables
205 Double_t xx;
206 Double_t mpc;
207 Double_t fland;
208 Double_t sum = 0.0;
209 Double_t xlow,xupp;
210 Double_t step;
211 Double_t i;
212
213
214 // MP shift correction
215 mpc = par[1] - mpshift * par[0];
216
217 // Range of convolution integral
218 xlow = x[0] - sc * par[3];
219 xupp = x[0] + sc * par[3];
220
221 step = (xupp-xlow) / np;
222
223 // Convolution integral of Landau and Gaussian by sum
224 for(i=1.0; i<=np/2; i++) {
225 xx = xlow + (i-.5) * step;
226 fland = TMath::Landau(xx,mpc,par[0]) / par[0];
227 sum += fland * TMath::Gaus(x[0],xx,par[3]);
228
229 xx = xupp - (i-.5) * step;
230 fland = TMath::Landau(xx,mpc,par[0]) / par[0];
231 sum += fland * TMath::Gaus(x[0],xx,par[3]);
232 }
233
234 return (par[2] * step * sum * invsq2pi / par[3]);
235}
236
237//_______________________________________________________________________
238Double_t AliITSPident::Langaufun2(Double_t *x, Double_t *par){
239 //normalized langaufun
240 return 1/par[4]*Langaufun(x,par);
241}
242//_______________________________________________________________________
243Double_t AliITSPident::Langaufunnorm(Double_t *x, Double_t *par){
244 //Fit parameters:
245 //par[0]=Width (scale) parameter of Landau density
246 //par[1]=Most Probable (MP, location) parameter of Landau density
247
248 //par[2]=Width (sigma) of convoluted Gaussian function
249 //
250 //In the Landau distribution (represented by the CERNLIB approximation),
251 //the maximum is located at x=-0.22278298 with the location parameter=0.
252 //This shift is corrected within this function, so that the actual
253 //maximum is identical to the MP parameter.
254
255 // Numeric constants
256 Double_t invsq2pi = 0.3989422804014; // (2 pi)^(-1/2)
257 Double_t mpshift = -0.22278298; // Landau maximum location
258
259 // Control constants
260 Double_t np = 100.0; // number of convolution steps
261 Double_t sc = 5.0; // convolution extends to +-sc Gaussian sigmas
262
263 // Variables
264 Double_t xx;
265 Double_t mpc;
266 Double_t fland;
267 Double_t sum = 0.0;
268 Double_t xlow,xupp;
269 Double_t step;
270 Double_t i;
271
272
273 // MP shift correction
274 mpc = par[1] - mpshift * par[0];
275
276 // Range of convolution integral
277 xlow = x[0] - sc * par[2];
278 xupp = x[0] + sc * par[2];
279
280 step = (xupp-xlow) / np;
281
282 // Convolution integral of Landau and Gaussian by sum
283 for(i=1.0; i<=np/2; i++) {
284 xx = xlow + (i-.5) * step;
285 fland = TMath::Landau(xx,mpc,par[0]) / par[0];
286 sum += fland * TMath::Gaus(x[0],xx,par[2]);
287
288 xx = xupp - (i-.5) * step;
289 fland = TMath::Landau(xx,mpc,par[0]) / par[0];
290 sum += fland * TMath::Gaus(x[0],xx,par[2]);
291 }
292
293 return (step * sum * invsq2pi / par[2]);
294}
295//_______________________________________________________________________
296Double_t AliITSPident::Gaus2(Double_t *x, Double_t *par){
297 //normalized gaussian function
298 return 1/(sqrt(2*TMath::Pi())*par[1])*TMath::Gaus(x[0],par[0],par[1]);
299}
300//_______________________________________________________________________
301void AliITSPident::CookFunItsLay(Int_t lay,Int_t opt,Double_t *par,Double_t dedx,Double_t mom,Double_t rangei,Double_t rangef,TString comment){
302 //it gives the response functions
303 TF1 funLay(comment,Langaufunnorm,rangei,rangef,3);
304 funLay.SetParameters(par);
305 Double_t condFun=funLay.Eval(dedx);
306 if(opt==0){
307 fCondFunProLay[lay]=condFun;
308 if(mom<0.4 && dedx<100)fCondFunProLay[lay]=0.00001;
309 if(mom<0.4 &&dedx<50)fCondFunProLay[lay]=0.0000001;
310 }
311 if(opt==1){
312 fCondFunKLay[lay]=condFun;
313 if(mom<0.25 && dedx<100)fCondFunKLay[lay]=0.00001;
314 if(mom<0.4 &&dedx<30)fCondFunKLay[lay]=0.0000001;
315 }
316 if(opt==2){
317 fCondFunPiLay[lay]=condFun;
318 if(mom<0.6 &&dedx<20)fCondFunPiLay[lay]=0.001;
319 }
320
321}
322//_______________________________________________________________________
323Float_t AliITSPident::CookCombinedBayes(Double_t condfun[][3],Float_t *prior,Int_t part)const {
324 //Bayesian combined PID in the ITS
325 Int_t test=0;
326 Float_t bayes;
327 Float_t pprior[4]={0,0,0,0};
328 for(Int_t j=0;j<4;j++)pprior[j]=prior[j];
329 pprior[2]+=pprior[3];//prior for electrons summed to priors for pions
330 for(Int_t i=0;i<4;i++){//layer
331 if (condfun[i][0]>0 || condfun[i][1]>0 ||condfun[i][2]>0) test++;
332 }
333 if(test==4){
334 if ((pprior[0]!=0 || pprior[1]!=0 ||pprior[2]!=0)&&CookSum(condfun,pprior)!=0){
335
336 bayes=pprior[part]*CookProd(condfun,part)*1/CookSum(condfun,pprior);
337
338 }
339 else bayes=-100;
340 }
341 else bayes=-100;
342 return bayes;
343}
344//_______________________________________________________________________
345Float_t AliITSPident::CookProd(Double_t condfun[][3],Int_t part)const{
346 //
347 Float_t p=1;
348 for(Int_t lay=0;lay<4;lay++){
349
350 p=p*condfun[lay][part];
351 }
352
353 return p;
354}
355//_______________________________________________________________________
356Float_t AliITSPident::CookSum(Double_t condfun[][3],Float_t *prior)const{
357 //
358 Float_t sum=0;
359 Float_t pprior[4]={0,0,0,0};
360 for(Int_t j=0;j<4;j++)pprior[j]=prior[j];
361 pprior[2]+=pprior[3];//prior for electrons summed to priors for pions
362 for(Int_t i=0;i<3;i++){//sum over the particles--electrons excluded
363 sum+=pprior[i]*CookProd(condfun,i);
364 }
365 return sum;
366
367}