1 //------------------------------------------------------------------------------
\r
2 // Implementation of AliPerformanceEff class. It keeps information from
\r
3 // comparison of reconstructed and MC particle tracks. In addtion,
\r
4 // it keeps selection cuts used during comparison. The comparison
\r
5 // information is stored in the ROOT histograms. Analysis of these
\r
6 // histograms can be done by using Analyse() class function. The result of
\r
7 // the analysis (histograms/graphs) are stored in the folder which is
\r
8 // a data member of AliPerformanceEff.
\r
10 // Author: J.Otwinowski 04/02/2008
\r
11 //------------------------------------------------------------------------------
\r
15 // after running comparison task, read the file, and get component
\r
16 gROOT->LoadMacro("$ALICE_ROOT/PWG1/Macros/LoadMyLibs.C");
\r
18 TFile f("Output.root");
\r
19 AliPerformanceEff * compObj = (AliPerformanceEff*)coutput->FindObject("AliPerformanceEff");
\r
21 // Analyse comparison data
\r
24 // the output histograms/graphs will be stored in the folder "folderEff"
\r
25 compObj->GetAnalysisFolder()->ls("*");
\r
27 // user can save whole comparison object (or only folder with anlysed histograms)
\r
28 // in the seperate output file (e.g.)
\r
29 TFile fout("Analysed_Eff.root","recreate");
\r
30 compObj->Write(); // compObj->GetAnalysisFolder()->Write();
\r
39 #include "AliESDtrack.h"
\r
40 #include "AliRecInfoCuts.h"
\r
41 #include "AliMCInfoCuts.h"
\r
42 #include "AliLog.h"
\r
43 #include "AliESDVertex.h"
\r
44 #include "AliExternalTrackParam.h"
\r
45 #include "AliTracker.h"
\r
46 #include "AliESDEvent.h"
\r
47 #include "AliMCEvent.h"
\r
48 #include "AliMCParticle.h"
\r
49 #include "AliHeader.h"
\r
50 #include "AliGenEventHeader.h"
\r
51 #include "AliStack.h"
\r
52 #include "AliPerformanceEff.h"
\r
54 using namespace std;
\r
56 ClassImp(AliPerformanceEff)
\r
58 //_____________________________________________________________________________
\r
59 AliPerformanceEff::AliPerformanceEff():
\r
60 AliPerformanceObject("AliPerformanceEff"),
\r
70 // histogram folder
\r
73 // default consttructor
\r
77 //_____________________________________________________________________________
\r
78 AliPerformanceEff::AliPerformanceEff(Char_t* name="AliPerformanceEff",Char_t*title="AliPerformanceEff",Int_t analysisMode=0, Bool_t hptGenerator=kFALSE):
\r
79 AliPerformanceObject(name,title),
\r
89 // histogram folder
\r
92 // named constructor
\r
94 SetAnalysisMode(analysisMode);
\r
95 SetHptGenerator(hptGenerator);
\r
101 //_____________________________________________________________________________
\r
102 AliPerformanceEff::~AliPerformanceEff()
\r
106 if(fEffHisto) delete fEffHisto; fEffHisto=0;
\r
107 if(fEffSecHisto) delete fEffSecHisto; fEffSecHisto=0;
\r
108 if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;
\r
111 //_____________________________________________________________________________
\r
112 void AliPerformanceEff::Init()
\r
117 Int_t nPtBins = 50;
\r
118 Double_t ptMin = 1.e-2, ptMax = 10.;
\r
120 Double_t *binsPt = 0;
\r
121 if (IsHptGenerator()) {
\r
122 nPtBins = 100; ptMax = 100.;
\r
123 binsPt = CreateLogAxis(nPtBins,ptMin,ptMax);
\r
125 binsPt = CreateLogAxis(nPtBins,ptMin,ptMax);
\r
129 Int_t nPtBins = 31;
\r
130 Double_t binsPt[32] = {0.,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.7,0.8,0.9,1.0,1.2,1.4,1.6,1.8,2.0,2.25,2.5,2.75,3.,3.5,4.,5.,6.,8.,10.};
\r
131 Double_t ptMin = 0., ptMax = 10.;
\r
133 if(IsHptGenerator() == kTRUE) {
\r
135 ptMin = 0.; ptMax = 100.;
\r
139 //mceta:mcphi:mcpt:pid:recStatus:findable
\r
140 Int_t binsEffHisto[6]={30,90,nPtBins,5,2,2};
\r
141 Double_t minEffHisto[6]={-1.5,0.,ptMin,0.,0.,0.};
\r
142 Double_t maxEffHisto[6]={ 1.5,2.*TMath::Pi(), ptMax,5.,2.,2.};
\r
144 fEffHisto = new THnSparseF("fEffHisto","mceta:mcphi:mcpt:pid:recStatus:findable",6,binsEffHisto,minEffHisto,maxEffHisto);
\r
145 fEffHisto->SetBinEdges(2,binsPt);
\r
147 fEffHisto->GetAxis(0)->SetTitle("#eta_{mc}");
\r
148 fEffHisto->GetAxis(1)->SetTitle("#phi_{mc} (rad)");
\r
149 fEffHisto->GetAxis(2)->SetTitle("p_{Tmc} (GeV/c)");
\r
150 fEffHisto->GetAxis(3)->SetTitle("pid");
\r
151 fEffHisto->GetAxis(4)->SetTitle("recStatus");
\r
152 fEffHisto->GetAxis(5)->SetTitle("findable");
\r
153 fEffHisto->Sumw2();
\r
155 //mceta:mcphi:mcpt:pid:recStatus:findable:mcR:mother_phi:mother_eta
\r
156 Int_t binsEffSecHisto[9]={30,60,nPtBins,5,2,2,100,60,30};
\r
157 Double_t minEffSecHisto[9]={-1.5,0.,ptMin,0.,0.,0.,0.,0.,-1.5};
\r
158 Double_t maxEffSecHisto[9]={ 1.5,2.*TMath::Pi(), ptMax,5.,2.,2.,200,2.*TMath::Pi(),1.5};
\r
160 fEffSecHisto = new THnSparseF("fEffSecHisto","mceta:mcphi:mcpt:pid:recStatus:findable:mcR:mother_phi:mother_eta",9,binsEffSecHisto,minEffSecHisto,maxEffSecHisto);
\r
161 fEffSecHisto->SetBinEdges(2,binsPt);
\r
163 fEffSecHisto->GetAxis(0)->SetTitle("#eta_{mc}");
\r
164 fEffSecHisto->GetAxis(1)->SetTitle("#phi_{mc} (rad)");
\r
165 fEffSecHisto->GetAxis(2)->SetTitle("p_{Tmc} (GeV/c)");
\r
166 fEffSecHisto->GetAxis(3)->SetTitle("pid");
\r
167 fEffSecHisto->GetAxis(4)->SetTitle("recStatus");
\r
168 fEffSecHisto->GetAxis(5)->SetTitle("findable");
\r
169 fEffSecHisto->GetAxis(6)->SetTitle("mcR (cm)");
\r
170 fEffSecHisto->GetAxis(7)->SetTitle("mother_phi (rad)");
\r
171 fEffSecHisto->GetAxis(8)->SetTitle("mother_eta");
\r
172 fEffSecHisto->Sumw2();
\r
176 AliDebug(AliLog::kError, "ERROR: Cannot find AliMCInfoCuts object");
\r
178 AliDebug(AliLog::kError, "ERROR: Cannot find AliRecInfoCuts object");
\r
181 fAnalysisFolder = CreateFolder("folderEff","Analysis Efficiency Folder");
\r
184 //_____________________________________________________________________________
\r
185 void AliPerformanceEff::ProcessTPC(AliMCEvent* const mcEvent, AliESDEvent *const esdEvent)
\r
187 // Fill TPC only efficiency comparison information
\r
188 Int_t *labelsRec = new Int_t[esdEvent->GetNumberOfTracks()];
\r
190 AliDebug(AliLog::kError, "Cannot create labelsRec");
\r
192 Int_t *labelsAllRec = new Int_t[esdEvent->GetNumberOfTracks()];
\r
194 AliDebug(AliLog::kError, "Cannot create labelsAllRec");
\r
196 // loop over rec. tracks
\r
197 AliESDtrack *track=0;
\r
198 for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
\r
200 track = esdEvent->GetTrack(iTrack);
\r
201 if(!track) continue;
\r
202 if(track->Charge()==0) continue;
\r
203 Int_t label = TMath::Abs(track->GetLabel());
\r
204 labelsAllRec[iTrack]=label;
\r
207 if(IsRecTPC(track) != 0)
\r
208 labelsRec[iTrack]=label;
\r
212 // MC histograms for efficiency studies
\r
215 AliStack *stack = mcEvent->Stack();
\r
217 AliDebug(AliLog::kError, "Stack not available");
\r
221 //Int_t nPart = stack->GetNtrack();
\r
222 Int_t nPart = stack->GetNprimary();
\r
223 for (Int_t iMc = 0; iMc < nPart; ++iMc)
\r
225 TParticle* particle = stack->Particle(iMc);
\r
226 if (!particle) continue;
\r
227 if (particle->GetPDG()->Charge() == 0.0) continue;
\r
229 // physical primary
\r
230 Bool_t prim = stack->IsPhysicalPrimary(iMc);
\r
231 if(!prim) continue;
\r
233 Bool_t findable = kFALSE;
\r
234 for(Int_t iRec=0; iRec<esdEvent->GetNumberOfTracks(); ++iRec)
\r
237 if(iMc == labelsAllRec[iRec])
\r
239 findable = IsFindable(mcEvent,iMc);
\r
244 Bool_t recStatus = kFALSE;
\r
245 for(Int_t iRec=0; iRec<esdEvent->GetNumberOfTracks(); ++iRec)
\r
247 // check reconstructed
\r
248 if(iMc == labelsRec[iRec])
\r
255 // Only 5 charged particle species (e,mu,pi,K,p)
\r
256 if (fCutsMC->IsPdgParticle(TMath::Abs(particle->GetPdgCode())) == kFALSE) continue;
\r
258 // transform Pdg to Pid
\r
259 Int_t pid = TransformToPID(particle);
\r
261 Float_t mceta = particle->Eta();
\r
262 Float_t mcphi = particle->Phi();
\r
263 if(mcphi<0) mcphi += 2.*TMath::Pi();
\r
264 Float_t mcpt = particle->Pt();
\r
268 Double_t vEffHisto[6] = {mceta, mcphi, mcpt, pid, recStatus, findable};
\r
269 fEffHisto->Fill(vEffHisto);
\r
272 if(labelsRec) delete [] labelsRec; labelsRec = 0;
\r
273 if(labelsAllRec) delete [] labelsAllRec; labelsAllRec = 0;
\r
276 //_____________________________________________________________________________
\r
277 void AliPerformanceEff::ProcessTPCSec(AliMCEvent* const mcEvent, AliESDEvent *const esdEvent)
\r
279 // Fill TPC only efficiency comparison information for secondaries
\r
280 Int_t *labelsRec = new Int_t[esdEvent->GetNumberOfTracks()];
\r
282 AliDebug(AliLog::kError, "Cannot create labelsRec");
\r
284 Int_t *labelsAllRec = new Int_t[esdEvent->GetNumberOfTracks()];
\r
286 AliDebug(AliLog::kError, "Cannot create labelsAllRec");
\r
288 // loop over rec. tracks
\r
289 AliESDtrack *track=0;
\r
290 Int_t multAll=0, multRec=0;
\r
291 for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
\r
293 track = esdEvent->GetTrack(iTrack);
\r
294 if(!track) continue;
\r
295 if(track->Charge()==0) continue;
\r
296 Int_t label = TMath::Abs(track->GetLabel());
\r
297 labelsAllRec[multAll]=label;
\r
301 if(IsRecTPC(track) != 0) {
\r
302 labelsRec[multRec]=label;
\r
308 // MC histograms for efficiency studies
\r
311 AliStack *stack = mcEvent->Stack();
\r
313 AliDebug(AliLog::kError, "Stack not available");
\r
317 Int_t nPart = stack->GetNtrack();
\r
318 //Int_t nPart = stack->GetNprimary();
\r
319 for (Int_t iMc = 0; iMc < nPart; ++iMc)
\r
321 TParticle* particle = stack->Particle(iMc);
\r
322 if (!particle) continue;
\r
323 if (particle->GetPDG()->Charge() == 0.0) continue;
\r
325 // physical primary
\r
326 Bool_t prim = stack->IsPhysicalPrimary(iMc);
\r
328 // only secondaries which can be reconstructed at TPC
\r
331 //Float_t radius = TMath::Sqrt(particle->Vx()*particle->Vx()+particle->Vy()*particle->Vy()+particle->Vz()*particle->Vz());
\r
332 //if(radius > fCutsMC->GetMaxR()) continue;
\r
334 // only secondary electrons from gamma conversion
\r
335 //if( TMath::Abs(particle->GetPdgCode())!=fCutsMC->GetEM() || particle->GetUniqueID() != 5) continue;
\r
337 Bool_t findable = kFALSE;
\r
338 for(Int_t iRec=0; iRec<multAll; ++iRec)
\r
341 if(iMc == labelsAllRec[iRec])
\r
343 findable = IsFindable(mcEvent,iMc);
\r
348 Bool_t recStatus = kFALSE;
\r
349 for(Int_t iRec=0; iRec<multRec; ++iRec)
\r
351 // check reconstructed
\r
352 if(iMc == labelsRec[iRec])
\r
359 // Only 5 charged particle species (e,mu,pi,K,p)
\r
360 if (fCutsMC->IsPdgParticle(TMath::Abs(particle->GetPdgCode())) == kFALSE) continue;
\r
362 // transform Pdg to Pid
\r
363 Int_t pid = TransformToPID(particle);
\r
365 Float_t mceta = particle->Eta();
\r
366 Float_t mcphi = particle->Phi();
\r
367 if(mcphi<0) mcphi += 2.*TMath::Pi();
\r
368 Float_t mcpt = particle->Pt();
\r
369 Float_t mcR = particle->R();
\r
371 // get info about mother
\r
372 Int_t motherLabel = particle->GetMother(0);
\r
373 if(motherLabel < 0) continue;
\r
374 TParticle *mother = stack->Particle(motherLabel);
\r
375 if(!mother) continue;
\r
377 Float_t mother_eta = mother->Eta();
\r
378 Float_t mother_phi = mother->Phi();
\r
379 if(mother_phi<0) mother_phi += 2.*TMath::Pi();
\r
382 Double_t vEffSecHisto[9] = { mceta, mcphi, mcpt, pid, recStatus, findable, mcR, mother_phi, mother_eta };
\r
383 fEffSecHisto->Fill(vEffSecHisto);
\r
386 if(labelsRec) delete [] labelsRec; labelsRec = 0;
\r
387 if(labelsAllRec) delete [] labelsAllRec; labelsAllRec = 0;
\r
393 //_____________________________________________________________________________
\r
394 void AliPerformanceEff::ProcessTPCITS(AliMCEvent* const mcEvent, AliESDEvent *const esdEvent)
\r
396 // Fill efficiency comparison information
\r
397 Int_t *labelsRec = new Int_t[esdEvent->GetNumberOfTracks()];
\r
399 AliDebug(AliLog::kError, "Cannot create labelsRec");
\r
401 Int_t *labelsAllRec = new Int_t[esdEvent->GetNumberOfTracks()];
\r
403 AliDebug(AliLog::kError, "Cannot create labelsAllRec");
\r
405 // loop over rec. tracks
\r
406 AliESDtrack *track=0;
\r
407 for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
\r
409 track = esdEvent->GetTrack(iTrack);
\r
410 if(!track) continue;
\r
411 if(track->Charge()==0) continue;
\r
412 Int_t label = TMath::Abs(track->GetLabel());
\r
413 labelsAllRec[iTrack]=label;
\r
416 if(IsRecTPCITS(track) != 0)
\r
417 labelsRec[iTrack]=label;
\r
421 // MC histograms for efficiency studies
\r
424 AliStack *stack = mcEvent->Stack();
\r
426 AliDebug(AliLog::kError, "Stack not available");
\r
430 //Int_t nPart = stack->GetNtrack();
\r
431 Int_t nPart = stack->GetNprimary();
\r
432 for (Int_t iMc = 0; iMc < nPart; ++iMc)
\r
434 TParticle* particle = stack->Particle(iMc);
\r
435 if (!particle) continue;
\r
436 if (particle->GetPDG()->Charge() == 0.0) continue;
\r
438 // physical primary
\r
439 Bool_t prim = stack->IsPhysicalPrimary(iMc);
\r
440 if(!prim) continue;
\r
442 Bool_t findable = kFALSE;
\r
443 for(Int_t iRec=0; iRec<esdEvent->GetNumberOfTracks(); ++iRec)
\r
446 if(iMc == labelsAllRec[iRec])
\r
448 findable = IsFindable(mcEvent,iMc);
\r
453 Bool_t recStatus = kFALSE;
\r
454 for(Int_t iRec=0; iRec<esdEvent->GetNumberOfTracks(); ++iRec)
\r
456 // check reconstructed
\r
457 if(iMc == labelsRec[iRec])
\r
464 // Only 5 charged particle species (e,mu,pi,K,p)
\r
465 if (fCutsMC->IsPdgParticle(TMath::Abs(particle->GetPdgCode())) == kFALSE) continue;
\r
467 // transform Pdg to Pid
\r
468 Int_t pid = TransformToPID(particle);
\r
470 Float_t mceta = particle->Eta();
\r
471 Float_t mcphi = particle->Phi();
\r
472 if(mcphi<0) mcphi += 2.*TMath::Pi();
\r
473 Float_t mcpt = particle->Pt();
\r
476 Double_t vEffHisto[6] = { mceta, mcphi, mcpt, pid, recStatus, findable};
\r
477 fEffHisto->Fill(vEffHisto);
\r
480 if(labelsRec) delete [] labelsRec; labelsRec = 0;
\r
481 if(labelsAllRec) delete [] labelsAllRec; labelsAllRec = 0;
\r
484 //_____________________________________________________________________________
\r
485 void AliPerformanceEff::ProcessConstrained(AliMCEvent* const mcEvent, AliESDEvent *const esdEvent)
\r
487 // Process comparison information
\r
488 Int_t *labelsRec = new Int_t[esdEvent->GetNumberOfTracks()];
\r
490 AliDebug(AliLog::kError, "Cannot create labelsRec");
\r
492 Int_t *labelsAllRec = new Int_t[esdEvent->GetNumberOfTracks()];
\r
494 AliDebug(AliLog::kError, "Cannot create labelsAllRec");
\r
496 // loop over rec. tracks
\r
497 AliESDtrack *track=0;
\r
498 for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
\r
500 track = esdEvent->GetTrack(iTrack);
\r
501 if(!track) continue;
\r
502 if(track->Charge()==0) continue;
\r
503 Int_t label = TMath::Abs(track->GetLabel());
\r
504 labelsAllRec[iTrack]=label;
\r
507 if(IsRecConstrained(track) != 0)
\r
508 labelsRec[iTrack]=label;
\r
513 // MC histograms for efficiency studies
\r
516 AliStack *stack = mcEvent->Stack();
\r
518 AliDebug(AliLog::kError, "Stack not available");
\r
522 //Int_t nPart = stack->GetNtrack();
\r
523 Int_t nPart = stack->GetNprimary();
\r
524 for (Int_t iMc = 0; iMc < nPart; ++iMc)
\r
526 TParticle* particle = stack->Particle(iMc);
\r
527 if (!particle) continue;
\r
528 if (particle->GetPDG()->Charge() == 0.0) continue;
\r
530 // physical primary
\r
531 Bool_t prim = stack->IsPhysicalPrimary(iMc);
\r
532 if(!prim) continue;
\r
534 Bool_t findable = kFALSE;
\r
535 for(Int_t iRec=0; iRec<esdEvent->GetNumberOfTracks(); ++iRec)
\r
538 if(iMc == labelsAllRec[iRec])
\r
540 findable = IsFindable(mcEvent,iMc);
\r
545 Bool_t recStatus = kFALSE;
\r
546 for(Int_t iRec=0; iRec<esdEvent->GetNumberOfTracks(); ++iRec)
\r
548 // check reconstructed
\r
549 if(iMc == labelsRec[iRec])
\r
556 // Only 5 charged particle species (e,mu,pi,K,p)
\r
557 if (fCutsMC->IsPdgParticle(TMath::Abs(particle->GetPdgCode())) == kFALSE) continue;
\r
559 // transform Pdg to Pid
\r
560 Int_t pid = TransformToPID(particle);
\r
562 Float_t mceta = particle->Eta();
\r
563 Float_t mcphi = particle->Phi();
\r
564 if(mcphi<0) mcphi += 2.*TMath::Pi();
\r
565 Float_t mcpt = particle->Pt();
\r
568 Double_t vEffHisto[6] = { mceta, mcphi, mcpt, pid, recStatus, findable};
\r
569 fEffHisto->Fill(vEffHisto);
\r
572 if(labelsRec) delete [] labelsRec; labelsRec = 0;
\r
573 if(labelsAllRec) delete [] labelsAllRec; labelsAllRec = 0;
\r
576 //_____________________________________________________________________________
\r
577 void AliPerformanceEff::Exec(AliMCEvent* const mcEvent, AliESDEvent *const esdEvent, AliESDfriend *const esdFriend, const Bool_t bUseMC, const Bool_t bUseESDfriend)
\r
579 // Process comparison information
\r
583 AliDebug(AliLog::kError, "esdEvent not available");
\r
586 AliHeader* header = 0;
\r
587 AliGenEventHeader* genHeader = 0;
\r
588 AliStack* stack = 0;
\r
594 AliDebug(AliLog::kError, "mcEvent not available");
\r
597 // get MC event header
\r
598 header = mcEvent->Header();
\r
600 AliDebug(AliLog::kError, "Header not available");
\r
603 // MC particle stack
\r
604 stack = mcEvent->Stack();
\r
606 AliDebug(AliLog::kError, "Stack not available");
\r
610 genHeader = header->GenEventHeader();
\r
612 AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
\r
615 genHeader->PrimaryVertex(vtxMC);
\r
620 if(bUseESDfriend) {
\r
622 AliDebug(AliLog::kError, "esdFriend not available");
\r
630 if(GetAnalysisMode() == 0) ProcessTPC(mcEvent,esdEvent);
\r
631 else if(GetAnalysisMode() == 1) ProcessTPCITS(mcEvent,esdEvent);
\r
632 else if(GetAnalysisMode() == 2) ProcessConstrained(mcEvent,esdEvent);
\r
633 else if(GetAnalysisMode() == 5) ProcessTPCSec(mcEvent,esdEvent);
\r
635 printf("ERROR: AnalysisMode %d \n",fAnalysisMode);
\r
640 //_____________________________________________________________________________
\r
641 Int_t AliPerformanceEff::TransformToPID(TParticle *particle)
\r
643 // transform Pdg to Pid
\r
644 // Pdg convension is different for hadrons and leptons
\r
645 // (e.g. K+/K- = 321/-321; e+/e- = -11/11 )
\r
648 if( TMath::Abs(particle->GetPdgCode())==fCutsMC->GetEM() ) pid = 0;
\r
649 if( TMath::Abs(particle->GetPdgCode())==fCutsMC->GetMuM() ) pid = 1;
\r
650 if( TMath::Abs(particle->GetPdgCode())==fCutsMC->GetPiP() ) pid = 2;
\r
651 if( TMath::Abs(particle->GetPdgCode())==fCutsMC->GetKP() ) pid = 3;
\r
652 if( TMath::Abs(particle->GetPdgCode())==fCutsMC->GetProt() ) pid = 4;
\r
657 //_____________________________________________________________________________
\r
658 Bool_t AliPerformanceEff::IsFindable(AliMCEvent *mcEvent, Int_t label)
\r
660 if(!mcEvent) return kFALSE;
\r
662 AliMCParticle *mcParticle = mcEvent->GetTrack(label);
\r
663 if(!mcParticle) return kFALSE;
\r
666 Float_t tpcTrackLength = mcParticle->GetTPCTrackLength(AliTracker::GetBz(),0.05,counter,3.0);
\r
667 //printf("tpcTrackLength %f \n", tpcTrackLength);
\r
669 return (tpcTrackLength>fCutsMC->GetMinTrackLength());
\r
672 //_____________________________________________________________________________
\r
673 Bool_t AliPerformanceEff::IsRecTPC(AliESDtrack *esdTrack)
\r
675 if(!esdTrack) return kFALSE;
\r
677 const AliExternalTrackParam *track = esdTrack->GetTPCInnerParam();
\r
678 if(!track) return kFALSE;
\r
680 Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
\r
681 esdTrack->GetImpactParametersTPC(dca,cov);
\r
683 Bool_t recStatus = kFALSE;
\r
684 if(esdTrack->GetTPCNcls()>fCutsRC->GetMinNClustersTPC()) recStatus = kTRUE;
\r
687 if( TMath::Abs(dca[0])<fCutsRC->GetMaxDCAToVertexXY() &&
\r
688 TMath::Abs(dca[1])<fCutsRC->GetMaxDCAToVertexZ())
\r
697 //_____________________________________________________________________________
\r
698 Bool_t AliPerformanceEff::IsRecTPCITS(AliESDtrack *esdTrack)
\r
700 if(!esdTrack) return kFALSE;
\r
702 Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
\r
703 esdTrack->GetImpactParameters(dca,cov);
\r
705 Bool_t recStatus = kFALSE;
\r
707 if ((esdTrack->GetStatus()&AliESDtrack::kTPCrefit)==0) return kFALSE; // TPC refit
\r
708 if (esdTrack->GetTPCNcls()<fCutsRC->GetMinNClustersTPC()) return kFALSE; // min. nb. TPC clusters
\r
709 //if ((esdTrack->GetStatus()&AliESDtrack::kITSrefit)==0) return kFALSE; // ITS refit
\r
710 //Int_t clusterITS[200];
\r
711 //if(esdTrack->GetITSclusters(clusterITS)<fCutsRC->GetMinNClustersITS()) return kFALSE; // min. nb. ITS clusters
\r
715 if(TMath::Abs(dca[0])<fCutsRC->GetMaxDCAToVertexXY() &&
\r
716 TMath::Abs(dca[1])<fCutsRC->GetMaxDCAToVertexZ())
\r
725 //_____________________________________________________________________________
\r
726 Bool_t AliPerformanceEff::IsRecConstrained(AliESDtrack *esdTrack)
\r
728 if(!esdTrack) return kFALSE;
\r
730 const AliExternalTrackParam * track = esdTrack->GetConstrainedParam();
\r
731 if(!track) return kFALSE;
\r
733 Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
\r
734 esdTrack->GetImpactParameters(dca,cov);
\r
735 //Int_t label = TMath::Abs(esdTrack->GetLabel());
\r
737 Bool_t recStatus = kFALSE;
\r
739 if ((esdTrack->GetStatus()&AliESDtrack::kTPCrefit)==0) return kFALSE; // TPC refit
\r
740 if (esdTrack->GetTPCNcls()<fCutsRC->GetMinNClustersTPC()) return kFALSE; // min. nb. TPC clusters
\r
741 Int_t clusterITS[200];
\r
742 if(esdTrack->GetITSclusters(clusterITS)<fCutsRC->GetMinNClustersITS()) return kFALSE; // min. nb. ITS clusters
\r
747 if(TMath::Abs(dca[0])<fCutsRC->GetMaxDCAToVertexXY() &&
\r
748 TMath::Abs(dca[1])<fCutsRC->GetMaxDCAToVertexZ())
\r
757 //_____________________________________________________________________________
\r
758 Long64_t AliPerformanceEff::Merge(TCollection* const list)
\r
760 // Merge list of objects (needed by PROOF)
\r
765 if (list->IsEmpty())
\r
768 TIterator* iter = list->MakeIterator();
\r
771 // collection of generated histograms
\r
774 while((obj = iter->Next()) != 0)
\r
776 AliPerformanceEff* entry = dynamic_cast<AliPerformanceEff*>(obj);
\r
777 if (entry == 0) continue;
\r
779 fEffHisto->Add(entry->fEffHisto);
\r
780 fEffSecHisto->Add(entry->fEffSecHisto);
\r
787 //_____________________________________________________________________________
\r
788 void AliPerformanceEff::Analyse()
\r
790 // Analyse comparison information and store output histograms
\r
791 // in the folder "folderEff"
\r
793 TH1::AddDirectory(kFALSE);
\r
794 TObjArray *aFolderObj = new TObjArray;
\r
798 // efficiency vs pt
\r
801 if(GetAnalysisMode() != 5) {
\r
803 fEffHisto->GetAxis(0)->SetRangeUser(-0.9,0.9); // eta range
\r
804 fEffHisto->GetAxis(2)->SetRangeUser(0.1,10.); // pt range
\r
806 // rec efficiency vs pt
\r
807 TH1D *ptAll = fEffHisto->Projection(2);
\r
809 fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
810 TH1D *ptRec = fEffHisto->Projection(2);
\r
811 TH1D *ptRec_c = (TH1D*)ptRec->Clone();
\r
812 ptRec_c->Divide(ptRec,ptAll,1,1,"B");
\r
813 ptRec_c->SetName("ptRecEff");
\r
815 ptRec_c->GetXaxis()->SetTitle(fEffHisto->GetAxis(2)->GetTitle());
\r
816 ptRec_c->GetYaxis()->SetTitle("efficiency");
\r
817 sprintf(title,"%s vs %s","rec. efficiency",fEffHisto->GetAxis(2)->GetTitle());
\r
818 ptRec_c->SetTitle(title);
\r
820 ptRec_c->SetBit(TH1::kLogX);
\r
821 aFolderObj->Add(ptRec_c);
\r
823 // rec efficiency vs pid vs pt
\r
825 fEffHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
826 fEffHisto->GetAxis(3)->SetRangeUser(2.,2.); // pions
\r
828 TH1D *ptAllPi = fEffHisto->Projection(2);
\r
830 fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
831 TH1D *ptRecPi = fEffHisto->Projection(2);
\r
832 TH1D *ptRecPi_c = (TH1D*)ptRecPi->Clone();
\r
833 ptRecPi_c->Divide(ptRecPi,ptAllPi,1,1,"B");
\r
834 ptRecPi_c->SetName("ptRecEffPi");
\r
836 ptRecPi_c->GetXaxis()->SetTitle(fEffHisto->GetAxis(2)->GetTitle());
\r
837 ptRecPi_c->GetYaxis()->SetTitle("efficiency");
\r
838 sprintf(title,"%s vs %s","rec. efficiency (pions)",fEffHisto->GetAxis(2)->GetTitle());
\r
839 ptRecPi_c->SetTitle(title);
\r
841 ptRecPi_c->SetBit(TH1::kLogX);
\r
842 aFolderObj->Add(ptRecPi_c);
\r
844 fEffHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
845 fEffHisto->GetAxis(3)->SetRangeUser(3.,3.); // kaons
\r
846 TH1D *ptAllK = fEffHisto->Projection(2);
\r
848 fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
849 TH1D *ptRecK = fEffHisto->Projection(2);
\r
851 TH1D *ptRecK_c = (TH1D*)ptRecK->Clone();
\r
852 ptRecK_c->Divide(ptRecK,ptAllK,1,1,"B");
\r
853 ptRecK_c->SetName("ptRecEffK");
\r
855 ptRecK_c->GetXaxis()->SetTitle(fEffHisto->GetAxis(2)->GetTitle());
\r
856 ptRecK_c->GetYaxis()->SetTitle("efficiency");
\r
857 sprintf(title,"%s vs %s","rec. efficiency (kaons)",fEffHisto->GetAxis(2)->GetTitle());
\r
858 ptRecK_c->SetTitle(title);
\r
861 ptRecK_c->SetBit(TH1::kLogX);
\r
862 aFolderObj->Add(ptRecK_c);
\r
864 fEffHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
865 fEffHisto->GetAxis(3)->SetRangeUser(4.,4.); // protons
\r
866 TH1D *ptAllP = fEffHisto->Projection(2);
\r
868 fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
869 TH1D *ptRecP = fEffHisto->Projection(2);
\r
870 TH1D *ptRecP_c = (TH1D*)ptRecP->Clone();
\r
871 ptRecP_c->Divide(ptRecP,ptAllP,1,1,"B");
\r
872 ptRecP_c->SetName("ptRecEffP");
\r
874 ptRecP_c->GetXaxis()->SetTitle(fEffHisto->GetAxis(2)->GetTitle());
\r
875 ptRecP_c->GetYaxis()->SetTitle("efficiency");
\r
876 sprintf(title,"%s vs %s","rec. efficiency (protons)",fEffHisto->GetAxis(2)->GetTitle());
\r
877 ptRecP_c->SetTitle(title);
\r
879 ptRecP_c->SetBit(TH1::kLogX);
\r
880 aFolderObj->Add(ptRecP_c);
\r
882 // findable efficiency vs pt
\r
884 fEffHisto->GetAxis(3)->SetRangeUser(0.,4.);
\r
885 fEffHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
886 fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // findable
\r
887 TH1D *ptAllF = fEffHisto->Projection(2);
\r
889 fEffHisto->GetAxis(4)->SetRangeUser(1.,1.);
\r
890 fEffHisto->GetAxis(5)->SetRangeUser(1.,1.);
\r
892 TH1D *ptRecF = fEffHisto->Projection(2); // rec findable
\r
893 TH1D *ptRecF_c = (TH1D*)ptRecF->Clone();
\r
894 ptRecF_c->Divide(ptRecF,ptAllF,1,1,"B");
\r
895 ptRecF_c->SetName("ptRecEffF");
\r
897 ptRecF_c->GetXaxis()->SetTitle(fEffHisto->GetAxis(2)->GetTitle());
\r
898 ptRecF_c->GetYaxis()->SetTitle("efficiency");
\r
899 sprintf(title,"%s vs %s","rec. efficiency (findable)",fEffHisto->GetAxis(2)->GetTitle());
\r
900 ptRecF_c->SetTitle(title);
\r
902 ptRecF_c->SetBit(TH1::kLogX);
\r
903 aFolderObj->Add(ptRecF_c);
\r
906 // efficiency vs eta
\r
909 fEffHisto->GetAxis(0)->SetRangeUser(-1.5,1.5); // eta range
\r
910 fEffHisto->GetAxis(2)->SetRangeUser(0.2,10.); // pt range
\r
911 fEffHisto->GetAxis(4)->SetRangeUser(0.,1.); // all
\r
912 fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); // all
\r
914 TH1D *etaAll = fEffHisto->Projection(0);
\r
916 fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
917 TH1D *etaRec = fEffHisto->Projection(0);
\r
918 TH1D *etaRec_c = (TH1D*)etaRec->Clone();
\r
919 etaRec_c->Divide(etaRec,etaAll,1,1,"B");
\r
920 etaRec_c->SetName("etaRecEff");
\r
922 etaRec_c->GetXaxis()->SetTitle(fEffHisto->GetAxis(0)->GetTitle());
\r
923 etaRec_c->GetYaxis()->SetTitle("efficiency");
\r
924 sprintf(title,"%s vs %s","rec. efficiency",fEffHisto->GetAxis(0)->GetTitle());
\r
925 etaRec_c->SetTitle(title);
\r
927 aFolderObj->Add(etaRec_c);
\r
929 // rec efficiency vs pid vs eta
\r
930 fEffHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
931 fEffHisto->GetAxis(3)->SetRangeUser(2.,2.); // pions
\r
933 TH1D *etaAllPi = fEffHisto->Projection(0);
\r
935 fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
936 TH1D *etaRecPi = fEffHisto->Projection(0);
\r
937 TH1D *etaRecPi_c = (TH1D*)etaRecPi->Clone();
\r
938 etaRecPi_c->Divide(etaRecPi,etaAllPi,1,1,"B");
\r
939 etaRecPi_c->SetName("etaRecEffPi");
\r
941 etaRecPi_c->GetXaxis()->SetTitle(fEffHisto->GetAxis(0)->GetTitle());
\r
942 etaRecPi_c->GetYaxis()->SetTitle("efficiency");
\r
943 sprintf(title,"%s vs %s","rec. efficiency (pions)",fEffHisto->GetAxis(0)->GetTitle());
\r
944 etaRecPi_c->SetTitle(title);
\r
946 aFolderObj->Add(etaRecPi_c);
\r
948 fEffHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
949 fEffHisto->GetAxis(3)->SetRangeUser(3.,3.); // kaons
\r
950 TH1D *etaAllK = fEffHisto->Projection(0);
\r
952 fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
953 TH1D *etaRecK = fEffHisto->Projection(0);
\r
955 TH1D *etaRecK_c = (TH1D*)etaRecK->Clone();
\r
956 etaRecK_c->Divide(etaRecK,etaAllK,1,1,"B");
\r
957 etaRecK_c->SetName("etaRecEffK");
\r
959 etaRecK_c->GetXaxis()->SetTitle(fEffHisto->GetAxis(0)->GetTitle());
\r
960 etaRecK_c->GetYaxis()->SetTitle("efficiency");
\r
961 sprintf(title,"%s vs %s","rec. efficiency (kaons)",fEffHisto->GetAxis(0)->GetTitle());
\r
962 etaRecK_c->SetTitle(title);
\r
965 aFolderObj->Add(etaRecK_c);
\r
967 fEffHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
968 fEffHisto->GetAxis(3)->SetRangeUser(4.,4.); // protons
\r
969 TH1D *etaAllP = fEffHisto->Projection(0);
\r
971 fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
972 TH1D *etaRecP = fEffHisto->Projection(0);
\r
973 TH1D *etaRecP_c = (TH1D*)etaRecP->Clone();
\r
974 etaRecP_c->Divide(etaRecP,etaAllP,1,1,"B");
\r
975 etaRecP_c->SetName("etaRecEffP");
\r
977 etaRecP_c->GetXaxis()->SetTitle(fEffHisto->GetAxis(0)->GetTitle());
\r
978 etaRecP_c->GetYaxis()->SetTitle("efficiency");
\r
979 sprintf(title,"%s vs %s","rec. efficiency (protons)",fEffHisto->GetAxis(0)->GetTitle());
\r
980 etaRecP_c->SetTitle(title);
\r
982 aFolderObj->Add(etaRecP_c);
\r
984 // findable efficiency vs eta
\r
986 fEffHisto->GetAxis(3)->SetRangeUser(0.,4.);
\r
987 fEffHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
988 fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // findable
\r
989 TH1D *etaAllF = fEffHisto->Projection(0);
\r
991 fEffHisto->GetAxis(4)->SetRangeUser(1.,1.);
\r
992 fEffHisto->GetAxis(5)->SetRangeUser(1.,1.);
\r
994 TH1D *etaRecF = fEffHisto->Projection(0); // rec findable
\r
995 TH1D *etaRecF_c = (TH1D*)etaRecF->Clone();
\r
996 etaRecF_c->Divide(etaRecF,etaAllF,1,1,"B");
\r
997 etaRecF_c->SetName("etaRecEffF");
\r
999 etaRecF_c->GetXaxis()->SetTitle(fEffHisto->GetAxis(0)->GetTitle());
\r
1000 etaRecF_c->GetYaxis()->SetTitle("efficiency");
\r
1001 sprintf(title,"%s vs %s","rec. efficiency (findable)",fEffHisto->GetAxis(0)->GetTitle());
\r
1002 etaRecF_c->SetTitle(title);
\r
1004 aFolderObj->Add(etaRecF_c);
\r
1007 // efficiency vs phi
\r
1010 fEffHisto->GetAxis(0)->SetRangeUser(-0.9,0.9); // eta range
\r
1011 fEffHisto->GetAxis(2)->SetRangeUser(0.2,10.); // pt range
\r
1012 fEffHisto->GetAxis(4)->SetRangeUser(0.,1.); // all
\r
1013 fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); // all
\r
1015 TH1D *phiAll = fEffHisto->Projection(1);
\r
1017 fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1018 TH1D *phiRec = fEffHisto->Projection(1);
\r
1019 TH1D *phiRec_c = (TH1D*)phiRec->Clone();
\r
1020 phiRec_c->Divide(phiRec,phiAll,1,1,"B");
\r
1021 phiRec_c->SetName("phiRecEff");
\r
1023 phiRec_c->GetXaxis()->SetTitle(fEffHisto->GetAxis(1)->GetTitle());
\r
1024 phiRec_c->GetYaxis()->SetTitle("efficiency");
\r
1025 sprintf(title,"%s vs %s","rec. efficiency",fEffHisto->GetAxis(1)->GetTitle());
\r
1026 phiRec_c->SetTitle(title);
\r
1028 aFolderObj->Add(phiRec_c);
\r
1030 // rec efficiency vs pid vs phi
\r
1031 fEffHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1032 fEffHisto->GetAxis(3)->SetRangeUser(2.,2.); // pions
\r
1034 TH1D *phiAllPi = fEffHisto->Projection(1);
\r
1036 fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1037 TH1D *phiRecPi = fEffHisto->Projection(1);
\r
1038 TH1D *phiRecPi_c = (TH1D*)phiRecPi->Clone();
\r
1039 phiRecPi_c->Divide(phiRecPi,phiAllPi,1,1,"B");
\r
1040 phiRecPi_c->SetName("phiRecEffPi");
\r
1042 phiRecPi_c->GetXaxis()->SetTitle(fEffHisto->GetAxis(1)->GetTitle());
\r
1043 phiRecPi_c->GetYaxis()->SetTitle("efficiency");
\r
1044 sprintf(title,"%s vs %s","rec. efficiency (pions)",fEffHisto->GetAxis(1)->GetTitle());
\r
1045 phiRecPi_c->SetTitle(title);
\r
1047 aFolderObj->Add(phiRecPi_c);
\r
1049 fEffHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1050 fEffHisto->GetAxis(3)->SetRangeUser(3.,3.); // kaons
\r
1051 TH1D *phiAllK = fEffHisto->Projection(1);
\r
1053 fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1054 TH1D *phiRecK = fEffHisto->Projection(1);
\r
1056 TH1D *phiRecK_c = (TH1D*)phiRecK->Clone();
\r
1057 phiRecK_c->Divide(phiRecK,phiAllK,1,1,"B");
\r
1058 phiRecK_c->SetName("phiRecEffK");
\r
1060 phiRecK_c->GetXaxis()->SetTitle(fEffHisto->GetAxis(1)->GetTitle());
\r
1061 phiRecK_c->GetYaxis()->SetTitle("efficiency");
\r
1062 sprintf(title,"%s vs %s","rec. efficiency (kaons)",fEffHisto->GetAxis(1)->GetTitle());
\r
1063 phiRecK_c->SetTitle(title);
\r
1066 aFolderObj->Add(phiRecK_c);
\r
1068 fEffHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1069 fEffHisto->GetAxis(3)->SetRangeUser(4.,4.); // protons
\r
1070 TH1D *phiAllP = fEffHisto->Projection(1);
\r
1072 fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1073 TH1D *phiRecP = fEffHisto->Projection(1);
\r
1074 TH1D *phiRecP_c = (TH1D*)phiRecP->Clone();
\r
1075 phiRecP_c->Divide(phiRecP,phiAllP,1,1,"B");
\r
1076 phiRecP_c->SetName("phiRecEffP");
\r
1078 phiRecP_c->GetXaxis()->SetTitle(fEffHisto->GetAxis(1)->GetTitle());
\r
1079 phiRecP_c->GetYaxis()->SetTitle("efficiency");
\r
1080 sprintf(title,"%s vs %s","rec. efficiency (protons)",fEffHisto->GetAxis(1)->GetTitle());
\r
1081 phiRecP_c->SetTitle(title);
\r
1083 aFolderObj->Add(phiRecP_c);
\r
1085 // findable efficiency vs phi
\r
1087 fEffHisto->GetAxis(3)->SetRangeUser(0.,4.);
\r
1088 fEffHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1089 fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // findable
\r
1090 TH1D *phiAllF = fEffHisto->Projection(1);
\r
1092 fEffHisto->GetAxis(4)->SetRangeUser(1.,1.);
\r
1093 fEffHisto->GetAxis(5)->SetRangeUser(1.,1.);
\r
1095 TH1D *phiRecF = fEffHisto->Projection(1); // rec findable
\r
1096 TH1D *phiRecF_c = (TH1D*)phiRecF->Clone();
\r
1097 phiRecF_c->Divide(phiRecF,phiAllF,1,1,"B");
\r
1098 phiRecF_c->SetName("phiRecEffF");
\r
1100 phiRecF_c->GetXaxis()->SetTitle(fEffHisto->GetAxis(1)->GetTitle());
\r
1101 phiRecF_c->GetYaxis()->SetTitle("efficiency");
\r
1102 sprintf(title,"%s vs %s","rec. efficiency (findable)",fEffHisto->GetAxis(1)->GetTitle());
\r
1103 phiRecF_c->SetTitle(title);
\r
1105 aFolderObj->Add(phiRecF_c);
\r
1109 Float_t minEta=-1.5, maxEta=1.5;
\r
1110 Float_t minR=0.0, maxR=150.0;
\r
1111 Float_t minPt=0.15, maxPt=100.0;
\r
1113 // mother eta range
\r
1114 fEffSecHisto->GetAxis(8)->SetRangeUser(minEta,maxEta);
\r
1116 // particle creation radius range
\r
1117 fEffSecHisto->GetAxis(6)->SetRangeUser(minR,maxR);
\r
1120 fEffSecHisto->GetAxis(0)->SetRangeUser(minEta,maxEta);
\r
1121 fEffSecHisto->GetAxis(2)->SetRangeUser(minPt,maxPt);
\r
1123 // rec efficiency vs pt
\r
1124 TH1D *ptAll = fEffSecHisto->Projection(2);
\r
1126 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1127 TH1D *ptRec = fEffSecHisto->Projection(2);
\r
1128 TH1D *ptRec_c = (TH1D*)ptRec->Clone();
\r
1129 ptRec_c->Divide(ptRec,ptAll,1,1,"B");
\r
1130 ptRec_c->SetName("ptRecEff");
\r
1132 ptRec_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(2)->GetTitle());
\r
1133 ptRec_c->GetYaxis()->SetTitle("efficiency");
\r
1134 sprintf(title,"%s vs %s","rec. efficiency",fEffSecHisto->GetAxis(2)->GetTitle());
\r
1135 ptRec_c->SetTitle(title);
\r
1137 ptRec_c->SetBit(TH1::kLogX);
\r
1138 aFolderObj->Add(ptRec_c);
\r
1140 // rec efficiency vs pid vs pt
\r
1142 fEffSecHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1143 fEffSecHisto->GetAxis(3)->SetRangeUser(0.,0.); // electrons
\r
1145 TH1D *ptAllEle = fEffSecHisto->Projection(2);
\r
1147 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1148 TH1D *ptRecEle = fEffSecHisto->Projection(2);
\r
1149 TH1D *ptRecEle_c = (TH1D*)ptRecEle->Clone();
\r
1150 ptRecEle_c->Divide(ptRecEle,ptAllEle,1,1,"B");
\r
1151 ptRecEle_c->SetName("ptRecEffEle");
\r
1153 ptRecEle_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(2)->GetTitle());
\r
1154 ptRecEle_c->GetYaxis()->SetTitle("efficiency");
\r
1155 sprintf(title,"%s vs %s","rec. efficiency (electrons)",fEffSecHisto->GetAxis(2)->GetTitle());
\r
1156 ptRecEle_c->SetTitle(title);
\r
1158 ptRecEle_c->SetBit(TH1::kLogX);
\r
1159 aFolderObj->Add(ptRecEle_c);
\r
1163 fEffSecHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1164 fEffSecHisto->GetAxis(3)->SetRangeUser(2.,2.); // pions
\r
1166 TH1D *ptAllPi = fEffSecHisto->Projection(2);
\r
1168 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1169 TH1D *ptRecPi = fEffSecHisto->Projection(2);
\r
1170 TH1D *ptRecPi_c = (TH1D*)ptRecPi->Clone();
\r
1171 ptRecPi_c->Divide(ptRecPi,ptAllPi,1,1,"B");
\r
1172 ptRecPi_c->SetName("ptRecEffPi");
\r
1174 ptRecPi_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(2)->GetTitle());
\r
1175 ptRecPi_c->GetYaxis()->SetTitle("efficiency");
\r
1176 sprintf(title,"%s vs %s","rec. efficiency (pions)",fEffSecHisto->GetAxis(2)->GetTitle());
\r
1177 ptRecPi_c->SetTitle(title);
\r
1179 ptRecPi_c->SetBit(TH1::kLogX);
\r
1180 aFolderObj->Add(ptRecPi_c);
\r
1182 fEffSecHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1183 fEffSecHisto->GetAxis(3)->SetRangeUser(3.,3.); // kaons
\r
1184 TH1D *ptAllK = fEffSecHisto->Projection(2);
\r
1186 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1187 TH1D *ptRecK = fEffSecHisto->Projection(2);
\r
1189 TH1D *ptRecK_c = (TH1D*)ptRecK->Clone();
\r
1190 ptRecK_c->Divide(ptRecK,ptAllK,1,1,"B");
\r
1191 ptRecK_c->SetName("ptRecEffK");
\r
1193 ptRecK_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(2)->GetTitle());
\r
1194 ptRecK_c->GetYaxis()->SetTitle("efficiency");
\r
1195 sprintf(title,"%s vs %s","rec. efficiency (kaons)",fEffSecHisto->GetAxis(2)->GetTitle());
\r
1196 ptRecK_c->SetTitle(title);
\r
1199 ptRecK_c->SetBit(TH1::kLogX);
\r
1200 aFolderObj->Add(ptRecK_c);
\r
1202 fEffSecHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1203 fEffSecHisto->GetAxis(3)->SetRangeUser(4.,4.); // protons
\r
1204 TH1D *ptAllP = fEffSecHisto->Projection(2);
\r
1206 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1207 TH1D *ptRecP = fEffSecHisto->Projection(2);
\r
1208 TH1D *ptRecP_c = (TH1D*)ptRecP->Clone();
\r
1209 ptRecP_c->Divide(ptRecP,ptAllP,1,1,"B");
\r
1210 ptRecP_c->SetName("ptRecEffP");
\r
1212 ptRecP_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(2)->GetTitle());
\r
1213 ptRecP_c->GetYaxis()->SetTitle("efficiency");
\r
1214 sprintf(title,"%s vs %s","rec. efficiency (protons)",fEffSecHisto->GetAxis(2)->GetTitle());
\r
1215 ptRecP_c->SetTitle(title);
\r
1217 ptRecP_c->SetBit(TH1::kLogX);
\r
1218 aFolderObj->Add(ptRecP_c);
\r
1220 // findable efficiency vs pt
\r
1222 fEffSecHisto->GetAxis(3)->SetRangeUser(0.,4.);
\r
1223 fEffSecHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1224 fEffSecHisto->GetAxis(5)->SetRangeUser(1.,1.); // findable
\r
1225 TH1D *ptAllF = fEffSecHisto->Projection(2);
\r
1227 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.);
\r
1228 fEffSecHisto->GetAxis(5)->SetRangeUser(1.,1.);
\r
1230 TH1D *ptRecF = fEffSecHisto->Projection(2); // rec findable
\r
1231 TH1D *ptRecF_c = (TH1D*)ptRecF->Clone();
\r
1232 ptRecF_c->Divide(ptRecF,ptAllF,1,1,"B");
\r
1233 ptRecF_c->SetName("ptRecEffF");
\r
1235 ptRecF_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(2)->GetTitle());
\r
1236 ptRecF_c->GetYaxis()->SetTitle("efficiency");
\r
1237 sprintf(title,"%s vs %s","rec. efficiency (findable)",fEffSecHisto->GetAxis(2)->GetTitle());
\r
1238 ptRecF_c->SetTitle(title);
\r
1240 ptRecF_c->SetBit(TH1::kLogX);
\r
1241 aFolderObj->Add(ptRecF_c);
\r
1244 // efficiency vs eta
\r
1246 fEffSecHisto->GetAxis(2)->SetRangeUser(minPt,maxPt);
\r
1247 fEffSecHisto->GetAxis(4)->SetRangeUser(0.,1.); // all
\r
1248 fEffSecHisto->GetAxis(5)->SetRangeUser(0.,1.); // all
\r
1250 TH1D *etaAll = fEffSecHisto->Projection(0);
\r
1252 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1253 TH1D *etaRec = fEffSecHisto->Projection(0);
\r
1254 TH1D *etaRec_c = (TH1D*)etaRec->Clone();
\r
1255 etaRec_c->Divide(etaRec,etaAll,1,1,"B");
\r
1256 etaRec_c->SetName("etaRecEff");
\r
1258 etaRec_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(0)->GetTitle());
\r
1259 etaRec_c->GetYaxis()->SetTitle("efficiency");
\r
1260 sprintf(title,"%s vs %s","rec. efficiency",fEffSecHisto->GetAxis(0)->GetTitle());
\r
1261 etaRec_c->SetTitle(title);
\r
1263 aFolderObj->Add(etaRec_c);
\r
1265 // rec efficiency vs pid vs eta
\r
1266 fEffSecHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1267 fEffSecHisto->GetAxis(3)->SetRangeUser(0.,0.); // electrons
\r
1269 TH1D *etaAllEle = fEffSecHisto->Projection(0);
\r
1271 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1272 TH1D *etaRecEle = fEffSecHisto->Projection(0);
\r
1273 TH1D *etaRecEle_c = (TH1D*)etaRecEle->Clone();
\r
1274 etaRecEle_c->Divide(etaRecEle,etaAllEle,1,1,"B");
\r
1275 etaRecEle_c->SetName("etaRecEffEle");
\r
1277 etaRecEle_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(0)->GetTitle());
\r
1278 etaRecEle_c->GetYaxis()->SetTitle("efficiency");
\r
1279 sprintf(title,"%s vs %s","rec. efficiency (electrons)",fEffSecHisto->GetAxis(0)->GetTitle());
\r
1280 etaRecEle_c->SetTitle(title);
\r
1282 aFolderObj->Add(etaRecEle_c);
\r
1285 fEffSecHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1286 fEffSecHisto->GetAxis(3)->SetRangeUser(2.,2.); // pions
\r
1288 TH1D *etaAllPi = fEffSecHisto->Projection(0);
\r
1290 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1291 TH1D *etaRecPi = fEffSecHisto->Projection(0);
\r
1292 TH1D *etaRecPi_c = (TH1D*)etaRecPi->Clone();
\r
1293 etaRecPi_c->Divide(etaRecPi,etaAllPi,1,1,"B");
\r
1294 etaRecPi_c->SetName("etaRecEffPi");
\r
1296 etaRecPi_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(0)->GetTitle());
\r
1297 etaRecPi_c->GetYaxis()->SetTitle("efficiency");
\r
1298 sprintf(title,"%s vs %s","rec. efficiency (pions)",fEffSecHisto->GetAxis(0)->GetTitle());
\r
1299 etaRecPi_c->SetTitle(title);
\r
1301 aFolderObj->Add(etaRecPi_c);
\r
1303 fEffSecHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1304 fEffSecHisto->GetAxis(3)->SetRangeUser(3.,3.); // kaons
\r
1305 TH1D *etaAllK = fEffSecHisto->Projection(0);
\r
1307 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1308 TH1D *etaRecK = fEffSecHisto->Projection(0);
\r
1310 TH1D *etaRecK_c = (TH1D*)etaRecK->Clone();
\r
1311 etaRecK_c->Divide(etaRecK,etaAllK,1,1,"B");
\r
1312 etaRecK_c->SetName("etaRecEffK");
\r
1314 etaRecK_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(0)->GetTitle());
\r
1315 etaRecK_c->GetYaxis()->SetTitle("efficiency");
\r
1316 sprintf(title,"%s vs %s","rec. efficiency (kaons)",fEffSecHisto->GetAxis(0)->GetTitle());
\r
1317 etaRecK_c->SetTitle(title);
\r
1320 aFolderObj->Add(etaRecK_c);
\r
1322 fEffSecHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1323 fEffSecHisto->GetAxis(3)->SetRangeUser(4.,4.); // protons
\r
1324 TH1D *etaAllP = fEffSecHisto->Projection(0);
\r
1326 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1327 TH1D *etaRecP = fEffSecHisto->Projection(0);
\r
1328 TH1D *etaRecP_c = (TH1D*)etaRecP->Clone();
\r
1329 etaRecP_c->Divide(etaRecP,etaAllP,1,1,"B");
\r
1330 etaRecP_c->SetName("etaRecEffP");
\r
1332 etaRecP_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(0)->GetTitle());
\r
1333 etaRecP_c->GetYaxis()->SetTitle("efficiency");
\r
1334 sprintf(title,"%s vs %s","rec. efficiency (protons)",fEffSecHisto->GetAxis(0)->GetTitle());
\r
1335 etaRecP_c->SetTitle(title);
\r
1337 aFolderObj->Add(etaRecP_c);
\r
1339 // findable efficiency vs eta
\r
1341 fEffSecHisto->GetAxis(3)->SetRangeUser(0.,4.);
\r
1342 fEffSecHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1343 fEffSecHisto->GetAxis(5)->SetRangeUser(1.,1.); // findable
\r
1344 TH1D *etaAllF = fEffSecHisto->Projection(0);
\r
1346 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.);
\r
1347 fEffSecHisto->GetAxis(5)->SetRangeUser(1.,1.);
\r
1349 TH1D *etaRecF = fEffSecHisto->Projection(0); // rec findable
\r
1350 TH1D *etaRecF_c = (TH1D*)etaRecF->Clone();
\r
1351 etaRecF_c->Divide(etaRecF,etaAllF,1,1,"B");
\r
1352 etaRecF_c->SetName("etaRecEffF");
\r
1354 etaRecF_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(0)->GetTitle());
\r
1355 etaRecF_c->GetYaxis()->SetTitle("efficiency");
\r
1356 sprintf(title,"%s vs %s","rec. efficiency (findable)",fEffSecHisto->GetAxis(0)->GetTitle());
\r
1357 etaRecF_c->SetTitle(title);
\r
1359 aFolderObj->Add(etaRecF_c);
\r
1362 // efficiency vs phi
\r
1365 fEffSecHisto->GetAxis(0)->SetRangeUser(minEta,maxEta);
\r
1366 fEffSecHisto->GetAxis(2)->SetRangeUser(minPt,maxPt);
\r
1368 fEffSecHisto->GetAxis(4)->SetRangeUser(0.,1.); // all
\r
1369 fEffSecHisto->GetAxis(5)->SetRangeUser(0.,1.); // all
\r
1371 TH1D *phiAll = fEffSecHisto->Projection(1);
\r
1373 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1374 TH1D *phiRec = fEffSecHisto->Projection(1);
\r
1375 TH1D *phiRec_c = (TH1D*)phiRec->Clone();
\r
1376 phiRec_c->Divide(phiRec,phiAll,1,1,"B");
\r
1377 phiRec_c->SetName("phiRecEff");
\r
1379 phiRec_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(1)->GetTitle());
\r
1380 phiRec_c->GetYaxis()->SetTitle("efficiency");
\r
1381 sprintf(title,"%s vs %s","rec. efficiency",fEffSecHisto->GetAxis(1)->GetTitle());
\r
1382 phiRec_c->SetTitle(title);
\r
1384 aFolderObj->Add(phiRec_c);
\r
1386 // rec efficiency vs pid vs phi
\r
1387 fEffSecHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1388 fEffSecHisto->GetAxis(3)->SetRangeUser(2.,2.); // pions
\r
1390 TH1D *phiAllEle = fEffSecHisto->Projection(1);
\r
1392 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1393 TH1D *phiRecEle = fEffSecHisto->Projection(1);
\r
1394 TH1D *phiRecEle_c = (TH1D*)phiRecEle->Clone();
\r
1395 phiRecEle_c->Divide(phiRecEle,phiAllEle,1,1,"B");
\r
1396 phiRecEle_c->SetName("phiRecEffEle");
\r
1398 phiRecEle_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(1)->GetTitle());
\r
1399 phiRecEle_c->GetYaxis()->SetTitle("efficiency");
\r
1400 sprintf(title,"%s vs %s","rec. efficiency (electrons)",fEffSecHisto->GetAxis(1)->GetTitle());
\r
1401 phiRecEle_c->SetTitle(title);
\r
1403 aFolderObj->Add(phiRecEle_c);
\r
1406 fEffSecHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1407 fEffSecHisto->GetAxis(3)->SetRangeUser(2.,2.); // pions
\r
1409 TH1D *phiAllPi = fEffSecHisto->Projection(1);
\r
1411 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1412 TH1D *phiRecPi = fEffSecHisto->Projection(1);
\r
1413 TH1D *phiRecPi_c = (TH1D*)phiRecPi->Clone();
\r
1414 phiRecPi_c->Divide(phiRecPi,phiAllPi,1,1,"B");
\r
1415 phiRecPi_c->SetName("phiRecEffPi");
\r
1417 phiRecPi_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(1)->GetTitle());
\r
1418 phiRecPi_c->GetYaxis()->SetTitle("efficiency");
\r
1419 sprintf(title,"%s vs %s","rec. efficiency (pions)",fEffSecHisto->GetAxis(1)->GetTitle());
\r
1420 phiRecPi_c->SetTitle(title);
\r
1422 aFolderObj->Add(phiRecPi_c);
\r
1424 fEffSecHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1425 fEffSecHisto->GetAxis(3)->SetRangeUser(3.,3.); // kaons
\r
1426 TH1D *phiAllK = fEffSecHisto->Projection(1);
\r
1428 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1429 TH1D *phiRecK = fEffSecHisto->Projection(1);
\r
1431 TH1D *phiRecK_c = (TH1D*)phiRecK->Clone();
\r
1432 phiRecK_c->Divide(phiRecK,phiAllK,1,1,"B");
\r
1433 phiRecK_c->SetName("phiRecEffK");
\r
1435 phiRecK_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(1)->GetTitle());
\r
1436 phiRecK_c->GetYaxis()->SetTitle("efficiency");
\r
1437 sprintf(title,"%s vs %s","rec. efficiency (kaons)",fEffSecHisto->GetAxis(1)->GetTitle());
\r
1438 phiRecK_c->SetTitle(title);
\r
1441 aFolderObj->Add(phiRecK_c);
\r
1443 fEffSecHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1444 fEffSecHisto->GetAxis(3)->SetRangeUser(4.,4.); // protons
\r
1445 TH1D *phiAllP = fEffSecHisto->Projection(1);
\r
1447 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed
\r
1448 TH1D *phiRecP = fEffSecHisto->Projection(1);
\r
1449 TH1D *phiRecP_c = (TH1D*)phiRecP->Clone();
\r
1450 phiRecP_c->Divide(phiRecP,phiAllP,1,1,"B");
\r
1451 phiRecP_c->SetName("phiRecEffP");
\r
1453 phiRecP_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(1)->GetTitle());
\r
1454 phiRecP_c->GetYaxis()->SetTitle("efficiency");
\r
1455 sprintf(title,"%s vs %s","rec. efficiency (protons)",fEffSecHisto->GetAxis(1)->GetTitle());
\r
1456 phiRecP_c->SetTitle(title);
\r
1458 aFolderObj->Add(phiRecP_c);
\r
1460 // findable efficiency vs phi
\r
1462 fEffSecHisto->GetAxis(3)->SetRangeUser(0.,4.);
\r
1463 fEffSecHisto->GetAxis(4)->SetRangeUser(0.,1.);
\r
1464 fEffSecHisto->GetAxis(5)->SetRangeUser(1.,1.); // findable
\r
1465 TH1D *phiAllF = fEffSecHisto->Projection(1);
\r
1467 fEffSecHisto->GetAxis(4)->SetRangeUser(1.,1.);
\r
1468 fEffSecHisto->GetAxis(5)->SetRangeUser(1.,1.);
\r
1470 TH1D *phiRecF = fEffSecHisto->Projection(1); // rec findable
\r
1471 TH1D *phiRecF_c = (TH1D*)phiRecF->Clone();
\r
1472 phiRecF_c->Divide(phiRecF,phiAllF,1,1,"B");
\r
1473 phiRecF_c->SetName("phiRecEffF");
\r
1475 phiRecF_c->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(1)->GetTitle());
\r
1476 phiRecF_c->GetYaxis()->SetTitle("efficiency");
\r
1477 sprintf(title,"%s vs %s","rec. efficiency (findable)",fEffSecHisto->GetAxis(1)->GetTitle());
\r
1478 phiRecF_c->SetTitle(title);
\r
1480 aFolderObj->Add(phiRecF_c);
\r
1483 // export objects to analysis folder
\r
1484 fAnalysisFolder = ExportToFolder(aFolderObj);
\r
1486 // delete only TObjArray
\r
1487 if(aFolderObj) delete aFolderObj;
\r
1490 //_____________________________________________________________________________
\r
1491 TFolder* AliPerformanceEff::ExportToFolder(TObjArray * array)
\r
1493 // recreate folder avery time and export objects to new one
\r
1495 AliPerformanceEff * comp=this;
\r
1496 TFolder *folder = comp->GetAnalysisFolder();
\r
1498 TString name, title;
\r
1499 TFolder *newFolder = 0;
\r
1501 Int_t size = array->GetSize();
\r
1504 // get name and title from old folder
\r
1505 name = folder->GetName();
\r
1506 title = folder->GetTitle();
\r
1512 newFolder = CreateFolder(name.Data(),title.Data());
\r
1513 newFolder->SetOwner();
\r
1515 // add objects to folder
\r
1517 newFolder->Add(array->At(i));
\r
1526 //_____________________________________________________________________________
\r
1527 TFolder* AliPerformanceEff::CreateFolder(TString name,TString title) {
\r
1528 // create folder for analysed histograms
\r
1530 TFolder *folder = 0;
\r
1531 folder = new TFolder(name.Data(),title.Data());
\r