]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ITS/AliITSPident.cxx
Bayesian PID: new parametrization and code update (E. Biolcati - F.Prino)
[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//////////////////////////////////////////////////////////////////////////
e96abd41 8#include "AliESDtrack.h"
b536a002 9#include "AliITSPidParams.h"
10#include "AliPID.h"
e62c1aea 11#include "AliITSPident.h"
12
13ClassImp(AliITSPident)
14 //_______________________________________________________________________
94631b2f 15AliITSPident::AliITSPident():
94631b2f 16fPBayesp(0),
17fPBayesk(0),
18fPBayespi(0),
19fPPriorip(0),
20fPPriorik(0),
21fPPrioripi(0),
b68da4a2 22fPPriorie(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//_______________________________________________________________________
32AliITSPident::~AliITSPident(){
33 // destructor
34}
e62c1aea 35//_______________________________________________________________________
b536a002 36AliITSPident::AliITSPident(Double_t mom,AliITSPidParams *pars, Double_t *Qlay,Double_t priorip,Double_t priorik,Double_t prioripi,Double_t priorie):
94631b2f 37fPBayesp(0),
38fPBayesk(0),
39fPBayespi(0),
40fPPriorip(priorip),
41fPPriorik(priorik),
42fPPrioripi(prioripi),
b68da4a2 43fPPriorie(priorie)
44{
45 //
b536a002 46 CalculateResponses(mom,pars,Qlay);
b68da4a2 47}
b68da4a2 48//__________________________________________________________________________________________
b536a002 49AliITSPident::AliITSPident(AliESDtrack *track,AliITSPidParams *pars,Double_t priorip,Double_t priorik,Double_t prioripi,Double_t priorie):
94631b2f 50fPBayesp(0),
51fPBayesk(0),
52fPBayespi(0),
53fPPriorip(priorip),
54fPPriorik(priorik),
55fPPrioripi(prioripi),
b68da4a2 56fPPriorie(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//_______________________________________________________________________
65void 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 105Double_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}//_______________________________________________________________________
114Double_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//_______________________________________________________________________
124Double_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 134Double_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 158Double_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 167Double_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}