]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG1/AliComparisonEff.cxx
Update tracking class and macros, and pid class to read correctly the ESDs
[u/mrichter/AliRoot.git] / PWG1 / AliComparisonEff.cxx
index 1c79035bd89f5d0e0963d0a8844d773ec5df2740..2a2be73d34c3e0b84ee293079c4126a45a0b5aa7 100644 (file)
@@ -16,7 +16,8 @@
   gROOT->LoadMacro("$ALICE_ROOT/PWG1/Macros/LoadMyLibs.C");\r
   LoadMyLibs();\r
   TFile f("Output.root");\r
-  AliComparisonEff * compObj = (AliComparisonEff*)f.Get("AliComparisonEff");\r
+  //AliComparisonEff * compObj = (AliComparisonEff*)f.Get("AliComparisonEff");\r
+  AliComparisonEff * compObj = (AliComparisonEff*)cOutput->FindObject("AliComparisonEff");\r
 \r
   // Analyse comparison data\r
   compObj->Analyse();\r
 \r
 */\r
 \r
+#include <TAxis.h>\r
+#include <TH1D.h>\r
 \r
-#include <iostream>\r
-\r
-#include "TFile.h"\r
-#include "TCint.h"\r
-#include "TH3F.h"\r
-#include "TH2F.h"\r
-#include "TF1.h"\r
-#include "TProfile.h"\r
-#include "TProfile2D.h"\r
-#include "TGraph2D.h"\r
-#include "TCanvas.h"\r
-#include "TGraph.h"\r
 // \r
-#include "AliESDEvent.h"  \r
-#include "AliESD.h"\r
-#include "AliESDfriend.h"\r
-#include "AliESDfriendTrack.h"\r
+#include "AliESDtrack.h"\r
 #include "AliRecInfoCuts.h" \r
 #include "AliMCInfoCuts.h" \r
 #include "AliLog.h" \r
-//\r
-#include "AliMathBase.h"\r
-#include "AliTreeDraw.h" \r
-#include "AliMagFMaps.h" \r
 #include "AliESDVertex.h" \r
 #include "AliExternalTrackParam.h" \r
 #include "AliTracker.h" \r
-\r
 #include "AliMCInfo.h" \r
 #include "AliESDRecInfo.h" \r
 #include "AliComparisonEff.h" \r
 \r
 using namespace std;\r
 \r
-\r
 ClassImp(AliComparisonEff)\r
 \r
 //_____________________________________________________________________________\r
@@ -76,258 +58,84 @@ AliComparisonEff::AliComparisonEff():
 \r
   // histograms\r
  \r
-  fMCPt(0),\r
-  fMCRecPt(0),\r
-  fMCRecPrimPt(0),\r
-  fMCRecSecPt(0),\r
-\r
-  fEffTPCPt(0),\r
-  fEffTPCPtMC(0),\r
-  fEffTPCPtF(0),\r
-  //\r
-  fEffTPCPt_P(0),\r
-  fEffTPCPtMC_P(0),\r
-  fEffTPCPtF_P(0),\r
-  //\r
-  fEffTPCPt_Pi(0),\r
-  fEffTPCPtMC_Pi(0),\r
-  fEffTPCPtF_Pi(0),\r
-  //\r
-  fEffTPCPt_K(0),\r
-  fEffTPCPtMC_K(0),\r
-  fEffTPCPtF_K(0),\r
\r
-  fEffTPCTan(0),\r
-  fEffTPCTanMC(0),\r
-  fEffTPCTanF(0),\r
-  //\r
-  fEffTPCPtTan(0),\r
-  fEffTPCPtTanMC(0),\r
-  fEffTPCPtTanF(0),\r
+  fEffHisto(0),\r
 \r
   // Cuts \r
   fCutsRC(0), \r
   fCutsMC(0),\r
 \r
-  fVertex(0),\r
-\r
   // histogram folder \r
   fAnalysisFolder(0)\r
 {\r
-  // init vertex\r
-  fVertex = new AliESDVertex();\r
-  fVertex->SetXv(0.0); fVertex->SetYv(0.0); fVertex->SetZv(0.0); \r
+  // default consttructor      \r
+}\r
 \r
-  for(Int_t i=0; i<4; ++i)\r
-  {\r
-    fTPCPtDCASigmaIdeal[i]=0;\r
-    fTPCPtDCASigmaFull[i]=0;\r
-    fTPCPtDCASigmaDay0[i]=0;\r
+//_____________________________________________________________________________\r
+AliComparisonEff::AliComparisonEff(Char_t* name="AliComparisonEff",Char_t*title="AliComparisonEff",Int_t analysisMode=0, Bool_t hptGenerator=kFALSE):\r
+  AliComparisonObject(name,title),\r
 \r
-    fTPCPtDCAXY[i]=0;\r
-    fTPCPtDCAZ[i]=0;\r
+  // histograms\r
+  fEffHisto(0),\r
 \r
-       fTPCPtDCASigmaIdealPid[i]=0;\r
-       fTPCPtDCASigmaFullPid[i]=0;\r
-       fTPCPtDCASigmaDay0Pid[i]=0;\r
+  // Cuts \r
+  fCutsRC(0), \r
+  fCutsMC(0),\r
 \r
-       fTPCPtDCAXYPid[i]=0;   \r
-       fTPCPtDCAZPid[i]=0; \r
-  }\r
+  // histogram folder \r
+  fAnalysisFolder(0)\r
+{\r
+  // named constructor\r
+  //\r
+  SetAnalysisMode(analysisMode);\r
+  SetHptGenerator(hptGenerator);\r
 \r
   Init();\r
 }\r
 \r
-//_____________________________________________________________________________\r
-AliComparisonEff::~AliComparisonEff(){\r
-\r
-  // \r
-  if(fMCPt)  delete  fMCPt; fMCPt=0;\r
-  if(fMCRecPt)  delete  fMCRecPt; fMCRecPt=0;\r
-  if(fMCRecPrimPt)  delete  fMCRecPrimPt; fMCRecPrimPt=0;\r
-  if(fMCRecSecPt)  delete  fMCRecSecPt; fMCRecSecPt=0;\r
-\r
-  // \r
-  if(fEffTPCPt)   delete  fEffTPCPt;   fEffTPCPt=0;\r
-  if(fEffTPCPtMC) delete  fEffTPCPtMC; fEffTPCPtMC=0;\r
-  if(fEffTPCPtF)  delete  fEffTPCPtF;  fEffTPCPtF=0;\r
-\r
-  // \r
-  if(fEffTPCPt_P)   delete  fEffTPCPt_P;   fEffTPCPt_P=0;\r
-  if(fEffTPCPtMC_P) delete  fEffTPCPtMC_P; fEffTPCPtMC_P=0;\r
-  if(fEffTPCPtF_P)  delete  fEffTPCPtF_P;  fEffTPCPtF_P=0;\r
-\r
-  // \r
-  if(fEffTPCPt_Pi)   delete  fEffTPCPt_Pi;   fEffTPCPt_Pi=0;\r
-  if(fEffTPCPtMC_Pi) delete  fEffTPCPtMC_Pi; fEffTPCPtMC_Pi=0;\r
-  if(fEffTPCPtF_Pi)  delete  fEffTPCPtF_Pi;  fEffTPCPtF_Pi=0;\r
-\r
-  // \r
-  if(fEffTPCPt_K)   delete  fEffTPCPt_K;   fEffTPCPt_K=0;\r
-  if(fEffTPCPtMC_K) delete  fEffTPCPtMC_K; fEffTPCPtMC_K=0;\r
-  if(fEffTPCPtF_K)  delete  fEffTPCPtF_K;  fEffTPCPtF_K=0;\r
-\r
-  // \r
-  if(fEffTPCTan)   delete  fEffTPCTan;   fEffTPCTan=0;\r
-  if(fEffTPCTanMC) delete  fEffTPCTanMC; fEffTPCTanMC=0;\r
-  if(fEffTPCTanF)  delete  fEffTPCTanF;  fEffTPCTanF=0;\r
-\r
-  //\r
-  if(fEffTPCPtTan)   delete  fEffTPCPtTan;   fEffTPCPtTan=0;\r
-  if(fEffTPCPtTanMC) delete  fEffTPCPtTanMC; fEffTPCPtTanMC=0;\r
-  if(fEffTPCPtTanF)  delete  fEffTPCPtTanF;  fEffTPCPtTanF=0;\r
-\r
-  for(Int_t i=0; i<4; ++i)\r
-  {\r
-    if(fTPCPtDCASigmaIdeal[i]) delete  fTPCPtDCASigmaIdeal[i];  fTPCPtDCASigmaIdeal[i]=0;\r
-    if(fTPCPtDCASigmaFull[i]) delete  fTPCPtDCASigmaFull[i];  fTPCPtDCASigmaFull[i]=0;\r
-    if(fTPCPtDCASigmaDay0[i]) delete  fTPCPtDCASigmaDay0[i];  fTPCPtDCASigmaDay0[i]=0;\r
 \r
-    if(fTPCPtDCAXY[i]) delete  fTPCPtDCAXY[i];  fTPCPtDCAXY[i]=0;\r
-    if(fTPCPtDCAZ[i]) delete  fTPCPtDCAZ[i];  fTPCPtDCAZ[i]=0;\r
+//_____________________________________________________________________________\r
+AliComparisonEff::~AliComparisonEff()\r
+{\r
+// destructor\r
 \r
-       if(fTPCPtDCASigmaIdealPid[i]) delete  fTPCPtDCASigmaIdealPid[i];  fTPCPtDCASigmaIdealPid[i]=0;\r
-       if(fTPCPtDCASigmaFullPid[i]) delete  fTPCPtDCASigmaFullPid[i];  fTPCPtDCASigmaFullPid[i]=0;\r
-       if(fTPCPtDCASigmaDay0Pid[i]) delete  fTPCPtDCASigmaDay0Pid[i];  fTPCPtDCASigmaDay0Pid[i]=0;\r
+  if(fEffHisto)  delete  fEffHisto; fEffHisto=0;\r
 \r
-       if(fTPCPtDCAXYPid[i]) delete  fTPCPtDCAXYPid[i]; fTPCPtDCAXYPid[i]=0;\r
-       if(fTPCPtDCAZPid[i]) delete   fTPCPtDCAZPid[i];  fTPCPtDCAZPid[i]=0;\r
-  }\r
+  if(fCutsRC) delete fCutsRC; fCutsRC=0;\r
+  if(fCutsMC) delete fCutsMC; fCutsMC=0;\r
 \r
   if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;\r
 }\r
 \r
 //_____________________________________________________________________________\r
-void AliComparisonEff::Init(){\r
-\r
+void AliComparisonEff::Init()\r
+{\r
   // Init histograms\r
   //\r
-  fMCPt = new TH1F("fMCPt","fMCPt",50,0.1,3);           \r
-  fMCPt->SetXTitle("p_{t}");\r
-  fMCPt->SetYTitle("yield");\r
-\r
-  fMCRecPt = new TH1F("fMCRecPt","fMCRecPt",50,0.1,3);           \r
-  fMCRecPt->SetXTitle("p_{t}");\r
-  fMCRecPt->SetYTitle("yield");\r
-\r
-  fMCRecPrimPt = new TH1F("fMCRecPrimPt","fMCRecPrimPt",50,0.1,3);           \r
-  fMCRecPrimPt->SetXTitle("p_{t}");\r
-  fMCRecPrimPt->SetYTitle("yield");\r
-\r
-  fMCRecSecPt = new TH1F("fMCRecSecPt","fMCRecSecPt",50,0.1,3);           \r
-  fMCRecSecPt->SetXTitle("p_{t}");\r
-  fMCRecSecPt->SetYTitle("yield");\r
-\r
-  // Efficiency as function of pt\r
-  fEffTPCPt = new TProfile("Eff_pt","Eff_Pt",50,0.1,3);           \r
-  fEffTPCPt->SetXTitle("p_{t}");\r
-  fEffTPCPt->SetYTitle("TPC Efficiency");\r
-\r
-  fEffTPCPtMC = new TProfile("MC_Eff_pt","MC_Eff_Pt",50,0.1,3);   \r
-  fEffTPCPtMC->SetXTitle("p_{t}");\r
-  fEffTPCPtMC->SetYTitle("MC TPC Efficiency");\r
-\r
-  fEffTPCPtF = new TProfile("F_Eff_pt","F_Eff_Pt",50,0.1,3);     \r
-  fEffTPCPtF->SetXTitle("p_{t}");\r
-  fEffTPCPtF->SetYTitle("TPC Findable Efficiency");\r
-\r
-  // Efficiency as function of pt protons\r
-  fEffTPCPt_P = new TProfile("Eff_pt_P","Eff_Pt_P",50,0.1,3);           \r
-  fEffTPCPt_P->SetXTitle("p_{t}");\r
-  fEffTPCPt_P->SetYTitle("TPC Efficiency");\r
-\r
-  fEffTPCPtMC_P = new TProfile("MC_Eff_pt_P","MC_Eff_Pt_P",50,0.1,3);   \r
-  fEffTPCPtMC_P->SetXTitle("p_{t}");\r
-  fEffTPCPtMC_P->SetYTitle("MC TPC Efficiency");\r
-\r
-  fEffTPCPtF_P = new TProfile("F_Eff_pt_P","F_Eff_Pt_P",50,0.1,3);     \r
-  fEffTPCPtF_P->SetXTitle("p_{t}");\r
-  fEffTPCPtF_P->SetYTitle("TPC Findable Efficiency");\r
-\r
-  // Efficiency as function of pt pions\r
-  fEffTPCPt_Pi = new TProfile("Eff_pt_Pi","Eff_Pit_Pi",50,0.1,3);           \r
-  fEffTPCPt_Pi->SetXTitle("p_{t}");\r
-  fEffTPCPt_Pi->SetYTitle("TPC Efficiency");\r
-\r
-  fEffTPCPtMC_Pi = new TProfile("MC_Eff_pt_Pi","MC_Eff_Pit_Pi",50,0.1,3);   \r
-  fEffTPCPtMC_Pi->SetXTitle("p_{t}");\r
-  fEffTPCPtMC_Pi->SetYTitle("MC TPC Efficiency");\r
-\r
-  fEffTPCPtF_Pi = new TProfile("F_Eff_pt_Pi","F_Eff_Pit_Pi",50,0.1,3);     \r
-  fEffTPCPtF_Pi->SetXTitle("p_{t}");\r
-  fEffTPCPtF_Pi->SetYTitle("TPC Findable Efficiency");\r
-\r
-  // Efficiency as function of pt kaons\r
-  fEffTPCPt_K = new TProfile("Eff_pt_K","Eff_Kt_K",50,0.1,3);           \r
-  fEffTPCPt_K->SetXTitle("p_{t}");\r
-  fEffTPCPt_K->SetYTitle("TPC Efficiency");\r
-\r
-  fEffTPCPtMC_K = new TProfile("MC_Eff_pt_K","MC_Eff_Kt_K",50,0.1,3);   \r
-  fEffTPCPtMC_K->SetXTitle("p_{t}");\r
-  fEffTPCPtMC_K->SetYTitle("MC TPC Efficiency");\r
-\r
-  fEffTPCPtF_K = new TProfile("F_Eff_pt_K","F_Eff_Kt_K",50,0.1,3);     \r
-  fEffTPCPtF_K->SetXTitle("p_{t}");\r
-  fEffTPCPtF_K->SetYTitle("TPC Findable Efficiency");\r
-\r
-  // Efficiency as function of tan(theta) \r
-  fEffTPCTan = new TProfile("Eff_tan","Eff_tan",50,-2.5,2.5);         \r
-  fEffTPCTan->SetXTitle("tan(#theta)");\r
-  fEffTPCTan->SetYTitle("TPC Efficiency");\r
-\r
-  fEffTPCTanMC = new TProfile("MC_Eff_tan","MC_Eff_tan",50,-2.5,2.5); \r
-  fEffTPCTanMC->SetXTitle("tan(#theta)");\r
-  fEffTPCTanMC->SetYTitle("MC TPC Efficiency");\r
-\r
-  fEffTPCTanF = new TProfile("F_Eff_tan","F_Eff_tan",50,-2.5,2.5);   \r
-  fEffTPCPtF->SetXTitle("tan(#theta)");\r
-  fEffTPCPtF->SetYTitle("TPC Findable Efficiency");\r
-\r
-  // Efficiency as function of pt and tan(theta) \r
-  fEffTPCPtTan = new TProfile2D("Eff_pt_tan","Eff_Pt_tan",10,0.1,3,20,-2.,2.);\r
-  fEffTPCPtTan->SetXTitle("tan(#theta)");\r
-  fEffTPCPtTan->SetYTitle("p_{t}");\r
-\r
-  fEffTPCPtTanMC = new TProfile2D("MC_Eff_pt_tan_MC","MC Eff Pt",10,0.1,3,20,-2.,2.);\r
-  fEffTPCPtTanMC->SetXTitle("tan(#theta)");\r
-  fEffTPCPtTanMC->SetYTitle("p_{t}");\r
-\r
-  fEffTPCPtTanF = new TProfile2D("MC_Eff_pt_tan_F","MC Eff Pt",10,0.1,3,20,-2.,2.);\r
-  fEffTPCPtTanF->SetXTitle("tan(#theta)");\r
-  fEffTPCPtTanF->SetYTitle("p_{t}");\r
-\r
-  char name[256];\r
-  for(Int_t i=0; i<4; ++i)\r
-  {\r
-    sprintf(name, "fTPCPtDCASigmaIdeal_%d",i);\r
-    fTPCPtDCASigmaIdeal[i] = new TH2F(name,name,50,0.1,3,100,0,100);\r
-\r
-    sprintf(name, "fTPCPtDCASigmaFull_%d",i);\r
-    fTPCPtDCASigmaFull[i] = new TH2F(name,name,50,0.1,3,100,0,100);\r
-\r
-    sprintf(name, "fTPCPtDCASigmaDay0_%d",i);\r
-    fTPCPtDCASigmaDay0[i] = new TH2F(name,name,50,0.1,3,100,0,100);\r
+  Int_t nPtBins = 31;\r
+  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
+  Double_t ptMin = 0., ptMax = 10.;\r
 \r
-    sprintf(name, "fTPCPtDCAXY_%d",i);\r
-    fTPCPtDCAXY[i]= new TH2F(name,name,50,0.1,3,100,0,100);\r
-    sprintf(name, "fTPCPtDCAZ_%d",i);\r
-    fTPCPtDCAZ[i]= new TH2F(name,name,50,0.1,3,100,0,100);\r
-\r
-    sprintf(name, "fTPCPtDCASigmaIdealPid_%d",i);\r
-       fTPCPtDCASigmaIdealPid[i] = new TH3F(name,name,50,0.1,3,100,0,100,5,0,5);\r
+  if(IsHptGenerator() == kTRUE) {\r
+    nPtBins = 100;\r
+    ptMin = 0.; ptMax = 100.;\r
+  }\r
 \r
-    sprintf(name, "fTPCPtDCASigmaFullPid_%d",i);\r
-       fTPCPtDCASigmaFullPid[i]= new TH3F(name,name,50,0.1,3,100,0,100,5,0,5);\r
+  //mceta:mcphi:mcpt:pid:isPrim:recStatus:findable\r
+  Int_t binsEffHisto[7]={30,144,nPtBins,5,2,2,2};\r
+  Double_t minEffHisto[7]={-1.5,0.,ptMin,0.,0.,0.,0.};\r
+  Double_t maxEffHisto[7]={ 1.5,2.*TMath::Pi(), ptMax,5.,2.,2.,2.};\r
 \r
-    sprintf(name, "fTPCPtDCASigmaDay0Pid_%d",i);\r
-       fTPCPtDCASigmaDay0Pid[i]= new TH3F(name,name,50,0.1,3,100,0,100,5,0,5);\r
+  fEffHisto = new THnSparseF("fEffHisto","mceta:mcphi:mcpt:pid:isPrim:recStatus:findable",7,binsEffHisto,minEffHisto,maxEffHisto);\r
+  if(!IsHptGenerator()) fEffHisto->SetBinEdges(2,binsPt);\r
 \r
-    sprintf(name, "fTPCPtDCAXYPid_%d",i);\r
-       fTPCPtDCAXYPid[i]= new TH3F(name,name,50,0.1,3,100,0,100,5,0,5);\r
-\r
-    sprintf(name, "fTPCPtDCAZPid_%d",i);\r
-       fTPCPtDCAZPid[i]= new TH3F(name,name,50,0.1,3,100,0,100,5,0,5);\r
-  }\r
+  fEffHisto->GetAxis(0)->SetTitle("eta");\r
+  fEffHisto->GetAxis(1)->SetTitle("phi (rad)");\r
+  fEffHisto->GetAxis(2)->SetTitle("pt (GeV/c)");\r
+  fEffHisto->GetAxis(3)->SetTitle("pid");\r
+  fEffHisto->GetAxis(4)->SetTitle("isPrim");\r
+  fEffHisto->GetAxis(5)->SetTitle("recStatus");\r
+  fEffHisto->GetAxis(6)->SetTitle("findable");\r
+  fEffHisto->Sumw2();\r
 \r
   // init cuts\r
   if(!fCutsMC) \r
@@ -340,41 +148,34 @@ void AliComparisonEff::Init(){
 }\r
 \r
 //_____________________________________________________________________________\r
-void AliComparisonEff::Process(AliMCInfo* infoMC, AliESDRecInfo *infoRC)\r
+void AliComparisonEff::ProcessTPC(AliMCInfo* const infoMC, AliESDRecInfo* const infoRC)\r
 {\r
   // Fill efficiency comparison information\r
-  \r
+\r
   AliExternalTrackParam *track = 0;\r
   Double_t field      = AliTracker::GetBz(); // nominal Bz field [kG]\r
   Double_t kMaxD      = 123456.0; // max distance\r
-\r
-  // systematics\r
-  const Double_t kSigma2Full_xy  = 0.25; // ExB full systematics  [cm]\r
-  const Double_t kSigma2Full_z  =  5.0;  // drift velocity (goofie) [cm] \r
-\r
-  const Double_t kSigma2Day0_xy  = 0.02; //  ExB  [cm]\r
-  const Double_t kSigma2Day0_z  =  0.1;  //   drift velocity (goofie) [cm]  \r
-\r
-  //  \r
-  Double_t     DCASigmaIdeal=0;\r
-  Double_t  DCASigmaFull=0;\r
-  Double_t  DCASigmaDay0=0;\r
-\r
   Double_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z\r
+  AliESDVertex vertexMC;  // MC primary vertex\r
 \r
   // distance to Prim. vertex \r
   const Double_t* dv = infoMC->GetVDist(); \r
 \r
   Float_t mcpt = infoMC->GetParticle().Pt();\r
-  Float_t tantheta = TMath::Tan(infoMC->GetParticle().Theta()-TMath::Pi()*0.5);\r
+  Float_t mceta = infoMC->GetParticle().Eta();\r
+  Float_t mcphi = infoMC->GetParticle().Phi();\r
+  if(mcphi<0) mcphi += 2.*TMath::Pi();\r
+\r
   Bool_t isPrim = TMath::Sqrt(dv[0]*dv[0] + dv[1]*dv[1])<fCutsMC->GetMaxR() && TMath::Abs(dv[2])<fCutsMC->GetMaxVz();\r
+  Bool_t findable = (infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits());\r
+  Bool_t recStatus = kFALSE;\r
  \r
   // calculate and set prim. vertex\r
-  fVertex->SetXv( infoMC->GetParticle().Vx() - dv[0] );\r
-  fVertex->SetYv( infoMC->GetParticle().Vy() - dv[1] );\r
-  fVertex->SetZv( infoMC->GetParticle().Vz() - dv[2] );\r
+  vertexMC.SetXv( infoMC->GetParticle().Vx() - dv[0] );\r
+  vertexMC.SetYv( infoMC->GetParticle().Vy() - dv[1] );\r
+  vertexMC.SetZv( infoMC->GetParticle().Vz() - dv[2] );\r
   \r
-  // Check selection cuts\r
+  // Only 5 charged particle species (e,mu,pi,K,p)\r
   if (fCutsMC->IsPdgParticle(TMath::Abs(infoMC->GetParticle().GetPdgCode())) == kFALSE) return; \r
 \r
   // transform Pdg to Pid\r
@@ -387,213 +188,152 @@ void AliComparisonEff::Process(AliMCInfo* infoMC, AliESDRecInfo *infoRC)
   if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetKP() ) pid = 3; \r
   if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetProt() ) pid = 4; \r
 \r
-  //cout << "dv[0] " << dv[0] << " dv[1] " << dv[1]  <<  " dv[2] " << dv[2] << endl; \r
-  //cout << "v[0] " << fVertex->GetXv()  << " v[1] " << fVertex->GetYv()  <<  " v[2] " << fVertex->GetZv()<< endl; \r
-  if (TMath::Abs(tantheta)<fCutsRC->GetMaxAbsTanTheta())\r
+  if (infoRC->GetESDtrack() && infoRC->GetESDtrack()->GetTPCInnerParam()) \r
   {\r
-    if (infoRC->GetESDtrack() && infoRC->GetESDtrack()->GetTPCInnerParam()) \r
+    if ((track = new AliExternalTrackParam(*infoRC->GetESDtrack()->GetTPCInnerParam())) != 0)\r
     {\r
-      if ((track = new AliExternalTrackParam(*infoRC->GetESDtrack()->GetTPCInnerParam())) != 0 )\r
-      {\r
-        Bool_t bDCAStatus = track->PropagateToDCA(fVertex,field,kMaxD,dca,cov);\r
-               if(bDCAStatus) {\r
-               //\r
-               cov[2] = track->GetCovariance()[2];\r
-\r
-           // Eff = infoRC->GetStatus(1)==3 && isPrim / isPrim;\r
-        // Pt vs ( dca[0]^2/cov[0]^2 + dca[1]^2/cov[2]^2 ) \r
-        // Pt vs ( dca[0]^2/(cov[0]^2 + kSigma2Full_xy)  + dca[1]^2/( cov[2]^2 + kSigma2Full_z ) \r
-        // Pt vs ( dca[0]^2/(cov[0]^2 + kSigma2_xy)  + dca[1]^2/( cov[2]^2 + kSigma2_z ) \r
-\r
-         if(cov[0]>0.0 && cov[2]>0.0)\r
-                {\r
-                        DCASigmaIdeal = TMath::Power(dca[0],2)/cov[0] \r
-                                                                         + TMath::Power(dca[1],2)/cov[2]; \r
-\r
-                        DCASigmaFull = TMath::Power(dca[0],2)/(cov[0]+kSigma2Full_xy) \r
-                                                                        + TMath::Power(dca[1],2)/(cov[2]+kSigma2Full_z); \r
-\r
-                        DCASigmaDay0 = TMath::Power(dca[0],2)/(cov[0]+kSigma2Day0_xy) \r
-                                                                        + TMath::Power(dca[1],2)/(cov[2]+kSigma2Day0_z); \r
-\r
-              //cout << "dca[0] " << dca[0]  << " dca[1] " << dca[1]  << endl; \r
-              //cout << "cov[0] " << cov[0]  << " cov[2] " << cov[2]  << endl; \r
-              //cout << "DCASigmaIdeal " << DCASigmaIdeal  << " DCASigmaFull " << DCASigmaFull  << " DCASigmaDay0 "  <<DCASigmaDay0 <<  endl; \r
-            //cout << " -------------------------------------------------------- "<<  endl; \r
-                }\r
-\r
-         // MC pt\r
-         fMCPt->Fill(mcpt); \r
-         if(infoRC->GetStatus(1)==3) fMCRecPt->Fill(mcpt); \r
-         if(infoRC->GetStatus(1)==3 && isPrim) fMCRecPrimPt->Fill(mcpt); \r
-         if(infoRC->GetStatus(1)==3 && !isPrim) fMCRecSecPt->Fill(mcpt); \r
-\r
-         if(isPrim)\r
-                {\r
-           fTPCPtDCASigmaIdeal[0]->Fill(mcpt,DCASigmaIdeal);\r
-           fTPCPtDCASigmaFull[0]->Fill(mcpt,DCASigmaFull);\r
-           fTPCPtDCASigmaDay0[0]->Fill(mcpt,DCASigmaDay0);\r
-\r
-           fTPCPtDCAXY[0]->Fill(mcpt,dca[0]);\r
-           fTPCPtDCAZ[0]->Fill(mcpt,dca[1]);\r
-\r
-           fTPCPtDCASigmaIdealPid[0]->Fill(mcpt,DCASigmaIdeal,pid);\r
-           fTPCPtDCASigmaFullPid[0]->Fill(mcpt,DCASigmaFull,pid);\r
-           fTPCPtDCASigmaDay0Pid[0]->Fill(mcpt,DCASigmaDay0,pid);\r
-\r
-           fTPCPtDCAXYPid[0]->Fill(mcpt,dca[0],pid);\r
-           fTPCPtDCAZPid[0]->Fill(mcpt,dca[1],pid);\r
-                          \r
-                  if(infoRC->GetStatus(1)==3)\r
-                  {\r
-             fTPCPtDCASigmaIdeal[1]->Fill(mcpt,DCASigmaIdeal);\r
-             fTPCPtDCASigmaFull[1]->Fill(mcpt,DCASigmaFull);\r
-             fTPCPtDCASigmaDay0[1]->Fill(mcpt,DCASigmaDay0);\r
-\r
-             fTPCPtDCAXY[1]->Fill(mcpt,dca[0]);\r
-             fTPCPtDCAZ[1]->Fill(mcpt,dca[1]);\r
-\r
-             fTPCPtDCASigmaIdealPid[1]->Fill(mcpt,DCASigmaIdeal,pid);\r
-             fTPCPtDCASigmaFullPid[1]->Fill(mcpt,DCASigmaFull,pid);\r
-             fTPCPtDCASigmaDay0Pid[1]->Fill(mcpt,DCASigmaDay0,pid);\r
-\r
-             fTPCPtDCAXYPid[1]->Fill(mcpt,dca[0],pid);\r
-             fTPCPtDCAZPid[1]->Fill(mcpt,dca[1],pid);\r
-           }\r
-                }\r
-\r
-        // Cont = infoRC->GetStatus(1)==3 && !isPrim / infoRC->GetStatus(1)==3   \r
-        // Pt vs ( dz[0]^2/cov[0]^2 + dz[1]^2/cov[2]^2 ) \r
-        // Pt vs ( dz[0]^2/(cov[0]^2 + kSigma2Full_xy)  + dz[1]^2/( cov[2]^2 + kSigma2Full_z ) \r
-        // Pt vs ( dz[0]^2/(cov[0]^2 + kSigma2_xy)  + dz[1]^2/( cov[2]^2 + kSigma2_z ) \r
-\r
-                if(infoRC->GetStatus(1)==3) \r
-                {\r
-                  fTPCPtDCASigmaIdeal[2]->Fill(mcpt,DCASigmaIdeal);\r
-           fTPCPtDCASigmaFull[2]->Fill(mcpt,DCASigmaFull);\r
-           fTPCPtDCASigmaDay0[2]->Fill(mcpt,DCASigmaDay0);\r
-\r
-           fTPCPtDCAXY[2]->Fill(mcpt,dca[0]);\r
-           fTPCPtDCAZ[2]->Fill(mcpt,dca[1]);\r
-\r
-           fTPCPtDCASigmaIdealPid[2]->Fill(mcpt,DCASigmaIdeal,pid);\r
-           fTPCPtDCASigmaFullPid[2]->Fill(mcpt,DCASigmaFull,pid);\r
-           fTPCPtDCASigmaDay0Pid[2]->Fill(mcpt,DCASigmaDay0,pid);\r
-\r
-           fTPCPtDCAXYPid[2]->Fill(mcpt,dca[0],pid);\r
-           fTPCPtDCAZPid[2]->Fill(mcpt,dca[1],pid);\r
\r
-                  if(isPrim==0)\r
-                  {\r
-             fTPCPtDCASigmaIdeal[3]->Fill(mcpt,DCASigmaIdeal);\r
-             fTPCPtDCASigmaFull[3]->Fill(mcpt,DCASigmaFull);\r
-             fTPCPtDCASigmaDay0[3]->Fill(mcpt,DCASigmaDay0);\r
-\r
-             fTPCPtDCAXY[3]->Fill(mcpt,dca[0]);\r
-             fTPCPtDCAZ[3]->Fill(mcpt,dca[1]);\r
-\r
-             fTPCPtDCASigmaIdealPid[3]->Fill(mcpt,DCASigmaIdeal,pid);\r
-             fTPCPtDCASigmaFullPid[3]->Fill(mcpt,DCASigmaFull,pid);\r
-             fTPCPtDCASigmaDay0Pid[3]->Fill(mcpt,DCASigmaDay0,pid);\r
-\r
-             fTPCPtDCAXYPid[3]->Fill(mcpt,dca[0],pid);\r
-             fTPCPtDCAZPid[3]->Fill(mcpt,dca[1],pid);\r
-           }\r
-            }\r
-          delete track;\r
-       }\r
-       }\r
-     } \r
-        else \r
-        {\r
-       if(isPrim)\r
-          {\r
-            fTPCPtDCASigmaIdeal[0]->Fill(mcpt,0.0);\r
-         fTPCPtDCASigmaFull[0]->Fill(mcpt,0.0);\r
-         fTPCPtDCASigmaDay0[0]->Fill(mcpt,0.0);\r
-\r
-         fTPCPtDCAXY[0]->Fill(mcpt,0.0);\r
-         fTPCPtDCAZ[0]->Fill(mcpt,0.0);\r
-\r
-         fTPCPtDCASigmaIdealPid[0]->Fill(mcpt,0.0,pid);\r
-         fTPCPtDCASigmaFullPid[0]->Fill(mcpt,0.0,pid);\r
-         fTPCPtDCASigmaDay0Pid[0]->Fill(mcpt,0.0,pid);\r
-\r
-         fTPCPtDCAXYPid[0]->Fill(mcpt,0.0,pid);\r
-         fTPCPtDCAZPid[0]->Fill(mcpt,0.0,pid);\r
-          }\r
-     }\r
+      Bool_t bDCAStatus = track->PropagateToDCA(&vertexMC,field,kMaxD,dca,cov);\r
+      if(bDCAStatus) {\r
+        if(TMath::Abs(dca[0])<fCutsRC->GetMaxDCAToVertexXY() && TMath::Abs(dca[1])<fCutsRC->GetMaxDCAToVertexZ())\r
+        {\r
+          recStatus = kTRUE;\r
+        }\r
+      }\r
+    delete track;\r
+    }\r
   }\r
 \r
-  // only primary particles\r
-  if (!isPrim) return;\r
+  // Fill histograms\r
+  Double_t vEffHisto[7] = { mceta, mcphi, mcpt, pid, isPrim, recStatus, findable }; \r
+  fEffHisto->Fill(vEffHisto);\r
+}\r
+\r
+//_____________________________________________________________________________\r
+void AliComparisonEff::ProcessTPCITS(AliMCInfo* const infoMC, AliESDRecInfo* const infoRC)\r
+{\r
+  // Fill efficiency comparison information\r
\r
+  Int_t clusterITS[200];\r
+  Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z\r
+\r
+  Float_t mcpt = infoMC->GetParticle().Pt();\r
+  Float_t mceta = infoMC->GetParticle().Eta();\r
+  Float_t mcphi = infoMC->GetParticle().Phi();\r
+  if(mcphi<0) mcphi += 2.*TMath::Pi();\r
 \r
-  // pt\r
-  if (TMath::Abs(tantheta)<fCutsRC->GetMaxAbsTanTheta()){\r
+  // distance to Prim. vertex \r
+  const Double_t* dv = infoMC->GetVDist(); \r
 \r
-    fEffTPCPt->Fill(mcpt, infoRC->GetStatus(1)==3);\r
-    fEffTPCPtMC->Fill(mcpt, infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits());\r
-    if (infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits()){\r
-      fEffTPCPtF->Fill(mcpt, infoRC->GetStatus(1)==3);\r
-    }\r
+  Bool_t isPrim = TMath::Sqrt(dv[0]*dv[0] + dv[1]*dv[1])<fCutsMC->GetMaxR() && TMath::Abs(dv[2])<fCutsMC->GetMaxVz();\r
+  Bool_t findable = (infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits());\r
+  Bool_t recStatus =kFALSE;\r
\r
+  // Only 5 charged particle species (e,mu,pi,K,p)\r
+  if (fCutsMC->IsPdgParticle(TMath::Abs(infoMC->GetParticle().GetPdgCode())) == kFALSE) return; \r
+\r
+  // transform Pdg to Pid\r
+  // Pdg convension is different for hadrons and leptons \r
+  // (e.g. K+/K- = 321/-321; e+/e- = -11/11 ) \r
+  Double_t pid = -1;\r
+  if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetEM() ) pid = 0; \r
+  if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetMuM() ) pid = 1; \r
+  if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetPiP() ) pid = 2; \r
+  if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetKP() ) pid = 3; \r
+  if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetProt() ) pid = 4; \r
 \r
-    // protons\r
-    if(TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetProt()) { \r
-          fEffTPCPt_P->Fill(mcpt, infoRC->GetStatus(1)==3);\r
-       fEffTPCPtMC_P->Fill(mcpt, infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits());\r
-\r
-       if(infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits()) {\r
-         fEffTPCPtF_P->Fill(mcpt, infoRC->GetStatus(1)==3);\r
-       }\r
-       }\r
-\r
-    // pions\r
-    if(TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetPiP()) {\r
-         fEffTPCPt_Pi->Fill(mcpt, infoRC->GetStatus(1)==3);\r
-      fEffTPCPtMC_Pi->Fill(mcpt, infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits());\r
-\r
-       if(infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits()) {\r
-         fEffTPCPtF_Pi->Fill(mcpt, infoRC->GetStatus(1)==3);\r
-       }\r
-       }\r
-\r
-       // kaons\r
-    if(TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetKP()) {\r
-         fEffTPCPt_K->Fill(mcpt, infoRC->GetStatus(1)==3);\r
-      fEffTPCPtMC_K->Fill(mcpt, infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits());\r
-\r
-       if(infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits()) {\r
-         fEffTPCPtF_K->Fill(mcpt, infoRC->GetStatus(1)==3);\r
-       }\r
-       }\r
+  if(!infoRC->GetESDtrack()) return;\r
+  if(infoRC->GetESDtrack()->GetITSclusters(clusterITS)>fCutsRC->GetMinNClustersITS())\r
+  {\r
+    infoRC->GetESDtrack()->GetImpactParameters(dca,cov);\r
+    if(TMath::Abs(dca[0]) < fCutsRC->GetMaxDCAToVertexXY() && TMath::Abs(dca[1]) < fCutsRC->GetMaxDCAToVertexZ()) \r
+    {\r
+       recStatus =(infoRC->GetStatus(1)==3);\r
+    } \r
   }\r
 \r
-  // theta\r
-  if (TMath::Abs(mcpt)>fCutsRC->GetPtMin()){\r
-    fEffTPCTan->Fill(tantheta, infoRC->GetStatus(1)==3);\r
-    fEffTPCTanMC->Fill(tantheta, infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits());\r
-    if (infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits()){\r
-      fEffTPCTanF->Fill(tantheta, infoRC->GetStatus(1)==3);\r
+  // fill histograms\r
+  Double_t vEffHisto[7] = { mceta, mcphi, mcpt, pid, isPrim, recStatus, findable }; \r
+  fEffHisto->Fill(vEffHisto);\r
+}\r
+\r
+//_____________________________________________________________________________\r
+void AliComparisonEff::ProcessConstrained(AliMCInfo* const infoMC, AliESDRecInfo* const infoRC)\r
+{\r
+  // Fill efficiency comparison information\r
+  AliExternalTrackParam *track = 0;\r
+  Double_t field      = AliTracker::GetBz(); // nominal Bz field [kG]\r
+  Double_t kMaxD      = 123456.0; // max distance\r
+  Double_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z\r
+  AliESDVertex vertexMC;  // MC primary vertex\r
+\r
+  // distance to Prim. vertex \r
+  const Double_t* dv = infoMC->GetVDist(); \r
+\r
+  Float_t mcpt = infoMC->GetParticle().Pt();\r
+  Float_t mceta = infoMC->GetParticle().Eta();\r
+  Float_t mcphi = infoMC->GetParticle().Phi();\r
+  if(mcphi<0) mcphi += 2.*TMath::Pi();\r
+\r
+  Bool_t isPrim = TMath::Sqrt(dv[0]*dv[0] + dv[1]*dv[1])<fCutsMC->GetMaxR() && TMath::Abs(dv[2])<fCutsMC->GetMaxVz();\r
+  Bool_t findable = (infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits());\r
+  Bool_t recStatus = kFALSE;\r
\r
+  // calculate and set prim. vertex\r
+  vertexMC.SetXv( infoMC->GetParticle().Vx() - dv[0] );\r
+  vertexMC.SetYv( infoMC->GetParticle().Vy() - dv[1] );\r
+  vertexMC.SetZv( infoMC->GetParticle().Vz() - dv[2] );\r
+  \r
+  // Only 5 charged particle species (e,mu,pi,K,p)\r
+  if (fCutsMC->IsPdgParticle(TMath::Abs(infoMC->GetParticle().GetPdgCode())) == kFALSE) return; \r
+\r
+  // transform Pdg to Pid\r
+  // Pdg convension is different for hadrons and leptons \r
+  // (e.g. K+/K- = 321/-321; e+/e- = -11/11 ) \r
+  Double_t pid = -1;\r
+  if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetEM() ) pid = 0; \r
+  if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetMuM() ) pid = 1; \r
+  if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetPiP() ) pid = 2; \r
+  if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetKP() ) pid = 3; \r
+  if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetProt() ) pid = 4; \r
+\r
+  // constrained parameters resolution\r
+  if (!infoRC->GetESDtrack()) return;\r
+  const AliExternalTrackParam * cparam = infoRC->GetESDtrack()->GetConstrainedParam();\r
+  if(!cparam) return;\r
+\r
+  if ((track = new AliExternalTrackParam(*cparam)) != 0)\r
+  {\r
+    Bool_t bDCAStatus = track->PropagateToDCA(&vertexMC,field,kMaxD,dca,cov);\r
+    if(bDCAStatus) {\r
+      if(TMath::Abs(dca[0])<fCutsRC->GetMaxDCAToVertexXY() && TMath::Abs(dca[1])<fCutsRC->GetMaxDCAToVertexZ())\r
+      {\r
+        recStatus =  (infoRC->GetStatus(1)!=3);\r
+      }\r
     }\r
+  delete track;\r
   }\r
 \r
-  // pt-theta\r
-  fEffTPCPtTan->Fill(mcpt,tantheta,infoRC->GetStatus(1)==3);\r
-  fEffTPCPtTanMC->Fill(mcpt,tantheta,infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits()); \r
-  if (infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits()){\r
-    fEffTPCPtTanF->Fill(mcpt,tantheta,infoRC->GetStatus(1)==3); \r
-  }\r
+  // Fill histograms\r
+  Double_t vEffHisto[7] = { mceta, mcphi, mcpt, pid, isPrim, recStatus, findable }; \r
+  fEffHisto->Fill(vEffHisto);\r
 }\r
 \r
 //_____________________________________________________________________________\r
-void AliComparisonEff::Exec(AliMCInfo* infoMC, AliESDRecInfo *infoRC)\r
+void AliComparisonEff::Exec(AliMCInfo* const infoMC, AliESDRecInfo* const infoRC)\r
 {\r
   // Process comparison information\r
-  Process(infoMC,infoRC);\r
+\r
+  if(GetAnalysisMode() == 0) ProcessTPC(infoMC,infoRC);\r
+  else if(GetAnalysisMode() == 1) ProcessTPCITS(infoMC,infoRC);\r
+  else if(GetAnalysisMode() == 2) ProcessConstrained(infoMC,infoRC);\r
+  else {\r
+    printf("ERROR: AnalysisMode %d \n",fAnalysisMode);\r
+    return;\r
+  }\r
 }\r
 \r
 //_____________________________________________________________________________\r
-Long64_t AliComparisonEff::Merge(TCollection* list) \r
+Long64_t AliComparisonEff::Merge(TCollection* const list) \r
 {\r
   // Merge list of objects (needed by PROOF)\r
 \r
@@ -614,52 +354,7 @@ Long64_t AliComparisonEff::Merge(TCollection* list)
     AliComparisonEff* entry = dynamic_cast<AliComparisonEff*>(obj);\r
     if (entry == 0) continue; \r
   \r
-    fMCPt->Add(entry->fMCPt);\r
-    fMCRecPt->Add(entry->fMCRecPt);\r
-    fMCRecPrimPt->Add(entry->fMCRecPrimPt);\r
-    fMCRecSecPt->Add(entry->fMCRecSecPt);\r
-\r
-    fEffTPCPt->Add(entry->fEffTPCPt);\r
-       fEffTPCPtMC->Add(entry->fEffTPCPtMC);\r
-       fEffTPCPtF->Add(entry->fEffTPCPtF);\r
-\r
-    fEffTPCPt_P->Add(entry->fEffTPCPt_P);\r
-       fEffTPCPtMC_P->Add(entry->fEffTPCPtMC_P);\r
-       fEffTPCPtF_P->Add(entry->fEffTPCPtF_P);\r
-\r
-    fEffTPCPt_Pi->Add(entry->fEffTPCPt_Pi);\r
-       fEffTPCPtMC_Pi->Add(entry->fEffTPCPtMC_Pi);\r
-       fEffTPCPtF_Pi->Add(entry->fEffTPCPtF_Pi);\r
-\r
-    fEffTPCPt_K->Add(entry->fEffTPCPt_K);\r
-       fEffTPCPtMC_K->Add(entry->fEffTPCPtMC_K);\r
-       fEffTPCPtF_K->Add(entry->fEffTPCPtF_K);\r
-\r
-       fEffTPCTan->Add(entry->fEffTPCTan);\r
-       fEffTPCTanMC->Add(entry->fEffTPCTanMC);\r
-       fEffTPCTanF->Add(entry->fEffTPCTanF);\r
-         \r
-       fEffTPCPtTan->Add(entry->fEffTPCPtTan);\r
-       fEffTPCPtTanMC->Add(entry->fEffTPCPtTanMC);\r
-       fEffTPCPtTanF->Add(entry->fEffTPCPtTanF);\r
-    \r
-    for(Int_t i=0; i<4; ++i)\r
-    {\r
-      fTPCPtDCASigmaIdeal[i]->Add(entry->fTPCPtDCASigmaIdeal[i]);\r
-      fTPCPtDCASigmaFull[i]->Add(entry->fTPCPtDCASigmaFull[i]);\r
-      fTPCPtDCASigmaDay0[i]->Add(entry->fTPCPtDCASigmaDay0[i]);\r
-\r
-      fTPCPtDCAXY[i]->Add(entry->fTPCPtDCAXY[i]);\r
-      fTPCPtDCAZ[i]->Add(entry->fTPCPtDCAXY[i]);\r
-\r
-      fTPCPtDCASigmaIdealPid[i]->Add(entry->fTPCPtDCASigmaIdealPid[i]);\r
-      fTPCPtDCASigmaFullPid[i]->Add(entry->fTPCPtDCASigmaFullPid[i]);\r
-      fTPCPtDCASigmaDay0Pid[i]->Add(entry->fTPCPtDCASigmaDay0Pid[i]);\r
-\r
-      fTPCPtDCAXYPid[i]->Add(entry->fTPCPtDCAXYPid[i]);\r
-      fTPCPtDCAZPid[i]->Add(entry->fTPCPtDCAXYPid[i]);\r
-    }\r
-\r
+     fEffHisto->Add(entry->fEffHisto);\r
   count++;\r
   }\r
 \r
@@ -672,219 +367,141 @@ void AliComparisonEff::Analyse()
   // Analyse comparison information and store output histograms\r
   // in the folder "folderEff" \r
   //\r
-  \r
   TH1::AddDirectory(kFALSE);\r
-\r
-  AliComparisonEff * comp=this;\r
   TObjArray *aFolderObj = new TObjArray;\r
 \r
-  // calculate efficiency and contamination (4 sigma) \r
-  TH1 *h_sigmaidealpid[20];\r
-  TH1 *h_sigmafullpid[20];\r
-  TH1 *h_sigmaday0pid[20];\r
+  // efficiency vs pt\r
+  fEffHisto->GetAxis(0)->SetRangeUser(-0.9,0.9); // eta range\r
+  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.);    // primary tracks\r
 \r
-  TH1 *h_sigmaidealpidtot[4];\r
-  TH1 *h_sigmafullpidtot[4];\r
-  TH1 *h_sigmaday0pidtot[4];\r
+  // rec efficiency vs pt\r
+  TH1D *ptAll = fEffHisto->Projection(2);\r
 \r
-  char name[256];\r
-  char name1[256];\r
-  Int_t idx;\r
+  fEffHisto->GetAxis(5)->SetRangeUser(1.,1.);  // reconstructed \r
+  TH1D *ptRec = fEffHisto->Projection(2);\r
+  ptRec->Divide(ptAll);\r
+  ptRec->SetName("ptRecEff");\r
 \r
-  for(Int_t i=0; i<4; ++i)\r
-  {\r
-     //total\r
-     comp->fTPCPtDCASigmaIdealPid[i]->GetYaxis()->SetRange(1,4);\r
-     sprintf(name,"h_sigmaidealpidtot_%d",i);\r
-     h_sigmaidealpidtot[i] = comp->fTPCPtDCASigmaIdealPid[i]->Project3D();\r
-     h_sigmaidealpidtot[i]->SetName(name);\r
-\r
-     comp->fTPCPtDCASigmaFullPid[i]->GetYaxis()->SetRange(1,4);\r
-     sprintf(name,"h_sigmafullpidtot_%d",i);\r
-     h_sigmafullpidtot[i] = comp->fTPCPtDCASigmaFullPid[i]->Project3D();\r
-     h_sigmafullpidtot[i]->SetName(name);\r
-\r
-     comp->fTPCPtDCASigmaDay0Pid[i]->GetYaxis()->SetRange(1,4);\r
-     sprintf(name,"h_sigmaday0pidtot_%d",i);\r
-     h_sigmaday0pidtot[i] = comp->fTPCPtDCASigmaDay0Pid[i]->Project3D();\r
-     h_sigmaday0pidtot[i]->SetName(name);\r
-\r
-     // pid wise\r
-     for(Int_t j=0; j<5; ++j)\r
-        {\r
-       idx = i*5 + j;\r
-\r
-       comp->fTPCPtDCASigmaIdealPid[i]->GetYaxis()->SetRange(1,4);\r
-       comp->fTPCPtDCASigmaIdealPid[i]->GetZaxis()->SetRange(j+1,j+1);\r
-\r
-       sprintf(name,"h_sigmaidealpid_%d",idx);\r
-       h_sigmaidealpid[idx] = comp->fTPCPtDCASigmaIdealPid[i]->Project3D();\r
-       h_sigmaidealpid[idx]->SetName(name);\r
-          \r
-\r
-       comp->fTPCPtDCASigmaFullPid[i]->GetYaxis()->SetRange(1,4);\r
-       comp->fTPCPtDCASigmaFullPid[i]->GetZaxis()->SetRange(j+1,j+1);\r
-\r
-       sprintf(name,"h_sigmafullpid_%d",idx);\r
-       h_sigmafullpid[idx] = comp->fTPCPtDCASigmaFullPid[i]->Project3D();\r
-       h_sigmafullpid[idx]->SetName(name);\r
-       \r
-       comp->fTPCPtDCASigmaDay0Pid[i]->GetYaxis()->SetRange(1,4);\r
-       comp->fTPCPtDCASigmaDay0Pid[i]->GetZaxis()->SetRange(j+1,j+1);\r
-\r
-       sprintf(name,"h_sigmaday0pid_%d",idx);\r
-       h_sigmaday0pid[idx] = comp->fTPCPtDCASigmaDay0Pid[i]->Project3D();\r
-       h_sigmaday0pid[idx]->SetName(name);\r
-       } \r
-  }\r
+  aFolderObj->Add(ptRec);\r
 \r
-  // calculate efficiency and contamination (all pids)\r
-  h_sigmaidealpidtot[0]->Sumw2();\r
-  h_sigmaidealpidtot[1]->Divide(h_sigmaidealpidtot[0]);\r
-  h_sigmaidealpidtot[2]->Sumw2();\r
-  h_sigmaidealpidtot[3]->Divide(h_sigmaidealpidtot[2]);\r
 \r
-  h_sigmafullpidtot[0]->Sumw2();\r
-  h_sigmafullpidtot[1]->Divide(h_sigmafullpidtot[0]);\r
-  h_sigmafullpidtot[2]->Sumw2();\r
-  h_sigmafullpidtot[3]->Divide(h_sigmafullpidtot[2]);\r
+  // rec efficiency vs pid vs pt\r
+  fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
+  fEffHisto->GetAxis(3)->SetRangeUser(2.,2.); // pions\r
+  TH1D *ptAllPi = fEffHisto->Projection(2);\r
 \r
-  h_sigmaday0pidtot[0]->Sumw2();\r
-  h_sigmaday0pidtot[1]->Divide(h_sigmaday0pidtot[0]);\r
-  h_sigmaday0pidtot[2]->Sumw2();\r
-  h_sigmaday0pidtot[3]->Divide(h_sigmaday0pidtot[2]);\r
+  fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r
+  TH1D *ptRecPi = fEffHisto->Projection(2);\r
+  ptRecPi->Divide(ptAllPi);\r
+  ptRecPi->SetName("ptRecEffPi");\r
 \r
-  // calculate efficiency pid wise\r
-  for(Int_t jdx = 0; jdx<5; jdx++)\r
-  {\r
-    h_sigmaidealpid[jdx]->Sumw2();\r
-    h_sigmaidealpid[jdx+5]->Divide(h_sigmaidealpid[jdx]);\r
+  aFolderObj->Add(ptRecPi);\r
 \r
-    h_sigmafullpid[jdx]->Sumw2();\r
-    h_sigmafullpid[jdx+5]->Divide(h_sigmafullpid[jdx]);\r
+  fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
+  fEffHisto->GetAxis(3)->SetRangeUser(3.,3.); // kaons\r
+  TH1D *ptAllK = fEffHisto->Projection(2);\r
 \r
-    h_sigmaday0pid[jdx]->Sumw2();\r
-    h_sigmaday0pid[jdx+5]->Divide(h_sigmaday0pid[jdx]);\r
-  }\r
+  fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r
+  TH1D *ptRecK = fEffHisto->Projection(2);\r
+  ptRecK->Divide(ptAllK);\r
+  ptRecK->SetName("ptRecEffK");\r
 \r
-  // calculate cont. pid wise\r
-  for(Int_t jdx = 0; jdx<5; jdx++)\r
-  {\r
-    h_sigmaidealpid[jdx+15]->Divide(h_sigmaidealpidtot[2]);\r
-    h_sigmafullpid[jdx+15]->Divide(h_sigmafullpidtot[2]);\r
-    h_sigmaday0pid[jdx+15]->Divide(h_sigmaday0pidtot[2]);\r
-  }\r
+  aFolderObj->Add(ptRecK);\r
+\r
+  fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
+  fEffHisto->GetAxis(3)->SetRangeUser(4.,4.); // protons\r
+  TH1D *ptAllP = fEffHisto->Projection(2);\r
 \r
-  TCanvas * c = new TCanvas("Efficiency","Track efficiency");\r
-  c->cd();\r
-  c->Divide(1,2);\r
+  fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r
+  TH1D *ptRecP = fEffHisto->Projection(2);\r
+  ptRecP->Divide(ptAllP);\r
+  ptRecP->SetName("ptRecEffP");\r
+\r
+  aFolderObj->Add(ptRecP);\r
+  \r
+  // findable efficiency \r
+  fEffHisto->GetAxis(3)->SetRangeUser(0.,4.); \r
+  fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
+  fEffHisto->GetAxis(6)->SetRangeUser(1.,1.); // findable\r
+  TH1D *ptAllF = fEffHisto->Projection(2);\r
+\r
+  fEffHisto->GetAxis(5)->SetRangeUser(1.,1.);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(1.,1.);\r
+  TH1D *ptRecF = fEffHisto->Projection(2); // rec findable\r
+  ptRecF->Divide(ptAllF);\r
+  ptRecF->SetName("ptRecFindableEff");\r
+\r
+  aFolderObj->Add(ptRecF);\r
 \r
   //\r
-  c->cd(1);\r
-  comp->fEffTPCTanF->SetXTitle("Tan(#theta)");\r
-  comp->fEffTPCTanF->SetYTitle("eff_{findable}");\r
-  comp->fEffTPCTanF->SetName("EffTanFindable");\r
-  comp->fEffTPCTanF->Draw();\r
+  // efficiency vs eta\r
   //\r
-  c->cd(2);\r
-  comp->fEffTPCTan->SetXTitle("Tan(#theta)");\r
-  comp->fEffTPCTan->SetYTitle("eff_{all}");\r
-  comp->fEffTPCTan->SetName("EffTanAll");\r
-  comp->fEffTPCTan->Draw();\r
-\r
-  aFolderObj->Add(comp->fEffTPCTanF);\r
-  aFolderObj->Add(comp->fEffTPCTan);\r
-\r
-  h_sigmaidealpidtot[1]->SetXTitle("p_{t}");\r
-  h_sigmaidealpidtot[1]->SetYTitle("efficiency");\r
-  h_sigmaidealpidtot[1]->SetTitle("Eff_SigmaIdeal");\r
-  h_sigmaidealpidtot[1]->SetName("Eff_SigmaIdeal");\r
-\r
-  h_sigmaidealpidtot[3]->SetXTitle("p_{t}");\r
-  h_sigmaidealpidtot[3]->SetYTitle("contamination");\r
-  h_sigmaidealpidtot[3]->SetTitle("Cont_SigmaIdeal");\r
-  h_sigmaidealpidtot[3]->SetName("Cont_SigmaIdeal");\r
-\r
-  aFolderObj->Add(h_sigmaidealpidtot[1]);\r
-  aFolderObj->Add(h_sigmaidealpidtot[3]);\r
-\r
-  h_sigmafullpidtot[1]->SetXTitle("p_{t}");\r
-  h_sigmafullpidtot[1]->SetYTitle("efficiency");\r
-  h_sigmafullpidtot[1]->SetTitle("Eff_SigmaFull");\r
-  h_sigmafullpidtot[1]->SetName("Eff_SigmaFull");\r
-\r
-  h_sigmafullpidtot[3]->SetXTitle("p_{t}");\r
-  h_sigmafullpidtot[3]->SetYTitle("contamination");\r
-  h_sigmafullpidtot[3]->SetTitle("Cont_SigmaFull");\r
-  h_sigmafullpidtot[3]->SetName("Cont_SigmaFull");\r
-\r
-  aFolderObj->Add(h_sigmafullpidtot[1]);\r
-  aFolderObj->Add(h_sigmafullpidtot[3]);\r
-\r
-  h_sigmaday0pidtot[1]->SetXTitle("p_{t}");\r
-  h_sigmaday0pidtot[1]->SetYTitle("efficiency");\r
-  h_sigmaday0pidtot[1]->SetTitle("Eff_SigmaDay0");\r
-  h_sigmaday0pidtot[1]->SetName("Eff_SigmaDay0");\r
-\r
-  h_sigmaday0pidtot[3]->SetXTitle("p_{t}");\r
-  h_sigmaday0pidtot[3]->SetYTitle("contamination");\r
-  h_sigmaday0pidtot[3]->SetTitle("Cont_SigmaDay0");\r
-  h_sigmaday0pidtot[3]->SetName("Cont_SigmaDay0");\r
-\r
-  aFolderObj->Add(h_sigmaday0pidtot[1]);\r
-  aFolderObj->Add(h_sigmaday0pidtot[3]);\r
-\r
-  for(Int_t jdx = 0; jdx<5; jdx++)\r
-  {\r
-    sprintf(name,"Eff_SigmaIdeal_%d",jdx);\r
-    sprintf(name1,"Cont_SigmaIdeal_%d",jdx);\r
 \r
+  fEffHisto->GetAxis(0)->SetRangeUser(-1.5,1.5); // eta range\r
+  fEffHisto->GetAxis(2)->SetRangeUser(0.2,10.); // pt range\r
+  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.);   // primary tracks\r
+  fEffHisto->GetAxis(5)->SetRangeUser(0.,1.);   // all\r
+  fEffHisto->GetAxis(6)->SetRangeUser(0.,1.);   // all\r
 \r
-    h_sigmaidealpid[jdx+5]->SetXTitle("p_{t}");\r
-    h_sigmaidealpid[jdx+5]->SetYTitle("efficiency");\r
-    h_sigmaidealpid[jdx+5]->SetTitle(name);\r
-    h_sigmaidealpid[jdx+5]->SetName(name);\r
+  // rec efficiency vs eta\r
+  TH1D *etaAll = fEffHisto->Projection(0);\r
 \r
-    h_sigmaidealpid[jdx+15]->SetXTitle("p_{t}");\r
-    h_sigmaidealpid[jdx+15]->SetYTitle("contamination");\r
-    h_sigmaidealpid[jdx+15]->SetTitle(name1);\r
-    h_sigmaidealpid[jdx+15]->SetName(name1);\r
+  fEffHisto->GetAxis(5)->SetRangeUser(1.,1.);  // reconstructed \r
+  TH1D *etaRec = fEffHisto->Projection(0);\r
+  etaRec->Divide(etaAll);\r
+  etaRec->SetName("etaRecEff");\r
 \r
-       aFolderObj->Add(h_sigmaidealpid[jdx+5]);\r
-       aFolderObj->Add(h_sigmaidealpid[jdx+15]);\r
+  aFolderObj->Add(etaRec);\r
 \r
-    sprintf(name,"Eff_SigmaFull_%d",jdx);\r
-    sprintf(name1,"Cont_SigmaFull_%d",jdx);\r
+  // rec efficiency vs pid vs eta\r
+  fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
+  fEffHisto->GetAxis(3)->SetRangeUser(2.,2.); // pions\r
+  TH1D *etaAllPi = fEffHisto->Projection(0);\r
 \r
-    h_sigmafullpid[jdx+5]->SetXTitle("p_{t}");\r
-    h_sigmafullpid[jdx+5]->SetYTitle("efficiency");\r
-    h_sigmafullpid[jdx+5]->SetTitle(name);\r
-    h_sigmafullpid[jdx+5]->SetName(name);\r
+  fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r
+  TH1D *etaRecPi = fEffHisto->Projection(0);\r
+  etaRecPi->Divide(etaAllPi);\r
+  etaRecPi->SetName("etaRecEffPi");\r
 \r
-    h_sigmafullpid[jdx+15]->SetXTitle("p_{t}");\r
-    h_sigmafullpid[jdx+15]->SetYTitle("contamination");\r
-    h_sigmafullpid[jdx+15]->SetTitle(name1);\r
-    h_sigmafullpid[jdx+15]->SetName(name1);\r
+  aFolderObj->Add(etaRecPi);\r
 \r
-       aFolderObj->Add(h_sigmafullpid[jdx+5]);\r
-       aFolderObj->Add(h_sigmafullpid[jdx+15]);\r
+  fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
+  fEffHisto->GetAxis(3)->SetRangeUser(3.,3.); // kaons\r
+  TH1D *etaAllK = fEffHisto->Projection(0);\r
 \r
-    sprintf(name,"Eff_SigmaDay0_%d",jdx);\r
-    sprintf(name1,"Cont_SigmaDay0_%d",jdx);\r
+  fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r
+  TH1D *etaRecK = fEffHisto->Projection(0);\r
+  etaRecK->Divide(etaAllK);\r
+  etaRecK->SetName("etaRecEffK");\r
 \r
-    h_sigmaday0pid[jdx+5]->SetXTitle("p_{t}");\r
-    h_sigmaday0pid[jdx+5]->SetYTitle("efficiency");\r
-    h_sigmaday0pid[jdx+5]->SetTitle(name);\r
-    h_sigmaday0pid[jdx+5]->SetName(name);\r
+  aFolderObj->Add(etaRecK);\r
 \r
-    h_sigmaday0pid[jdx+15]->SetXTitle("p_{t}");\r
-    h_sigmaday0pid[jdx+15]->SetYTitle("contamination");\r
-    h_sigmaday0pid[jdx+15]->SetTitle(name1);\r
-    h_sigmaday0pid[jdx+15]->SetName(name1);\r
+  fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
+  fEffHisto->GetAxis(3)->SetRangeUser(4.,4.); // protons\r
+  TH1D *etaAllP = fEffHisto->Projection(0);\r
 \r
-       aFolderObj->Add(h_sigmaday0pid[jdx+5]);\r
-       aFolderObj->Add(h_sigmaday0pid[jdx+15]);\r
-  }\r
+  fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r
+  TH1D *etaRecP = fEffHisto->Projection(0);\r
+  etaRecP->Divide(etaAllP);\r
+  etaRecP->SetName("etaRecEffP");\r
+\r
+  aFolderObj->Add(etaRecP);\r
+  \r
+  //\r
+  // findable efficiency \r
+  //\r
+  fEffHisto->GetAxis(3)->SetRangeUser(0.,4.); \r
+  fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
+  fEffHisto->GetAxis(6)->SetRangeUser(1.,1.); // findable\r
+  TH1D *etaAllF = fEffHisto->Projection(0);\r
+\r
+  fEffHisto->GetAxis(5)->SetRangeUser(1.,1.);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(1.,1.);\r
+  TH1D *etaRecF = fEffHisto->Projection(0);   // rec findable\r
+  etaRecF->Divide(etaAllF);\r
+  etaRecF->SetName("etaRecFindableEff");\r
+\r
+  aFolderObj->Add(etaRecF);\r
 \r
   // export objects to analysis folder\r
   fAnalysisFolder = ExportToFolder(aFolderObj);\r