////////////////////////////////////////////////////////////////////////// // USER Class for PID in the ITS // //The PID is based on the likelihood of all the four ITS' layers, // //without using the truncated mean for the dE/dx. The response // //functions for each layer are convoluted Landau-Gaussian functions. // // Origin: Elena Bruna bruna@to.infn.it,, Massimo Masera masera@to.infn.it// ////////////////////////////////////////////////////////////////////////// #include "AliITStrackV2.h" #include "AliITSPident.h" #include "AliITSSteerPid.h" #include ClassImp(AliITSPident) //_______________________________________________________________________ AliITSPident::AliITSPident(): fMom(0), fdEdx(0), fPBayesp(0), fPBayesk(0), fPBayespi(0), fPPriorip(0), fPPriorik(0), fPPrioripi(0), fPPriorie(0) { // default constructor for (Int_t i=0;i<8;i++){ fCondFunProLay[i]=0; fCondFunKLay[i]=0; fCondFunPiLay[i]=0; } for (Int_t i=0;i<4;i++)fNcls[i]=0; } //_______________________________________________________________________ AliITSPident::~AliITSPident(){ // destructor } //______________________________________________________________________ AliITSPident::AliITSPident(const AliITSPident &ob) :TObject(ob), fMom(ob.fMom), fdEdx(ob.fdEdx), fPBayesp(ob.fPBayesp), fPBayesk(ob.fPBayesk), fPBayespi(ob.fPBayespi), fPPriorip(ob.fPPriorip), fPPriorik(ob.fPPriorik), fPPrioripi(ob.fPPrioripi), fPPriorie(ob.fPPriorie) { // Copy constructor } //______________________________________________________________________ AliITSPident& AliITSPident::operator=(const AliITSPident& ob){ // Assignment operator this->~AliITSPident(); new(this) AliITSPident(ob); return *this; } //_______________________________________________________________________ AliITSPident::AliITSPident(Double_t mom,Double_t dEdx,AliITSSteerPid *sp,Float_t *Qlay,Float_t *nlay,Float_t priorip,Float_t priorik,Float_t prioripi,Float_t priorie): fMom(mom), fdEdx(dEdx), fPBayesp(0), fPBayesk(0), fPBayespi(0), fPPriorip(priorip), fPPriorik(priorik), fPPrioripi(prioripi), fPPriorie(priorie) { // for (Int_t i=0;i<8;i++){ fCondFunProLay[i]=-1; fCondFunKLay[i]=-1; fCondFunPiLay[i]=-1; } for(Int_t la=0;la<4;la++){//loop on layers Double_t parp[3];Double_t park[3];Double_t parpi[3]; fNcls[la]=0; Double_t range[6]; range[0]=0.3*parp[1]; range[1]=2.*parp[1]; range[2]=0.3*park[1]; range[3]=2.*park[1]; range[4]=0.3*parpi[1]; range[5]=2.*parpi[1]; Int_t layer=la+2; for(Int_t ii=0;ii<8;ii++){ if(nlay[ii]==layer){ fNcls[la]++; if(Qlay[ii]>0){ sp->GetParFitLayer(la,fMom,parp,park,parpi); CookFunItsLay(ii,0,parp,Qlay[ii],fMom,range[0],range[1],"fPro"); CookFunItsLay(ii,1,park,Qlay[ii],fMom,range[2],range[3],"fKao"); CookFunItsLay(ii,2,parpi,Qlay[ii],fMom,range[4],range[5],"fPi"); } } } } Float_t prior[4];Double_t condFun[8][3]; prior[0]=fPPriorip; prior[1]=fPPriorik; prior[2]=fPPrioripi; prior[3]=fPPriorie; for(Int_t la=0;la<8;la++){ condFun[la][0]= fCondFunProLay[la]; condFun[la][1]= fCondFunKLay[la]; condFun[la][2]= fCondFunPiLay[la]; } fPBayesp=CookCombinedBayes(condFun,prior,0); fPBayesk=CookCombinedBayes(condFun,prior,1); fPBayespi=CookCombinedBayes(condFun,prior,2); } //__________________________________________________________________________________________ AliITSPident::AliITSPident(AliITStrackV2 *trackITS,AliITSSteerPid *sp,Float_t *Qlay,Float_t *nlay,Float_t priorip,Float_t priorik,Float_t prioripi,Float_t priorie): fMom(0), fdEdx(0), fPBayesp(0), fPBayesk(0), fPBayespi(0), fPPriorip(priorip), fPPriorik(priorik), fPPrioripi(prioripi), fPPriorie(priorie) { // for (Int_t i=0;i<8;i++){ fCondFunProLay[i]=-1; fCondFunKLay[i]=-1; fCondFunPiLay[i]=-1; } Double_t xr; Double_t par[5]; trackITS->GetExternalParameters(xr,par); if (par[4]!=0) { Float_t lamb=TMath::ATan(par[3]); fMom=1/(TMath::Abs(par[4])*TMath::Cos(lamb)); } for(Int_t la=0;la<4;la++){//loop on layers Double_t parp[3];Double_t park[3];Double_t parpi[3]; fNcls[la]=0; Double_t range[8]; range[0]=0.3*parp[1]; range[1]=2.*parp[1]; range[2]=0.3*park[1]; range[3]=2.*park[1]; range[4]=0.3*parpi[1]; range[5]=2.*parpi[1]; Int_t layer=la+2; for(Int_t ii=0;ii<8;ii++){ if(nlay[ii]==layer){ fNcls[la]++; if(Qlay[ii]>0){ sp->GetParFitLayer(la,fMom,parp,park,parpi); CookFunItsLay(ii,0,parp,Qlay[ii],fMom,range[0],range[1],"fPro"); CookFunItsLay(ii,1,park,Qlay[ii],fMom,range[2],range[3],"fKao"); CookFunItsLay(ii,2,parpi,Qlay[ii],fMom,range[4],range[5],"fPi"); } } } } Float_t prior[4];Double_t condFun[8][3]; prior[0]=fPPriorip; prior[1]=fPPriorik; prior[2]=fPPrioripi; prior[3]=fPPriorie; for(Int_t la=0;la<8;la++){ condFun[la][0]= fCondFunProLay[la]; condFun[la][1]= fCondFunKLay[la]; condFun[la][2]= fCondFunPiLay[la]; } fPBayesp=CookCombinedBayes(condFun,prior,0); fPBayesk=CookCombinedBayes(condFun,prior,1); fPBayespi=CookCombinedBayes(condFun,prior,2); fdEdx=trackITS->GetdEdx(); } //_______________________________________________________________________ void AliITSPident::GetNclsPerLayer(Int_t *ncls) const{ //number of clusters for each layer (sdd1,sdd2,ssd1,ssd2) for(Int_t la=0;la<4;la++){ ncls[la]=fNcls[la]; } }//_______________________________________________________________________ Double_t AliITSPident::GetProdCondFunPro() const { //Product of conditional probability functions for protons Double_t rv=1.; for(Int_t i=0;i<8;i++){ Double_t fun=GetCondFunPro(i); if(fun>=0)rv*=fun; } return rv; }//_______________________________________________________________________ Double_t AliITSPident::GetProdCondFunK() const { //Product of conditional probability functions for kaons Double_t rv=1.; for(Int_t i=0;i<8;i++){ Double_t fun=GetCondFunK(i); if(fun>=0)rv*=fun; } return rv; } //_______________________________________________________________________ Double_t AliITSPident::GetProdCondFunPi() const { //Product of conditional probability functions for pions Double_t rv=1.; for(Int_t i=0;i<8;i++){ Double_t fun=GetCondFunPi(i); if(fun>=0)rv*=fun; } return rv; } //_______________________________________________________________________ void AliITSPident::PrintParameters() const{ //print parameters cout<<"___________________________\n"; cout<<"Track Local Momentum = "<<" "<0 || condfun[i][1]>0 ||condfun[i][2]>0) test++; } if(test>0){ if ((pprior[0]!=0 || pprior[1]!=0 ||pprior[2]!=0)&&CookSum(condfun,pprior)!=0){ bayes=pprior[part]*CookProd(condfun,part)*1/CookSum(condfun,pprior); } else bayes=-100; } else bayes=-100; return bayes; } //_______________________________________________________________________ Float_t AliITSPident::CookProd(Double_t condfun[][3],Int_t part)const{ // Float_t p=1; for(Int_t lay=0;lay<8;lay++){ if(condfun[lay][part]>=0)p=p*condfun[lay][part]; } return p; } //_______________________________________________________________________ Float_t AliITSPident::CookSum(Double_t condfun[][3],Float_t *prior)const{ // Float_t sum=0; Float_t pprior[4]={0,0,0,0}; for(Int_t j=0;j<4;j++)pprior[j]=prior[j]; pprior[2]+=pprior[3];//prior for electrons summed to priors for pions for(Int_t i=0;i<3;i++){//sum over the particles--electrons excluded sum+=pprior[i]*CookProd(condfun,i); } return sum; }