1 //********************************************************************
2 // Example (very naive for the moment) of using the ESD classes
3 // It demonstrates the idea of the "combined PID".
4 // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
5 //********************************************************************
7 #if !defined( __CINT__) || defined(__MAKECINT__)
14 #include "TStopwatch.h"
15 #include "TParticle.h"
20 #include "AliRunLoader.h"
21 #include "AliLoader.h"
26 extern AliRun *gAlice;
29 Int_t AliESDcomparison(const Char_t *dir=".") {
32 TH2F *tpcHist=(TH2F*)gROOT->FindObject("tpcHist");
34 tpcHist=new TH2F("tpcHist","TPC dE/dX vs momentum",100,pi,pa,100,0.,300.);
35 tpcHist->SetXTitle("p (GeV/c)"); tpcHist->SetYTitle("dE/dx (Arb. Units)");
36 tpcHist->SetMarkerStyle(8);
37 tpcHist->SetMarkerSize(0.3);
39 const Char_t *hname[]={
40 "piG","piR","piF","piGood","piFake",
41 "kaG","kaR","kaF","kaGood","kaFake",
42 "prG","prR","prF","prGood","prFake"
44 Int_t nh=sizeof(hname)/sizeof(const Char_t *);
45 TH1F **hprt=new TH1F*[nh];
47 for (Int_t i=0; i<nh; i++) {
48 hprt[i]=(TH1F*)gROOT->FindObject(hname[i]);
49 if (hprt[i]==0) {hprt[i]=new TH1F(hname[i],"",20,pi,pa);hprt[i]->Sumw2();}
55 piGood->SetTitle("Combined PID for pions");
56 piGood->SetLineColor(4); piGood->SetXTitle("p (GeV/c)");
58 piFake->SetLineColor(2);
63 kaGood->SetTitle("Combined PID for kaons");
64 kaGood->SetLineColor(4); kaGood->SetXTitle("p (GeV/c)");
66 kaFake->SetLineColor(2);
70 TH1F *prGood=hprt[13];
71 prGood->SetTitle("Combined PID for protons");
72 prGood->SetLineColor(4); prGood->SetXTitle("p (GeV/c)");
73 TH1F *prFake=hprt[14];
74 prFake->SetLineColor(2);
81 delete gAlice->GetRunLoader();
85 sprintf(fname,"%s/galice.root",dir);
86 AliRunLoader *rl = AliRunLoader::Open(fname);
88 cerr<<"Can not open session"<<endl;
91 if (rl->LoadgAlice()) {
92 cerr<<"LoadgAlice returned error"<<endl;
96 if (rl->LoadHeader()) {
97 cerr<<"LoadHeader returned error"<<endl;
101 rl->LoadKinematics();
102 AliStack *stack = rl->Stack();
104 sprintf(fname,"%s/AliESDs.root",dir);
105 TFile *ef=TFile::Open(fname);
106 if (!ef->IsOpen()) {cerr<<"Can't AliESDs.root !\n"; return 1;}
111 TIter next(ef->GetListOfKeys());
113 //****** Tentative particle type "concentrations"
114 Double_t c[5]={0.01, 0.01, 0.85, 0.10, 0.05};
116 //******* The loop over events
117 while ((key=(TKey*)next())!=0) {
120 cerr<<"Processing event number : "<<n++<<endl;
124 AliESD *event=(AliESD*)key->ReadObj();
126 Int_t ntrk=event->GetNumberOfTracks();
127 cerr<<"Number of ESD tracks : "<<ntrk<<endl;
129 // ****** The loop over tracks
131 Int_t pisel=0,kasel=0,prsel=0,nsel=0;
134 AliESDtrack *t=event->GetTrack(ntrk);
136 UInt_t status=AliESDtrack::kESDpid;
137 status|=AliESDtrack::kITSpid;
138 status|=AliESDtrack::kTPCpid;
139 status|=AliESDtrack::kTOFpid;
141 if ((t->GetStatus()&status) == status) {
144 Double_t p=t->GetP();
145 Double_t dedx=t->GetTPCsignal();
146 tpcHist->Fill(p,dedx,1);
148 Int_t lab=TMath::Abs(t->GetLabel());
149 TParticle *part=stack->Particle(lab);
150 Int_t code=part->GetPdgCode();
152 Double_t r[10]; t->GetESDpid(r);
156 for (i=0; i<AliESDtrack::kSPECIES; i++) rcc+=(c[i]*r[i]);
157 if (rcc==0.) continue;
159 //Here we apply Bayes' formula
161 for (i=0; i<AliESDtrack::kSPECIES; i++) w[i]=c[i]*r[i]/rcc;
163 if (TMath::Abs(code)==2212) prR->Fill(p);
164 if (w[4]>w[3] && w[4]>w[2] && w[4]>w[1] && w[4]>w[0]) {//proton
167 if (TMath::Abs(code)!=2212) prF->Fill(p);
170 if (TMath::Abs(code)==321) kaR->Fill(p);
171 if (w[3]>w[4] && w[3]>w[2] && w[3]>w[1] && w[3]>w[0]) {//kaon
174 if (TMath::Abs(code)!=321) kaF->Fill(p);
177 if (TMath::Abs(code)==211) piR->Fill(p);
178 if (w[2]>w[3] && w[2]>w[4] && w[2]>w[1] && w[2]>w[0]) {//pion
181 if (TMath::Abs(code)!=211) piF->Fill(p);
188 cerr<<"Number of selected ESD tracks : "<<nsel<<endl;
189 cerr<<"Number of selected pion ESD tracks : "<<pisel<<endl;
190 cerr<<"Number of selected kaon ESD tracks : "<<kasel<<endl;
191 cerr<<"Number of selected proton ESD tracks : "<<prsel<<endl;
195 timer.Stop(); timer.Print();
197 TCanvas *c1=(TCanvas*)gROOT->FindObject("c1");
199 c1=new TCanvas("c1","",0,0,600,1200);
206 //piG->Sumw2(); piF->Sumw2(); piR->Sumw2();
207 piGood->Add(piG,piF,1,-1);
208 piGood->Divide(piGood,piR,1,1,"b");
209 piFake->Divide(piF,piG,1,1,"b");
210 piGood->Draw("hist");
211 piFake->Draw("same");
214 //kaG->Sumw2(); kaF->Sumw2(); kaR->Sumw2();
215 kaGood->Add(kaG,kaF,1,-1);
216 kaGood->Divide(kaGood,kaR,1,1,"b");
217 kaFake->Divide(kaF,kaG,1,1,"b");
218 kaGood->Draw("hist");
219 kaFake->Draw("same");
222 //prG->Sumw2(); prF->Sumw2(); prR->Sumw2();
223 prGood->Add(prG,prF,1,-1);
224 prGood->Divide(prGood,prR,1,1,"b");
225 prFake->Divide(prF,prG,1,1,"b");
226 prGood->Draw("hist");
227 prFake->Draw("same");