]>
Commit | Line | Data |
---|---|---|
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 | ////////////////////////////////////////////////////////////////////////// | |
e96abd41 | 8 | #include "AliESDtrack.h" |
b536a002 | 9 | #include "AliITSPidParams.h" |
10 | #include "AliPID.h" | |
e62c1aea | 11 | #include "AliITSPident.h" |
12 | ||
13 | ClassImp(AliITSPident) | |
14 | //_______________________________________________________________________ | |
94631b2f | 15 | AliITSPident::AliITSPident(): |
94631b2f | 16 | fPBayesp(0), |
17 | fPBayesk(0), | |
18 | fPBayespi(0), | |
19 | fPPriorip(0), | |
20 | fPPriorik(0), | |
21 | fPPrioripi(0), | |
b68da4a2 | 22 | fPPriorie(0) |
94631b2f | 23 | { |
e62c1aea | 24 | // default constructor |
b68da4a2 | 25 | for (Int_t i=0;i<8;i++){ |
e62c1aea | 26 | fCondFunProLay[i]=0; |
27 | fCondFunKLay[i]=0; | |
28 | fCondFunPiLay[i]=0; | |
29 | } | |
30 | } | |
31 | //_______________________________________________________________________ | |
32 | AliITSPident::~AliITSPident(){ | |
33 | // destructor | |
34 | } | |
e62c1aea | 35 | //_______________________________________________________________________ |
b536a002 | 36 | AliITSPident::AliITSPident(Double_t mom,AliITSPidParams *pars, Double_t *Qlay,Double_t priorip,Double_t priorik,Double_t prioripi,Double_t priorie): |
94631b2f | 37 | fPBayesp(0), |
38 | fPBayesk(0), | |
39 | fPBayespi(0), | |
40 | fPPriorip(priorip), | |
41 | fPPriorik(priorik), | |
42 | fPPrioripi(prioripi), | |
b68da4a2 | 43 | fPPriorie(priorie) |
44 | { | |
45 | // | |
b536a002 | 46 | CalculateResponses(mom,pars,Qlay); |
b68da4a2 | 47 | } |
b68da4a2 | 48 | //__________________________________________________________________________________________ |
b536a002 | 49 | AliITSPident::AliITSPident(AliESDtrack *track,AliITSPidParams *pars,Double_t priorip,Double_t priorik,Double_t prioripi,Double_t priorie): |
94631b2f | 50 | fPBayesp(0), |
51 | fPBayesk(0), | |
52 | fPBayespi(0), | |
53 | fPPriorip(priorip), | |
54 | fPPriorik(priorik), | |
55 | fPPrioripi(prioripi), | |
b68da4a2 | 56 | fPPriorie(priorie) |
94631b2f | 57 | { |
e62c1aea | 58 | // |
b536a002 | 59 | Double_t mom=track->GetP(); |
60 | Double_t Qlay[4]={0.,0.,0.,0.}; | |
61 | track->GetITSdEdxSamples(Qlay); | |
62 | CalculateResponses(mom,pars,Qlay); | |
63 | } | |
64 | //_______________________________________________________________________ | |
65 | void AliITSPident::CalculateResponses(Double_t mom,AliITSPidParams *pars, Double_t *Qlay){ | |
66 | // calculates conditional probabilities | |
67 | ||
b68da4a2 | 68 | for (Int_t i=0;i<8;i++){ |
69 | fCondFunProLay[i]=-1; | |
70 | fCondFunKLay[i]=-1; | |
71 | fCondFunPiLay[i]=-1; | |
72 | } | |
e62c1aea | 73 | |
b536a002 | 74 | for(Int_t iLay=0; iLay<4; iLay++){//loop on layers (3=SDD inner 6=SSD outer) |
75 | Double_t dedx=Qlay[iLay]; | |
76 | if(dedx>0){ | |
77 | fCondFunProLay[iLay]=pars->GetLandauGausNorm(dedx,AliPID::kProton,mom,iLay+3); | |
78 | if(mom<0.4 && dedx<100)fCondFunProLay[iLay]=0.00001; | |
79 | if(mom<0.4 &&dedx<50)fCondFunProLay[iLay]=0.0000001; | |
80 | fCondFunKLay[iLay]=pars->GetLandauGausNorm(dedx,AliPID::kKaon,mom,iLay+3); | |
81 | if(mom<0.25 && dedx<100)fCondFunKLay[iLay]=0.00001; | |
82 | if(mom<0.4 &&dedx<30)fCondFunKLay[iLay]=0.0000001; | |
83 | fCondFunPiLay[iLay]=pars->GetLandauGausNorm(dedx,AliPID::kPion,mom,iLay+3); | |
84 | if(mom<0.6 &&dedx<20)fCondFunPiLay[iLay]=0.001; | |
b68da4a2 | 85 | } |
e62c1aea | 86 | } |
b536a002 | 87 | Double_t prior[4]; |
88 | Double_t condFun[8][3]; | |
e62c1aea | 89 | |
90 | prior[0]=fPPriorip; | |
91 | prior[1]=fPPriorik; | |
92 | prior[2]=fPPrioripi; | |
93 | prior[3]=fPPriorie; | |
b536a002 | 94 | for(Int_t iLay=0;iLay<8;iLay++){ |
95 | condFun[iLay][0]= fCondFunProLay[iLay]; | |
96 | condFun[iLay][1]= fCondFunKLay[iLay]; | |
97 | condFun[iLay][2]= fCondFunPiLay[iLay]; | |
e62c1aea | 98 | } |
99 | ||
e62c1aea | 100 | fPBayesp=CookCombinedBayes(condFun,prior,0); |
e62c1aea | 101 | fPBayesk=CookCombinedBayes(condFun,prior,1); |
e62c1aea | 102 | fPBayespi=CookCombinedBayes(condFun,prior,2); |
e62c1aea | 103 | } |
104 | //_______________________________________________________________________ | |
b68da4a2 | 105 | Double_t AliITSPident::GetProdCondFunPro() const { |
106 | //Product of conditional probability functions for protons | |
107 | Double_t rv=1.; | |
108 | for(Int_t i=0;i<8;i++){ | |
109 | Double_t fun=GetCondFunPro(i); | |
110 | if(fun>=0)rv*=fun; | |
111 | } | |
112 | return rv; | |
113 | }//_______________________________________________________________________ | |
114 | Double_t AliITSPident::GetProdCondFunK() const { | |
115 | //Product of conditional probability functions for kaons | |
116 | Double_t rv=1.; | |
117 | for(Int_t i=0;i<8;i++){ | |
118 | Double_t fun=GetCondFunK(i); | |
119 | if(fun>=0)rv*=fun; | |
120 | } | |
121 | return rv; | |
122 | } | |
123 | //_______________________________________________________________________ | |
124 | Double_t AliITSPident::GetProdCondFunPi() const { | |
125 | //Product of conditional probability functions for pions | |
b536a002 | 126 | Double_t rv=1.; |
127 | for(Int_t i=0;i<8;i++){ | |
128 | Double_t fun=GetCondFunPi(i); | |
129 | if(fun>=0)rv*=fun; | |
e62c1aea | 130 | } |
b536a002 | 131 | return rv; |
e62c1aea | 132 | } |
133 | //_______________________________________________________________________ | |
b536a002 | 134 | Double_t AliITSPident::CookCombinedBayes(Double_t condfun[][3],Double_t *prior,Int_t part)const { |
e62c1aea | 135 | //Bayesian combined PID in the ITS |
136 | Int_t test=0; | |
b536a002 | 137 | Double_t bayes; |
138 | Double_t pprior[4]={0,0,0,0}; | |
e62c1aea | 139 | for(Int_t j=0;j<4;j++)pprior[j]=prior[j]; |
140 | pprior[2]+=pprior[3];//prior for electrons summed to priors for pions | |
b68da4a2 | 141 | for(Int_t i=0;i<8;i++){//layer |
e62c1aea | 142 | if (condfun[i][0]>0 || condfun[i][1]>0 ||condfun[i][2]>0) test++; |
143 | } | |
b536a002 | 144 | |
b68da4a2 | 145 | if(test>0){ |
b536a002 | 146 | Double_t sum=CookSum(condfun,pprior); |
147 | if ((pprior[0]!=0 || pprior[1]!=0 ||pprior[2]!=0)&&sum!=0.){ | |
e62c1aea | 148 | |
b536a002 | 149 | bayes=pprior[part]*CookProd(condfun,part)*1/sum; |
e62c1aea | 150 | |
151 | } | |
152 | else bayes=-100; | |
153 | } | |
154 | else bayes=-100; | |
155 | return bayes; | |
156 | } | |
157 | //_______________________________________________________________________ | |
b536a002 | 158 | Double_t AliITSPident::CookProd(Double_t condfun[][3],Int_t part)const{ |
e62c1aea | 159 | // |
b536a002 | 160 | Double_t p=1; |
b68da4a2 | 161 | for(Int_t lay=0;lay<8;lay++){ |
b536a002 | 162 | if(condfun[lay][part]>0.) p=p*condfun[lay][part]; |
e62c1aea | 163 | } |
e62c1aea | 164 | return p; |
165 | } | |
166 | //_______________________________________________________________________ | |
b536a002 | 167 | Double_t AliITSPident::CookSum(Double_t condfun[][3],Double_t *prior)const{ |
e62c1aea | 168 | // |
b536a002 | 169 | Double_t sum=0.; |
170 | Double_t pprior[4]={0,0,0,0}; | |
171 | for(Int_t j=0;j<4;j++) pprior[j]=prior[j]; | |
e62c1aea | 172 | pprior[2]+=pprior[3];//prior for electrons summed to priors for pions |
173 | for(Int_t i=0;i<3;i++){//sum over the particles--electrons excluded | |
174 | sum+=pprior[i]*CookProd(condfun,i); | |
175 | } | |
176 | return sum; | |
177 | ||
178 | } |