* provided "as is" without express or implied warranty. *
**************************************************************************/
+/* $Id$ */
+
//-----------------------------------------------------------------------//
// ITS PID class --- method # 2 //
// //
//-----------------------------------------------------------------------//
#include "AliITSpidESD2.h"
-#include "AliESD.h"
+#include "AliESDEvent.h"
#include "AliESDtrack.h"
-#include "AliITStrackV2.h"
-#include "AliITSRecPoint.h"
-#include "AliITStrackerMI.h"
#include "AliITSLoader.h"
#include "AliITSPident.h"
#include "AliITSSteerPid.h"
ClassImp(AliITSpidESD2)
//_________________________________________________________________________
- AliITSpidESD2::AliITSpidESD2():AliITSpidESD(),
-fTracker(0),
-fLoader(0),
-fSp(0)
-{ //
+AliITSpidESD2::AliITSpidESD2():
+ AliITSpidESD(),
+ fSp(0)
+{
// The main constructor
-}
-//_________________________________________________________________________
-AliITSpidESD2::AliITSpidESD2(AliITStrackerMI* tracker,AliITSLoader* loader):AliITSpidESD(),
-fTracker(0),
-fLoader(0),
-fSp(0)
-{ //
- // The main constructor
- fTracker=tracker;
- fLoader=loader;
fSp=new AliITSSteerPid();
fSp->InitLayer();
}
+
+
//_________________________________________________________________________
AliITSpidESD2::~AliITSpidESD2(){
//destructor
if(fSp)delete fSp;
-
}
+
+
//______________________________________________________________________
AliITSpidESD2::AliITSpidESD2(const AliITSpidESD2 &ob) :AliITSpidESD(ob),
-fTracker(ob.fTracker),
-fLoader(ob.fLoader),
fSp(ob.fSp)
{
// Copy constructor
-
}
+
//______________________________________________________________________
AliITSpidESD2& AliITSpidESD2::operator=(const AliITSpidESD2& ob ){
// Assignment operator
return *this;
}
-//_________________________________________________________________________
-Int_t AliITSpidESD2::MakePID(AliESD *event)
-{
+
+//______________________________________________________________________
+void AliITSpidESD2::GetITSpidSingleTrack(AliESDtrack* esdtr, Double_t condprobfun[]){
+ // Method to calculate PID probabilities for a single track
+
+ Double_t momits=esdtr->GetP();
+ Double_t qclu[4];
+ esdtr->GetITSdEdxSamples(qclu);
+
+ Float_t qclucorr[8],nlay[8];
+ for(Int_t jj=0;jj<8;jj++){
+ if(jj<4 && qclu[jj]>0){
+ qclucorr[jj]=qclu[jj];
+ nlay[jj]=jj+2; // layers numbered from 0 to 5
+ }
+ else{
+ qclucorr[jj]=-1;
+ nlay[jj]=0;
+ }
+ }
+
+ Float_t prip=0.33;
+ Float_t prik=0.33;
+ Float_t pripi=0.33;
+ Float_t prie=0.;
+ AliITSPident mypid(momits,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
+ return;
+}
- //
+
+
+//_________________________________________________________________________
+Int_t AliITSpidESD2::MakePID(AliESDEvent *event){
// This function calculates the "detector response" PID probabilities
- //
- Double_t xr,par[5];
- AliITStrackV2* track=0;
- fLoader->LoadRecPoints();
- TTree *cTree=fLoader->TreeR();
- fTracker->LoadClusters(cTree);
Int_t ntrk=event->GetNumberOfTracks();
- Double_t momits;
- // for (Int_t i=0; i<ntrk; i++) {
+ const Int_t kns=AliPID::kSPECIES;
+ Double_t condprobfun[kns];
+
for (Int_t i=0; i<ntrk; i++) {
AliESDtrack *esdtr=event->GetTrack(i);
- if ((esdtr->GetStatus()&AliESDtrack::kITSin )==0)
+ if ((esdtr->GetStatus()&AliESDtrack::kITSin )==0){
if ((esdtr->GetStatus()&AliESDtrack::kITSout)==0) continue;
-
- track = new AliITStrackV2(*esdtr);
- Double_t dEdxsignal=track->GetdEdx();
- track->GetExternalParameters(xr,par);
- if (par[4]!=0) {
- Float_t lamb=TMath::ATan(par[3]);
- momits=1/(TMath::Abs(par[4])*TMath::Cos(lamb));
- }
- else {
- AliWarning("Null particle momentum in ITS");
- momits = 0.;
- }
- Double_t snp=track->GetSnp();
- Double_t tgl=track->GetTgl();
- const Int_t kns=AliPID::kSPECIES;
- Double_t condprobfun[kns];
- for(Int_t ii=0;ii<kns;ii++)condprobfun[ii]=0;
- Int_t cluindsdd1 = track->GetClusterIndex(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;
}
-
- AliITSRecPoint* clu3=(AliITSRecPoint*)fTracker->GetCluster(cluindssd1);
- if(clu3!=0){
- q3=clu3->GetQ();
- q3corr=q3*TMath::Sqrt((1-snp*snp)/(1+tgl*tgl));
- }
- else{
- q3=-99;
- q3corr=-99;
- }
-
- 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
- condprobfun[3]=mypid.GetProdCondFunK();//kaon
- condprobfun[4]=mypid.GetProdCondFunPro();//pro
-
+ GetITSpidSingleTrack(esdtr,condprobfun);
esdtr->SetITSpid(condprobfun);
-
- delete track;
- }
- fTracker->UnloadClusters();
- fLoader->UnloadRecPoints();
+ }
return 0;
}