//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 <Riostream.h>
ClassImp(AliITSPident)
//_______________________________________________________________________
-AliITSPident::AliITSPident(){
+AliITSPident::AliITSPident():
+fMom(0),
+fdEdx(0),
+fPBayesp(0),
+fPBayesk(0),
+fPBayespi(0),
+fPPriorip(0),
+fPPriorik(0),
+fPPrioripi(0),
+fPPriorie(0)
+{
// default constructor
- fMom=0;
- fdEdx=0;
- fInvPt=0;
- fPBayesp=0;
- fPBayesk=0;
- fPBayespi=0;
- fPPriorip=0;
- fPPriorik=0;
- fPPrioripi=0;
- fPPriorie=0;
- for (Int_t i=0;i<4;i++){
+ 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) {
+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
- // Copies are not allowed. The method is protected to avoid misuse.
- Error("AliITSPident","Copy constructor not allowed\n");
}
//______________________________________________________________________
-AliITSPident& AliITSPident::operator=(const AliITSPident& /* ob */){
+AliITSPident& AliITSPident::operator=(const AliITSPident& ob){
// Assignment operator
- // Assignment is not allowed. The method is protected to avoid misuse.
- Error("= operator","Assignment operator not allowed\n");
+ this->~AliITSPident();
+ new(this) AliITSPident(ob);
return *this;
}
//_______________________________________________________________________
-AliITSPident::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){
-
- //test
-
- fMom=mom;
- fInvPt=invPt;
+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];
- sp->GetParFitLayer(la,fMom,parp,park,parpi);
- // cout<<"lay = "<<la<<endl;
- //for(Int_t i=0;i<3;i++)cout<<parp[i]<<" "<<park[i]<<" "<<parpi[i]<<endl;
+ fNcls[la]=0;
Double_t range[6];
range[0]=0.3*parp[1];
range[1]=2.*parp[1];
range[4]=0.3*parpi[1];
range[5]=2.*parpi[1];
- CookFunItsLay(la,0,parp,Qlay[la],fMom,range[0],range[1],"fPro");
- CookFunItsLay(la,1,park,Qlay[la],fMom,range[2],range[3],"fKao");
- CookFunItsLay(la,2,parpi,Qlay[la],fMom,range[4],range[5],"fPi");
+ 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");
+ }
+ }
+ }
}
- fPPriorip=priorip;
- fPPriorik=priorik;
- fPPrioripi=prioripi;
- fPPriorie=priorie;
-
-
- Float_t prior[4];Double_t condFun[4][3];
+
+ 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<4;la++){
+ for(Int_t la=0;la<8;la++){
condFun[la][0]= fCondFunProLay[la];
condFun[la][1]= fCondFunKLay[la];
condFun[la][2]= fCondFunPiLay[la];
}
- cout<<"PROTONS"<<endl;
fPBayesp=CookCombinedBayes(condFun,prior,0);
- for(Int_t la=0;la<4;la++)cout<<" lay "<<la<<"->prob "<<condFun[la][0];cout<<endl;cout<<"bayes = "<<fPBayesp<<endl;
- cout<<"KAONS"<<endl;
fPBayesk=CookCombinedBayes(condFun,prior,1);
- for(Int_t la=0;la<4;la++)cout<<" lay "<<la<<"->prob "<<condFun[la][1];cout<<endl;cout<<"bayes = "<<fPBayesk<<endl;
- cout<<"PIONS"<<endl;
fPBayespi=CookCombinedBayes(condFun,prior,2);
- for(Int_t la=0;la<4;la++)cout<<" lay "<<la<<"->prob "<<condFun[la][2];cout<<endl;cout<<"bayes = "<<fPBayespi<<endl;
-
-
- fdEdx=dEdx;
}
-
-//_______________________________________________________________________
-AliITSPident::AliITSPident(AliITStrackV2 *trackITS,AliITSSteerPid *sp,Float_t *Qlay,Float_t priorip,Float_t priorik,Float_t prioripi,Float_t priorie){
+//__________________________________________________________________________________________
+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);
fMom=1/(TMath::Abs(par[4])*TMath::Cos(lamb));
}
- fInvPt=par[4];
for(Int_t la=0;la<4;la++){//loop on layers
Double_t parp[3];Double_t park[3];Double_t parpi[3];
- sp->GetParFitLayer(la,fMom,parp,park,parpi);
+ 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];
- CookFunItsLay(la,0,parp,Qlay[la],fMom,range[0],range[1],"fPro");
- CookFunItsLay(la,1,park,Qlay[la],fMom,range[2],range[3],"fKao");
- CookFunItsLay(la,2,parpi,Qlay[la],fMom,range[4],range[5],"fPi");
- }
- fPPriorip=priorip;
- fPPriorik=priorik;
- fPPrioripi=prioripi;
- fPPriorie=priorie;
+ 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[4][3];
+ 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<4;la++){
+ for(Int_t la=0;la<8;la++){
condFun[la][0]= fCondFunProLay[la];
condFun[la][1]= fCondFunKLay[la];
condFun[la][2]= fCondFunPiLay[la];
}
- cout<<"PROTONS"<<endl;
fPBayesp=CookCombinedBayes(condFun,prior,0);
- for(Int_t la=0;la<4;la++)cout<<" lay "<<la<<"->prob "<<condFun[la][0];cout<<endl;cout<<"bayes = "<<fPBayesp<<endl;
- cout<<"KAONS"<<endl;
fPBayesk=CookCombinedBayes(condFun,prior,1);
- for(Int_t la=0;la<4;la++)cout<<" lay "<<la<<"->prob "<<condFun[la][1];cout<<endl;cout<<"bayes = "<<fPBayesk<<endl;
- cout<<"PIONS"<<endl;
fPBayespi=CookCombinedBayes(condFun,prior,2);
- for(Int_t la=0;la<4;la++)cout<<" lay "<<la<<"->prob "<<condFun[la][2];cout<<endl;cout<<"bayes = "<<fPBayespi<<endl;
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 = "<<" "<<fMom<<endl;
cout<<"Track dEdx = "<<" "<<fdEdx<<endl;
- cout<<"Inv Pt = "<<fInvPt<<endl;
}
//_______________________________________________________________________
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<4;i++){//layer
+ for(Int_t i=0;i<8;i++){//layer
if (condfun[i][0]>0 || condfun[i][1]>0 ||condfun[i][2]>0) test++;
}
- if(test==4){
+ 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);
Float_t AliITSPident::CookProd(Double_t condfun[][3],Int_t part)const{
//
Float_t p=1;
- for(Int_t lay=0;lay<4;lay++){
-
- p=p*condfun[lay][part];
+ for(Int_t lay=0;lay<8;lay++){
+ if(condfun[lay][part]>=0)p=p*condfun[lay][part];
}
return p;