From b68da4a292c0512e0bbe0beb6f47302ad13b2792 Mon Sep 17 00:00:00 2001 From: masera Date: Thu, 5 Apr 2007 09:00:34 +0000 Subject: [PATCH] Using 2 recpoins per layer, if needed --- ITS/AliITSPident.cxx | 138 ++++++++++++++++++++++++++++++------------ ITS/AliITSPident.h | 44 +++++--------- ITS/AliITSpidESD2.cxx | 77 +++++++++-------------- 3 files changed, 144 insertions(+), 115 deletions(-) diff --git a/ITS/AliITSPident.cxx b/ITS/AliITSPident.cxx index fcdc421b753..9a44f219dda 100644 --- a/ITS/AliITSPident.cxx +++ b/ITS/AliITSPident.cxx @@ -5,7 +5,10 @@ //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) //_______________________________________________________________________ @@ -18,15 +21,15 @@ fPBayespi(0), fPPriorip(0), fPPriorik(0), fPPrioripi(0), -fPPriorie(0), -fInvPt(0) +fPPriorie(0) { // default constructor - 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(){ @@ -42,8 +45,7 @@ fPBayespi(ob.fPBayespi), fPPriorip(ob.fPPriorip), fPPriorik(ob.fPPriorik), fPPrioripi(ob.fPPrioripi), -fPPriorie(ob.fPPriorie), -fInvPt(ob.fInvPt) +fPPriorie(ob.fPPriorie) { // Copy constructor } @@ -58,7 +60,7 @@ AliITSPident& AliITSPident::operator=(const AliITSPident& ob){ //_______________________________________________________________________ -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): +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), @@ -67,15 +69,17 @@ fPBayespi(0), fPPriorip(priorip), fPPriorik(priorik), fPPrioripi(prioripi), -fPPriorie(priorie), -fInvPt(invPt){ - - //test - +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); - + fNcls[la]=0; Double_t range[6]; range[0]=0.3*parp[1]; range[1]=2.*parp[1]; @@ -85,19 +89,28 @@ fInvPt(invPt){ 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"); + } + } + } } - - 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]; @@ -107,11 +120,10 @@ fInvPt(invPt){ 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 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), @@ -120,10 +132,14 @@ fPBayespi(0), fPPriorip(priorip), fPPriorik(priorik), fPPrioripi(prioripi), -fPPriorie(priorie), -fInvPt(0) +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); @@ -132,32 +148,42 @@ fInvPt(0) 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"); + + 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]; @@ -171,12 +197,47 @@ fInvPt(0) } //_______________________________________________________________________ +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 = "<<" "< -#include -#include -#include -#include "AliITSPidParItem.h" -#include "AliITSSteerPid.h" +class AliITStrackV2; +class AliITSSteerPid; +class TF1; +class AliITSPidParItem; class AliITSPident : public TObject{ public: AliITSPident(); - AliITSPident(Double_t mom,Double_t invPt,Double_t dEdx,AliITSSteerPid *sp,Float_t *Qlay,Float_t priorip=0.066,Float_t priorik=0.103,Float_t prioripi=0.83,Float_t priorie=0.001); + AliITSPident(Double_t mom,Double_t dEdx,AliITSSteerPid *sp,Float_t *Qlay,Float_t *nlay,Float_t priorip=0.066,Float_t priorik=0.103,Float_t prioripi=0.83,Float_t priorie=0.001); - AliITSPident(AliITStrackV2 *trackITS,AliITSSteerPid *sp,Float_t *Qlay,Float_t priorip=0.066,Float_t priorik=0.103,Float_t prioripi=0.83,Float_t priorie=0.001); + AliITSPident(AliITStrackV2 *trackITS,AliITSSteerPid *sp,Float_t *Qlay,Float_t *nlay,Float_t priorip=0.066,Float_t priorik=0.103,Float_t prioripi=0.83,Float_t priorie=0.001); virtual ~AliITSPident(); Float_t GetP() const {return fMom;}//local momentum (GeV/c) @@ -29,25 +28,15 @@ class AliITSPident : public TObject{ Double_t GetCondFunPro(Int_t lay) const { return fCondFunProLay[lay]; } - Double_t GetProdCondFunPro() const { - Double_t rv=1.; for(Int_t i=0;i<4;i++)rv*=GetCondFunPro(i); - return rv; - } + Double_t GetProdCondFunPro() const; Double_t GetCondFunK(Int_t lay) const { return fCondFunKLay[lay]; } - Double_t GetProdCondFunK() const { - Double_t rv=1.; for(Int_t i=0;i<4;i++)rv*=GetCondFunK(i); - return rv; - } + Double_t GetProdCondFunK() const; Double_t GetCondFunPi(Int_t lay) const { return fCondFunPiLay[lay]; } - Double_t GetProdCondFunPi() const { - Double_t rv=1.; for(Int_t i=0;i<4;i++)rv*=GetCondFunPi(i); - return rv; - } - Float_t GetInvPt() const {return fInvPt;} + Double_t GetProdCondFunPi() const; void PrintParameters() const; Float_t GetPBayesp()const {return fPBayesp;} Float_t GetPBayesk()const {return fPBayesk;} @@ -56,7 +45,7 @@ class AliITSPident : public TObject{ Float_t GetPPriorik() const {return fPPriorik;} Float_t GetPPrioripi() const {return fPPrioripi;} Float_t GetPPriorie() const {return fPPriorie;} - + void GetNclsPerLayer(Int_t *ncls) const; static Double_t Langaufun(Double_t *x, Double_t *par); static Double_t Langaufun2(Double_t *x, Double_t *par); static Double_t Langaufunnorm(Double_t *x, Double_t *par); @@ -74,9 +63,9 @@ class AliITSPident : public TObject{ Float_t fMom; // Particle momentum Double_t fdEdx; // Particle dE/dx - Double_t fCondFunProLay[4]; // one for each silicon layer - Double_t fCondFunKLay[4]; // cond. prob. function kaons per layer - Double_t fCondFunPiLay[4]; // cond. prob. function pions per layer + Double_t fCondFunProLay[8]; // one for each silicon layer + Double_t fCondFunKLay[8]; // cond. prob. function kaons per layer + Double_t fCondFunPiLay[8]; // cond. prob. function pions per layer Float_t fPBayesp; // Bayes prob. Float_t fPBayesk; // Bayes prob. for kaons Float_t fPBayespi; // Bayes prob. for pions @@ -84,8 +73,7 @@ class AliITSPident : public TObject{ Float_t fPPriorik; // Priori prob. for kaons Float_t fPPrioripi; // Priori prob. for pions Float_t fPPriorie; // Priori prob. for electrons - Float_t fInvPt; // Particle Inverse Transverse momentum - - ClassDef(AliITSPident,1); + Int_t fNcls[4]; // N. of clusters per layer (sdd1,sdd2,ssd1,ssd2) + ClassDef(AliITSPident,2); }; #endif diff --git a/ITS/AliITSpidESD2.cxx b/ITS/AliITSpidESD2.cxx index 42f0f8706bc..39368449204 100644 --- a/ITS/AliITSpidESD2.cxx +++ b/ITS/AliITSpidESD2.cxx @@ -92,7 +92,7 @@ Int_t AliITSpidESD2::MakePID(AliESD *event) fLoader->LoadRecPoints(); TTree *cTree=fLoader->TreeR(); fTracker->LoadClusters(cTree); - + printf("==== Landau Fit PID ITS ====== \n"); Int_t ntrk=event->GetNumberOfTracks(); Double_t momits; // for (Int_t i=0; iGetClusterIndex(3); - Int_t cluindsdd2 = track->GetClusterIndex(2); - Int_t cluindssd1 = track->GetClusterIndex(1); - Int_t cluindssd2 = track->GetClusterIndex(0); - Float_t q1,q1corr,q2,q2corr,q3,q3corr,q4,q4corr; - AliITSRecPoint* clu1=(AliITSRecPoint*)fTracker->GetCluster(cluindsdd1); - if(clu1!=0){ - q1=clu1->GetQ(); - q1corr=q1*TMath::Sqrt((1-snp*snp)/(1+tgl*tgl)); - } - else{ - q1=-99; - q1corr=-99; - } - - AliITSRecPoint* clu2=(AliITSRecPoint*)fTracker->GetCluster(cluindsdd2); - if(clu2!=0){ - q2=clu2->GetQ(); - q2corr=q2*TMath::Sqrt((1-snp*snp)/(1+tgl*tgl)); - } - else{ - q2=-99; - q2corr=-99; + Int_t cluind[12]; + for(Int_t ii=0;ii<12;ii++){ + cluind[ii]=track->GetClusterIndex(ii); } - - AliITSRecPoint* clu3=(AliITSRecPoint*)fTracker->GetCluster(cluindssd1); - if(clu3!=0){ - q3=clu3->GetQ(); - q3corr=q3*TMath::Sqrt((1-snp*snp)/(1+tgl*tgl)); + AliITSRecPoint* cluarr[12]; + Float_t qclu[8],qclucorr[8],nlay[8]; + for(Int_t i=0;i<8;i++){ + qclu[i]=0; + qclucorr[i]=0; + nlay[i]=0; } - else{ - q3=-99; - q3corr=-99; + Int_t jj=0; + for(Int_t i=0;i<12;i++){ + cluind[i]=track->GetClusterIndex(i); + if(cluind[i]>0){ + cluarr[i]=(AliITSRecPoint*)fTracker->GetCluster(cluind[i]); + Int_t lay=cluarr[i]->GetLayer(); + if(lay>1){//sdd+ssd only + qclu[jj]=cluarr[i]->GetQ(); + qclucorr[jj]=qclu[jj]*TMath::Sqrt((1-snp*snp)/(1+tgl*tgl)); + nlay[jj]=lay; + jj++; + } + else qclucorr[jj]=-1; + } } - - AliITSRecPoint* clu4=(AliITSRecPoint*)fTracker->GetCluster(cluindssd2); - if(clu4!=0){ - q4=clu4->GetQ(); - q4corr=q4*TMath::Sqrt((1-snp*snp)/(1+tgl*tgl)); - } - else{ - q4=-99; - q4corr=-99; - } - Float_t qlay[4]={q1corr,q2corr,q3corr,q4corr}; + Float_t prip=0.33; Float_t prik=0.33; Float_t pripi=0.33; Float_t prie=0.; - Double_t invPt=track->Get1Pt(); - AliITSPident mypid(momits,invPt,dEdxsignal,fSp,qlay,prip,prik,pripi,prie); - condprobfun[0]=mypid.GetProdCondFunPi();//el -> ITS does not distinguish among Pi,mu,el - condprobfun[1]=mypid.GetProdCondFunPi();//mu -> ITS does not distinguish among Pi,mu,el - condprobfun[2]=mypid.GetProdCondFunPi();//pi -> ITS does not distinguish among Pi,mu,el + AliITSPident mypid(momits,dEdxsignal,fSp,qclucorr,nlay,prip,prik,pripi,prie); + condprobfun[0]=mypid.GetProdCondFunPi();//el --PID in the ITS does not distinguish among Pi,el,mu + condprobfun[1]=mypid.GetProdCondFunPi();//mu + condprobfun[2]=mypid.GetProdCondFunPi();//pi condprobfun[3]=mypid.GetProdCondFunK();//kaon condprobfun[4]=mypid.GetProdCondFunPro();//pro -- 2.43.0