]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
coverity
authorjotwinow <jotwinow@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 3 Jun 2011 15:09:21 +0000 (15:09 +0000)
committerjotwinow <jotwinow@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 3 Jun 2011 15:09:21 +0000 (15:09 +0000)
13 files changed:
PWG0/dNdPt/AliPtResolAnalysis.cxx
PWG0/dNdPt/AliPtResolAnalysisPbPb.cxx
PWG0/dNdPt/AlidNdPtAnalysis.cxx
PWG0/dNdPt/AlidNdPtAnalysisPbPb.cxx
PWG0/dNdPt/AlidNdPtCorrection.cxx
PWG0/dNdPt/AlidNdPtCutAnalysis.cxx
PWG0/dNdPt/AlidNdPtCutAnalysisPbPb.cxx
PWG0/dNdPt/AlidNdPtEfficiency.cxx
PWG0/dNdPt/AlidNdPtHelper.cxx
PWG0/dNdPt/macros/ApplyCorrections_PbPb.C [new file with mode: 0644]
PWG0/dNdPt/macros/ApplyCorrections_pp.C [new file with mode: 0644]
PWG0/dNdPt/macros/GenerateCorrMatr_PbPb.C [new file with mode: 0644]
PWG0/dNdPt/macros/GenerateCorrMatr_pp.C [new file with mode: 0644]

index df98479d42c6f1c42a03685ac2295ae981aa5e14..405666073b1f83d6b4a27b9b3cf0f634e24f38b2 100644 (file)
@@ -267,6 +267,7 @@ void AliPtResolAnalysis::Analyse()
   //\r
   TH1::AddDirectory(kFALSE);\r
   TObjArray *aFolderObj = new TObjArray;\r
+  if(!aFolderObj) return;\r
   \r
   //\r
   // Reconstructed event vertex\r
@@ -274,6 +275,10 @@ void AliPtResolAnalysis::Analyse()
   \r
   // export objects to analysis folder\r
   fAnalysisFolder = ExportToFolder(aFolderObj);\r
+  if(!fAnalysisFolder) { \r
+    if(aFolderObj) delete aFolderObj;\r
+    return;\r
+  }\r
 \r
   // delete only TObjArray\r
   if(aFolderObj) delete aFolderObj;\r
@@ -282,8 +287,10 @@ void AliPtResolAnalysis::Analyse()
 //_____________________________________________________________________________\r
 TFolder* AliPtResolAnalysis::ExportToFolder(TObjArray * const array) \r
 {\r
-  // recreate folder avery time and export objects to new one\r
+  // recreate folder every time and export objects to new one\r
   //\r
+  if(!array) return NULL;\r
+\r
   AliPtResolAnalysis * comp=this;\r
   TFolder *folder = comp->GetAnalysisFolder();\r
 \r
index 3e707dbd9093ffc5e1bc34d2bc26b5f688b91606..2fd662ecf4ca4c93ec8783f1ec50d5a230cf7cff 100644 (file)
@@ -284,6 +284,7 @@ void AliPtResolAnalysisPbPb::Analyse()
   //\r
   TH1::AddDirectory(kFALSE);\r
   TObjArray *aFolderObj = new TObjArray;\r
+  if(!aFolderObj) return;\r
   \r
   //\r
   // Reconstructed event vertex\r
@@ -291,6 +292,10 @@ void AliPtResolAnalysisPbPb::Analyse()
   \r
   // export objects to analysis folder\r
   fAnalysisFolder = ExportToFolder(aFolderObj);\r
+  if(!fAnalysisFolder) { \r
+    if(aFolderObj) delete aFolderObj;\r
+    return;\r
+  }\r
 \r
   // delete only TObjArray\r
   if(aFolderObj) delete aFolderObj;\r
@@ -301,6 +306,8 @@ TFolder* AliPtResolAnalysisPbPb::ExportToFolder(TObjArray * const array)
 {\r
   // recreate folder avery time and export objects to new one\r
   //\r
+  if(!array) return NULL;\r
+\r
   AliPtResolAnalysisPbPb * comp=this;\r
   TFolder *folder = comp->GetAnalysisFolder();\r
 \r
index ae9234d13e8277836318b44201b8fb31c59feee4..75a59d149694b0b994c9f4d4c1eede801e905e5f 100644 (file)
@@ -874,8 +874,8 @@ void AlidNdPtAnalysis::Init()
   Int_t binsMCTrackHist1[3]=  {fPtCorrNbins, fEtaNbins, 90};\r
   Double_t minMCTrackHist1[3]={0.,-1.,0.}; \r
   Double_t maxMCTrackHist1[3]={10.,1.,2.*TMath::Pi()}; \r
-  sprintf(name,"fMCTrackHist1_%d",i);\r
-  sprintf(title,"mcPt:mcEta:mcPhi");\r
+  snprintf(name,256,"fMCTrackHist1_%d",i);\r
+  snprintf(title,256,"mcPt:mcEta:mcPhi");\r
   \r
   fMCTrackHist1[i] = new THnSparseF(name,title,3,binsMCTrackHist1,minMCTrackHist1,maxMCTrackHist1);\r
   fMCTrackHist1[i]->SetBinEdges(0,fBinsPtCorr);\r
@@ -888,8 +888,8 @@ void AlidNdPtAnalysis::Init()
   Int_t binsMCPrimTrackHist1[5]=  {fPtCorrNbins,fEtaNbins,6,20,4000};\r
   Double_t minMCPrimTrackHist1[5]={0.,-1.,0.,0.,0.}; \r
   Double_t maxMCPrimTrackHist1[5]={10.,1.,6.,20.,4000.}; \r
-  sprintf(name,"fMCPrimTrackHist1_%d",i);\r
-  sprintf(title,"mcPt:mcEta:pid:mech:mother");\r
+  snprintf(name,256,"fMCPrimTrackHist1_%d",i);\r
+  snprintf(title,256,"mcPt:mcEta:pid:mech:mother");\r
   \r
   fMCPrimTrackHist1[i] = new THnSparseF(name,title,5,binsMCPrimTrackHist1,minMCPrimTrackHist1,maxMCPrimTrackHist1);\r
   fMCPrimTrackHist1[i]->SetBinEdges(0,fBinsPtCorr);\r
@@ -904,8 +904,8 @@ void AlidNdPtAnalysis::Init()
   Int_t binsMCPrimTrackHist2[3]=  {4000,20,4000};\r
   Double_t minMCPrimTrackHist2[3]={0.,0.,0.}; \r
   Double_t maxMCPrimTrackHist2[3]={4000.,20.,4000.}; \r
-  sprintf(name,"fMCPrimTrackHist2_%d",i);\r
-  sprintf(title,"pdg:mech:mother");\r
+  snprintf(name,256,"fMCPrimTrackHist2_%d",i);\r
+  snprintf(title,256,"pdg:mech:mother");\r
   \r
   fMCPrimTrackHist2[i] = new THnSparseF(name,title,3,binsMCPrimTrackHist2,minMCPrimTrackHist2,maxMCPrimTrackHist2);\r
   fMCPrimTrackHist2[i]->GetAxis(0)->SetTitle("pdg");\r
@@ -916,8 +916,8 @@ void AlidNdPtAnalysis::Init()
   Int_t binsMCSecTrackHist1[5]=  {fPtCorrNbins,fEtaNbins,6,20,4000};\r
   Double_t minMCSecTrackHist1[5]={0.,-1.,0.,0.,0.}; \r
   Double_t maxMCSecTrackHist1[5]={10.,1.,6.,20.,4000.};   \r
-  sprintf(name,"fMCSecTrackHist1_%d",i);\r
-  sprintf(title,"mcPt:mcEta:pid:mech:mother");\r
+  snprintf(name,256,"fMCSecTrackHist1_%d",i);\r
+  snprintf(title,256,"mcPt:mcEta:pid:mech:mother");\r
   \r
   fMCSecTrackHist1[i] = new THnSparseF(name,title,5,binsMCSecTrackHist1,minMCSecTrackHist1,maxMCSecTrackHist1);\r
   fMCSecTrackHist1[i]->SetBinEdges(0,fBinsPtCorr);\r
@@ -936,8 +936,8 @@ void AlidNdPtAnalysis::Init()
   Int_t binsRecTrackHist1[3]={fPtNbins,fEtaNbins,90};\r
   Double_t minRecTrackHist1[3]={0.,-1.,0.}; \r
   Double_t maxRecTrackHist1[3]={10.,1.,2.*TMath::Pi()};\r
-  sprintf(name,"fRecTrackHist1_%d",i);\r
-  sprintf(title,"Pt:Eta:Phi");\r
+  snprintf(name,256,"fRecTrackHist1_%d",i);\r
+  snprintf(title,256,"Pt:Eta:Phi");\r
   fRecTrackHist1[i] = new THnSparseF(name,title,3,binsRecTrackHist1,minRecTrackHist1,maxRecTrackHist1);\r
   fRecTrackHist1[i]->SetBinEdges(0,fBinsPt);\r
   fRecTrackHist1[i]->SetBinEdges(1,fBinsEta);\r
@@ -948,10 +948,8 @@ void AlidNdPtAnalysis::Init()
 \r
   // \r
   Int_t binsRecTrackMultHist1[2]={fPtNbins,fMultNbins};\r
-//   Double_t minRecTrackMultHist1[2]={0.,-0.5}; \r
-//   Double_t maxRecTrackMultHist1[2]={10.,149.5};\r
-  sprintf(name,"fRecTrackMultHist_%d",i);\r
-  sprintf(title,"Pt:Mult");\r
+  snprintf(name,256,"fRecTrackMultHist_%d",i);\r
+  snprintf(title,256,"Pt:Mult");\r
   fRecTrackMultHist1[i] = new THnSparseF(name,title,2,binsRecTrackMultHist1); //,minRecTrackMultHist1,maxRecTrackMultHist1);\r
   fRecTrackMultHist1[i]->SetBinEdges(0,fBinsPt);\r
   fRecTrackMultHist1[i]->SetBinEdges(1,fBinsMult);\r
@@ -963,8 +961,9 @@ void AlidNdPtAnalysis::Init()
   Int_t binsRecMCTrackHist1[4] = {fPtCorrNbins,fEtaNbins,100,100};\r
   Double_t minRecMCTrackHist1[4]={0.,-1.,-0.5,-0.5}; \r
   Double_t maxRecMCTrackHist1[4]={20.,1.,0.5,0.5}; \r
-  sprintf(name,"fRecMCTrackHist1");\r
-  sprintf(title,"mcPt:mcEta:(Pt-mcPt)/mcPt:(Eta-mcEta)");\r
+  snprintf(name,256,"fRecMCTrackHist1");\r
+  snprintf(title,256,"mcPt:mcEta:(Pt-mcPt)/mcPt:(Eta-mcEta)");\r
+\r
   fRecMCTrackHist1 = new THnSparseF(name,title,4,binsRecMCTrackHist1,minRecMCTrackHist1,maxRecMCTrackHist1);\r
   fRecMCTrackHist1->SetBinEdges(0,fBinsPtCorr);\r
   fRecMCTrackHist1->SetBinEdges(1,fBinsEta);\r
@@ -976,8 +975,8 @@ void AlidNdPtAnalysis::Init()
   Int_t binsMCMultRecTrackHist1[3] = {fPtCorrNbins,fEtaNbins,6};\r
   Double_t minMCMultRecTrackHist1[3]={0.,-1.,0.}; \r
   Double_t maxMCMultRecTrackHist1[3]={20.,1.,6.}; \r
-  sprintf(name,"fMCMultRecTrackHist1");\r
-  sprintf(title,"mcPt:mcEta:pid");\r
+  snprintf(name,256,"fMCMultRecTrackHist1");\r
+  snprintf(title,256,"mcPt:mcEta:pid");\r
   fMCMultRecTrackHist1 = new THnSparseF(name,title,3,binsMCMultRecTrackHist1,minMCMultRecTrackHist1,maxMCMultRecTrackHist1);\r
   fMCMultRecTrackHist1->SetBinEdges(0,fBinsPtCorr);\r
   fMCMultRecTrackHist1->SetBinEdges(1,fBinsEta);\r
@@ -2594,13 +2593,13 @@ void AlidNdPtAnalysis::Analyse()
 \r
   for(Int_t i = 0; i<6; i++) \r
   { \r
-    sprintf(name,"mc_pt_rec_prim_pid_%d",i); \r
+    snprintf(name,256,"mc_pt_rec_prim_pid_%d",i); \r
     fMCPrimTrackHist1[2]->GetAxis(2)->SetRange(i+1,i+1);\r
     h = fMCPrimTrackHist1[2]->Projection(0);\r
     h->SetName(name);\r
     aFolderObj->Add(h);\r
 \r
-    sprintf(name,"mc_pt_rec_sec_pid_%d",i); \r
+    snprintf(name,256,"mc_pt_rec_sec_pid_%d",i); \r
     fMCSecTrackHist1[2]->GetAxis(2)->SetRange(i+1,i+1);\r
     h = fMCSecTrackHist1[2]->Projection(0);\r
     h->SetName(name);\r
@@ -2613,19 +2612,19 @@ void AlidNdPtAnalysis::Analyse()
       if(j == 4) {\r
         // decay\r
        \r
-        sprintf(name,"mc_pt_rec_sec_pid_%d_decay",i); \r
+        snprintf(name,256,"mc_pt_rec_sec_pid_%d_decay",i); \r
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);\r
         h = fMCSecTrackHist1[2]->Projection(0);\r
         h->SetName(name);\r
         aFolderObj->Add(h);\r
 \r
-        sprintf(name,"mc_eta_rec_sec_pid_%d_decay",i); \r
+        snprintf(name,256,"mc_eta_rec_sec_pid_%d_decay",i); \r
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);\r
         h = fMCSecTrackHist1[2]->Projection(1);\r
         h->SetName(name);\r
         aFolderObj->Add(h);\r
 \r
-        sprintf(name,"mc_mother_rec_sec_pid_%d_decay",i); \r
+        snprintf(name,256,"mc_mother_rec_sec_pid_%d_decay",i); \r
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);\r
         h = fMCSecTrackHist1[2]->Projection(4);\r
         h->SetName(name);\r
@@ -2634,19 +2633,19 @@ void AlidNdPtAnalysis::Analyse()
       } else if (j == 5) {\r
        // conversion\r
 \r
-        sprintf(name,"mc_pt_rec_sec_pid_%d_conv",i); \r
+        snprintf(name,256,"mc_pt_rec_sec_pid_%d_conv",i); \r
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);\r
         h = fMCSecTrackHist1[2]->Projection(0);\r
         h->SetName(name);\r
         aFolderObj->Add(h);\r
 \r
-        sprintf(name,"mc_eta_rec_sec_pid_%d_conv",i); \r
+        snprintf(name,256,"mc_eta_rec_sec_pid_%d_conv",i); \r
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);\r
         h = fMCSecTrackHist1[2]->Projection(1);\r
         h->SetName(name);\r
         aFolderObj->Add(h);\r
 \r
-        sprintf(name,"mc_mother_rec_sec_pid_%d_conv",i); \r
+        snprintf(name,256,"mc_mother_rec_sec_pid_%d_conv",i); \r
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);\r
         h = fMCSecTrackHist1[2]->Projection(4);\r
         h->SetName(name);\r
@@ -2655,31 +2654,31 @@ void AlidNdPtAnalysis::Analyse()
      } else if (j == 13) {\r
        // mat\r
        \r
-        sprintf(name,"mc_pt_rec_sec_pid_%d_mat",i); \r
+        snprintf(name,256,"mc_pt_rec_sec_pid_%d_mat",i); \r
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);\r
         h = fMCSecTrackHist1[2]->Projection(0);\r
         h->SetName(name);\r
         aFolderObj->Add(h);\r
 \r
-        sprintf(name,"mc_eta_rec_sec_pid_%d_mat",i); \r
+        snprintf(name,256,"mc_eta_rec_sec_pid_%d_mat",i); \r
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);\r
         h = fMCSecTrackHist1[2]->Projection(1);\r
         h->SetName(name);\r
         aFolderObj->Add(h);\r
 \r
-        sprintf(name,"mc_eta_mother_rec_sec_pid_%d_mat",i); \r
+        snprintf(name,256,"mc_eta_mother_rec_sec_pid_%d_mat",i); \r
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);\r
         h = fMCSecTrackHist1[2]->Projection(4,1);\r
         h->SetName(name);\r
         aFolderObj->Add(h);\r
 \r
-        sprintf(name,"mc_mother_rec_sec_pid_%d_mat",i); \r
+        snprintf(name,256,"mc_mother_rec_sec_pid_%d_mat",i); \r
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);\r
         h = fMCSecTrackHist1[2]->Projection(4);\r
         h->SetName(name);\r
         aFolderObj->Add(h);\r
 \r
-        sprintf(name,"mc_pt_mother_rec_sec_pid_%d_mat",i); \r
+        snprintf(name,256,"mc_pt_mother_rec_sec_pid_%d_mat",i); \r
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);\r
         h = fMCSecTrackHist1[2]->Projection(4,0);\r
         h->SetName(name);\r
index 981eb6691fd162064474a0b2cf79084ee16c9d2c..8113bb47975aecb61475f285b7c71f2e78c88da0 100644 (file)
@@ -551,8 +551,8 @@ void AlidNdPtAnalysisPbPb::Init() {
   Int_t binsMCTrackHist1[4]=  {fPtNbins, fEtaNbins, 90, fCentralityNbins};
   Double_t minMCTrackHist1[4]={0.,-1.5,0., 0.}; 
   Double_t maxMCTrackHist1[4]={50,1.5,2.*TMath::Pi(), 100.}; 
-  sprintf(name,"fMCTrackHist1_%d",i);
-  sprintf(title,"mcPt:mcEta:mcPhi:Centrality");
+  snprintf(name,256,"fMCTrackHist1_%d",i);
+  snprintf(title,256,"mcPt:mcEta:mcPhi:Centrality");
   
   fMCTrackHist1[i] = new THnSparseF(name,title,4,binsMCTrackHist1,minMCTrackHist1,maxMCTrackHist1);
   fMCTrackHist1[i]->SetBinEdges(0,fBinsPt);
@@ -567,8 +567,8 @@ void AlidNdPtAnalysisPbPb::Init() {
   Int_t binsMCPrimTrackHist1[6]=  {fPtNbins,fEtaNbins,6,20,4000, fCentralityNbins};
   Double_t minMCPrimTrackHist1[6]={0.,-1.5,0.,0.,0., 0.}; 
   Double_t maxMCPrimTrackHist1[6]={50.,1.5,6.,20.,4000., 100.}; 
-  sprintf(name,"fMCPrimTrackHist1_%d",i);
-  sprintf(title,"mcPt:mcEta:pid:mech:mother:Centrality");
+  snprintf(name,256,"fMCPrimTrackHist1_%d",i);
+  snprintf(title,256,"mcPt:mcEta:pid:mech:mother:Centrality");
   
   fMCPrimTrackHist1[i] = new THnSparseF(name,title,6,binsMCPrimTrackHist1,minMCPrimTrackHist1,maxMCPrimTrackHist1);
   fMCPrimTrackHist1[i]->SetBinEdges(0,fBinsPt);
@@ -585,8 +585,8 @@ void AlidNdPtAnalysisPbPb::Init() {
   Int_t binsMCPrimTrackHist2[4]=  {4000,20,4000,fCentralityNbins};
   Double_t minMCPrimTrackHist2[4]={0.,0.,0., 0.}; 
   Double_t maxMCPrimTrackHist2[4]={4000.,20.,4000., 100.}; 
-  sprintf(name,"fMCPrimTrackHist2_%d",i);
-  sprintf(title,"pdg:mech:mother:Centrality");
+  snprintf(name,256,"fMCPrimTrackHist2_%d",i);
+  snprintf(title,256,"pdg:mech:mother:Centrality");
   
   fMCPrimTrackHist2[i] = new THnSparseF(name,title,4,binsMCPrimTrackHist2,minMCPrimTrackHist2,maxMCPrimTrackHist2);
   fMCPrimTrackHist2[i]->SetBinEdges(3,fBinsCentrality);
@@ -599,8 +599,8 @@ void AlidNdPtAnalysisPbPb::Init() {
   Int_t binsMCSecTrackHist1[6]=  {fPtNbins,fEtaNbins,6,20,4000, fCentralityNbins};
   Double_t minMCSecTrackHist1[6]={0.,-1.5,0.,0.,0., 0.}; 
   Double_t maxMCSecTrackHist1[6]={50.,1.5,6.,20.,4000., 100.}; 
-  sprintf(name,"fMCSecTrackHist1_%d",i);
-  sprintf(title,"mcPt:mcEta:pid:mech:mother:Centrality");
+  snprintf(name,256,"fMCSecTrackHist1_%d",i);
+  snprintf(title,256,"mcPt:mcEta:pid:mech:mother:Centrality");
   
   fMCSecTrackHist1[i] = new THnSparseF(name,title,6,binsMCSecTrackHist1,minMCSecTrackHist1,maxMCSecTrackHist1);
   fMCSecTrackHist1[i]->SetBinEdges(0,fBinsPt);
@@ -617,8 +617,8 @@ void AlidNdPtAnalysisPbPb::Init() {
   Int_t binsRecTrackHist1[4]={fPtNbins,fEtaNbins,90, fCentralityNbins};
   Double_t minRecTrackHist1[4]={0.,-1.5,0., 0.}; 
   Double_t maxRecTrackHist1[4]={50.,1.5,2.*TMath::Pi(), 100.};
-  sprintf(name,"fRecTrackHist1_%d",i);
-  sprintf(title,"Pt:Eta:Phi:Centrality");
+  snprintf(name,256,"fRecTrackHist1_%d",i);
+  snprintf(title,256,"Pt:Eta:Phi:Centrality");
   fRecTrackHist1[i] = new THnSparseF(name,title,4,binsRecTrackHist1,minRecTrackHist1,maxRecTrackHist1);
   fRecTrackHist1[i]->SetBinEdges(0,fBinsPt);
   fRecTrackHist1[i]->SetBinEdges(1,fBinsEta);
@@ -629,8 +629,8 @@ void AlidNdPtAnalysisPbPb::Init() {
   fRecTrackHist1[i]->GetAxis(3)->SetTitle("Centrality");
   fRecTrackHist1[i]->Sumw2();
 
-  sprintf(name,"fRecTrackHist2_%d",i);
-  sprintf(title,"Zv:Pt:Eta:Centrality");
+  snprintf(name,256,"fRecTrackHist2_%d",i);
+  snprintf(title,256,"Zv:Pt:Eta:Centrality");
   fRecTrackHist2[i] = new THnSparseF(name,title,4,binsTrackEvent);
   fRecTrackHist2[i]->SetBinEdges(0,fBinsZv);
   fRecTrackHist2[i]->SetBinEdges(1,fBinsPt);
@@ -646,8 +646,8 @@ void AlidNdPtAnalysisPbPb::Init() {
   Int_t binsRecTrackMultHist1[3]={fPtNbins,fMultNbins, fCentralityNbins};
   Double_t minRecTrackMultHist1[3]={0.,-0.5, -0.}; 
   Double_t maxRecTrackMultHist1[3]={50.,10000.5, 100.};
-  sprintf(name,"fRecTrackMultHist_%d",i);
-  sprintf(title,"Pt:Mult:Centrality");
+  snprintf(name,256,"fRecTrackMultHist_%d",i);
+  snprintf(title,256,"Pt:Mult:Centrality");
   fRecTrackMultHist1[i] = new THnSparseF(name,title,3,binsRecTrackMultHist1,minRecTrackMultHist1,maxRecTrackMultHist1);
   fRecTrackMultHist1[i]->SetBinEdges(0,fBinsPt);
   fRecTrackMultHist1[i]->SetBinEdges(1,fBinsMult);
@@ -662,8 +662,8 @@ void AlidNdPtAnalysisPbPb::Init() {
   Double_t minRecMCTrackHist1[5]={0.,-1.5,-0.5,-0.5, 0.}; 
   Double_t maxRecMCTrackHist1[5]={50.,1.5,0.5,0.5, 100.}; 
 
-  sprintf(name,"fRecMCTrackHist1");
-  sprintf(title,"mcPt:mcEta:(Pt-mcPt)/mcPt:(Eta-mcEta):Centrality");
+  snprintf(name,256,"fRecMCTrackHist1");
+  snprintf(title,256,"mcPt:mcEta:(Pt-mcPt)/mcPt:(Eta-mcEta):Centrality");
   fRecMCTrackHist1 = new THnSparseF(name,title,5,binsRecMCTrackHist1,minRecMCTrackHist1,maxRecMCTrackHist1);
   fRecMCTrackHist1->SetBinEdges(0,fBinsPt);
   fRecMCTrackHist1->SetBinEdges(1,fBinsEta);
@@ -677,8 +677,8 @@ void AlidNdPtAnalysisPbPb::Init() {
   Int_t binsMCMultRecTrackHist1[4] = {fPtNbins,fEtaNbins,6, fCentralityNbins};
   Double_t minMCMultRecTrackHist1[4]={0.,-1.5,0., 0.}; 
   Double_t maxMCMultRecTrackHist1[4]={50.,1.5,6., 100.}; 
-  sprintf(name,"fMCMultRecTrackHist1");
-  sprintf(title,"mcPt:mcEta:pid:Centrality");
+  snprintf(name,256,"fMCMultRecTrackHist1");
+  snprintf(title,256,"mcPt:mcEta:pid:Centrality");
   fMCMultRecTrackHist1 = new THnSparseF(name,title,4,binsMCMultRecTrackHist1,minMCMultRecTrackHist1,maxMCMultRecTrackHist1);
   fMCMultRecTrackHist1->SetBinEdges(0,fBinsPt);
   fMCMultRecTrackHist1->SetBinEdges(1,fBinsEta);
@@ -1842,13 +1842,13 @@ void AlidNdPtAnalysisPbPb::Analyse()
 
   for(Int_t i = 0; i<6; i++) 
   { 
-    sprintf(name,"mc_pt_rec_prim_pid_%d",i); 
+    snprintf(name,256,"mc_pt_rec_prim_pid_%d",i); 
     fMCPrimTrackHist1[2]->GetAxis(2)->SetRange(i+1,i+1);
     h = fMCPrimTrackHist1[2]->Projection(0);
     h->SetName(name);
     aFolderObj->Add(h);
 
-    sprintf(name,"mc_pt_rec_sec_pid_%d",i); 
+    snprintf(name,256,"mc_pt_rec_sec_pid_%d",i); 
     fMCSecTrackHist1[2]->GetAxis(2)->SetRange(i+1,i+1);
     h = fMCSecTrackHist1[2]->Projection(0);
     h->SetName(name);
@@ -1861,19 +1861,19 @@ void AlidNdPtAnalysisPbPb::Analyse()
       if(j == 4) {
         // decay
        
-        sprintf(name,"mc_pt_rec_sec_pid_%d_decay",i); 
+        snprintf(name,256,"mc_pt_rec_sec_pid_%d_decay",i); 
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
         h = fMCSecTrackHist1[2]->Projection(0);
         h->SetName(name);
         aFolderObj->Add(h);
 
-        sprintf(name,"mc_eta_rec_sec_pid_%d_decay",i); 
+        snprintf(name,256,"mc_eta_rec_sec_pid_%d_decay",i); 
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
         h = fMCSecTrackHist1[2]->Projection(1);
         h->SetName(name);
         aFolderObj->Add(h);
 
-        sprintf(name,"mc_mother_rec_sec_pid_%d_decay",i); 
+        snprintf(name,256,"mc_mother_rec_sec_pid_%d_decay",i); 
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
         h = fMCSecTrackHist1[2]->Projection(4);
         h->SetName(name);
@@ -1882,19 +1882,19 @@ void AlidNdPtAnalysisPbPb::Analyse()
       } else if (j == 5) {
        // conversion
 
-        sprintf(name,"mc_pt_rec_sec_pid_%d_conv",i); 
+        snprintf(name,256,"mc_pt_rec_sec_pid_%d_conv",i); 
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
         h = fMCSecTrackHist1[2]->Projection(0);
         h->SetName(name);
         aFolderObj->Add(h);
 
-        sprintf(name,"mc_eta_rec_sec_pid_%d_conv",i); 
+        snprintf(name,256,"mc_eta_rec_sec_pid_%d_conv",i); 
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
         h = fMCSecTrackHist1[2]->Projection(1);
         h->SetName(name);
         aFolderObj->Add(h);
 
-        sprintf(name,"mc_mother_rec_sec_pid_%d_conv",i); 
+        snprintf(name,256,"mc_mother_rec_sec_pid_%d_conv",i); 
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
         h = fMCSecTrackHist1[2]->Projection(4);
         h->SetName(name);
@@ -1903,31 +1903,31 @@ void AlidNdPtAnalysisPbPb::Analyse()
      } else if (j == 13) {
        // mat
        
-        sprintf(name,"mc_pt_rec_sec_pid_%d_mat",i); 
+        snprintf(name,256,"mc_pt_rec_sec_pid_%d_mat",i); 
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
         h = fMCSecTrackHist1[2]->Projection(0);
         h->SetName(name);
         aFolderObj->Add(h);
 
-        sprintf(name,"mc_eta_rec_sec_pid_%d_mat",i); 
+        snprintf(name,256,"mc_eta_rec_sec_pid_%d_mat",i); 
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
         h = fMCSecTrackHist1[2]->Projection(1);
         h->SetName(name);
         aFolderObj->Add(h);
 
-        sprintf(name,"mc_eta_mother_rec_sec_pid_%d_mat",i); 
+        snprintf(name,256,"mc_eta_mother_rec_sec_pid_%d_mat",i); 
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
         h = fMCSecTrackHist1[2]->Projection(4,1);
         h->SetName(name);
         aFolderObj->Add(h);
 
-        sprintf(name,"mc_mother_rec_sec_pid_%d_mat",i); 
+        snprintf(name,256,"mc_mother_rec_sec_pid_%d_mat",i); 
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
         h = fMCSecTrackHist1[2]->Projection(4);
         h->SetName(name);
         aFolderObj->Add(h);
 
-        sprintf(name,"mc_pt_mother_rec_sec_pid_%d_mat",i); 
+        snprintf(name,256,"mc_pt_mother_rec_sec_pid_%d_mat",i); 
         fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
         h = fMCSecTrackHist1[2]->Projection(4,0);
         h->SetName(name);
index 5876d033cdd841715c5ded5c8ebb074e2371af1a..f9ed195a8b6364d1f3dfba8ff9c4939d6ed40704 100644 (file)
@@ -348,8 +348,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCAllPrimTrackMultHist1[3]={ptNbins,etaNbins,150};\r
   Double_t minMCAllPrimTrackMultHist1[3]={0.,-1.,-0.5}; \r
   Double_t maxMCAllPrimTrackMultHist1[3]={20.,1.,149.5}; \r
-  sprintf(name,"fMCAllPrimTrackMultHist1");\r
-  sprintf(title,"mcPt:mcEta:multiplicity");\r
+  snprintf(name,256,"fMCAllPrimTrackMultHist1");\r
+  snprintf(title,256,"mcPt:mcEta:multiplicity");\r
   \r
   fMCAllPrimTrackMultHist1 = new THnSparseF(name,title,3,binsMCAllPrimTrackMultHist1,minMCAllPrimTrackMultHist1,maxMCAllPrimTrackMultHist1);\r
   fMCAllPrimTrackMultHist1->SetBinEdges(0,binsPt);\r
@@ -362,8 +362,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCNDEventAllPrimTrackMultHist1[3]={ptNbins,etaNbins,150};\r
   Double_t minMCNDEventAllPrimTrackMultHist1[3]={0.,-1.,-0.5}; \r
   Double_t maxMCNDEventAllPrimTrackMultHist1[3]={20.,1.,149.5}; \r
-  sprintf(name,"fMCNDEventAllPrimTrackMultHist1");\r
-  sprintf(title,"mcPt:mcEta:multiplicity");\r
+  snprintf(name,256,"fMCNDEventAllPrimTrackMultHist1");\r
+  snprintf(title,256,"mcPt:mcEta:multiplicity");\r
   \r
   fMCNDEventAllPrimTrackMultHist1 = new THnSparseF(name,title,3,binsMCNDEventAllPrimTrackMultHist1,minMCNDEventAllPrimTrackMultHist1,maxMCNDEventAllPrimTrackMultHist1);\r
   fMCNDEventAllPrimTrackMultHist1->SetBinEdges(0,binsPt);\r
@@ -376,8 +376,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCNSDEventAllPrimTrackMultHist1[3]={ptNbins,etaNbins,150};\r
   Double_t minMCNSDEventAllPrimTrackMultHist1[3]={0.,-1.,-0.5}; \r
   Double_t maxMCNSDEventAllPrimTrackMultHist1[3]={20.,1.,149.5}; \r
-  sprintf(name,"fMCNSDEventAllPrimTrackMultHist1");\r
-  sprintf(title,"mcPt:mcEta:multiplicity");\r
+  snprintf(name,256,"fMCNSDEventAllPrimTrackMultHist1");\r
+  snprintf(title,256,"mcPt:mcEta:multiplicity");\r
   \r
   fMCNSDEventAllPrimTrackMultHist1 = new THnSparseF(name,title,3,binsMCNSDEventAllPrimTrackMultHist1,minMCNSDEventAllPrimTrackMultHist1,maxMCNSDEventAllPrimTrackMultHist1);\r
   fMCNSDEventAllPrimTrackMultHist1->SetBinEdges(0,binsPt);\r
@@ -390,8 +390,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCEventTriggerPrimTrackMultHist1[3]={ptNbins,etaNbins,150};\r
   Double_t minMCEventTriggerPrimTrackMultHist1[3]={0.,-1.,-0.5}; \r
   Double_t maxMCEventTriggerPrimTrackMultHist1[3]={20.,1.,149.5}; \r
-  sprintf(name,"fMCTriggerPrimTrackMultHist1");\r
-  sprintf(title,"mcPt:mcEta:multiplicity");\r
+  snprintf(name,256,"fMCTriggerPrimTrackMultHist1");\r
+  snprintf(title,256,"mcPt:mcEta:multiplicity");\r
   \r
   fMCTriggerPrimTrackMultHist1 = new THnSparseF(name,title,3,binsMCEventTriggerPrimTrackMultHist1,minMCEventTriggerPrimTrackMultHist1,maxMCEventTriggerPrimTrackMultHist1);\r
   fMCTriggerPrimTrackMultHist1->SetBinEdges(0,binsPt);\r
@@ -404,8 +404,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCEventPrimTrackMultHist1[3]={ptNbins,etaNbins,150};\r
   Double_t minMCEventPrimTrackMultHist1[3]={0.,-1.,-0.5}; \r
   Double_t maxMCEventPrimTrackMultHist1[3]={20.,1.,149.5}; \r
-  sprintf(name,"fMCEventPrimTrackMultHist1");\r
-  sprintf(title,"mcPt:mcEta:multiplicity");\r
+  snprintf(name,256,"fMCEventPrimTrackMultHist1");\r
+  snprintf(title,256,"mcPt:mcEta:multiplicity");\r
   \r
   fMCEventPrimTrackMultHist1 = new THnSparseF(name,title,3,binsMCEventPrimTrackMultHist1,minMCEventPrimTrackMultHist1,maxMCEventPrimTrackMultHist1);\r
   fMCEventPrimTrackMultHist1->SetBinEdges(0,binsPt);\r
@@ -422,8 +422,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCAllPrimTrackTrueMultHist1[3]={ptNbins,etaNbins,150};\r
   Double_t minMCAllPrimTrackTrueMultHist1[3]={0.,-1.,-0.5}; \r
   Double_t maxMCAllPrimTrackTrueMultHist1[3]={20.,1.,149.5}; \r
-  sprintf(name,"fMCAllPrimTrackTrueMultHist1");\r
-  sprintf(title,"mcPt:mcEta:true_mult");\r
+  snprintf(name,256,"fMCAllPrimTrackTrueMultHist1");\r
+  snprintf(title,256,"mcPt:mcEta:true_mult");\r
   \r
   fMCAllPrimTrackTrueMultHist1 = new THnSparseF(name,title,3,binsMCAllPrimTrackTrueMultHist1,minMCAllPrimTrackTrueMultHist1,maxMCAllPrimTrackTrueMultHist1);\r
   fMCAllPrimTrackTrueMultHist1->SetBinEdges(0,binsPt);\r
@@ -436,8 +436,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCNDEventAllPrimTrackTrueMultHist1[3]={ptNbins,etaNbins,150};\r
   Double_t minMCNDEventAllPrimTrackTrueMultHist1[3]={0.,-1.,-0.5}; \r
   Double_t maxMCNDEventAllPrimTrackTrueMultHist1[3]={20.,1.,149.5}; \r
-  sprintf(name,"fMCNDEventAllPrimTrackTrueMultHist1");\r
-  sprintf(title,"mcPt:mcEta:true_mult");\r
+  snprintf(name,256,"fMCNDEventAllPrimTrackTrueMultHist1");\r
+  snprintf(title,256,"mcPt:mcEta:true_mult");\r
   \r
   fMCNDEventAllPrimTrackTrueMultHist1 = new THnSparseF(name,title,3,binsMCNDEventAllPrimTrackTrueMultHist1,minMCNDEventAllPrimTrackTrueMultHist1,maxMCNDEventAllPrimTrackTrueMultHist1);\r
   fMCNDEventAllPrimTrackTrueMultHist1->SetBinEdges(0,binsPt);\r
@@ -450,8 +450,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCNSDEventAllPrimTrackTrueMultHist1[3]={ptNbins,etaNbins,150};\r
   Double_t minMCNSDEventAllPrimTrackTrueMultHist1[3]={0.,-1.,-0.5}; \r
   Double_t maxMCNSDEventAllPrimTrackTrueMultHist1[3]={20.,1.,149.5}; \r
-  sprintf(name,"fMCNSDEventAllPrimTrackTrueMultHist1");\r
-  sprintf(title,"mcPt:mcEta:true_mult");\r
+  snprintf(name,256,"fMCNSDEventAllPrimTrackTrueMultHist1");\r
+  snprintf(title,256,"mcPt:mcEta:true_mult");\r
   \r
   fMCNSDEventAllPrimTrackTrueMultHist1 = new THnSparseF(name,title,3,binsMCNSDEventAllPrimTrackTrueMultHist1,minMCNSDEventAllPrimTrackTrueMultHist1,maxMCNSDEventAllPrimTrackTrueMultHist1);\r
   fMCNSDEventAllPrimTrackTrueMultHist1->SetBinEdges(0,binsPt);\r
@@ -464,8 +464,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCEventTriggerPrimTrackTrueMultHist1[3]={ptNbins,etaNbins,150};\r
   Double_t minMCEventTriggerPrimTrackTrueMultHist1[3]={0.,-1.,-0.5}; \r
   Double_t maxMCEventTriggerPrimTrackTrueMultHist1[3]={20.,1.,149.5}; \r
-  sprintf(name,"fMCTriggerPrimTrackTrueMultHist1");\r
-  sprintf(title,"mcPt:mcEta:true_mult");\r
+  snprintf(name,256,"fMCTriggerPrimTrackTrueMultHist1");\r
+  snprintf(title,256,"mcPt:mcEta:true_mult");\r
   \r
   fMCTriggerPrimTrackTrueMultHist1 = new THnSparseF(name,title,3,binsMCEventTriggerPrimTrackTrueMultHist1,minMCEventTriggerPrimTrackTrueMultHist1,maxMCEventTriggerPrimTrackTrueMultHist1);\r
   fMCTriggerPrimTrackTrueMultHist1->SetBinEdges(0,binsPt);\r
@@ -478,8 +478,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCEventPrimTrackTrueMultHist1[3]={ptNbins,etaNbins,150};\r
   Double_t minMCEventPrimTrackTrueMultHist1[3]={0.,-1.,-0.5}; \r
   Double_t maxMCEventPrimTrackTrueMultHist1[3]={20.,1.,149.5}; \r
-  sprintf(name,"fMCEventPrimTrackTrueMultHist1");\r
-  sprintf(title,"mcPt:mcEta:true_mult");\r
+  snprintf(name,256,"fMCEventPrimTrackTrueMultHist1");\r
+  snprintf(title,256,"mcPt:mcEta:true_mult");\r
   \r
   fMCEventPrimTrackTrueMultHist1 = new THnSparseF(name,title,3,binsMCEventPrimTrackTrueMultHist1,minMCEventPrimTrackTrueMultHist1,maxMCEventPrimTrackTrueMultHist1);\r
   fMCEventPrimTrackTrueMultHist1->SetBinEdges(0,binsPt);\r
@@ -496,8 +496,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCAllPrimTrackTrueMultHist2[3]={ptNbins,150,150};\r
   Double_t minMCAllPrimTrackTrueMultHist2[3]={0.,-0.5,-0.5}; \r
   Double_t maxMCAllPrimTrackTrueMultHist2[3]={20.,149.5,149.5}; \r
-  sprintf(name,"fMCAllPrimTrackTrueMultHist2");\r
-  sprintf(title,"mcPt:mult:true_mult");\r
+  snprintf(name,256,"fMCAllPrimTrackTrueMultHist2");\r
+  snprintf(title,256,"mcPt:mult:true_mult");\r
   \r
   fMCAllPrimTrackTrueMultHist2 = new THnSparseF(name,title,3,binsMCAllPrimTrackTrueMultHist2,minMCAllPrimTrackTrueMultHist2,maxMCAllPrimTrackTrueMultHist2);\r
   fMCAllPrimTrackTrueMultHist2->SetBinEdges(0,binsPt);\r
@@ -509,8 +509,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCNDEventAllPrimTrackTrueMultHist2[3]={ptNbins,150,150};\r
   Double_t minMCNDEventAllPrimTrackTrueMultHist2[3]={0.,-0.5,-0.5}; \r
   Double_t maxMCNDEventAllPrimTrackTrueMultHist2[3]={20.,149.5,149.5}; \r
-  sprintf(name,"fMCNDEventAllPrimTrackTrueMultHist2");\r
-  sprintf(title,"mcPt:mult:true_mult");\r
+  snprintf(name,256,"fMCNDEventAllPrimTrackTrueMultHist2");\r
+  snprintf(title,256,"mcPt:mult:true_mult");\r
   \r
   fMCNDEventAllPrimTrackTrueMultHist2 = new THnSparseF(name,title,3,binsMCNDEventAllPrimTrackTrueMultHist2,minMCNDEventAllPrimTrackTrueMultHist2,maxMCNDEventAllPrimTrackTrueMultHist2);\r
   fMCNDEventAllPrimTrackTrueMultHist2->SetBinEdges(0,binsPt);\r
@@ -522,8 +522,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCNSDEventAllPrimTrackTrueMultHist2[3]={ptNbins,150,150};\r
   Double_t minMCNSDEventAllPrimTrackTrueMultHist2[3]={0.,-0.5,-0.5}; \r
   Double_t maxMCNSDEventAllPrimTrackTrueMultHist2[3]={20.,149.5,149.5}; \r
-  sprintf(name,"fMCNSDEventAllPrimTrackTrueMultHist2");\r
-  sprintf(title,"mcPt:mult:true_mult");\r
+  snprintf(name,256,"fMCNSDEventAllPrimTrackTrueMultHist2");\r
+  snprintf(title,256,"mcPt:mult:true_mult");\r
   \r
   fMCNSDEventAllPrimTrackTrueMultHist2 = new THnSparseF(name,title,3,binsMCNSDEventAllPrimTrackTrueMultHist2,minMCNSDEventAllPrimTrackTrueMultHist2,maxMCNSDEventAllPrimTrackTrueMultHist2);\r
   fMCNSDEventAllPrimTrackTrueMultHist2->SetBinEdges(0,binsPt);\r
@@ -535,8 +535,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCEventTriggerPrimTrackTrueMultHist2[3]={ptNbins,150,150};\r
   Double_t minMCEventTriggerPrimTrackTrueMultHist2[3]={0.,-0.5,-0.5}; \r
   Double_t maxMCEventTriggerPrimTrackTrueMultHist2[3]={20.,149.5,149.5}; \r
-  sprintf(name,"fMCTriggerPrimTrackTrueMultHist2");\r
-  sprintf(title,"mcPt:mult:true_mult");\r
+  snprintf(name,256,"fMCTriggerPrimTrackTrueMultHist2");\r
+  snprintf(title,256,"mcPt:mult:true_mult");\r
   \r
   fMCTriggerPrimTrackTrueMultHist2 = new THnSparseF(name,title,3,binsMCEventTriggerPrimTrackTrueMultHist2,minMCEventTriggerPrimTrackTrueMultHist2,maxMCEventTriggerPrimTrackTrueMultHist2);\r
   fMCTriggerPrimTrackTrueMultHist2->SetBinEdges(0,binsPt);\r
@@ -548,8 +548,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCEventPrimTrackTrueMultHist2[3]={ptNbins,150,150};\r
   Double_t minMCEventPrimTrackTrueMultHist2[3]={0.,-0.5,-0.5}; \r
   Double_t maxMCEventPrimTrackTrueMultHist2[3]={20.,149.5,149.5}; \r
-  sprintf(name,"fMCEventPrimTrackTrueMultHist2");\r
-  sprintf(title,"mcPt:mult:true_mult");\r
+  snprintf(name,256,"fMCEventPrimTrackTrueMultHist2");\r
+  snprintf(title,256,"mcPt:mult:true_mult");\r
   \r
   fMCEventPrimTrackTrueMultHist2 = new THnSparseF(name,title,3,binsMCEventPrimTrackTrueMultHist2,minMCEventPrimTrackTrueMultHist2,maxMCEventPrimTrackTrueMultHist2);\r
   fMCEventPrimTrackTrueMultHist2->SetBinEdges(0,binsPt);\r
@@ -565,8 +565,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCAllPrimTrackMeanPtTrueMult1[2]={100,150};\r
   Double_t minMCAllPrimTrackMeanPtTrueMult1[2]={0.,-0.5}; \r
   Double_t maxMCAllPrimTrackMeanPtTrueMult1[2]={10.,149.5}; \r
-  sprintf(name,"fMCAllPrimTrackMeanPtTrueMult1");\r
-  sprintf(title,"event <mcPt>:true_mult");\r
+  snprintf(name,256,"fMCAllPrimTrackMeanPtTrueMult1");\r
+  snprintf(title,256,"event <mcPt>:true_mult");\r
   \r
   fMCAllPrimTrackMeanPtTrueMult1 = new THnSparseF(name,title,2,binsMCAllPrimTrackMeanPtTrueMult1,minMCAllPrimTrackMeanPtTrueMult1,maxMCAllPrimTrackMeanPtTrueMult1);\r
   fMCAllPrimTrackMeanPtTrueMult1->GetAxis(0)->SetTitle("<mcPt> (GeV/c)");\r
@@ -576,8 +576,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCAllPrimTrackMeanPtMult1[2]={100,150};\r
   Double_t minMCAllPrimTrackMeanPtMult1[2]={0.,-0.5}; \r
   Double_t maxMCAllPrimTrackMeanPtMult1[2]={10.,149.5}; \r
-  sprintf(name,"fMCAllPrimTrackMeanPtMult1");\r
-  sprintf(title,"event <mcPt>:mult");\r
+  snprintf(name,256,"fMCAllPrimTrackMeanPtMult1");\r
+  snprintf(title,256,"event <mcPt>:mult");\r
   \r
   fMCAllPrimTrackMeanPtMult1 = new THnSparseF(name,title,2,binsMCAllPrimTrackMeanPtMult1,minMCAllPrimTrackMeanPtMult1,maxMCAllPrimTrackMeanPtMult1);\r
   fMCAllPrimTrackMeanPtMult1->GetAxis(0)->SetTitle("<mcPt> (GeV/c)");\r
@@ -588,8 +588,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCNDEventAllPrimTrackMeanPtTrueMult1[2]={100,150};\r
   Double_t minMCNDEventAllPrimTrackMeanPtTrueMult1[2]={0.,-0.5}; \r
   Double_t maxMCNDEventAllPrimTrackMeanPtTrueMult1[2]={10.,149.5}; \r
-  sprintf(name,"fMCNDEventAllPrimTrackMeanPtTrueMult1");\r
-  sprintf(title,"event <mcPt>:true_mult");\r
+  snprintf(name,256,"fMCNDEventAllPrimTrackMeanPtTrueMult1");\r
+  snprintf(title,256,"event <mcPt>:true_mult");\r
   \r
   fMCNDEventAllPrimTrackMeanPtTrueMult1 = new THnSparseF(name,title,2,binsMCNDEventAllPrimTrackMeanPtTrueMult1,minMCNDEventAllPrimTrackMeanPtTrueMult1,maxMCNDEventAllPrimTrackMeanPtTrueMult1);\r
   fMCNDEventAllPrimTrackMeanPtTrueMult1->GetAxis(0)->SetTitle("<mcPt> (GeV/c)");\r
@@ -599,8 +599,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCNDEventAllPrimTrackMeanPtMult1[2]={100,150};\r
   Double_t minMCNDEventAllPrimTrackMeanPtMult1[2]={0.,-0.5}; \r
   Double_t maxMCNDEventAllPrimTrackMeanPtMult1[2]={10.,149.5}; \r
-  sprintf(name,"fMCNDEventAllPrimTrackMeanPtMult1");\r
-  sprintf(title,"event <mcPt>:mult");\r
+  snprintf(name,256,"fMCNDEventAllPrimTrackMeanPtMult1");\r
+  snprintf(title,256,"event <mcPt>:mult");\r
   \r
   fMCNDEventAllPrimTrackMeanPtMult1 = new THnSparseF(name,title,2,binsMCNDEventAllPrimTrackMeanPtMult1,minMCNDEventAllPrimTrackMeanPtMult1,maxMCNDEventAllPrimTrackMeanPtMult1);\r
   fMCNDEventAllPrimTrackMeanPtMult1->GetAxis(0)->SetTitle("<mcPt> (GeV/c)");\r
@@ -611,8 +611,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCNSDEventAllPrimTrackMeanPtTrueMult1[2]={100,150};\r
   Double_t minMCNSDEventAllPrimTrackMeanPtTrueMult1[2]={0.,-0.5}; \r
   Double_t maxMCNSDEventAllPrimTrackMeanPtTrueMult1[2]={10.,149.5}; \r
-  sprintf(name,"fMCNSDEventAllPrimTrackMeanPtTrueMult1");\r
-  sprintf(title,"event <mcPt>:true_mult");\r
+  snprintf(name,256,"fMCNSDEventAllPrimTrackMeanPtTrueMult1");\r
+  snprintf(title,256,"event <mcPt>:true_mult");\r
   \r
   fMCNSDEventAllPrimTrackMeanPtTrueMult1 = new THnSparseF(name,title,2,binsMCNSDEventAllPrimTrackMeanPtTrueMult1,minMCNSDEventAllPrimTrackMeanPtTrueMult1,maxMCNSDEventAllPrimTrackMeanPtTrueMult1);\r
   fMCNSDEventAllPrimTrackMeanPtTrueMult1->GetAxis(0)->SetTitle("<mcPt> (GeV/c)");\r
@@ -622,8 +622,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCNSDEventAllPrimTrackMeanPtMult1[2]={100,150};\r
   Double_t minMCNSDEventAllPrimTrackMeanPtMult1[2]={0.,-0.5}; \r
   Double_t maxMCNSDEventAllPrimTrackMeanPtMult1[2]={10.,149.5}; \r
-  sprintf(name,"fMCNSDEventAllPrimTrackMeanPtMult1");\r
-  sprintf(title,"event <mcPt>:mult");\r
+  snprintf(name,256,"fMCNSDEventAllPrimTrackMeanPtMult1");\r
+  snprintf(title,256,"event <mcPt>:mult");\r
   \r
   fMCNSDEventAllPrimTrackMeanPtMult1 = new THnSparseF(name,title,2,binsMCNSDEventAllPrimTrackMeanPtMult1,minMCNSDEventAllPrimTrackMeanPtMult1,maxMCNSDEventAllPrimTrackMeanPtMult1);\r
   fMCNSDEventAllPrimTrackMeanPtMult1->GetAxis(0)->SetTitle("<mcPt> (GeV/c)");\r
@@ -634,8 +634,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCTriggerPrimTrackMeanPtTrueMult1[2]={100,150};\r
   Double_t minMCTriggerPrimTrackMeanPtTrueMult1[2]={0.,-0.5}; \r
   Double_t maxMCTriggerPrimTrackMeanPtTrueMult1[2]={10.,149.5}; \r
-  sprintf(name,"fMCTriggerPrimTrackMeanPtTrueMult1");\r
-  sprintf(title,"event <mcPt>:true_mult");\r
+  snprintf(name,256,"fMCTriggerPrimTrackMeanPtTrueMult1");\r
+  snprintf(title,256,"event <mcPt>:true_mult");\r
   \r
   fMCTriggerPrimTrackMeanPtTrueMult1 = new THnSparseF(name,title,2,binsMCTriggerPrimTrackMeanPtTrueMult1,minMCTriggerPrimTrackMeanPtTrueMult1,maxMCTriggerPrimTrackMeanPtTrueMult1);\r
   fMCTriggerPrimTrackMeanPtTrueMult1->GetAxis(0)->SetTitle("<mcPt> (GeV/c)");\r
@@ -645,8 +645,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCTriggerPrimTrackMeanPtMult1[2]={100,150};\r
   Double_t minMCTriggerPrimTrackMeanPtMult1[2]={0.,-0.5}; \r
   Double_t maxMCTriggerPrimTrackMeanPtMult1[2]={10.,149.5}; \r
-  sprintf(name,"fMCTriggerPrimTrackMeanPtMult1");\r
-  sprintf(title,"event <mcPt>:mult");\r
+  snprintf(name,256,"fMCTriggerPrimTrackMeanPtMult1");\r
+  snprintf(title,256,"event <mcPt>:mult");\r
   \r
   fMCTriggerPrimTrackMeanPtMult1 = new THnSparseF(name,title,2,binsMCTriggerPrimTrackMeanPtMult1,minMCTriggerPrimTrackMeanPtMult1,maxMCTriggerPrimTrackMeanPtMult1);\r
   fMCTriggerPrimTrackMeanPtMult1->GetAxis(0)->SetTitle("<mcPt> (GeV/c)");\r
@@ -657,8 +657,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCEventPrimTrackMeanPtTrueMult1[2]={100,150};\r
   Double_t minMCEventPrimTrackMeanPtTrueMult1[2]={0.,-0.5}; \r
   Double_t maxMCEventPrimTrackMeanPtTrueMult1[2]={10.,149.5}; \r
-  sprintf(name,"fMCEventPrimTrackMeanPtTrueMult1");\r
-  sprintf(title,"event <mcPt>:true_mult");\r
+  snprintf(name,256,"fMCEventPrimTrackMeanPtTrueMult1");\r
+  snprintf(title,256,"event <mcPt>:true_mult");\r
   \r
   fMCEventPrimTrackMeanPtTrueMult1 = new THnSparseF(name,title,2,binsMCEventPrimTrackMeanPtTrueMult1,minMCEventPrimTrackMeanPtTrueMult1,maxMCEventPrimTrackMeanPtTrueMult1);\r
   fMCEventPrimTrackMeanPtTrueMult1->GetAxis(0)->SetTitle("<mcPt> (GeV/c)");\r
@@ -668,8 +668,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsMCEventPrimTrackMeanPtMult1[2]={100,150};\r
   Double_t minMCEventPrimTrackMeanPtMult1[2]={0.,-0.5}; \r
   Double_t maxMCEventPrimTrackMeanPtMult1[2]={10.,149.5}; \r
-  sprintf(name,"fMCEventPrimTrackMeanPtMult1");\r
-  sprintf(title,"event <mcPt>:mult");\r
+  snprintf(name,256,"fMCEventPrimTrackMeanPtMult1");\r
+  snprintf(title,256,"event <mcPt>:mult");\r
   \r
   fMCEventPrimTrackMeanPtMult1 = new THnSparseF(name,title,2,binsMCEventPrimTrackMeanPtMult1,minMCEventPrimTrackMeanPtMult1,maxMCEventPrimTrackMeanPtMult1);\r
   fMCEventPrimTrackMeanPtMult1->GetAxis(0)->SetTitle("<mcPt> (GeV/c)");\r
@@ -689,8 +689,8 @@ void AlidNdPtCorrection::Init(){
     Int_t binsRecTrackHist1[3]={ptNbins,etaNbins,90};\r
     Double_t minRecTrackHist1[3]={0.,-1.,0.}; \r
     Double_t maxRecTrackHist1[3]={10.,1.,2.*TMath::Pi()};\r
-    sprintf(name,"fRecTrackHist1_%d",i);\r
-    sprintf(title,"Pt:Eta:Phi");\r
+    snprintf(name,256,"fRecTrackHist1_%d",i);\r
+    snprintf(title,256,"Pt:Eta:Phi");\r
   \r
     fRecTrackHist1[i] = new THnSparseF(name,title,3,binsRecTrackHist1,minRecTrackHist1,maxRecTrackHist1);\r
     fRecTrackHist1[i]->SetBinEdges(0,binsPt);\r
@@ -730,8 +730,8 @@ void AlidNdPtCorrection::Init(){
   for(Int_t i=0; i<8; i++) \r
   {\r
     // THnSparse track histograms\r
-    sprintf(name,"fCorrRecTrackMultHist1_%d",i);\r
-    sprintf(title,"Pt:Eta:mult");\r
+    snprintf(name,256,"fCorrRecTrackMultHist1_%d",i);\r
+    snprintf(title,256,"Pt:Eta:mult");\r
     fCorrRecTrackMultHist1[i] = new THnSparseF(name,title,3,binsCorrRecTrackMultHist1,minCorrRecTrackMultHist1,maxCorrRecTrackMultHist1);\r
     fCorrRecTrackMultHist1[i]->SetBinEdges(0,binsPt);\r
     fCorrRecTrackMultHist1[i]->SetBinEdges(1,binsEta);\r
@@ -741,8 +741,8 @@ void AlidNdPtCorrection::Init(){
     fCorrRecTrackMultHist1[i]->Sumw2();\r
 \r
     // THnSparse track histograms\r
-    sprintf(name,"fCorrRecTrackTrueMultHist1_%d",i);\r
-    sprintf(title,"Pt:Eta:true_mult");\r
+    snprintf(name,256,"fCorrRecTrackTrueMultHist1_%d",i);\r
+    snprintf(title,256,"Pt:Eta:true_mult");\r
     fCorrRecTrackTrueMultHist1[i] = new THnSparseF(name,title,3,binsCorrRecTrackTrueMultHist1,minCorrRecTrackTrueMultHist1,maxCorrRecTrackTrueMultHist1);\r
     fCorrRecTrackTrueMultHist1[i]->SetBinEdges(0,binsPt);\r
     fCorrRecTrackTrueMultHist1[i]->SetBinEdges(1,binsEta);\r
@@ -752,8 +752,8 @@ void AlidNdPtCorrection::Init(){
     fCorrRecTrackTrueMultHist1[i]->Sumw2();\r
 \r
     //\r
-    sprintf(name,"fCorrRecTrackTrueMultHist2_%d",i);\r
-    sprintf(title,"Pt:mult:true_mult");\r
+    snprintf(name,256,"fCorrRecTrackTrueMultHist2_%d",i);\r
+    snprintf(title,256,"Pt:mult:true_mult");\r
     fCorrRecTrackTrueMultHist2[i] = new THnSparseF(name,title,3,binsCorrRecTrackTrueMultHist2,minCorrRecTrackTrueMultHist2,maxCorrRecTrackTrueMultHist2);\r
     fCorrRecTrackTrueMultHist2[i]->SetBinEdges(0,binsPt);\r
     fCorrRecTrackTrueMultHist2[i]->GetAxis(0)->SetTitle("Pt (GeV/c)");\r
@@ -762,23 +762,23 @@ void AlidNdPtCorrection::Init(){
     fCorrRecTrackTrueMultHist2[i]->Sumw2();\r
 \r
     // THnSparse track histograms\r
-    sprintf(name,"fCorrRecTrackMeanPtMultHist1_%d",i);\r
-    sprintf(title,"<Pt>:mult");\r
+    snprintf(name,256,"fCorrRecTrackMeanPtMultHist1_%d",i);\r
+    snprintf(title,256,"<Pt>:mult");\r
     fCorrRecTrackMeanPtMultHist1[i] = new THnSparseF(name,title,2,binsCorrRecTrackMeanPtMultHist1,minCorrRecTrackMeanPtMultHist1,maxCorrRecTrackMeanPtMultHist1);\r
     fCorrRecTrackMeanPtMultHist1[i]->GetAxis(0)->SetTitle("<Pt> (GeV/c)");\r
     fCorrRecTrackMeanPtMultHist1[i]->GetAxis(1)->SetTitle("multiplicity");\r
     fCorrRecTrackMeanPtMultHist1[i]->Sumw2();\r
 \r
     // THnSparse track histograms\r
-    sprintf(name,"fCorrRecTrackMeanPtTrueMultHist1_%d",i);\r
-    sprintf(title,"<Pt>:true_mult");\r
+    snprintf(name,256,"fCorrRecTrackMeanPtTrueMultHist1_%d",i);\r
+    snprintf(title,256,"<Pt>:true_mult");\r
     fCorrRecTrackMeanPtTrueMultHist1[i] = new THnSparseF(name,title,2,binsCorrRecTrackMeanPtTrueMultHist1,minCorrRecTrackMeanPtTrueMultHist1,maxCorrRecTrackMeanPtTrueMultHist1);\r
     fCorrRecTrackMeanPtTrueMultHist1[i]->GetAxis(0)->SetTitle("<Pt> (GeV/c)");\r
     fCorrRecTrackMeanPtTrueMultHist1[i]->GetAxis(1)->SetTitle("true multiplicity");\r
     fCorrRecTrackMeanPtTrueMultHist1[i]->Sumw2();\r
 \r
-    sprintf(name,"fCorrRecTrackPt1_%d",i);\r
-    sprintf(title,"pt small bining");\r
+    snprintf(name,256,"fCorrRecTrackPt1_%d",i);\r
+    snprintf(title,256,"pt small bining");\r
     fCorrRecTrackPt1[i] = new THnSparseF(name,title,1,binsCorrRecTrackPt1,minCorrRecTrackPt1,maxCorrRecTrackPt1);\r
     fCorrRecTrackPt1[i]->GetAxis(0)->SetTitle("Pt (GeV/c)");\r
     fCorrRecTrackPt1[i]->Sumw2();\r
@@ -822,8 +822,8 @@ void AlidNdPtCorrection::Init(){
   for(Int_t i=0; i<5; i++) \r
   {\r
     // event corrected histograms\r
-    sprintf(name,"fCorrRecEventHist1_%d",i);\r
-    sprintf(title,"mcZv:mult");\r
+    snprintf(name,256,"fCorrRecEventHist1_%d",i);\r
+    snprintf(title,256,"mcZv:mult");\r
     fCorrRecEventHist1[i] = new THnSparseF("fCorrRecEventHist1","mcZv:mult",2,binsEventMatrix,minEventMatrix,maxEventMatrix);\r
     fCorrRecEventHist1[i]->SetBinEdges(0,binsZv);\r
     fCorrRecEventHist1[i]->GetAxis(0)->SetTitle("Zv (cm)");\r
@@ -831,8 +831,8 @@ void AlidNdPtCorrection::Init(){
     fCorrRecEventHist1[i]->Sumw2();\r
 \r
     // empty event corrected histograms\r
-    sprintf(name,"fCorrRecEventHist2_%d",i);\r
-    sprintf(title,"mcZv:mult");\r
+    snprintf(name,256,"fCorrRecEventHist2_%d",i);\r
+    snprintf(title,256,"mcZv:mult");\r
     fCorrRecEventHist2[i] = new THnSparseF("fCorrRecEventHist2","mcZv:mult",2,binsEventMatrix,minEventMatrix,maxEventMatrix);\r
     fCorrRecEventHist2[i]->SetBinEdges(0,binsZv);\r
     fCorrRecEventHist2[i]->GetAxis(0)->SetTitle("Zv (cm)");\r
@@ -846,8 +846,8 @@ void AlidNdPtCorrection::Init(){
   Int_t binsCosmicsHisto[3]=  {151, 300, ptNbins};\r
   Double_t minCosmicsHisto[3]={-1.5, -2.*TMath::Pi(), 0.0}; \r
   Double_t maxCosmicsHisto[3]={ 1.5, 2.*TMath::Pi(), 16.0}; \r
-  sprintf(name,"fCosmicsHisto");\r
-  sprintf(title,"deta:dphi:pt");\r
+  snprintf(name,256,"fCosmicsHisto");\r
+  snprintf(title,256,"deta:dphi:pt");\r
   \r
   fCosmicsHisto = new THnSparseF(name,title,3,binsCosmicsHisto,minCosmicsHisto,maxCosmicsHisto);\r
   fCosmicsHisto->SetBinEdges(2,binsPt);\r
index 51ea9fe53f5a5f4cb94cddeaa6d80a09781929de..9e24cfb7e0ec7eeb49948e311ef10879b93adf2b 100644 (file)
@@ -155,9 +155,9 @@ void AlidNdPtCutAnalysis::Init(){
   //\r
 \r
  //nCrossRows:chi2PerClust:nCrossRows/nFindableClust:fracSharedClust:DCAy:DCAz:eta:phi:pt:hasStrangeMother:isFromMaterial:isPrim:charge\r
-  Int_t binsRecMCTrackHist[13]=  {160, 10, 20, 20, 50,  50,  20,  90,             ptNbins, 2,  2,  2,  3};\r
-  Double_t minRecMCTrackHist[13]={0.,  0., 0., 0.,-0.5,-0.5,-1.0, 0.,             ptMin,   0., 0., 0.,-1.};\r
-  Double_t maxRecMCTrackHist[13]={160.,10.,1.,  1., 0.5, 0.5, 1.0, 2.*TMath::Pi(), ptMax,   2., 2., 2., 2.};\r
+  Int_t binsRecMCTrackHist[13]=  { 160,  10,  20,  20, 50,  50,   20,  90,             ptNbins, 2,  2,  2,  3  };\r
+  Double_t minRecMCTrackHist[13]={ 0.,   0.,  0.,  0., -0.5,-0.5,-1.0, 0.,             ptMin,   0., 0., 0.,-1. };\r
+  Double_t maxRecMCTrackHist[13]={ 160., 10., 1.,  1., 0.5, 0.5,  1.0, 2.*TMath::Pi(), ptMax,   2., 2., 2., 2. };\r
 \r
   fRecMCTrackHist = new THnSparseF("fRecMCTrackHist","nCrossRows:chi2PerClust:nCrossRows/nFindableClust:fracSharedClust:DCAy:DCAz:eta:phi:pt:hasStrangeMother:isFromMaterial:isPrim:charge",13,binsRecMCTrackHist,minRecMCTrackHist,maxRecMCTrackHist);\r
   fRecMCTrackHist->SetBinEdges(8,binsPt);\r
@@ -581,6 +581,8 @@ void AlidNdPtCutAnalysis::Analyse()
   //\r
   TH1::AddDirectory(kFALSE);\r
   TObjArray *aFolderObj = new TObjArray;\r
+  if(!aFolderObj) return;\r
+\r
   TH1D *h1D = 0; \r
   TH2D *h2D = 0; \r
 \r
@@ -611,11 +613,13 @@ void AlidNdPtCutAnalysis::Analyse()
   // Event counters\r
   //\r
   h2D = (TH2D*)fEventCount->Projection(0,1);\r
+  if(!h2D) return;\r
   h2D->SetName("trig_vs_trigANDvertex");\r
   aFolderObj->Add(h2D);\r
 \r
   fEventCount->GetAxis(0)->SetRange(2,2); // triggered\r
   h1D = (TH1D*)fEventCount->Projection(1);\r
+  if(!h1D) return;\r
   h1D->SetTitle("rec. vertex for triggered events");\r
   h1D->SetName("trigANDvertex");\r
   aFolderObj->Add(h1D);\r
@@ -624,30 +628,37 @@ void AlidNdPtCutAnalysis::Analyse()
   // Create rec. event histograms\r
   //\r
   h1D = (TH1D *)fRecEventHist->Projection(0);\r
+  if(!h1D) return;\r
   h1D->SetName("rec_xv");\r
   aFolderObj->Add(h1D);\r
 \r
   h1D = (TH1D *)fRecEventHist->Projection(1);\r
+  if(!h1D) return;\r
   h1D->SetName("rec_yv");\r
   aFolderObj->Add(h1D);\r
 \r
   h1D = (TH1D *)fRecEventHist->Projection(2);\r
+  if(!h1D) return;\r
   h1D->SetName("rec_zv");\r
   aFolderObj->Add(h1D);\r
 \r
   h2D = (TH2D *)fRecEventHist->Projection(3,4);\r
+  if(!h2D) return;\r
   h2D->SetName("rec_resZv_vs_Mult");\r
   aFolderObj->Add(h2D);\r
 \r
   h2D = (TH2D *)fRecEventHist->Projection(0,1);\r
+  if(!h2D) return;\r
   h2D->SetName("rec_xv_vs_yv");\r
   aFolderObj->Add(h2D);\r
 \r
   h2D = (TH2D *)fRecEventHist->Projection(0,2);\r
+  if(!h2D) return;\r
   h2D->SetName("rec_xv_vs_zv");\r
   aFolderObj->Add(h2D);\r
 \r
   h2D = (TH2D *)fRecEventHist->Projection(3,4);\r
+  if(!h2D) return;\r
   h2D->SetName("rec_resZv_vs_Mult");\r
   aFolderObj->Add(h2D);\r
 \r
@@ -660,10 +671,12 @@ void AlidNdPtCutAnalysis::Analyse()
   // Create mc event histograms\r
   //\r
   h2D = (TH2D *)fMCEventHist->Projection(0,1);\r
+  if(!h2D) return;\r
   h2D->SetName("mc_xv_vs_yv");\r
   aFolderObj->Add(h2D);\r
 \r
   h2D = (TH2D *)fMCEventHist->Projection(0,2);\r
+  if(!h2D) return;\r
   h2D->SetName("mc_xv_vs_zv");\r
   aFolderObj->Add(h2D);\r
 \r
@@ -671,14 +684,17 @@ void AlidNdPtCutAnalysis::Analyse()
   // Create rec-mc event histograms\r
   //\r
   h2D = (TH2D *)fRecMCEventHist->Projection(0,3);\r
+  if(!h2D) return;\r
   h2D->SetName("rec_mc_deltaXv_vs_mult");\r
   aFolderObj->Add(h2D);\r
 \r
   h2D = (TH2D *)fRecMCEventHist->Projection(1,3);\r
+  if(!h2D) return;\r
   h2D->SetName("rec_mc_deltaYv_vs_mult");\r
   aFolderObj->Add(h2D);\r
 \r
   h2D = (TH2D *)fRecMCEventHist->Projection(2,3);\r
+  if(!h2D) return;\r
   h2D->SetName("rec_mc_deltaZv_vs_mult");\r
   aFolderObj->Add(h2D);\r
 \r
@@ -695,24 +711,29 @@ void AlidNdPtCutAnalysis::Analyse()
   fRecMCTrackHist->GetAxis(4)->SetRangeUser(-maxDCAr,maxDCAr);\r
 \r
   h2D = (TH2D *)fRecMCTrackHist->Projection(7,5);\r
+  if(!h2D) return;\r
   h2D->SetName("pt_vs_eta");\r
   aFolderObj->Add(h2D);\r
 \r
   fRecMCTrackHist->GetAxis(7)->SetRangeUser(minPt,maxPt);  \r
 \r
   h2D = (TH2D *)fRecMCTrackHist->Projection(0,5);\r
+  if(!h2D) return;\r
   h2D->SetName("nClust_vs_eta");\r
   aFolderObj->Add(h2D);\r
 \r
   h2D = (TH2D *)fRecMCTrackHist->Projection(1,5);\r
+  if(!h2D) return;\r
   h2D->SetName("chi2PerClust_vs_eta");\r
   aFolderObj->Add(h2D);\r
 \r
   h2D = (TH2D *)fRecMCTrackHist->Projection(2,5);\r
+  if(!h2D) return;\r
   h2D->SetName("ratio_nClust_nFindableClust_vs_eta");\r
   aFolderObj->Add(h2D);\r
 \r
   h2D = (TH2D *)fRecMCTrackHist->Projection(5,6);\r
+  if(!h2D) return;\r
   h2D->SetName("eta_vs_phi");\r
   aFolderObj->Add(h2D);\r
 \r
@@ -720,14 +741,17 @@ void AlidNdPtCutAnalysis::Analyse()
   fRecMCTrackHist->GetAxis(5)->SetRangeUser(minEta,maxEta);  \r
 \r
   h2D = (TH2D *)fRecMCTrackHist->Projection(0,6);\r
+  if(!h2D) return;\r
   h2D->SetName("nClust_vs_phi");\r
   aFolderObj->Add(h2D);\r
 \r
   h2D = (TH2D *)fRecMCTrackHist->Projection(1,6);\r
+  if(!h2D) return;\r
   h2D->SetName("chi2PerClust_vs_phi");\r
   aFolderObj->Add(h2D);\r
 \r
   h2D = (TH2D *)fRecMCTrackHist->Projection(2,6);\r
+  if(!h2D) return;\r
   h2D->SetName("ratio_nClust_nFindableClust_vs_phi");\r
   aFolderObj->Add(h2D);\r
 \r
@@ -735,18 +759,22 @@ void AlidNdPtCutAnalysis::Analyse()
   fRecMCTrackHist->GetAxis(7)->SetRangeUser(0.0,maxPt);  \r
 \r
   h2D = (TH2D *)fRecMCTrackHist->Projection(0,7);\r
+  if(!h2D) return;\r
   h2D->SetName("nClust_vs_pt");\r
   aFolderObj->Add(h2D);\r
 \r
   h2D = (TH2D *)fRecMCTrackHist->Projection(1,7);\r
+  if(!h2D) return;\r
   h2D->SetName("chi2PerClust_vs_pt");\r
   aFolderObj->Add(h2D);\r
 \r
   h2D = (TH2D *)fRecMCTrackHist->Projection(2,7);\r
+  if(!h2D) return;\r
   h2D->SetName("ratio_nClust_nFindableClust_vs_pt");\r
   aFolderObj->Add(h2D);\r
 \r
   h2D = (TH2D *)fRecMCTrackHist->Projection(6,7);\r
+  if(!h2D) return;\r
   h2D->SetName("phi_vs_pt");\r
   aFolderObj->Add(h2D);\r
 \r
@@ -760,10 +788,12 @@ void AlidNdPtCutAnalysis::Analyse()
   fRecMCTrackHist->GetAxis(4)->SetRangeUser(-maxDCAr,maxDCAr);\r
 \r
   h2D = (TH2D *)fRecMCTrackHist->Projection(0,1);\r
+  if(!h2D) return;\r
   h2D->SetName("nClust_vs_chi2PerClust");\r
   aFolderObj->Add(h2D);\r
 \r
   h2D = (TH2D *)fRecMCTrackHist->Projection(0,2);\r
+  if(!h2D) return;\r
   h2D->SetName("nClust_vs_ratio_nClust_nFindableClust");\r
   aFolderObj->Add(h2D);\r
 \r
@@ -779,12 +809,14 @@ void AlidNdPtCutAnalysis::Analyse()
   // sec\r
   fRecMCTrackHist->GetAxis(9)->SetRange(1,1);\r
   h1D = (TH1D *)fRecMCTrackHist->Projection(3);\r
+  if(!h1D) return;\r
   h1D->SetName("dcay_sec");\r
   aFolderObj->Add(h1D);\r
 \r
   // prim\r
   fRecMCTrackHist->GetAxis(9)->SetRange(2,2);\r
   h1D = (TH1D *)fRecMCTrackHist->Projection(3);\r
+  if(!h1D) return;\r
   h1D->SetName("dcay_prim");\r
   aFolderObj->Add(h1D);\r
 \r
@@ -795,18 +827,24 @@ void AlidNdPtCutAnalysis::Analyse()
   // sec\r
   fRecMCTrackHist->GetAxis(9)->SetRange(1,1);\r
   h1D = (TH1D *)fRecMCTrackHist->Projection(4);\r
+  if(!h1D) return;\r
   h1D->SetName("dcaz_sec");\r
   aFolderObj->Add(h1D);\r
 \r
   // prim\r
   fRecMCTrackHist->GetAxis(9)->SetRange(2,2);\r
   h1D = (TH1D *)fRecMCTrackHist->Projection(4);\r
+  if(!h1D) return;\r
   h1D->SetName("dcaz_prim");\r
   aFolderObj->Add(h1D);\r
 \r
 \r
   // export objects to analysis folder\r
   fAnalysisFolder = ExportToFolder(aFolderObj);\r
+  if(!fAnalysisFolder) {\r
+      if(aFolderObj) delete aFolderObj;\r
+      return;\r
+  }\r
 \r
   // delete only TObjArray\r
   if(aFolderObj) delete aFolderObj;\r
index ae97896cfa70b2409880f6e4f37ed0d451db5275..9a7bfd815a593e33f4e92b775d9e1a56512393d7 100644 (file)
@@ -324,18 +324,18 @@ void AlidNdPtCutAnalysisPbPb::Process(AliESDEvent *const esdEvent, AliMCEvent *
 \r
   // get reconstructed vertex  \r
   const AliESDVertex* vtxESD = 0; \r
-  if(evtCuts->IsRecVertexRequired()) \r
-  {\r
-     if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {\r
+  if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {\r
         vtxESD = esdEvent->GetPrimaryVertexTPC();\r
-    }\r
-    else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {\r
-      vtxESD = esdEvent->GetPrimaryVertexTracks();\r
-    }\r
-    else {\r
+  }\r
+  else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {\r
+     vtxESD = esdEvent->GetPrimaryVertexTracks();\r
+  }\r
+  else {\r
        return;\r
-    }\r
   }\r
+\r
+  if(!vtxESD) return;\r
+\r
   Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD); \r
   //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);\r
   //printf("GetAnalysisMode() %d \n",GetAnalysisMode());\r
index de898a17d65f6e838e647345a1c365553069d26f..0756f338920ea3b3753478a9f130767c5ff368ca 100644 (file)
@@ -396,6 +396,8 @@ void AlidNdPtEfficiency::Analyse()
   //\r
   TH1::AddDirectory(kFALSE);\r
   TObjArray *aFolderObj = new TObjArray;\r
+  if(!aFolderObj) return; \r
+\r
   TH1D *h1Dall = 0; \r
   TH1D *h1D = 0; \r
   TH1D *h1Dc = 0; \r
@@ -420,8 +422,10 @@ void AlidNdPtEfficiency::Analyse()
   //eff vs eta\r
   fRecMCTrackHistTPCITS->GetAxis(6)->SetRange(2,2);  \r
   h1Dall = (TH1D *)fRecMCTrackHistTPCITS->Projection(0);\r
+  if(!h1Dall) return;\r
   fRecMCTrackHistTPCITS->GetAxis(5)->SetRange(2,2);  \r
   h1D = (TH1D *)fRecMCTrackHistTPCITS->Projection(0);\r
+  if(!h1D) return;\r
 \r
   h1Dc = (TH1D *)h1D->Clone("eff_vs_eta_TPCITS");\r
   h1Dc->Divide(h1Dall);\r
@@ -433,8 +437,10 @@ void AlidNdPtEfficiency::Analyse()
   fRecMCTrackHistTPCITS->GetAxis(6)->SetRange(2,2);  \r
   fRecMCTrackHistTPCITS->GetAxis(0)->SetRangeUser(-0.8, 0.799);  \r
   h1Dall = (TH1D *)fRecMCTrackHistTPCITS->Projection(1);\r
+  if(!h1Dall) return;\r
   fRecMCTrackHistTPCITS->GetAxis(5)->SetRange(2,2);  \r
   h1D = (TH1D *)fRecMCTrackHistTPCITS->Projection(1);\r
+  if(!h1D) return;\r
 \r
   h1Dc = (TH1D *)h1D->Clone("eff_vs_phi_TPCITS");\r
   h1Dc->Divide(h1Dall);\r
@@ -446,8 +452,10 @@ void AlidNdPtEfficiency::Analyse()
   fRecMCTrackHistTPCITS->GetAxis(6)->SetRange(2,2);  \r
   fRecMCTrackHistTPCITS->GetAxis(0)->SetRangeUser(-0.8, 0.799);  \r
   h1Dall = (TH1D *)fRecMCTrackHistTPCITS->Projection(2);\r
+  if(!h1Dall) return;\r
   fRecMCTrackHistTPCITS->GetAxis(5)->SetRange(2,2);  \r
   h1D = (TH1D *)fRecMCTrackHistTPCITS->Projection(2);\r
+  if(!h1D) return;\r
 \r
   h1Dc = (TH1D *)h1D->Clone("eff_vs_pT_TPCITS");\r
   h1Dc->Divide(h1Dall);\r
@@ -465,8 +473,10 @@ void AlidNdPtEfficiency::Analyse()
 \r
   //eff vs eta\r
   h1Dall = (TH1D *)fRecMCTrackHistITSTPC->Projection(0);\r
+  if(!h1Dall) return;\r
   fRecMCTrackHistITSTPC->GetAxis(5)->SetRange(2,2);  \r
   h1D = (TH1D *)fRecMCTrackHistITSTPC->Projection(0);\r
+  if(!h1D) return;\r
 \r
   h1Dc = (TH1D *)h1D->Clone("eff_vs_eta_ITSTPC");\r
   h1Dc->Divide(h1Dall);\r
@@ -476,8 +486,10 @@ void AlidNdPtEfficiency::Analyse()
   //eff vs phi\r
   fRecMCTrackHistITSTPC->GetAxis(0)->SetRangeUser(-0.8, 0.799);  \r
   h1Dall = (TH1D *)fRecMCTrackHistITSTPC->Projection(1);\r
+  if(!h1Dall) return;\r
   fRecMCTrackHistITSTPC->GetAxis(5)->SetRange(2,2);  \r
   h1D = (TH1D *)fRecMCTrackHistITSTPC->Projection(1);\r
+  if(!h1D) return;\r
 \r
   h1Dc = (TH1D *)h1D->Clone("eff_vs_phi_ITSTPC");\r
   h1Dc->Divide(h1Dall);\r
@@ -487,8 +499,10 @@ void AlidNdPtEfficiency::Analyse()
   //eff vs pT\r
   fRecMCTrackHistITSTPC->GetAxis(0)->SetRangeUser(-0.8, 0.799);  \r
   h1Dall = (TH1D *)fRecMCTrackHistITSTPC->Projection(2);\r
+  if(!h1Dall) return;\r
   fRecMCTrackHistITSTPC->GetAxis(5)->SetRange(2,2);  \r
   h1D = (TH1D *)fRecMCTrackHistITSTPC->Projection(2);\r
+  if(!h1D) return;\r
 \r
   h1Dc = (TH1D *)h1D->Clone("eff_vs_pT_ITSTPC");\r
   h1Dc->Divide(h1Dall);\r
@@ -497,6 +511,10 @@ void AlidNdPtEfficiency::Analyse()
   \r
   // export objects to analysis folder\r
   fAnalysisFolder = ExportToFolder(aFolderObj);\r
+  if(!fAnalysisFolder) {\r
+    if(aFolderObj) delete aFolderObj;\r
+    return;\r
+  }\r
 \r
   // delete only TObjArray\r
   if(aFolderObj) delete aFolderObj;\r
index 39b64584a454459ee5d852321e0791c51e3138be..05af1ab5619941fc68a868e17892f09532a84a3f 100644 (file)
@@ -379,7 +379,7 @@ TH1F* AlidNdPtHelper::CreateResHisto(TH2F* const hRes2, TH1F **phMean, Int_t int
   TVirtualPad* currentPad = gPad;
   TAxis* axis = hRes2->GetXaxis();
   Int_t nBins = axis->GetNbins();
-  Bool_t overflowBinFits = kFALSE;
+  //Bool_t overflowBinFits = kFALSE;
   TH1F* hRes, *hMean;
   if (axis->GetXbins()->GetSize()){
     hRes = new TH1F("hRes", "", nBins, axis->GetXbins()->GetArray());
@@ -404,7 +404,8 @@ TH1F* AlidNdPtHelper::CreateResHisto(TH2F* const hRes2, TH1F **phMean, Int_t int
   fitFunc->SetFillStyle(0);
   // create canvas for fits
   TCanvas* canBinFits = NULL;
-  Int_t nPads = (overflowBinFits) ? nBins+2 : nBins;
+  //Int_t nPads = (overflowBinFits) ? nBins+2 : nBins;
+  Int_t nPads = nBins;
   Int_t nx = Int_t(sqrt(nPads-1.));// + 1;
   Int_t ny = (nPads-1) / nx + 1;
   if (drawBinFits) {
@@ -415,7 +416,8 @@ TH1F* AlidNdPtHelper::CreateResHisto(TH2F* const hRes2, TH1F **phMean, Int_t int
   }
 
   // loop over x bins and fit projection
-  Int_t dBin = ((overflowBinFits) ? 1 : 0);
+  //Int_t dBin = ((overflowBinFits) ? 1 : 0);
+  Int_t dBin = 0;
   for (Int_t bin = 1-dBin; bin <= nBins+dBin; bin++) {
     if (drawBinFits) canBinFits->cd(bin + dBin);
     Int_t bin0=TMath::Max(bin-integ,0);
diff --git a/PWG0/dNdPt/macros/ApplyCorrections_PbPb.C b/PWG0/dNdPt/macros/ApplyCorrections_PbPb.C
new file mode 100644 (file)
index 0000000..8169181
--- /dev/null
@@ -0,0 +1,361 @@
+Double_t ApplyCorrections_PbPb(const char* datafile, const char* datatask, const char* corrfile, const char* idstring ,const char* outfile, const char* gifdir = 0)
+//Double_t ApplyCorrections_PbPb()
+{
+
+// tmp setting
+//      const char* datafile = "/lustre/alice/train/V006.PbPb/2011-03-15_0009.5917/mergedPeriods/PbPb/2.76ATeV/LHC10h.pass1/mknichel_dNdPtPbPb_TPCITS_VZERO1.root";     
+//      const char* datatask = "mknichel_dNdPtPbPb_TPCITS_VZERO";
+//      const char* corrfile = "/u/mknichel/alice/dNdPt_PbPb/2011-03-15/corrMatr_LHC10h8_TPCITS.root";     
+//      const char* idstring = "c0";
+//      const char* outfile = "/u/mknichel/alice/dNdPt_PbPb/2011-03-15/finalSpectra_LHC10h.pass1_TPCITS.root";     
+//      const char* gifdir = "/u/mknichel/alice/dNdPt_PbPb/2011-03-15/LHC10h.pass1";
+    
+Int_t c_first = 1;
+Int_t c_last = 11;
+
+TString id = TString(idstring);
+if ( id.Contains("c0-5") ) { c_first = c_last = 1; }
+if ( id.Contains("c5-10") ) { c_first = c_last = 2; }
+if ( id.Contains("c10-20") ) { c_first = c_last = 3; }
+if ( id.Contains("c20-30") ) { c_first = c_last = 4; }
+if ( id.Contains("c30-40") ) { c_first = c_last = 5; }
+if ( id.Contains("c40-50") ) { c_first = c_last = 6; }
+if ( id.Contains("c50-60") ) { c_first = c_last = 7; }
+if ( id.Contains("c60-70") ) { c_first = c_last = 8; }
+if ( id.Contains("c70-80") ) { c_first = c_last = 9; }
+if ( id.Contains("c80-90") ) { c_first = c_last = 10; }
+if ( id.Contains("c90-100") ) { c_first = c_last = 11; }
+    
+    // settings vor zVertex cut (event and track level)
+    Double_t zVert = 10.0;
+    
+    // setting on eta cut (track level)
+    Double_t eta = 0.8;
+    
+    //load required libraries
+    //load required libraries    
+    gSystem->AddIncludePath("-I$ROOTSYS/include -I$ALICE_ROOT/ -I$ALICE_ROOT/include -I$ALICE_ROOT/STEER  -I$ALICE_ROOT/ANALYSIS -I$ALICE_ROOT/PWG0 -I$ALICE_ROOT/PWG1 -I$ALICE_ROOT/PWG2 -I$ALICE_ROOT/PWG3 -I$ALICE_ROOT/PWG3/vertexingHF -I$ALICE_ROOT/PWG4 -I$ALICE_ROOT/CORRFW -I$ALICE_ROOT/TPC -I$ALICE_ROOT/TRD -I$ALICE_ROOT/PWG3/muon -I$ALICE_ROOT/JETAN -I$ALICE_ROOT/ANALYSIS/Tender");
+    
+  gSystem->Load("libCore");
+  gSystem->Load("libPhysics");
+  gSystem->Load("libMinuit");
+  gSystem->Load("libGui");
+  gSystem->Load("libXMLParser");
+
+  gSystem->Load("libGeom");
+  gSystem->Load("libVMC");
+
+  gSystem->Load("libNet");
+
+  gSystem->Load("libSTEERBase");
+  gSystem->Load("libESD");
+  gSystem->Load("libCDB");
+  gSystem->Load("libRAWDatabase");
+  gSystem->Load("libRAWDatarec");
+  gSystem->Load("libANALYSIS");
+
+    
+    
+    gSystem->Load("libANALYSIS.so");
+    gSystem->Load("libANALYSISalice.so");
+    gSystem->Load("libTENDER.so");
+    gSystem->Load("libCORRFW.so");
+    gSystem->Load("libPWG0base.so");    
+    gSystem->Load("libPWG0dep"); 
+    gSystem->Load("libPWG0selectors.so");
+    
+
+    // make plots nicer
+    gROOT->SetStyle("Plain");
+    gStyle->SetPalette(1);
+    
+    // array for all histograms to be saved
+    TObjArray* Hists = new TObjArray();
+    
+    // open file with correction matrices
+    TFile *fcorr = TFile::Open(corrfile,"READ");
+    if (!fcorr) return -2;
+    
+    // load data
+    TFile* fdata = TFile::Open(datafile,"READ");
+    if (!fdata) return -1;
+    TList* ldata = dynamic_cast<TList*>(fdata->Get(datatask));
+    if (!ldata) return -1;
+    AlidNdPtAnalysisPbPb *obj = dynamic_cast<AlidNdPtAnalysisPbPb*>(ldata->FindObject("dNdPtAnalysisPbPb"));
+    if (!obj) return -1;
+    
+    //Event statistics
+    THnSparse *fRecEventHist2 = obj->GetRecEventHist2(); //reconstructed events        
+    fRecEventHist2->GetAxis(2)->SetRange(c_first,c_last); // select centrality    
+    TH2D* h2RecEvent2All = (TH2D*) fRecEventHist2->Projection(0,1)->Clone("h2RecEvent2All");
+    fRecEventHist2->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    TH2D* h2RecEvent2 = (TH2D*) fRecEventHist2->Projection(0,1)->Clone("h2RecEvent2");
+    
+    Double_t ReconstructedEvents = h2RecEvent2->Integral();
+    Double_t ReconstructedEventsAll = h2RecEvent2All->Integral();
+    
+    Hists->Add(h2RecEvent2);
+    Hists->Add(h2RecEvent2All);
+  
+    printf("=== Number of events from DATA                      %lf ===\n",ReconstructedEvents);
+    printf("=== Number of events from DATA (before zVertex cut) %lf ===\n",ReconstructedEventsAll);        
+  
+    TH1D* h1ReconstructedEvents = new TH1D("h1ReconstructedEvents","h1ReconstructedEvents",1,0,1);
+    TH1D* h1ReconstructedEventsAll = new TH1D("h1ReconstructedEventsAll","h1ReconstructedEventsAll",1,0,1);
+    
+    h1ReconstructedEvents->Fill(0,ReconstructedEvents);
+    h1ReconstructedEvents->SetEntries(ReconstructedEvents);
+    h1ReconstructedEventsAll->Fill(0,ReconstructedEventsAll);
+    h1ReconstructedEventsAll->SetEntries(ReconstructedEventsAll);
+        
+    Hists->Add(h1ReconstructedEvents);
+    Hists->Add(h1ReconstructedEventsAll);
+
+     // retrieve tracks
+    THnSparse* fRecTrackHist2 = obj->GetRecTrackHist2(2); //after all cuts (2)
+    fRecTrackHist2->GetAxis(3)->SetRange(c_first,c_last); // select centrality    
+    fRecTrackHist2->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01); //zVertex
+    fRecTrackHist2->GetAxis(2)->SetRangeUser(-eta, eta-0.01); // eta   
+   
+    TH1D* h1RecTrackHist2_zv = fRecTrackHist2->Projection(0)->Clone("h1RecTrackHist2_zv");
+    TH1D* h1RecTrackHist2_pt = fRecTrackHist2->Projection(1)->Clone("h1RecTrackHist2_pt");
+    TH1D* h1RecTrackHist2_eta = fRecTrackHist2->Projection(2)->Clone("h1RecTrackHist2_eta");
+   
+    Hists->Add(h1RecTrackHist2_zv);
+    Hists->Add(h1RecTrackHist2_pt);
+    Hists->Add(h1RecTrackHist2_eta);
+
+    // retrieve correction matrices for tracking efficiency (note different binning!)
+    TH1D* h1TrackCorr_pt  = (TH1D*)fcorr->Get("h1TrackCorr_pt");  
+    TH1D* h1TrackCorr_eta = (TH1D*)fcorr->Get("h1TrackCorr_eta");
+        
+    // retrieve correction matrices for secondaries (note different binning!)
+    TH1D* h1SecCorr_pt  = (TH1D*)fcorr->Get("h1SecCorr_pt");  
+    TH1D* h1SecCorr_eta = (TH1D*)fcorr->Get("h1SecCorr_eta");
+
+    // create corrected spectra (as clone of raw data)
+    TH1D* h1Corrected_pt  = h1RecTrackHist2_pt->Clone("h1Corrected_pt");
+    TH1D* h1Corrected_eta  = h1RecTrackHist2_eta->Clone("h1Corrected_eta");
+
+    // secondaries correction for pt spectrum
+    for (int i=1; i <= h1Corrected_pt->GetNbinsX() ; i++) {
+        Double_t pt = h1Corrected_pt->GetBinCenter(i);
+        Double_t val = h1Corrected_pt->GetBinContent(i);
+        Double_t err = h1Corrected_pt->GetBinError(i);
+        if (pt >= 50) { pt = 49.5; }  // above 50 GeV corr matr have low statistics
+        Double_t secCorr    = h1SecCorr_pt->GetBinContent(h1SecCorr_pt->FindBin(pt));
+        Double_t secCorrErr = h1SecCorr_pt->GetBinError(h1SecCorr_pt->FindBin(pt));
+        Double_t effCorr    = h1TrackCorr_pt->GetBinContent(h1TrackCorr_pt->FindBin(pt));
+        Double_t effCorrErr = h1TrackCorr_pt->GetBinError(h1TrackCorr_pt->FindBin(pt));        
+        Double_t corr    = effCorr*secCorr;
+        Double_t corrErr = effCorr*secCorrErr + secCorr*effCorrErr; // errors are correlated        
+        Double_t cval = val*corr;
+        Double_t cerr = TMath::Sqrt(val*val*corrErr*corrErr + err*err*corr*corr);        
+        h1Corrected_pt->SetBinContent(i,cval);
+        h1Corrected_pt->SetBinError(i,cerr);
+    }
+
+    
+    // for eta the correction is simpler because of same binning
+    h1Corrected_eta->Multiply(h1SecCorr_eta);
+    h1Corrected_eta->Multiply(h1TrackCorr_eta);
+    
+    Hists->Add(h1Corrected_pt);
+    Hists->Add(h1Corrected_eta);
+
+    // create final spectra (as clone of corrected data)
+    TH1D* dNdPt   = h1Corrected_pt->Clone("dNdPt");
+    TH1D* dNdEta  = h1Corrected_eta->Clone("dNdEta");
+       
+    // also uncorrected spectra (as clone of raw data)
+    TH1D* dNdPt_raw   = h1RecTrackHist2_pt->Clone("dNdPt_raw");
+    TH1D* dNdEta_raw  = h1RecTrackHist2_eta->Clone("dNdEta_raw");
+    
+    TH1D* dNdPt_nores   = h1Corrected_pt->Clone("dNdPt_nores");    
+       
+
+//TF1 *fperi  = new TF1("fperi","1.00343-0.000608425*x-6.7038e-05*x*x",5.,40.);
+//TF1 *fcent  = new TF1("cent","1.01074e+00-1.98127e-03*x-1.19903e-04*x*x",5.,40.);
+TFile* fptcorr = TFile::Open("ptcorrPbPb_150511.root");
+
+TF1 * fun = 0;
+
+  TF1 *fcent  = new TF1("fcent","1.01074e+00-1.98127e-03*x-1.19903e-04*x*x",5.,50.);    
+  TF1 *fperi  = new TF1("fperi","1.00343-0.000608425*x-6.7038e-05*x*x",5.,50.);
+Double_t downscale = 1.;
+            if (c_first != c_last) {
+             cout << "++++++++++++++++++++++++++++++++++++++++" << endl;
+             cout << "WARNING: pt resolution correction error!" << endl;
+             cout << " (works only for single centraliy bins) " << endl;
+             cout << "++++++++++++++++++++++++++++++++++++++++" << endl;
+        }
+        if (c_first == 1) {
+               fun = (TF1*) fptcorr->Get("ptcorr_c0");
+               downscale = 0.8;
+               cout << "+++++++++++++++++++++++++++++++++++++++++++" << endl;
+               cout << "0-5% central pt-resolution correction used!" << endl;
+               cout << "+++++++++++++++++++++++++++++++++++++++++++" << endl;          
+        } else if (c_first == 2) { 
+               downscale = 0.8;
+               fun =(TF1*) fptcorr->Get("ptcorr_c5");
+               cout << "+++++++++++++++++++++++++++++++++++++++++++" << endl;
+               cout << "5-10% central pt-resolution correction used!" << endl;
+               cout << "+++++++++++++++++++++++++++++++++++++++++++" << endl;                  
+        } else if (c_first == 3) { 
+               downscale = 0.8;
+               fun =(TF1*) fptcorr->Get("ptcorr_c10");
+               cout << "+++++++++++++++++++++++++++++++++++++++++++" << endl;
+               cout << "10-20% central pt-resolution correction used!" << endl;
+               cout << "+++++++++++++++++++++++++++++++++++++++++++" << endl;                  
+        } else if (c_first == 4) { 
+               downscale = 0.9;
+               fun =(TF1*) fptcorr->Get("ptcorr_c20");
+               cout << "+++++++++++++++++++++++++++++++++++++++++++" << endl;
+               cout << "20-30% central pt-resolution correction used!" << endl;
+               cout << "+++++++++++++++++++++++++++++++++++++++++++" << endl;                  
+        } else if (c_first == 5) { 
+               fun =(TF1*) fptcorr->Get("ptcorr_c30");
+               cout << "+++++++++++++++++++++++++++++++++++++++++++" << endl;
+               cout << "30-40% central pt-resolution correction used!" << endl;
+               cout << "+++++++++++++++++++++++++++++++++++++++++++" << endl;                  
+        } else if (c_first == 6) { 
+               fun =(TF1*) fptcorr->Get("ptcorr_c40");
+               cout << "+++++++++++++++++++++++++++++++++++++++++++" << endl;
+               cout << "40-50% central pt-resolution correction used!" << endl;
+               cout << "+++++++++++++++++++++++++++++++++++++++++++" << endl;                  
+        } else if (c_first == 7) { 
+               fun =(TF1*) fptcorr->Get("ptcorr_c50");
+               cout << "+++++++++++++++++++++++++++++++++++++++++++" << endl;
+               cout << "50-60% central pt-resolution correction used!" << endl;
+               cout << "+++++++++++++++++++++++++++++++++++++++++++" << endl;                          
+       } else if (c_first == 8) { 
+               fun =(TF1*) fptcorr->Get("ptcorr_c60");
+               cout << "+++++++++++++++++++++++++++++++++++++++++++" << endl;
+               cout << "60-70% central pt-resolution correction used!" << endl;
+               cout << "+++++++++++++++++++++++++++++++++++++++++++" << endl;                             
+        } else {
+               fun =(TF1*) fptcorr->Get("ptcorr_c70");
+               cout << "+++++++++++++++++++++++++++++++++++++++++++++" << endl;                
+               cout << "70-80% central pt-resolution correction used!" << endl;
+               cout << "+++++++++++++++++++++++++++++++++++++++++++++" << endl;   
+        }    
+    
+
+    // normalization and finalization
+    // 1/N_evt 1/(2 pi pt) 1/width 1/etarange    
+    
+   for (int i=1; i <= dNdPt->GetNbinsX() ;i++) {
+        Double_t pt = dNdPt->GetBinCenter(i);
+        Double_t width = dNdPt->GetBinWidth(i);
+        Double_t val = dNdPt->GetBinContent(i);
+        Double_t err = dNdPt->GetBinError(i);
+        Double_t corrPtResol = 1.0;     
+        corrPtResol = 1.-((1.-fun->Eval(pt))*downscale );
+        if (pt < 10.) { corrPtResol = 1.0; }        
+        Double_t cval = (val * corrPtResol)/(width * 2.0 * TMath::Pi() * 1.6 * ReconstructedEvents * pt);
+        Double_t cerr = (err * corrPtResol)/(width * 2.0 * TMath::Pi() * 1.6 * ReconstructedEvents * pt);
+        dNdPt->SetBinContent(i,cval);
+        dNdPt->SetBinError(i,cerr);
+    }
+    // for dndeta again simpler
+    dNdEta->Scale(1,"width");
+    dNdEta->Scale(1./ReconstructedEvents);
+    
+    // normalization and finalization without resolution correction
+    // 1/N_evt 1/(2 pi pt) 1/width 1/etarange
+   for (int i=1; i <= dNdPt_nores->GetNbinsX() ;i++) {
+        Double_t pt = dNdPt_nores->GetBinCenter(i);
+        Double_t width = dNdPt_nores->GetBinWidth(i);
+        Double_t val = dNdPt_nores->GetBinContent(i);
+        Double_t err = dNdPt_nores->GetBinError(i);
+        Double_t cval = (val)/(width * 2.0 * TMath::Pi() * 1.6 * ReconstructedEvents * pt);
+        Double_t cerr = (err)/(width * 2.0 * TMath::Pi() * 1.6 * ReconstructedEvents * pt);
+        dNdPt_nores->SetBinContent(i,cval);
+        dNdPt_nores->SetBinError(i,cerr);
+    }    
+    
+    // normalization and finalization
+    // 1/N_evt 1/(2 pi pt) 1/width 1/etarange
+   for (int i=1; i <= dNdPt_raw->GetNbinsX() ;i++) {
+        Double_t pt = dNdPt_raw->GetBinCenter(i);
+        Double_t width = dNdPt_raw->GetBinWidth(i);
+        Double_t val = dNdPt_raw->GetBinContent(i);
+        Double_t err = dNdPt_raw->GetBinError(i);
+        Double_t cval = val/(width * 2.0 * TMath::Pi() * 1.6 * ReconstructedEvents * pt);
+        Double_t cerr = err/(width * 2.0 * TMath::Pi() * 1.6 * ReconstructedEvents * pt);
+        dNdPt_raw->SetBinContent(i,cval);
+        dNdPt_raw->SetBinError(i,cerr);
+    }
+    // for dndeta again simpler
+    dNdEta_raw->Scale(1,"width");
+    dNdEta_raw->Scale(1./ReconstructedEvents);
+     
+    dNdEta->SetMarkerStyle(21);
+    dNdPt->SetMarkerStyle(21);
+    dNdPt->SetTitle("; p_{T} (GeV/c) ; 1/N_{evt} 1/(2#pi p_{T}) (d^{2}N_{ch})/(d#eta dp_{T}) (GeV/c)^{-2}");
+    dNdEta->SetTitle("; #eta ; 1/N_{evt} (d^{2}N_{ch})/(d#eta)");
+    
+    dNdPt_raw->SetTitle("; p_{T} (GeV/c) ; 1/N_{evt} 1/(2#pi p_{T}) (d^{2}N_{ch})/(d#eta dp_{T}) (GeV/c)^{-2}");
+    dNdEta_raw->SetTitle("; #eta ; 1/N_{evt} (d^{2}N_{ch})/(d#eta)");
+    
+    Hists->Add(dNdEta_raw);
+    Hists->Add(dNdPt_raw);
+    Hists->Add(dNdEta);
+    Hists->Add(dNdPt);
+    Hists->Add(dNdPt_nores);
+    
+    
+   // plot pictures and save to gifdir
+    for (i=0; i < Hists->LastIndex(); i++) {    
+        TCanvas* ctmp = PlotHist(Hists->At(i),idstring);
+        if (gifdir && ctmp) {
+            TString gif(gifdir);
+            gif += '/';
+            gif += ctmp->GetName();
+            gif += ".gif";
+            ctmp->SaveAs(gif.Data(),"gif");     
+            delete ctmp;
+        }
+    }  
+
+    // save all correction matrices and control histograms to file
+    if (!outfile) { return; }
+    TFile *out = TFile::Open(outfile,"RECREATE");
+    Hists->Write();
+    out->Close();    
+
+    return ReconstructedEvents;
+
+}
+
+//___________________________________________________________________________
+TCanvas* PlotHist(TObject* hobj, const char* label=0)
+{
+    TH1* h = dynamic_cast<TH1*>(hobj);
+    if (!h) return 0;
+    if (h->GetDimension() > 2) return 0;
+    h->SetStats(0);
+    if ( TString(h->GetName()).Contains("Events")) { h->SetStats(1); } 
+    TString t(label);
+    if (label) t += "_";
+    t += h->GetName();
+    h->SetTitle(t.Data());
+    TCanvas* c = new TCanvas(t.Data(),t.Data());
+    if (h->GetDimension() >= 1) {
+        TString xlabel(h->GetXaxis()->GetTitle());
+        if (xlabel.Contains("Pt")) { c->SetLogx();  c->SetLogy();  h->GetXaxis()->SetRangeUser(0.1 , 100.); }
+        if (xlabel.Contains("p_{T}")) { c->SetLogx();  c->SetLogy();  h->GetXaxis()->SetRangeUser(0.1 , 100.); }        
+    }
+    if (h->GetDimension() == 2) {  
+        TString ylabel(h->GetYaxis()->GetTitle());
+        if (ylabel.Contains("Pt")) { c->SetLogy(); h->GetYaxis()->SetRangeUser(0.1 , 100.); }
+        if (ylabel.Contains("p_{T}")) { c->SetLogy(); h->GetYaxis()->SetRangeUser(0.1 , 100.); }
+        h->Draw("COLZ");
+    }        
+    if (h->GetDimension() == 1) {
+        h->Draw();
+    }
+    return c;
+
+}
diff --git a/PWG0/dNdPt/macros/ApplyCorrections_pp.C b/PWG0/dNdPt/macros/ApplyCorrections_pp.C
new file mode 100644 (file)
index 0000000..5244c69
--- /dev/null
@@ -0,0 +1,733 @@
+Double_t ApplyCorrections_pp(const char* datafile, const char* datatask, const char* corrfile, const char* idstring ,const char* outfile, const char* gifdir = 0)
+//Double_t ApplyCorrections_pp()
+{
+
+// tmp setting
+// const char* mcfile = "/d/alice09/mknichel/train/V007.MC_pp/2011-05-05_2347.7147/mergedPeriods/MC_pp/7TeV/LHC10f6a/mknichel_dNdPtpp_TPCITS.root";
+// const char* mctask = "mknichel_dNdPtpp_TPCITS";
+// const char* idstring = "TPCITS";
+// const char* gifdir = "/u/mknichel/alice/dNdPt_pp/temp";
+// const char* datafile = "/d/alice09/mknichel/train/V007.MC_pp/2011-05-05_2347.7147/mergedPeriods/MC_pp/7TeV/LHC10f6a/mknichel_dNdPtpp_TPCITS.root";
+// const char* outfile = "/u/mknichel/alice/dNdPt_pp/temp/FinalSpectra.root";
+// const char* corrfile = "/u/mknichel/alice/dNdPt_pp/temp/corrMatr_LHC10f6a_TPCITS.root";
+// const char* gifdir = "/u/mknichel/alice/dNdPt_pp/temp";
+
+TString fname (datafile);
+
+TString id (idstring);
+TString taskname = "mknichel_dNdPtpp_" + id;
+TString objname = "dNdPtAnalysis_" + id;
+
+// tmp setting
+ //     const char* datatask = "jotwinow_dNdPtAnalysis_TPCITS";
+//      const char* corrfile = "/u/mknichel/alice/dNdPt_pp/2011-04-04_1251/corrMatr_LHC10f6a_TPCITS.root";
+//      const char* idstring = "";
+//      const char* outfile = "/u/mknichel/alice/dNdPt_pp/2011-04-04_1251/finalSpectra_LHC11a_TPCITS.root";
+//      const char* gifdir = "/u/mknichel/alice/dNdPt_pp/2011-04-04_1251/plots";
+    
+    // settings vor zVertex cut (event and track level)
+    Double_t zVert = 10.0;
+    
+    // setting on eta cut (track level)
+    Double_t eta = 0.8;
+    /*
+    //load required libraries
+    //load required libraries    
+    gSystem->AddIncludePath("-I$ROOTSYS/include -I$ALICE_ROOT/ -I$ALICE_ROOT/include -I$ALICE_ROOT/STEER  -I$ALICE_ROOT/ANALYSIS -I$ALICE_ROOT/PWG0 -I$ALICE_ROOT/PWG1 -I$ALICE_ROOT/PWG2 -I$ALICE_ROOT/PWG3 -I$ALICE_ROOT/PWG3/vertexingHF -I$ALICE_ROOT/PWG4 -I$ALICE_ROOT/CORRFW -I$ALICE_ROOT/TPC -I$ALICE_ROOT/TRD -I$ALICE_ROOT/PWG3/muon -I$ALICE_ROOT/JETAN -I$ALICE_ROOT/ANALYSIS/Tender");
+    
+  gSystem->Load("libCore");
+  gSystem->Load("libPhysics");
+  gSystem->Load("libMinuit");
+  gSystem->Load("libGui");
+  gSystem->Load("libXMLParser");
+
+  gSystem->Load("libGeom");
+  gSystem->Load("libVMC");
+
+  gSystem->Load("libNet");
+
+  gSystem->Load("libSTEERBase");
+  gSystem->Load("libESD");
+  gSystem->Load("libCDB");
+  gSystem->Load("libRAWDatabase");
+  gSystem->Load("libRAWDatarec");
+  gSystem->Load("libANALYSIS");
+
+    
+    
+    gSystem->Load("libANALYSIS.so");
+    gSystem->Load("libOADB.so");
+    gSystem->Load("libANALYSISalice.so");
+    gSystem->Load("libTENDER.so");
+    gSystem->Load("libCORRFW.so");
+    gSystem->Load("libPWG0base.so");    
+    gSystem->Load("libPWG0dep"); 
+    gSystem->Load("libPWG0selectors.so");
+    */
+
+    // make plots nicer
+    gROOT->SetStyle("Plain");
+    gStyle->SetPalette(1);
+    
+    // array for all histograms to be saves
+    TObjArray* Hists = new TObjArray();
+    
+    // open file with correction matrices
+    TFile *fcorr = TFile::Open(corrfile,"READ");
+    if (!fcorr) return -2;
+    
+    TH1D* dNdPt_MC      =  (TH1D*) fcorr->Get("dNdPt_MC");
+    TH1D* dNdEta_MC      = (TH1D*) fcorr->Get("dNdEta_MC");
+    Hists->Add(dNdPt_MC);
+    Hists->Add(dNdEta_MC);
+    
+    // load data
+    TFile* fdata = TFile::Open(datafile,"READ");
+    if (!fdata) return -1;
+    TList* ldata = dynamic_cast<TList*>(fdata->Get(taskname.Data()));
+    if (!ldata) return -1;
+    AlidNdPtAnalysis *obj = dynamic_cast<AlidNdPtAnalysis*>(ldata->FindObject(objname.Data()));
+    if (!obj) return -1;
+    
+    //Event statistics
+    obj->GetRecEventHist2()->GetAxis(0)->SetRange();
+    THnSparse *fRecEventHist2 = obj->GetRecEventHist2(); //reconstructed events        
+    TH1D* h1RecEventHist2_zv = (TH1D*) fRecEventHist2->Projection(0)->Clone("h1RecEventHist2_zv");  // zvertex distribution
+    TH2D* h2RecEvent2All = (TH2D*) fRecEventHist2->Projection(0,1)->Clone("h2RecEvent2All");
+    fRecEventHist2->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    TH2D* h2RecEvent2 = (TH2D*) fRecEventHist2->Projection(0,1)->Clone("h2RecEvent2");
+    TH2D* h2RecEvent2Corrected = (TH2D*) fRecEventHist2->Projection(0,1)->Clone("h2RecEvent2Corrected"); //will be corrected
+    
+    THnSparse* fEventCount = obj->GetEventCount(); 
+    Hists->Add(fEventCount);
+    Double_t TriggeredEventsNoVertex = fEventCount->Projection(0)->GetBinContent(2) -  fEventCount->Projection(1)->GetBinContent(2); // all triggered events without rec. vertex
+    Double_t AllTriggeredEvents = fEventCount->Projection(0)->GetBinContent(2); // all
+    
+    Double_t ReconstructedEvents = h2RecEvent2->Integral();
+    Double_t ReconstructedEventsAll = h2RecEvent2All->Integral();
+    Double_t TriggerEffInel = 0.864; //numeber from michele floris for 7TeV (I use it also for 2.76)
+    TriggerEffInel = 0.9379; //mc value from mc
+    if ( fname.Contains("900GeV") ) { TriggerEffInel = 0.9156; } 
+    if ( fname.Contains("2.76TeV") ) { TriggerEffInel = 0.883; } 
+    if ( fname.Contains("7TeV") ) { TriggerEffInel = 0.8524; } 
+    
+    cout << "Using Trigger_to_Inel efficiecy: " << TriggerEffInel <<endl;
+    
+    
+    Double_t ReconstructedEventsFraction = (ReconstructedEventsAll-ReconstructedEvents) / ReconstructedEventsAll;
+    Double_t SelectedEventsFraction = ReconstructedEvents / ReconstructedEventsAll;
+    Double_t InelasticEventsSimple = AllTriggeredEvents/TriggerEffInel*SelectedEventsFraction;
+    
+    Hists->Add(h2RecEvent2);
+    Hists->Add(h2RecEvent2All);
+    Hists->Add(h2RecEvent2Corrected);
+  
+    printf("=== Number of events from DATA                      %lf ===\n",ReconstructedEvents);
+    printf("=== Number of events from DATA (before zVertex cut) %lf ===\n",ReconstructedEventsAll);
+    printf("=== Number of events from DATA (all triggered)      %lf ===\n",AllTriggeredEvents);
+  
+    TH1D* h1ReconstructedEvents = new TH1D("h1ReconstructedEvents","h1ReconstructedEvents",1,0,1);
+    TH1D* h1ReconstructedEventsAll = new TH1D("h1ReconstructedEventsAll","h1ReconstructedEventsAll",1,0,1);
+    
+    h1ReconstructedEvents->Fill(0,ReconstructedEvents);
+    h1ReconstructedEvents->SetEntries(ReconstructedEvents);
+    h1ReconstructedEventsAll->Fill(0,ReconstructedEventsAll);
+    h1ReconstructedEventsAll->SetEntries(ReconstructedEventsAll);
+        
+    Hists->Add(h1ReconstructedEvents);
+    Hists->Add(h1ReconstructedEventsAll);
+    
+     // retrieve corrections (event level)
+     TH2D* h2EventTriggerEffAll   = (TH2D*)fcorr->Get("h2EventTriggerEffAll");  
+     TH2D* h2EventTriggerCorrAll  = (TH2D*)fcorr->Get("h2EventTriggerCorrAll");  
+     TH2D* h2EventTriggerEff      = (TH2D*)fcorr->Get("h2EventTriggerEff");  
+     TH2D* h2EventTriggerCorr     = (TH2D*)fcorr->Get("h2EventTriggerCorr");  
+     TH2D* h2EventRecEffAll       = (TH2D*)fcorr->Get("h2EventRecEffAll");  
+     TH2D* h2EventRecCorrAll      = (TH2D*)fcorr->Get("h2EventRecCorrAll");  
+     TH2D* h2EventRecEff          = (TH2D*)fcorr->Get("h2EventRecEff");  
+     TH2D* h2EventRecCorr         = (TH2D*)fcorr->Get("h2EventRecCorr");  
+     TH2D* h2EventEffAll          = (TH2D*)fcorr->Get("h2EventEffAll");  
+     TH2D* h2EventCorrAll         = (TH2D*)fcorr->Get("h2EventCorrAll");  
+     TH2D* h2EventEff             = (TH2D*)fcorr->Get("h2EventEff");  
+     TH2D* h2EventCorr            = (TH2D*)fcorr->Get("h2EventCorr"); 
+     TH1D* h1TriggerEff_bin0_zv   = (TH1D*)fcorr->Get("h1TriggerEff_bin0_zv"); 
+     TH1D* h1TriggerCorr_bin0_zv  = (TH1D*)fcorr->Get("h1TriggerCorr_bin0_zv"); 
+     TH1D* h1Ratio_zv             = (TH1D*)fcorr->Get("h1Ratio_zv"); 
+     TH1D* corr_shape_trig0_zv    = (TH1D*)fcorr->Get("corr_shape_trig0_zv"); 
+     TH1D* corr_shape_notrig0_zv  = (TH1D*)fcorr->Get("corr_shape_notrig0_zv"); 
+     
+     
+    Double_t corrTrackMatch = 1.0;
+   //tracking efficiency is 2% to low in MC LHC10e13 900GeV as compared to data
+   if ( fname.Contains("900GeV") ) {   
+       corrTrackMatch = 1.02;
+       cout << "900 GeV: correct tracking matching efficiency " <<endl;
+   }
+
+     
+    // correct bin0
+    //h1RecEventHist2_zv->Scale(1./h1RecEventHist2_zv->Integral());
+    /*
+    TH1D* h1Bin0_zv =  (TH1D*) h1RecEventHist2_zv->Clone("h1Bin0_zv");
+    h1Bin0_zv->Multiply(h1Ratio_zv);
+    h1Bin0_zv->Scale(1./h1Bin0_zv->Integral());
+    h1Bin0_zv->Scale(TriggeredEventsNoVertex);
+    //h1Bin0_zv->Multiply(h1TriggerCorr_bin0_zv);
+    h1Bin0_zv->GetXaxis()->SetRangeUser(-zVert, zVert-0.01); //zVertex
+    Double_t bin0EventsCorrected =  h1Bin0_zv->Integral();
+    */
+    // this is what is used for normalization
+    Double_t InelasticEventsAll =  AllTriggeredEvents/TriggerEffInel; 
+    Double_t Bin0EventsAll = TriggeredEventsNoVertex;
+    Double_t UntriggeredEventsAll = InelasticEventsAll - AllTriggeredEvents;
+    cout << "cross check: INEL Events 1 " << InelasticEventsAll <<endl;
+    cout << "cross check: INEL Events 2 " << (ReconstructedEventsAll+Bin0EventsAll+UntriggeredEventsAll) <<endl;
+    
+    // correct bin0
+    TH1D* h1Bin0_zv =  (TH1D*) h1RecEventHist2_zv->Clone("h1Bin0_zv");
+    h1Bin0_zv->Multiply(corr_shape_trig0_zv);     //correct for shape
+    h1Bin0_zv->Scale(1./h1Bin0_zv->Integral());    //normalize    
+    h1Bin0_zv->Scale(Bin0EventsAll);
+    Double_t Bin0Events = h1Bin0_zv->Integral(5,8);
+    
+    //correct untriggered
+    TH1D* h1NoTrig_zv =  (TH1D*) h1RecEventHist2_zv->Clone("h1NoTrig_zv");
+    h1NoTrig_zv->Multiply(corr_shape_notrig0_zv);     //correct for shape
+    h1NoTrig_zv->Scale(1./h1NoTrig_zv->Integral());    //normalize    
+    h1NoTrig_zv->Scale(UntriggeredEventsAll);
+    Double_t UntriggeredEvents = h1NoTrig_zv->Integral(5,8);
+    
+    
+    Double_t InelasticEvents = ReconstructedEvents + Bin0Events + UntriggeredEvents;
+    
+    /*
+    // my way (old)
+    TH1D* h1Bin0_zv =  (TH1D*) h1RecEventHist2_zv->Clone("h1Bin0_zv");
+    h1Bin0_zv->Multiply(h1Ratio_zv);
+    h1Bin0_zv->Multiply(h1TriggerEff_bin0_zv);
+    h1Bin0_zv->Scale(1./h1Bin0_zv->Integral());
+    h1Bin0_zv->Scale(TriggeredEventsNoVertex);
+    h1Bin0_zv->Multiply(h1TriggerCorr_bin0_zv);
+    Double_t bin0EventsCorrected = h1Bin0_zv->Integral(5,8);
+     */
+
+    /*
+    //jaceks way (?)
+    h1RecEventHist2_zv->Scale(1./h1RecEventHist2_zv->Integral());
+    h1RecEventHist2_zv->Scale(TriggeredEventsNoVertex); 
+    Double_t bin0EventsCorrected = h1RecEventHist2_zv->Integral(5,8);    
+*/
+     // retrieve tracks
+    THnSparse* hSRecTrack; // = obj->GetRecTrackHist()->Clone("hsRecTrack"); //thnsparse to be corrected
+    THnSparse* fRecTrackHist2 = obj->GetRecTrackHist(); //after all cuts (2)
+    fRecTrackHist2->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01); //zVertex
+    fRecTrackHist2->GetAxis(2)->SetRangeUser(-eta, eta-0.01); // eta   
+    Int_t dims[4] = {0,1,2,3};
+    hSRecTrack = (THnSparse*) (fRecTrackHist2->Projection(4,dims,"e")->Clone("hSRecTrack"));        
+    hSRecTrackAllMult = (THnSparse*) (fRecTrackHist2->Projection(3,dims,"e")->Clone("hSRecTrackAllMult"));
+    
+    TH3D* h3RecTrackHist2 = fRecTrackHist2->Projection(0,1,2)->Clone("h3RecTrackHist2");
+   
+    TH1D* h1RecTrackHist2_zv = fRecTrackHist2->Projection(0)->Clone("h1RecTrackHist2_zv");
+    TH1D* h1RecTrackHist2_pt = fRecTrackHist2->Projection(1)->Clone("h1RecTrackHist2_pt");
+    TH1D* h1RecTrackHist2_eta = fRecTrackHist2->Projection(2)->Clone("h1RecTrackHist2_eta");
+   
+    Hists->Add(h1RecTrackHist2_zv);
+    Hists->Add(h1RecTrackHist2_pt);
+    Hists->Add(h1RecTrackHist2_eta);
+    Hists->Add(h3RecTrackHist2);
+    
+    // generate corrections for events
+    TH1D* h1MCGeneratedEvents     = (TH1D*)fcorr->Get("h1MCGeneratedEvents");  
+    TH1D* h1MCReconstructedEvents = (TH1D*)fcorr->Get("h1MCReconstructedEvents");
+    TH1D* h1MCTriggeredEvents0mult = (TH1D*)fcorr->Get("h1MCTriggeredEvents0mult");
+    TH1D* h1MCTriggeredEventsAll0mult = (TH1D*)fcorr->Get("h1MCTriggeredEventsAll0mult");
+    TH1D* h1MCTriggeredEventsAll = (TH1D*)fcorr->Get("h1MCTriggeredEventsAll");
+    TH1D* h1MCTriggeredEvents = (TH1D*)fcorr->Get("h1MCTriggeredEvents");
+        
+    
+    Double_t MCGeneratedEvents = h1MCGeneratedEvents->GetEntries();
+    Double_t MCReconstructedEvents = h1MCReconstructedEvents->GetEntries();
+    Double_t CorrEvent = MCGeneratedEvents / MCReconstructedEvents;
+    
+    Double_t MCTriggeredEvents = h1MCTriggeredEvents->GetEntries();
+    Double_t MCTriggeredEventsAll = h1MCTriggeredEventsAll->GetEntries();
+    Double_t MCTriggeredEvents0mult = h1MCTriggeredEvents0mult->GetEntries();
+    Double_t MCTriggeredEventsAll0mult = h1MCTriggeredEventsAll0mult->GetEntries();        
+    Double_t CorrVtxEvent0mult    = MCTriggeredEvents / (MCTriggeredEvents-MCTriggeredEvents0mult); //this is used
+    Double_t CorrVtxEventAll0mult = MCTriggeredEventsAll / (MCTriggeredEventsAll-MCTriggeredEventsAll0mult); 
+    
+    // correct for trigger/vertex inefficiencies
+    for (int xbin=1; xbin <= h2RecEvent2Corrected->GetNbinsX(); xbin++) {
+        for (int ybin=1; ybin <= h2RecEvent2Corrected->GetNbinsY(); ybin++) {
+            Double_t x = h2RecEvent2Corrected->GetXaxis()->GetBinCenter(xbin);
+            Double_t y = h2RecEvent2Corrected->GetYaxis()->GetBinCenter(ybin);
+            Int_t bin  = h2EventCorr->FindBin(x,y);            
+            Double_t corr    = h2EventCorr->GetBinContent(bin);
+            Double_t correrr = h2EventCorr->GetBinError(bin);
+            if (corr < 0.01) { corr=1.; correrr=0.;} //bin empty in correction matrix            
+            Double_t val     = h2RecEvent2Corrected->GetBinContent(xbin,ybin);
+            Double_t err     = h2RecEvent2Corrected->GetBinError(xbin,ybin);
+            h2RecEvent2Corrected->SetBinContent(xbin,ybin,corr*val);
+            h2RecEvent2Corrected->SetBinError(xbin,ybin,TMath::Sqrt(val*val*correrr*correrr + err*err*corr*corr));
+            
+        }
+    }
+    //Double_t ReconstructedEventsCorrected = h2RecEvent2Corrected->Integral() * CorrVtxEvent0mult;
+    //Double_t ReconstructedEventsCorrected = h2RecEvent2Corrected->Integral() + bin0EventsCorrected;
+    printf("=== Number of events from DATA (final correction)   %lf ===\n",InelasticEvents); 
+    printf("=== Number of events from DATA (corr, no bin0)      %lf ===\n",h2RecEvent2Corrected->Integral());
+    printf("=== Number of events from DATA (simple corr. 7TeV)  %lf ===\n",InelasticEventsSimple);          
+    printf("=== Number of events from DATA (simple correction)  %lf ===\n",ReconstructedEvents * CorrEvent);
+    printf("=== Number of bin0events from DATA                  %lf ===\n",TriggeredEventsNoVertex); 
+    //printf("=== Number of bin0events from DATA (corrected)      %lf ===\n",bin0EventsCorrected); 
+    
+    // retrieve 3D correction matrices for tracking efficiency and secondaries (note different binning!)
+    TH3D* h3TrackEff   = (TH3D*)fcorr->Get("h3TrackEff");  
+    TH3D* h3TrackCorr  = (TH3D*)fcorr->Get("h3TrackCorr");  
+    TH3D* h3SecCont    = (TH3D*)fcorr->Get("h3SecCont");  
+    TH3D* h3SecCorr    = (TH3D*)fcorr->Get("h3SecCorr");      
+    
+    // retrieve 3D thnsparse correction matrices for tracking efficiency and secondaries (note different binning!) --- this is used!!!!
+    THnSparse* hSTrackEff = (THnSparse*) fcorr->Get("hSTrackEff");
+    THnSparse* hSTrackCorr = (THnSparse*) fcorr->Get("hSTrackCorr");
+    THnSparse* hSSecCont = (THnSparse*) fcorr->Get("hSSecCont");
+    THnSparse* hSSecCorr = (THnSparse*) fcorr->Get("hSSecCorr");
+        
+
+    // retrieve correction matrices for tracking efficiency (note different binning!)
+    TH1D* h1TrackCorr_pt  = (TH1D*)fcorr->Get("h1TrackCorr_pt");  
+    TH1D* h1TrackCorr_eta = (TH1D*)fcorr->Get("h1TrackCorr_eta");
+        
+    // retrieve correction matrices for secondaries (note different binning!)
+    TH1D* h1SecCorr_pt  = (TH1D*)fcorr->Get("h1SecCorr_pt");  
+    TH1D* h1SecCorr_eta = (TH1D*)fcorr->Get("h1SecCorr_eta");
+
+    // create corrected spectra (as clone of raw data)
+    TH1D* h1Corrected_pt  = h1RecTrackHist2_pt->Clone("h1Corrected_pt");
+    TH1D* h1Corrected_eta  = h1RecTrackHist2_eta->Clone("h1Corrected_eta");
+
+    // secondaries correction for pt spectrum
+    for (int i=1; i <= h1Corrected_pt->GetNbinsX() ; i++) {
+        Double_t pt = h1Corrected_pt->GetBinCenter(i);
+        Double_t val = h1Corrected_pt->GetBinContent(i);
+        Double_t err = h1Corrected_pt->GetBinError(i);
+        if (pt >= 50) { pt = 49.5; }  // above 50 GeV corr matr have low statistics
+        Double_t secCorr    = h1SecCorr_pt->GetBinContent(h1SecCorr_pt->FindBin(pt));
+        Double_t secCorrErr = h1SecCorr_pt->GetBinError(h1SecCorr_pt->FindBin(pt));
+        Double_t cval = val*secCorr;
+        Double_t cerr = TMath::Sqrt(val*val*secCorrErr*secCorrErr + err*err*secCorr*secCorr);
+        h1Corrected_pt->SetBinContent(i,cval);
+        h1Corrected_pt->SetBinError(i,cerr);
+    }
+
+    // tracking efficiency correction pt spectrum
+    for (int i=1; i <= h1Corrected_pt->GetNbinsX() ;i++) {
+        Double_t pt = h1Corrected_pt->GetBinCenter(i);
+        Double_t val = h1Corrected_pt->GetBinContent(i);
+        Double_t err = h1Corrected_pt->GetBinError(i);
+        if (pt >= 50) { pt = 49.5; } // above 50 GeV corr matr have low statistics
+        Double_t effCorr    = h1TrackCorr_pt->GetBinContent(h1TrackCorr_pt->FindBin(pt));
+        Double_t effCorrErr = h1TrackCorr_pt->GetBinError(h1TrackCorr_pt->FindBin(pt));
+        
+        Double_t cval = corrTrackMatch * val * effCorr;
+        Double_t cerr = corrTrackMatch * TMath::Sqrt(val*val*effCorrErr*effCorrErr + err*err*effCorr*effCorr);
+        h1Corrected_pt->SetBinContent(i,cval);
+        h1Corrected_pt->SetBinError(i,cerr);
+    }
+       
+       
+    
+   // efficiency and contamination correction for thnsparse
+   for (Long64_t j = 0; j < hSRecTrack->GetNbins(); j++) {
+       Int_t tc[4];
+       Double_t tval    = hSRecTrack->GetBinContent(j,tc);
+       Double_t terr    = hSRecTrack->GetBinError(j);
+       Double_t tzv     = hSRecTrack->GetAxis(0)->GetBinCenter(tc[0]);
+       Double_t tpt     = hSRecTrack->GetAxis(1)->GetBinCenter(tc[1]);
+       Double_t teta    = hSRecTrack->GetAxis(2)->GetBinCenter(tc[2]);
+       Double_t tmultMB = hSRecTrack->GetAxis(3)->GetBinCenter(tc[3]);
+       if (tzv >= 10.0) { tzv = 9.9; }
+       if (teta >= 0.8) {teta = 0.79;}
+       if (tzv < -10.0) { tzv = -10.; }
+       if (teta < -0.8) { teta = -0.8; }              
+       if (tpt >= 50.) { tpt = 49.5; } // above 50 GeV corr matr have low statistics 
+       if (tpt < 0.15) { tpt = 0.175; } // also below 0.15       
+       Double_t xvals[3];
+       xvals[0] = tzv;
+       xvals[1] = tpt;
+       xvals[2] = teta;
+       Double_t effCorr    = hSTrackCorr->GetBinContent(hSTrackCorr->GetBin(xvals,kFALSE));
+       Double_t effCorrErr = hSTrackCorr->GetBinError(hSTrackCorr->GetBin(xvals,kFALSE));
+       Double_t secCorr    = hSSecCont->GetBinContent(hSSecCont->GetBin(xvals,kFALSE));
+       Double_t secCorrErr = hSSecCont->GetBinError(hSSecCont->GetBin(xvals,kFALSE));
+//        Double_t effCorr    = h3TrackCorr->GetBinContent(h3TrackCorr->FindBin(tzv,tpt,teta));
+//        Double_t effCorrErr = h3TrackCorr->GetBinError(h3TrackCorr->FindBin(tzv,tpt,teta));
+//        Double_t secCorr    = 1. - h3SecCont->GetBinContent(h3SecCont->FindBin(tzv,tpt,teta));
+//        Double_t secCorrErr = h3SecCont->GetBinError(h3SecCont->FindBin(tzv,tpt,teta));
+       if (effCorr < 1.) { cout << "bin empty, use efficiency 1!" << endl; effCorr=1.; }
+       if (secCorr < 0.001) { cout << "bin empty, use contamination 0!" << endl; }
+       if (effCorrErr < 1e-9) { cout << "eff error empty!" << endl; }
+       if (secCorrErr < 1e-9) { cout << "cont error empty!" << endl;}
+       Double_t corr    = corrTrackMatch * effCorr*(1.-secCorr);
+       //Double_t corrErr = corrTrackMatch * TMath::Sqrt(effCorr*secCorrErr + secCorr*effCorrErr); 
+       Double_t ctval = tval*corr;
+       Double_t cterr = terr*corr; // errors are not correlated        
+       //Double_t cterr = TMath::Sqrt(tval*tval*corrErr*corrErr + terr*terr*corr*corr); // errors are not correlated       
+       hSRecTrack->SetBinContent(j,ctval);
+       hSRecTrack->SetBinError(j,cterr);
+    }
+    
+    TH1D* effCorrPt = hSRecTrack->Projection(1)->Clone("effCorrPt");
+    TH1D* effCorrPtErr2 = hSRecTrack->Projection(1)->Clone("effCorrPtErr2");
+    TH1D* effCorrPtNorm = hSRecTrack->Projection(1)->Clone("effCorrPtNorm");
+    effCorrPt->Reset();
+    effCorrPtErr2->Reset();
+//     effCorrPtNorm->Reset();
+    /*
+for (Long64_t j = 0; j < hSRecTrackAllMult->GetNbins(); j++) {
+       Int_t tc[3];
+       Double_t tval    = hSRecTrackAllMult->GetBinContent(j,tc);
+       Double_t tzv     = hSRecTrackAllMult->GetAxis(0)->GetBinCenter(tc[0]);
+       Double_t tpt     = hSRecTrackAllMult->GetAxis(1)->GetBinCenter(tc[1]);
+       Double_t teta    = hSRecTrackAllMult->GetAxis(2)->GetBinCenter(tc[2]);
+       if (tpt >= 50.) { tpt = 49.5; } // above 50 GeV corr matr have low statistics 
+       Double_t effCorr    = h3TrackCorr->GetBinContent(h3TrackCorr->FindBin(tzv,tpt,teta));
+       Double_t effCorrErr = h3TrackCorr->GetBinError(h3TrackCorr->FindBin(tzv,tpt,teta));
+       Double_t secCorr    = 1. - h3SecCont->GetBinContent(h3SecCont->FindBin(tzv,tpt,teta));
+       Double_t secCorrErr = h3SecCont->GetBinError(h3SecCont->FindBin(tzv,tpt,teta));
+       if (effCorr < 0.1) { cout << "bin empty, use efficiency 1!" << endl; effCorr=1.; effCorrErr=0.; }
+       if (secCorr < 0.1) { cout << "bin empty, use contamination 0!" << endl; secCorr=1.; secCorrErr=0.; }
+       Double_t corr    = effCorr*secCorr;
+       Double_t corrErr = effCorr*secCorrErr + secCorr*effCorrErr; // errors are correlated
+       effCorrPt->Fill(tpt,tval*corr);
+       effCorrPtErr2->Fill(tpt,tval*tval*corrErr*corrErr);
+       effCorrPtNorm->Fill(tpt,tval);
+    }
+       
+    effCorrPt->Divide(effCorrPtNorm);
+    for (Int_t i = 4; i <= effCorrPtErr2->GetNbinsX(); i++) { effCorrPtErr2->SetBinContent(i,TMath::Sqrt(effCorrPtErr2->GetBinContent(i)));  }
+    effCorrPtErr2->Divide(effCorrPtNorm);
+    cout << effCorrPt->GetBinContent(4) << endl;
+    cout << effCorrPtErr2->GetBinContent(4) << endl;
+    cout << effCorrPtNorm->GetBinContent(4) << endl;
+    
+    
+    
+    TH1D* RecTrackPtCorrected = hSRecTrack->Projection(1)->Clone("RecTrackPtCorrected");
+    RecTrackPtCorrected->Reset();    
+    
+
+    for (Int_t i = 4; i <= RecTrackPtCorrected->GetNbinsX(); i++) {    
+       if (0 == effCorrPtErr2->GetBinContent(i)) continue;
+       Double_t val     = effCorrPt->GetBinContent(i); 
+       cout << (val*val/effCorrPtNorm->GetBinContent(i)) << " " << effCorrPtErr2->GetBinContent(i) << endl;
+       Double_t err2  = (val*val/effCorrPtNorm->GetBinContent(i)) + effCorrPtErr2->GetBinContent(i);
+       RecTrackPtCorrected->SetBinContent(i,val);
+       RecTrackPtCorrected->SetBinError(i,TMath::Sqrt(err2));
+    }
+    */
+    
+for (Long64_t j = 0; j < hSRecTrackAllMult->GetNbins(); j++) {
+       Int_t tc[3];
+       Double_t tval    = hSRecTrackAllMult->GetBinContent(j,tc);
+       Double_t terr    = TMath::Sqrt(tval); //hSRecTrackAllMult->GetBinError(j);
+       Double_t tzv     = hSRecTrackAllMult->GetAxis(0)->GetBinCenter(tc[0]);
+       Double_t tpt     = hSRecTrackAllMult->GetAxis(1)->GetBinCenter(tc[1]);
+       Double_t teta    = hSRecTrackAllMult->GetAxis(2)->GetBinCenter(tc[2]);
+       Double_t tmultMB = hSRecTrack->GetAxis(3)->GetBinCenter(tc[3]);
+       if (tzv >= 10.0) { tzv = 9.9; }
+       if (teta >= 0.8) {teta = 0.79;}
+       if (tzv < -10.0) { tzv = -10.; }
+       if (teta < -0.8) { teta = -0.8; }              
+       if (tpt >= 50.) { tpt = 49.5; } // above 50 GeV corr matr have low statistics 
+       if (tpt < 0.15) { tpt = 0.175; } // also below 0.15       
+      Double_t xvals[3];
+       xvals[0] = tzv;
+       xvals[1] = tpt;
+       xvals[2] = teta;
+       Double_t effCorr    = hSTrackCorr->GetBinContent(hSTrackCorr->GetBin(xvals,kFALSE));
+       Double_t effCorrErr = hSTrackCorr->GetBinError(hSTrackCorr->GetBin(xvals,kFALSE));
+       Double_t secCont    = hSSecCont->GetBinContent(hSSecCont->GetBin(xvals,kFALSE));
+       Double_t secContErr = hSSecCont->GetBinError(hSSecCont->GetBin(xvals,kFALSE));       
+//        Double_t effCorr    = h3TrackCorr->GetBinContent(h3TrackCorr->FindBin(tzv,tpt,teta));
+//        Double_t effCorrErr = h3TrackCorr->GetBinError(h3TrackCorr->FindBin(tzv,tpt,teta));
+//        Double_t secCorr    = 1. - h3SecCont->GetBinContent(h3SecCont->FindBin(tzv,tpt,teta));
+//        Double_t secCorrErr = h3SecCont->GetBinError(h3SecCont->FindBin(tzv,tpt,teta));       
+       if (effCorr < 1.) { cout << "bin empty, use efficiency 1!" << endl; effCorr=1.; }
+       if (secCont < 0.001) { cout << "bin empty, use contamination 0!" << endl; }
+       if (effCorrErr < 1e-9) { cout << "eff error empty!" << endl; }
+       if (secContErr < 1e-9) { cout << "cont error empty!" << endl;}
+       Double_t secCorr = (1.-secCont);
+       Double_t corr    = corrTrackMatch * (effCorr*secCorr);
+       Double_t corrErr = corrTrackMatch *  TMath::Sqrt(effCorr*secCorrErr + secCorr*effCorrErr); 
+       Double_t ctval = tval*corr;
+       Double_t cterr = terr*corr; // errors are not correlated        
+       //Double_t cterr = TMath::Sqrt(tval*tval*corrErr*corrErr + terr*terr*corr*corr); // errors are not correlated       
+       hSRecTrackAllMult->SetBinContent(j,ctval);
+       hSRecTrackAllMult->SetBinError(j,cterr);
+    }
+    
+    // create final spectrum in multiplicity bins
+    TH2D* dNdPtMult = hSRecTrack->Projection(3,1)->Clone("dNdPtMult");
+    
+    // create final spectra (as clone of corrected data)
+    TH1D* dNdPt = hSRecTrackAllMult->Projection(1)->Clone("dNdPt");
+/*
+    // errors on pt spectrum from corrections
+    for (int i=1; i <= dNdPt->GetNbinsX() ; i++) {
+        Double_t pt = dNdPt->GetBinCenter(i);
+        Double_t val = dNdPt->GetBinContent(i);
+        Double_t err = dNdPt->GetBinError(i);
+        if (pt >= 50) { pt = 49.5; }  // above 50 GeV corr matr have low statistics
+        Double_t secCorr    = h1SecCorr_pt->GetBinContent(h1SecCorr_pt->FindBin(pt));
+        Double_t secCorrErr = h1SecCorr_pt->GetBinError(h1SecCorr_pt->FindBin(pt));
+        Double_t effCorr    = h1TrackCorr_pt->GetBinContent(h1TrackCorr_pt->FindBin(pt));
+        Double_t effCorrErr = h1TrackCorr_pt->GetBinError(h1TrackCorr_pt->FindBin(pt));
+        Double_t corr    = effCorr*secCorr;
+        Double_t corrErr = effCorr*secCorrErr + secCorr*effCorrErr; // errors are correlated         
+        Double_t cval = val*secCorr;
+        Double_t cerr = TMath::Sqrt(val*val*corrErr*corrErr + err*err*corr*corr);
+        dNdPt->SetBinError(i,cerr);
+    }
+    
+    // errors on pt spectrum from corrections
+    for (int i=1; i <= dNdPtMult->GetNbinsX() ; i++) {
+    for (int k=1; k <= dNdPtMult->GetNbinsY() ; k++) {
+        Double_t pt = dNdPt->GetBinCenter(i);
+        Double_t val = dNdPtMult->GetBinContent(i,k);
+        Double_t err = dNdPtMult->GetBinError(i,k);
+        if (pt >= 50) { pt = 49.5; }  // above 50 GeV corr matr have low statistics
+        Double_t secCorr    = h1SecCorr_pt->GetBinContent(h1SecCorr_pt->FindBin(pt));
+        Double_t secCorrErr = h1SecCorr_pt->GetBinError(h1SecCorr_pt->FindBin(pt));
+        Double_t effCorr    = h1TrackCorr_pt->GetBinContent(h1TrackCorr_pt->FindBin(pt));
+        Double_t effCorrErr = h1TrackCorr_pt->GetBinError(h1TrackCorr_pt->FindBin(pt));
+        Double_t corr    = effCorr*secCorr;
+        Double_t corrErr = effCorr*secCorrErr + secCorr*effCorrErr; // errors are correlated         
+        Double_t cval = val*secCorr;
+        Double_t cerr = TMath::Sqrt(val*val*corrErr*corrErr + err*err*corr*corr);
+        dNdPtMult->SetBinError(i,k,cerr);
+    }
+    }    
+*/
+    
+    // for eta the correction is simpler because of same binning
+    h1Corrected_eta->Multiply(h1SecCorr_eta);
+    h1Corrected_eta->Multiply(h1TrackCorr_eta);
+    
+    Hists->Add(h1Corrected_pt);
+    Hists->Add(h1Corrected_eta);
+
+
+    TH1D* dNdPt_simple = (TH1D*) h1Corrected_pt->Clone("dNdPt_simple");
+    TH1D* dNdPt_simple_nores  = (TH1D*) h1Corrected_pt->Clone("dNdPt_simple_nores");
+    
+    
+    TH1D* dNdEta  = hSRecTrackAllMult->Projection(2)->Clone("dNdEta");
+    TH1D* dNdEta_simple  = h1Corrected_eta->Clone("dNdEta_simple");
+       
+    // also uncorrected spectra (as clone of raw data)
+    TH1D* dNdPt_raw   = (TH1D*) h1RecTrackHist2_pt->Clone("dNdPt_raw");
+    TH1D* dNdEta_raw  = (TH1D*) h1RecTrackHist2_eta->Clone("dNdEta_raw");
+    
+    // also uncorrected spectra (as clone of raw data)
+    TH1D* dNdPt_nores          = (TH1D*) dNdPt->Clone("dNdPt_nores");    
+    //TH1D* dNdEta_nores  = h1Corrected_eta->Clone("dNdEta_nores");
+    
+       
+
+//TF1 *fperi  = new TF1("fperi","1.00343-0.000608425*x-6.7038e-05*x*x",5.,50.);
+//TF1 *fcent  = new TF1("cent","1.01074e+00-1.98127e-03*x-1.19903e-04*x*x",5.,50.);
+TFile* fptcorr = TFile::Open("ptcorr_140511.root");
+
+TF1 *fun = 0;
+TString id = TString(idstring);
+if ( fname.Contains("900GeV") ) {
+  TF1 *fun  = (TF1*) fptcorr->Get("ptcorr_900");
+  cout << "++++++++++++++++++++++++++++++++++++++" << endl;
+  cout << "900GeV pt-resolution correction used!" << endl;
+  cout << "++++++++++++++++++++++++++++++++++++++" << endl;  
+} elseif ( fname.Contains("2.76TeV") ) {
+  TF1 *fun  = (TF1*) fptcorr->Get("ptcorr_2760");
+  cout << "+++++++++++++++++++++++++++++++++++++++++" << endl;
+  cout << "2.76TeV pt-resolution correction used!" << endl;
+  cout << "+++++++++++++++++++++++++++++++++++++++++" << endl;
+} elseif ( fname.Contains("7TeV") ) {
+  TF1 *fun  = (TF1*) fptcorr->Get("ptcorr_7000");
+  cout << "+++++++++++++++++++++++++++++++++++++++++" << endl;
+  cout << "7TeV pt-resolution correction used!" << endl;
+  cout << "+++++++++++++++++++++++++++++++++++++++++" << endl;  
+} else {
+  fun = TF1("none","1.",10.,50.);
+  cout << "++++++++++++++++++++++++++++++++++++++++" << endl;
+  cout << "ERROR! NO pt-resolution correction used!" << endl;
+  cout << "++++++++++++++++++++++++++++++++++++++++" << endl;
+}
+
+    // normalization and finalization
+    // 1/N_evt 1/(2 pi pt) 1/width 1/etarange
+   for (int i=1; i <= dNdPt->GetNbinsX() ;i++) {
+        Double_t pt = dNdPt->GetBinCenter(i);
+        Double_t width = dNdPt->GetBinWidth(i);
+        Double_t val = dNdPt->GetBinContent(i);
+        Double_t err = dNdPt->GetBinError(i);
+        Double_t corrPtResol = 1.0;
+        corrPtResol = fun->Eval(pt);
+        if (pt < 10.) { corrPtResol = 1.0; }
+        if (corrPtResol > 1.0 ) { corrPtResol = 1.0; }        
+        Double_t cval = (val * corrPtResol)/(width * 2.0 * TMath::Pi() * 1.6 * InelasticEvents * pt);
+        Double_t cerr = (err * corrPtResol)/(width * 2.0 * TMath::Pi() * 1.6 * InelasticEvents * pt);
+//         Double_t cval = (val * corrPtResol)/(width * 2.0 * TMath::Pi() * 1.6 * ReconstructedEvents * CorrEvent* pt);
+//         Double_t cerr = (err * corrPtResol)/(width * 2.0 * TMath::Pi() * 1.6 * ReconstructedEvents * CorrEvent* pt);        
+        dNdPt->SetBinContent(i,cval);
+        dNdPt->SetBinError(i,cerr);
+    }
+    
+    // normalization and finalization without resolution correction
+    // 1/N_evt 1/(2 pi pt) 1/width 1/etarange
+   for (int i=1; i <= dNdPt_nores->GetNbinsX() ;i++) {
+        Double_t pt = dNdPt_nores->GetBinCenter(i);
+        Double_t width = dNdPt_nores->GetBinWidth(i);
+        Double_t val = dNdPt_nores->GetBinContent(i);
+        Double_t err = dNdPt_nores->GetBinError(i);
+        Double_t cval = (val)/(width * 2.0 * TMath::Pi() * 1.6 * InelasticEvents * pt);
+        Double_t cerr = (err)/(width * 2.0 * TMath::Pi() * 1.6 * InelasticEvents * pt);
+        dNdPt_nores->SetBinContent(i,cval);
+        dNdPt_nores->SetBinError(i,cerr);
+    }
+    
+    // normalization and finalization without resolution correction
+    // 1/N_evt 1/(2 pi pt) 1/width 1/etarange
+   for (int i=1; i <= dNdPt_simple_nores->GetNbinsX() ;i++) {
+        Double_t pt = dNdPt_simple_nores->GetBinCenter(i);
+        Double_t width = dNdPt_simple_nores->GetBinWidth(i);
+        Double_t val = dNdPt_simple_nores->GetBinContent(i);
+        Double_t err = dNdPt_simple_nores->GetBinError(i);
+        Double_t cval = (val)/(width * 2.0 * TMath::Pi() * 1.6 * InelasticEvents * pt);
+        Double_t cerr = (err)/(width * 2.0 * TMath::Pi() * 1.6 * InelasticEvents * pt);
+        dNdPt_simple_nores->SetBinContent(i,cval);
+        dNdPt_simple_nores->SetBinError(i,cerr);
+    }    
+        
+    // for dndeta again simpler
+    dNdEta->Scale(1,"width");
+    dNdEta->Scale(1./InelasticEvents);
+    dNdEta_simple->Scale(1,"width");
+    dNdEta_simple->Scale(1./InelasticEvents);
+    
+    
+    // normalization and finalization
+    // 1/N_evt 1/(2 pi pt) 1/width 1/etarange
+   for (int i=1; i <= dNdPt_simple->GetNbinsX() ;i++) {
+        Double_t pt = dNdPt_simple->GetBinCenter(i);
+        Double_t width = dNdPt_simple->GetBinWidth(i);
+        Double_t val = dNdPt_simple->GetBinContent(i);
+        Double_t err = dNdPt_simple->GetBinError(i);
+        Double_t corrPtResol = 1.0;
+        corrPtResol = fun->Eval(pt);
+        if (pt < 10.) { corrPtResol = 1.0; }
+        if (corrPtResol > 1.0 ) { corrPtResol = 1.0; }
+        Double_t cval = (val * corrPtResol)/(width * 2.0 * TMath::Pi() * 1.6 * InelasticEvents * pt);
+        Double_t cerr = (err * corrPtResol)/(width * 2.0 * TMath::Pi() * 1.6 * InelasticEvents * pt);
+        dNdPt_simple->SetBinContent(i,cval);
+        dNdPt_simple->SetBinError(i,cerr);
+    }
+    /*
+    TH1D* dNdPt2 = (TH1D*) dNdPt->Clone("dNdPt2");
+    TH1D* dNdPt2_simple = (TH1D*) dNdPt_simple->Clone("dNdPt2_simple");
+    dNdPt2->Scale(InelasticEvents / (ReconstructedEvents * CorrEvent));
+    dNdPt2_simple->Scale(InelasticEvents / (ReconstructedEvents * CorrEvent));
+    Hists->Add(dNdPt2);
+    Hists->Add(dNdPt2_simple);    
+    */
+    
+    // normalization and finalization
+    // 1/N_evt 1/(2 pi pt) 1/width 1/etarange
+   for (int i=1; i <= dNdPt_raw->GetNbinsX() ;i++) {
+        Double_t pt = dNdPt_raw->GetBinCenter(i);
+        Double_t width = dNdPt_raw->GetBinWidth(i);
+        Double_t val = dNdPt_raw->GetBinContent(i);
+        Double_t err = dNdPt_raw->GetBinError(i);
+        Double_t cval = val/(width * 2.0 * TMath::Pi() * 1.6 * InelasticEvents * pt);
+        Double_t cerr = err/(width * 2.0 * TMath::Pi() * 1.6 * InelasticEvents * pt);
+        dNdPt_raw->SetBinContent(i,cval);
+        dNdPt_raw->SetBinError(i,cerr);
+    }
+    // for dndeta again simpler
+    dNdEta_raw->Scale(1,"width");
+    dNdEta_raw->Scale(1./InelasticEvents);
+     
+    dNdEta->SetMarkerStyle(21);
+    dNdPt->SetMarkerStyle(21);
+    dNdPt->SetTitle("; p_{T} (GeV/c) ; 1/N_{evt} 1/(2#pi p_{T}) (d^{2}N_{ch})/(d#eta dp_{T})^{-2}");
+    dNdEta->SetTitle("; #eta ; 1/N_{evt} (d^{2}N_{ch})/(d#eta)");
+    
+    dNdPt_raw->SetTitle("; p_{T} (GeV/c) ; 1/N_{evt} 1/(2#pi p_{T}) (d^{2}N_{ch})/(d#eta dp_{T})^{-2}");
+    dNdPt_nores->SetTitle("; p_{T} (GeV/c) ; 1/N_{evt} 1/(2#pi p_{T}) (d^{2}N_{ch})/(d#eta dp_{T})^{-2}");
+    dNdEta_raw->SetTitle("; #eta ; 1/N_{evt} (d^{2}N_{ch})/(d#eta)");
+    
+    Hists->Add(dNdEta_raw);
+    Hists->Add(dNdPt_raw);
+    Hists->Add(dNdEta);
+    Hists->Add(dNdEta_simple);
+    Hists->Add(dNdPt);
+    Hists->Add(dNdPt_nores);  
+    Hists->Add(dNdPt_simple);  
+    Hists->Add(dNdPt_simple_nores);  
+    Hists->Add(hSRecTrack);
+    Hists->Add(hSRecTrackAllMult);
+    
+    
+   // plot pictures and save to gifdir
+    for (i=0; i < Hists->LastIndex(); i++) {    
+        TCanvas* ctmp = PlotHist(Hists->At(i),idstring);
+        if (gifdir && ctmp) {
+            TString gif(gifdir);
+            gif += '/';
+            gif += ctmp->GetName();
+            gif += ".gif";
+            ctmp->SaveAs(gif.Data(),"gif");     
+            delete ctmp;
+        }
+    }  
+
+    // save all correction matrices and control histograms to file
+    if (!outfile) { return; }
+    TFile *out = TFile::Open(outfile,"RECREATE");
+    Hists->Write();
+    out->Close();    
+
+    return ReconstructedEvents;
+
+}
+
+//___________________________________________________________________________
+TCanvas* PlotHist(TObject* hobj, const char* label=0)
+{
+    TH1* h = dynamic_cast<TH1*>(hobj);
+    if (!h) return 0;
+    if (h->GetDimension() > 2) return 0;
+    h->SetStats(0);
+    if ( TString(h->GetName()).Contains("Events")) { h->SetStats(1); } 
+    TString t(label);
+    if (label) t += "_";
+    t += h->GetName();
+    h->SetTitle(t.Data());
+    TCanvas* c = new TCanvas(t.Data(),t.Data());
+    if (h->GetDimension() >= 1) {
+        TString xlabel(h->GetXaxis()->GetTitle());
+        if (xlabel.Contains("Pt")) { c->SetLogx();  c->SetLogy();  h->GetXaxis()->SetRangeUser(0.1 , 100.); }
+        if (xlabel.Contains("p_{T}")) { c->SetLogx();  c->SetLogy();  h->GetXaxis()->SetRangeUser(0.1 , 100.); }        
+    }
+    if (h->GetDimension() == 2) {  
+        TString ylabel(h->GetYaxis()->GetTitle());
+        if (ylabel.Contains("Pt")) { c->SetLogy(); h->GetYaxis()->SetRangeUser(0.1 , 100.); }
+        if (ylabel.Contains("p_{T}")) { c->SetLogy(); h->GetYaxis()->SetRangeUser(0.1 , 100.); }
+        h->Draw("COLZ");
+    }        
+    if (h->GetDimension() == 1) {
+        h->Draw();
+    }
+    return c;
+
+}
diff --git a/PWG0/dNdPt/macros/GenerateCorrMatr_PbPb.C b/PWG0/dNdPt/macros/GenerateCorrMatr_PbPb.C
new file mode 100644 (file)
index 0000000..5f837bd
--- /dev/null
@@ -0,0 +1,625 @@
+&
+Double_t GenerateCorrMatr_PbPb(const char* mcfile, const char* mctask, const char* idstring ,const char* outfile, const char* gifdir = 0)
+//Double_t GenerateCorrMatr_PbPb_TPCIT()
+{
+
+Int_t c_first = 1;
+Int_t c_last = 11;
+
+TString id = TString(idstring);
+if ( id.Contains("c0-5") ) { c_first = c_last = 1; }
+if ( id.Contains("c5-10") ) { c_first = c_last = 2; }
+if ( id.Contains("c10-20") ) { c_first = c_last = 3; }
+if ( id.Contains("c20-30") ) { c_first = c_last = 4; }
+if ( id.Contains("c30-40") ) { c_first = c_last = 5; }
+if ( id.Contains("c40-50") ) { c_first = c_last = 6; }
+if ( id.Contains("c50-60") ) { c_first = c_last = 7; }
+if ( id.Contains("c60-70") ) { c_first = c_last = 8; }
+if ( id.Contains("c70-80") ) { c_first = c_last = 9; }
+if ( id.Contains("c80-90") ) { c_first = c_last = 10; }
+if ( id.Contains("c90-100") ) { c_first = c_last = 11; }
+
+//tmp setting
+   //const char* mcfile = "/lustre/alice/train/V006.MC_PbPb/2011-03-15_0037.5917/mergedPeriods/MC_PbPb/2.76ATeV/LHC10h8/mknichel_dNdPtPbPb_TPCITS_VZERO1.root";
+   
+   //const char* mcfile = "/lustre/alice/train/V006.MC_PbPb/2011-03-13_0236.5847/mergedRuns/MC_PbPb/2.76ATeV/LHC11a7/137161.ana/mknichel_dNdPtPbPb_TPCITS_VZERO1.root";    
+     //const char* mctask =  "mknichel_dNdPtPbPb_TPCITS_VZERO";
+     //const char* idstring = "c70";
+     //const char* outfile = "/u/mknichel/alice/dNdPt_PbPb/2011-03-15/corrMatr_LHC10h8_TPCITS_c70.root";
+     //const char* gifdir ="/u/mknichel/alice/dNdPt_PbPb/2011-03-15/LHC10h8";
+    
+    // settings vor zVertex cut (event and track level)
+    Double_t zVert = 10.0;
+    
+    // setting on eta cut (track level)
+    Double_t eta = 0.8;
+    
+    // strangeness scaling factor (for secondaries from strange decays)
+    Double_t sscale = 2.0;
+    
+    //load required libraries
+    //load required libraries    
+    gSystem->AddIncludePath("-I$ROOTSYS/include -I$ALICE_ROOT/ -I$ALICE_ROOT/include -I$ALICE_ROOT/STEER  -I$ALICE_ROOT/ANALYSIS -I$ALICE_ROOT/PWG0 -I$ALICE_ROOT/PWG1 -I$ALICE_ROOT/PWG2 -I$ALICE_ROOT/PWG3 -I$ALICE_ROOT/PWG3/vertexingHF -I$ALICE_ROOT/PWG4 -I$ALICE_ROOT/CORRFW -I$ALICE_ROOT/TPC -I$ALICE_ROOT/TRD -I$ALICE_ROOT/PWG3/muon -I$ALICE_ROOT/JETAN -I$ALICE_ROOT/ANALYSIS/Tender");
+    
+  gSystem->Load("libCore");
+  gSystem->Load("libPhysics");
+  gSystem->Load("libMinuit");
+  gSystem->Load("libGui");
+  gSystem->Load("libXMLParser");
+
+  gSystem->Load("libGeom");
+  gSystem->Load("libVMC");
+
+  gSystem->Load("libNet");
+
+
+  gSystem->Load("libSTEERBase");
+  gSystem->Load("libESD");
+  gSystem->Load("libCDB");
+  gSystem->Load("libRAWDatabase");
+  gSystem->Load("libRAWDatarec");
+  gSystem->Load("libANALYSIS");
+
+    
+    
+    gSystem->Load("libANALYSIS.so");
+    gSystem->Load("libANALYSISalice.so");
+    gSystem->Load("libTENDER.so");
+    gSystem->Load("libCORRFW.so");
+    gSystem->Load("libPWG0base.so");    
+    gSystem->Load("libPWG0dep"); 
+    gSystem->Load("libPWG0selectors.so");
+    
+
+
+
+
+    // make plots nicer
+    gROOT->SetStyle("Plain");
+    gStyle->SetPalette(1);
+    
+    // array for all correction matrices
+    TObjArray* CorrMatr = new TObjArray();
+    
+    // array for all control histograms
+    TObjArray* ContHist = new TObjArray();
+    
+
+    // load mc information
+    TFile* fmc = TFile::Open(mcfile,"READ");
+    if (!fmc) return -1;
+    TList* lmc = dynamic_cast<TList*>(fmc->Get(mctask));
+    if (!lmc) return -1;
+    AlidNdPtAnalysisPbPb *obj = dynamic_cast<AlidNdPtAnalysisPbPb*>(lmc->FindObject("dNdPtAnalysisPbPb"));
+    if (!obj) return -1;
+    
+//
+// create rebinned thnsparse
+//
+  //ptbins before rebinning: 73;
+  const Int_t etaNbins = 30;
+  const Int_t zvNbins = 12;
+  const Int_t centralityBins = 11;
+  
+  //Double_t binsMult[multNbins+1] = {-0.5,  10000.5 }; // forPbPb --reduced!
+
+   // Set pt binning for corrections
+    const Int_t ptNbins = 30;
+    Double_t binsPt[31] = {0.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.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.4, 1.6, 1.8, 2.0, 3.0, 4.0, 50.0, 100.0 };
+
+  Double_t binsEta[etaNbins+1] = {
+        -1.5, -1.4, -1.3, -1.2, -1.1, -1.0, -0.9, -0.8, -0.7, -0.6,
+       -0.5, -0.4, -0.3, -0.2, -0.1,  0.0,  0.1,  0.2,  0.3,  0.4, 
+        0.5,  0.6,  0.7,  0.8,  0.9,  1.0,  1.1,  1.2,  1.3,  1.4, 
+        1.5};
+
+  Double_t binsZv[zvNbins+1] = {-30.,-25.,-20.,-15.,-10.,-5.,0.,5.,10.,15.,20.,25.,30.};
+  
+  Double_t binsCentrality[centralityBins+1] = {0., 5., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.};
+
+  Int_t binsTrackEventCorrMatrix[4]={zvNbins,ptNbins,etaNbins,centralityBins};
+  //Int_t binsTrackEvent[4]={zvNbins,ptNbins,etaNbins,centralityBins};
+  //Int_t binsTrackPtCorrelationMatrix[4]={ptNbins,ptNbins,etaNbins,centralityBins};
+/*
+  THnSparseF* fGenPrimTrackMatrix = new THnSparseF("fGenPrimTrackMatrix","mcZv:mcPt:mcEta:Centrality",4,binsTrackEventCorrMatrix);
+  fGenPrimTrackMatrix->SetBinEdges(0,binsZv);
+  fGenPrimTrackMatrix->SetBinEdges(1,binsPt);
+  fGenPrimTrackMatrix->SetBinEdges(2,binsEta);
+  fGenPrimTrackMatrix->SetBinEdges(3,binsCentrality);
+  fGenPrimTrackMatrix->GetAxis(0)->SetTitle("mcZv (cm)");
+  fGenPrimTrackMatrix->GetAxis(1)->SetTitle("mcPt (GeV/c)");
+  fGenPrimTrackMatrix->GetAxis(2)->SetTitle("mcEta");
+  fGenPrimTrackMatrix->GetAxis(3)->SetTitle("Centrality");
+  fGenPrimTrackMatrix->Sumw2();
+
+  THnSparseF* fRecPrimTrackMatrix = new THnSparseF("fRecPrimTrackMatrix","mcZv:mcPt:mcEta:Centrality",4,binsTrackEventCorrMatrix);
+  fRecPrimTrackMatrix->SetBinEdges(0,binsZv);
+  fRecPrimTrackMatrix->SetBinEdges(1,binsPt);
+  fRecPrimTrackMatrix->SetBinEdges(2,binsEta);
+  fRecPrimTrackMatrix->SetBinEdges(3,binsCentrality);
+  fRecPrimTrackMatrix->GetAxis(0)->SetTitle("mcZv (cm)");
+  fRecPrimTrackMatrix->GetAxis(1)->SetTitle("mcPt (GeV/c)");
+  fRecPrimTrackMatrix->GetAxis(2)->SetTitle("mcEta");
+  fRecPrimTrackMatrix->GetAxis(3)->SetTitle("Centrality");
+  fRecPrimTrackMatrix->Sumw2();
+
+  THnSparseF* fRecTrackMatrix = new THnSparseF("fRecTrackMatrix","mcZv:mcPt:mcEta:Centrality",4,binsTrackEventCorrMatrix);
+  fRecTrackMatrix->SetBinEdges(0,binsZv);
+  fRecTrackMatrix->SetBinEdges(1,binsPt);
+  fRecTrackMatrix->SetBinEdges(2,binsEta);
+  fRecTrackMatrix->SetBinEdges(3,binsCentrality);
+  fRecTrackMatrix->GetAxis(0)->SetTitle("mcZv (cm)");
+  fRecTrackMatrix->GetAxis(1)->SetTitle("mcPt (GeV/c)");
+  fRecTrackMatrix->GetAxis(2)->SetTitle("mcEta");
+  fRecTrackMatrix->GetAxis(3)->SetTitle("Centrality");
+  fRecTrackMatrix->Sumw2();
+
+  THnSparseF* fRecSecTrackMatrix = new THnSparseF("fRecSecTrackMatrix","mcZv:mcPt:mcEta:Centrality",4,binsTrackEventCorrMatrix);
+  fRecSecTrackMatrix->SetBinEdges(0,binsZv);
+  fRecSecTrackMatrix->SetBinEdges(1,binsPt);
+  fRecSecTrackMatrix->SetBinEdges(2,binsEta);
+  fRecSecTrackMatrix->SetBinEdges(3,binsCentrality);
+  fRecSecTrackMatrix->GetAxis(0)->SetTitle("mcZv (cm)");
+  fRecSecTrackMatrix->GetAxis(1)->SetTitle("Pt (GeV/c)");
+  fRecSecTrackMatrix->GetAxis(2)->SetTitle("Eta");
+  fRecSecTrackMatrix->GetAxis(3)->SetTitle("Centrality");
+  fRecSecTrackMatrix->Sumw2();
+*/
+
+    //Event statistics
+    THnSparse *fRecEventMatrix = obj->GetRecEventMatrix(); //all reconstructed events  
+    fRecEventMatrix->GetAxis(2)->SetRange(c_first,c_last); // select centrality
+    TH2D* h2RecEventAll = fRecEventMatrix->Projection(0,1)->Clone("h2RecEventAll");
+    fRecEventMatrix->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    TH2D* h2RecEvent = fRecEventMatrix->Projection(0,1)->Clone("h2RecEvent");
+    Double_t MCReconstructedEvents = h2RecEvent->Integral();
+    Double_t MCReconstructedEventsAll = h2RecEventAll->Integral();
+    ContHist->Add(h2RecEvent);
+    ContHist->Add(h2RecEventAll);
+        
+    THnSparse *fTriggerEventMatrix = obj->GetTriggerEventMatrix(); //all triggered events
+    fTriggerEventMatrix->GetAxis(2)->SetRange(c_first,c_last); // select centrality
+    TH2D* h2TriggerEventAll = fTriggerEventMatrix->Projection(0,1)->Clone("h2TriggerEventAll");
+    fTriggerEventMatrix->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    TH2D* h2TriggerEvent = fTriggerEventMatrix->Projection(0,1)->Clone("h2TriggerEvent");
+    Double_t MCTriggeredEvents = h2TriggerEvent->Integral();
+    Double_t MCTriggeredEventsAll = h2TriggerEventAll->Integral();
+    ContHist->Add(h2TriggerEvent);
+    ContHist->Add(h2TriggerEventAll);    
+        
+    THnSparse *fGenEventMatrix = obj->GetGenEventMatrix(); //all generated events
+    fGenEventMatrix->GetAxis(2)->SetRange(c_first,c_last); // select centrality
+    TH2D* h2GenEventAll = fGenEventMatrix->Projection(0,1)->Clone("h2GenEventAll");
+    fGenEventMatrix->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    TH2D* h2GenEvent = fGenEventMatrix->Projection(0,1)->Clone("h2GenEvent");
+    Double_t MCGeneratedEvents = h2GenEvent->Integral();
+    Double_t MCGeneratedEventsAll = h2GenEventAll->Integral(); 
+    ContHist->Add(h2RecEvent);
+    ContHist->Add(h2RecEventAll);
+       
+    printf("=== generated MC events for correction matrices    %lf ===\n",MCGeneratedEvents);
+    printf("=== triggered MC events for correction matrices    %lf ===\n",MCTriggeredEvents);
+    printf("=== recontructed MC events for correction matrices %lf ===\n",MCReconstructedEvents);
+    printf("\n");
+    printf("=== cut on the zVertex +- %lf ===\n",zVert);
+    printf("=== generated MC events (before zVertex cut)       %lf ===\n",MCGeneratedEventsAll);
+    printf("=== triggered MC events (before zVertex cut)       %lf ===\n",MCTriggeredEventsAll);
+    printf("=== recontructed MC events (before zVertex cut)    %lf ===\n",MCReconstructedEventsAll);
+    
+    TH1D* h1MCGeneratedEvents = new TH1D("h1MCGeneratedEvents","h1MCGeneratedEvents",1,0,1);
+    TH1D* h1MCTriggeredEvents = new TH1D("h1MCTriggeredEvents","h1MCTriggeredEvents",1,0,1);
+    TH1D* h1MCReconstructedEvents = new TH1D("h1MCReconstructedEvents","h1MCReconstructedEvents",1,0,1);
+    TH1D* h1MCGeneratedEventsAll = new TH1D("h1MCGeneratedEventsAll","h1MCGeneratedEventsAll",1,0,1);
+    TH1D* h1MCTriggeredEventsAll = new TH1D("h1MCTriggeredEventsAll","h1MCTriggeredEventsAll",1,0,1);
+    TH1D* h1MCReconstructedEventsAll = new TH1D("h1MCReconstructedEventsAll","h1MCReconstructedEventsAll",1,0,1);
+    
+    h1MCGeneratedEvents->Fill(0,MCGeneratedEvents);
+    h1MCGeneratedEvents->SetEntries(MCGeneratedEvents);
+    h1MCTriggeredEvents->Fill(0,MCTriggeredEvents);
+    h1MCTriggeredEvents->SetEntries(MCTriggeredEvents);
+    h1MCReconstructedEvents->Fill(0,MCReconstructedEvents);
+    h1MCReconstructedEvents->SetEntries(MCReconstructedEvents);
+    h1MCGeneratedEventsAll->Fill(0,MCGeneratedEventsAll);
+    h1MCGeneratedEventsAll->SetEntries(MCGeneratedEventsAll);
+    h1MCTriggeredEventsAll->Fill(0,MCTriggeredEventsAll);
+    h1MCTriggeredEventsAll->SetEntries(MCTriggeredEventsAll);
+    h1MCReconstructedEventsAll->Fill(0,MCReconstructedEventsAll);
+    h1MCReconstructedEventsAll->SetEntries(MCReconstructedEventsAll);
+    
+    ContHist->Add(h1MCGeneratedEvents);
+    ContHist->Add(h1MCTriggeredEvents);
+    ContHist->Add(h1MCReconstructedEvents);
+    ContHist->Add(h1MCGeneratedEventsAll);
+    ContHist->Add(h1MCTriggeredEventsAll);
+    ContHist->Add(h1MCReconstructedEventsAll);
+    
+    
+    // efficienfy and correction matrices for tigger and vertex efficiency
+    TH2D* h2EventTriggerEffAll  = AlidNdPtHelper::GenerateCorrMatrix(h2TriggerEventAll,h2GenEventAll,"h2EventTriggerEffAll");
+    TH2D* h2EventTriggerCorrAll = AlidNdPtHelper::GenerateCorrMatrix(h2GenEventAll,h2TriggerEventAll,"h2EventTriggerCorrAll"); 
+    TH2D* h2EventTriggerEff  = AlidNdPtHelper::GenerateCorrMatrix(h2TriggerEvent,h2GenEvent,"h2EventTriggerEff");
+    TH2D* h2EventTriggerCorr = AlidNdPtHelper::GenerateCorrMatrix(h2GenEvent,h2TriggerEvent,"h2EventTriggerCorr"); 
+
+    TH2D* h2EventRecEffAll  = AlidNdPtHelper::GenerateCorrMatrix(h2RecEventAll,h2TriggerEventAll,"h2EventRecEffAll");
+    TH2D* h2EventRecCorrAll = AlidNdPtHelper::GenerateCorrMatrix(h2TriggerEventAll,h2RecEventAll,"h2EventRecCorrAll");
+    TH2D* h2EventRecEff  = AlidNdPtHelper::GenerateCorrMatrix(h2RecEvent,h2TriggerEvent,"h2EventRecEff");
+    TH2D* h2EventRecCorr = AlidNdPtHelper::GenerateCorrMatrix(h2TriggerEvent,h2RecEvent,"h2EventRecCorr");
+
+    TH2D* h2EventEffAll  = AlidNdPtHelper::GenerateCorrMatrix(h2RecEventAll,h2GenEventAll,"h2EventEffAll");
+    TH2D* h2EventCorrAll = AlidNdPtHelper::GenerateCorrMatrix(h2GenEventAll,h2RecEventAll,"h2EventCorrAll");
+    TH2D* h2EventEff  = AlidNdPtHelper::GenerateCorrMatrix(h2RecEvent,h2GenEvent,"h2EventEff");
+    TH2D* h2EventCorr = AlidNdPtHelper::GenerateCorrMatrix(h2GenEvent,h2RecEvent,"h2EventCorr");
+
+    CorrMatr->Add(h2EventTriggerEffAll);
+    CorrMatr->Add(h2EventTriggerCorrAll);
+    CorrMatr->Add(h2EventTriggerEff);
+    CorrMatr->Add(h2EventTriggerCorr);
+    CorrMatr->Add(h2EventRecEffAll);
+    CorrMatr->Add(h2EventRecCorrAll);
+    CorrMatr->Add(h2EventRecEff);
+    CorrMatr->Add(h2EventRecCorr);
+    CorrMatr->Add(h2EventEffAll);
+    CorrMatr->Add(h2EventCorrAll);
+    CorrMatr->Add(h2EventEff);
+    CorrMatr->Add(h2EventCorr);
+
+
+
+    // all recontructed
+    THnSparse *fRecTrackMatrix = obj->GetRecTrackMatrix(); //all reconstructed tracks
+    fRecTrackMatrix->GetAxis(3)->SetRange(c_first,c_last); // select centrality
+    fRecTrackMatrix->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    fRecTrackMatrix->GetAxis(2)->SetRangeUser(-eta, eta-0.01);//eta
+        
+    TH3D* h3RecTrack = fRecTrackMatrix->Projection(0,1,2)->Clone("h3RecTrack");    
+    TH2D* h2RecTrack_zv_pt  = fRecTrackMatrix->Projection(0,1)->Clone("h2RecTrack_zv_pt");
+    TH2D* h2RecTrack_zv_eta = fRecTrackMatrix->Projection(0,2)->Clone("h2RecTrack_zv_eta");
+    TH2D* h2RecTrack_pt_eta = fRecTrackMatrix->Projection(1,2)->Clone("h2RecTrack_pt_eta");
+    TH1D* h1RecTrack_zv  = fRecTrackMatrix->Projection(0)->Clone("h1RecTrack_zv");    
+    TH1D* h1RecTrack_pt  = fRecTrackMatrix->Projection(1)->Clone("h1RecTrack_pt");
+    TH1D* h1RecTrack_eta = fRecTrackMatrix->Projection(2)->Clone("h1RecTrack_eta");
+    Double_t MCReconstructedTracks = h3RecTrack->Integral();
+    
+    h1RecTrack_pt = (TH1D*) h1RecTrack_pt->Rebin(ptNbins,"",binsPt); // rebin hist
+
+    ContHist->Add(h3RecTrack);
+    ContHist->Add(h2RecTrack_zv_pt);
+    ContHist->Add(h2RecTrack_zv_eta);
+    ContHist->Add(h2RecTrack_pt_eta);
+    ContHist->Add(h1RecTrack_zv);
+    ContHist->Add(h1RecTrack_pt);
+    ContHist->Add(h1RecTrack_eta);
+
+     // recontructed primary tracks
+    THnSparse *fRecPrimTrackMatrix = obj->GetRecPrimTrackMatrix();
+    fRecPrimTrackMatrix->GetAxis(3)->SetRange(c_first,c_last); // select centrality
+    THnSparse *fRecTrackMatrixScaled = fRecPrimTrackMatrix->Clone("fRecTrackMatrixScaled"); //used later for secondaries scaling
+    fRecPrimTrackMatrix->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    fRecPrimTrackMatrix->GetAxis(2)->SetRangeUser(-eta, eta-0.01);//eta
+    TH3D* h3RecPrimTrack = fRecPrimTrackMatrix->Projection(0,1,2)->Clone("h3RecPrimTrack");
+    TH2D* h2RecPrimTrack_zv_pt  = fRecPrimTrackMatrix->Projection(0,1)->Clone("h2RecPrimTrack_zv_pt");
+    TH2D* h2RecPrimTrack_zv_eta = fRecPrimTrackMatrix->Projection(0,2)->Clone("h2RecPrimTrack_zv_eta");
+    TH2D* h2RecPrimTrack_pt_eta = fRecPrimTrackMatrix->Projection(1,2)->Clone("h2RecPrimTrack_pt_eta");
+    TH1D* h1RecPrimTrack_zv  = fRecPrimTrackMatrix->Projection(0)->Clone("h1RecPrimTrack_zv"); 
+    TH1D* h1RecPrimTrack_pt  = fRecPrimTrackMatrix->Projection(1)->Clone("h1RecPrimTrack_pt");    
+    TH1D* h1RecPrimTrack_eta = fRecPrimTrackMatrix->Projection(2)->Clone("h1RecPrimTrack_eta");
+    Double_t MCReconstructedPrimTracks = h3RecPrimTrack->Integral();
+    
+    h1RecPrimTrack_pt = (TH1D*) h1RecPrimTrack_pt->Rebin(ptNbins,"",binsPt); // rebin hist
+
+    ContHist->Add(h3RecPrimTrack);
+    ContHist->Add(h2RecPrimTrack_zv_pt);
+    ContHist->Add(h2RecPrimTrack_zv_eta);
+    ContHist->Add(h2RecPrimTrack_pt_eta);
+    ContHist->Add(h1RecPrimTrack_zv);
+    ContHist->Add(h1RecPrimTrack_pt);
+    ContHist->Add(h1RecPrimTrack_eta);
+    
+     // recontructed secondary tracks
+    THnSparse *fRecSecTrackMatrix = obj->GetRecSecTrackMatrix();    
+    fRecSecTrackMatrix->GetAxis(3)->SetRange(c_first,c_last); // select centrality
+    THnSparse *fRecSecTrackMatrixScaled = fRecSecTrackMatrix->Clone("fRecSecTrackMatrixScaled"); //used later for secondaries scaling
+    fRecSecTrackMatrix->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    fRecSecTrackMatrix->GetAxis(2)->SetRangeUser(-eta, eta-0.01);//eta
+    TH3D* h3RecSecTrack = fRecSecTrackMatrix->Projection(0,1,2)->Clone("h3RecSecTrack");
+    TH2D* h2RecSecTrack_zv_pt  = fRecSecTrackMatrix->Projection(0,1)->Clone("h2RecSecTrack_zv_pt");
+    TH2D* h2RecSecTrack_zv_eta = fRecSecTrackMatrix->Projection(0,2)->Clone("h2RecSecTrack_zv_eta");
+    TH2D* h2RecSecTrack_pt_eta = fRecSecTrackMatrix->Projection(1,2)->Clone("h2RecSecTrack_pt_eta");
+    TH1D* h1RecSecTrack_zv  = fRecSecTrackMatrix->Projection(0)->Clone("h1RecSecTrack_zv");
+    TH1D* h1RecSecTrack_pt  = fRecSecTrackMatrix->Projection(1)->Clone("h1RecSecTrack_pt");
+    TH1D* h1RecSecTrack_eta = fRecSecTrackMatrix->Projection(2)->Clone("h1RecSecTrack_eta");
+    Double_t MCReconstructedSecTracks = h3RecSecTrack->Integral();
+
+    h1RecSecTrack_pt = (TH1D*) h1RecSecTrack_pt->Rebin(ptNbins,"",binsPt); // rebin hist
+
+    ContHist->Add(h3RecSecTrack);
+    ContHist->Add(h2RecSecTrack_zv_pt);
+    ContHist->Add(h2RecSecTrack_zv_eta);
+    ContHist->Add(h2RecSecTrack_pt_eta);
+    ContHist->Add(h1RecSecTrack_zv);
+    ContHist->Add(h1RecSecTrack_pt);
+    ContHist->Add(h1RecSecTrack_eta);
+    
+    // generated primary tracks
+    THnSparse *fGenPrimTrackMatrix =obj->GetGenPrimTrackMatrix();
+    fGenPrimTrackMatrix->GetAxis(3)->SetRange(c_first,c_last); // select centrality
+    fGenPrimTrackMatrix->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    fGenPrimTrackMatrix->GetAxis(2)->SetRangeUser(-eta, eta-0.01);//eta
+    TH3D* h3GenPrimTrack = fGenPrimTrackMatrix->Projection(0,1,2)->Clone("h3GenPrimTrack");
+    TH2D* h2GenPrimTrack_zv_Pt  = fGenPrimTrackMatrix->Projection(0,1)->Clone("h2GenPrimTrack_zv_pt");
+    TH2D* h2GenPrimTrack_zv_eta = fGenPrimTrackMatrix->Projection(0,2)->Clone("h2GenPrimTrack_zv_eta");
+    TH2D* h2GenPrimTrack_pt_eta = fGenPrimTrackMatrix->Projection(1,2)->Clone("h2GenPrimTrack_pt_eta");
+    TH1D* h1GenPrimTrack_zv  = fGenPrimTrackMatrix->Projection(0)->Clone("h1GenPrimTrack_zv");
+    TH1D* h1GenPrimTrack_pt  = fGenPrimTrackMatrix->Projection(1)->Clone("h1GenPrimTrack_pt");
+    TH1D* h1GenPrimTrack_eta = fGenPrimTrackMatrix->Projection(2)->Clone("h1GenPrimTrack_eta");
+    Double_t MCGeneratedPrimTracks = h3GenPrimTrack->Integral();
+
+
+    // mc truth histogram (for self-consistency check)
+    TH1D* dNdPt_MC   = h1GenPrimTrack_pt->Clone("dNdPt_MC");
+    // normalization and finalization
+    // 1/N_evt 1/(2 pi pt) 1/width 1/etarange
+    for (int ii=1; ii <= dNdPt_MC->GetNbinsX() ;ii++) {
+        Double_t pt = dNdPt_MC->GetBinCenter(ii);
+        Double_t width = dNdPt_MC->GetBinWidth(ii);
+        Double_t val = dNdPt_MC->GetBinContent(ii);
+        Double_t err = dNdPt_MC->GetBinError(ii);        
+        Double_t cval = (val)/(width * 2.0 * TMath::Pi() * 1.6 * MCGeneratedEvents * pt);
+        Double_t cerr = (err)/(width * 2.0 * TMath::Pi() * 1.6 * MCGeneratedEvents * pt);
+        dNdPt_MC->SetBinContent(ii,cval);
+        dNdPt_MC->SetBinError(ii,cerr);
+    }    
+    dNdPt_MC->SetMarkerStyle(21);
+    dNdPt_MC->SetTitle("; p_{T} (GeV/c) ; 1/N_{evt} 1/(2#pi p_{T}) (d^{2}N_{ch})/(d#eta dp_{T})^{-2}");
+    ContHist->Add(dNdPt_MC);    
+
+
+
+    h1GenPrimTrack_pt = (TH1D*) h1GenPrimTrack_pt->Rebin(ptNbins,"",binsPt); // rebin hist
+
+    ContHist->Add(h3GenPrimTrack);
+    ContHist->Add(h2GenPrimTrack_zv_pt);
+    ContHist->Add(h2GenPrimTrack_zv_eta);
+    ContHist->Add(h2GenPrimTrack_pt_eta);
+    ContHist->Add(h1GenPrimTrack_zv);
+    ContHist->Add(h1GenPrimTrack_pt);
+    ContHist->Add(h1GenPrimTrack_eta);
+    printf("\n");
+    printf("==============================================================\n");    
+    printf("=== recontructed MC tracks              %lf ===\n",MCReconstructedTracks);
+    printf("=== recontructed MC secondary tracks    %lf ===\n",MCReconstructedSecTracks);
+    printf("=== recontructed MC primary tracks      %lf ===\n",MCReconstructedPrimTracks);
+    printf("=== generated MC primary track          %lf ===\n",MCGeneratedPrimTracks);
+    printf("==============================================================\n");    
+    printf("\n");
+       
+//    THnSparse *fSparseTriggerTrackEvent = obj->GetTriggerTrackEventMatrix();//Tracks from triggered events
+//    THnSparse *fSparseVtxTrackEvent = obj->GetRecTrackEventMatrix();//Tracks from events with rec. vtx
+//    THnSparse *fSparseGenTrackEvent = obj->GetGenTrackEventMatrix();//generated TrackEvent matrix
+
+    // tracking efficiencies + corrections
+   TH3D* h3TrackEff  = AlidNdPtHelper::GenerateCorrMatrix(h3RecPrimTrack,h3GenPrimTrack,"h3TrackEff");
+   TH3D* h3TrackCorr = AlidNdPtHelper::GenerateCorrMatrix(h3GenPrimTrack,h3RecPrimTrack,"h3TrackCorr");
+   
+   TH2D* h2TrackEff_zv_pt   = AlidNdPtHelper::GenerateCorrMatrix(h2RecPrimTrack_zv_pt,h2GenPrimTrack_zv_pt,"h2TrackEff_zv_pt");
+   TH2D* h2TrackCorr_zv_pt  = AlidNdPtHelper::GenerateCorrMatrix(h2GenPrimTrack_zv_pt,h2RecPrimTrack_zv_pt,"h2TrackCorr_zv_pt");
+   TH2D* h2TrackEff_zv_eta  = AlidNdPtHelper::GenerateCorrMatrix(h2RecPrimTrack_zv_eta,h2GenPrimTrack_zv_eta,"h2TrackEff_zv_eta");
+   TH2D* h2TrackCorr_zv_eta = AlidNdPtHelper::GenerateCorrMatrix(h2GenPrimTrack_zv_eta,h2RecPrimTrack_zv_eta,"h2TrackCorr_zv_eta");
+   TH2D* h2TrackEff_pt_eta  = AlidNdPtHelper::GenerateCorrMatrix(h2RecPrimTrack_pt_eta,h2GenPrimTrack_pt_eta,"h2TrackEff_pt_eta");
+   TH2D* h2TrackCorr_pt_eta = AlidNdPtHelper::GenerateCorrMatrix(h2GenPrimTrack_pt_eta,h2RecPrimTrack_pt_eta,"h2TrackCorr_pt_eta");
+    
+   TH1D* h1TrackEff_zv   = AlidNdPtHelper::GenerateCorrMatrix(h1RecPrimTrack_zv,h1GenPrimTrack_zv,"h1TrackEff_zv");
+   TH1D* h1TrackCorr_zv  = AlidNdPtHelper::GenerateCorrMatrix(h1GenPrimTrack_zv,h1RecPrimTrack_zv,"h1TrackCorr_zv");
+   TH1D* h1TrackEff_pt   = AlidNdPtHelper::GenerateCorrMatrix(h1RecPrimTrack_pt,h1GenPrimTrack_pt,"h1TrackEff_pt");
+   TH1D* h1TrackCorr_pt  = AlidNdPtHelper::GenerateCorrMatrix(h1GenPrimTrack_pt,h1RecPrimTrack_pt,"h1TrackCorr_pt");
+   TH1D* h1TrackEff_eta  = AlidNdPtHelper::GenerateCorrMatrix(h1RecPrimTrack_eta,h1GenPrimTrack_eta,"h1TrackEff_eta");
+   TH1D* h1TrackCorr_eta = AlidNdPtHelper::GenerateCorrMatrix(h1GenPrimTrack_eta,h1RecPrimTrack_eta,"h1TrackCorr_eta");
+   
+   CorrMatr->Add(h3TrackEff);
+   CorrMatr->Add(h3TrackCorr);
+   CorrMatr->Add(h2TrackEff_zv_pt);
+   CorrMatr->Add(h2TrackCorr_zv_pt);
+   CorrMatr->Add(h2TrackEff_zv_eta);
+   CorrMatr->Add(h2TrackCorr_zv_eta);
+   CorrMatr->Add(h2TrackEff_pt_eta);
+   CorrMatr->Add(h2TrackCorr_pt_eta);
+   CorrMatr->Add(h1TrackEff_zv);
+   CorrMatr->Add(h1TrackCorr_zv);
+   CorrMatr->Add(h1TrackEff_pt);
+   CorrMatr->Add(h1TrackCorr_pt);
+   CorrMatr->Add(h1TrackEff_eta);
+   CorrMatr->Add(h1TrackCorr_eta);
+
+   // scale the secondaries before calculating correction matrices
+   for (Long64_t i = 0; i < fRecSecTrackMatrixScaled->GetNbins(); i++) {
+       Int_t c[3];
+       Double_t val = fRecSecTrackMatrixScaled->GetBinContent(i,c);
+       Double_t err = fRecSecTrackMatrixScaled->GetBinError(i);
+       Double_t pt =  fRecSecTrackMatrixScaled->GetAxis(1)->GetBinCenter(c[1]);
+       Double_t scale = GetStrangenessCorrFactorPbPb(pt, sscale);
+       fRecSecTrackMatrixScaled->SetBinContent(c,val*scale);
+       fRecSecTrackMatrixScaled->SetBinError(c,err*scale);
+    }
+    
+    // for correct determination of secondaries contamination, also the total total tracks have to be scaled
+    // this is done by taking primaries and adding the scaled secondaries
+    fRecTrackMatrixScaled->Add(fRecSecTrackMatrixScaled);
+
+    fRecSecTrackMatrixScaled->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    fRecSecTrackMatrixScaled->GetAxis(2)->SetRangeUser(-eta, eta-0.01);//eta
+    fRecSecTrackMatrixScaled->GetAxis(3)->SetRange(c_first,c_last); // select centrality
+    
+    TH3D* h3RecSecTrackScaled = fRecSecTrackMatrixScaled->Projection(0,1,2)->Clone("h3RecSecTrackScaled");
+    TH2D* h2RecSecTrackScaled_zv_pt  = fRecSecTrackMatrixScaled->Projection(0,1)->Clone("h2RecSecTrackScaled_zv_pt");
+    TH2D* h2RecSecTrackScaled_zv_eta = fRecSecTrackMatrixScaled->Projection(0,2)->Clone("h2RecSecTrackScaled_zv_eta");
+    TH2D* h2RecSecTrackScaled_pt_eta = fRecSecTrackMatrixScaled->Projection(1,2)->Clone("h2RecSecTrackScaled_pt_eta");
+    TH1D* h1RecSecTrackScaled_zv  = fRecSecTrackMatrixScaled->Projection(0)->Clone("h1RecSecTrackScaled_zv");
+    TH1D* h1RecSecTrackScaled_pt  = fRecSecTrackMatrixScaled->Projection(1)->Clone("h1RecSecTrackScaled_pt");
+    TH1D* h1RecSecTrackScaled_eta = fRecSecTrackMatrixScaled->Projection(2)->Clone("h1RecSecTrackScaled_eta");
+    
+    h1RecSecTrackScaled_pt = (TH1D*) h1RecSecTrackScaled_pt->Rebin(ptNbins,"",binsPt); // rebin hist
+
+    ContHist->Add(h3RecSecTrackScaled);
+    ContHist->Add(h2RecSecTrackScaled_zv_pt);
+    ContHist->Add(h2RecSecTrackScaled_zv_eta);
+    ContHist->Add(h2RecSecTrackScaled_pt_eta);
+    ContHist->Add(h1RecSecTrackScaled_zv);
+    ContHist->Add(h1RecSecTrackScaled_pt);
+    ContHist->Add(h1RecSecTrackScaled_eta);
+    
+    fRecTrackMatrixScaled->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    fRecTrackMatrixScaled->GetAxis(2)->SetRangeUser(-eta, eta-0.01);//eta
+    
+    TH3D* h3RecTrackScaled = fRecTrackMatrixScaled->Projection(0,1,2)->Clone("h3RecTrackScaled");
+    TH2D* h2RecTrackScaled_zv_pt  = fRecTrackMatrixScaled->Projection(0,1)->Clone("h2RecTrackScaled_zv_pt");
+    TH2D* h2RecTrackScaled_zv_eta = fRecTrackMatrixScaled->Projection(0,2)->Clone("h2RecTrackScaled_zv_eta");
+    TH2D* h2RecTrackScaled_pt_eta = fRecTrackMatrixScaled->Projection(1,2)->Clone("h2RecTrackScaled_pt_eta");
+    TH1D* h1RecTrackScaled_zv  = fRecTrackMatrixScaled->Projection(0)->Clone("h1RecTrackScaled_zv");
+    TH1D* h1RecTrackScaled_pt  = fRecTrackMatrixScaled->Projection(1)->Clone("h1RecTrackScaled_pt");
+    TH1D* h1RecTrackScaled_eta = fRecTrackMatrixScaled->Projection(2)->Clone("h1RecTrackScaled_eta");
+    
+    
+    h1RecTrackScaled_pt = (TH1D*) h1RecTrackScaled_pt->Rebin(ptNbins,"",binsPt); // rebin hist
+    
+
+    ContHist->Add(h3RecTrackScaled);
+    ContHist->Add(h2RecTrackScaled_zv_pt);
+    ContHist->Add(h2RecTrackScaled_zv_eta);
+    ContHist->Add(h2RecTrackScaled_pt_eta);
+    ContHist->Add(h1RecTrackScaled_zv);
+    ContHist->Add(h1RecTrackScaled_pt);
+    ContHist->Add(h1RecTrackScaled_eta);
+    
+    // create histograms for secondaries contamination and correction
+    
+    TH3D* h3SecCont = AlidNdPtHelper::GenerateCorrMatrix(h3RecSecTrackScaled,h3RecTrackScaled,"h3SecCont");
+    TH3D* h3SecCorr = AlidNdPtHelper::GenerateContCorrMatrix(h3RecSecTrackScaled,h3RecTrackScaled,"h3SecCorr");
+    TH2D* h2SecCont_zv_pt  = AlidNdPtHelper::GenerateCorrMatrix(h2RecSecTrackScaled_zv_pt,h2RecTrackScaled_zv_pt,"h2SecCont_zv_pt");
+    TH2D* h2SecCorr_zv_pt  = AlidNdPtHelper::GenerateContCorrMatrix(h2RecSecTrackScaled_zv_pt,h2RecTrackScaled_zv_pt,"h2SecCorr_zv_pt");
+    TH2D* h2SecCont_zv_eta = AlidNdPtHelper::GenerateCorrMatrix(h2RecSecTrackScaled_zv_eta,h2RecTrackScaled_zv_eta,"h2SecCont_zv_eta");
+    TH2D* h2SecCorr_zv_eta = AlidNdPtHelper::GenerateContCorrMatrix(h2RecSecTrackScaled_zv_eta,h2RecTrackScaled_zv_eta,"h2SecCorr_zv_eta");
+    TH2D* h2SecCont_pt_eta = AlidNdPtHelper::GenerateCorrMatrix(h2RecSecTrackScaled_pt_eta,h2RecTrackScaled_pt_eta,"h2SecCont_pt_eta");
+    TH2D* h2SecCorr_pt_eta = AlidNdPtHelper::GenerateContCorrMatrix(h2RecSecTrackScaled_pt_eta,h2RecTrackScaled_pt_eta,"h2SecCorr_pt_eta");
+    TH1D* h1SecCont_zv = AlidNdPtHelper::GenerateCorrMatrix(h1RecSecTrackScaled_zv,h1RecTrackScaled_zv,"h1SecCont_zv");
+    TH1D* h1SecCorr_zv = AlidNdPtHelper::GenerateContCorrMatrix(h1RecSecTrackScaled_zv,h1RecTrackScaled_zv,"h1SecCorr_zv");
+    TH1D* h1SecCont_pt = AlidNdPtHelper::GenerateCorrMatrix(h1RecSecTrackScaled_pt,h1RecTrackScaled_pt,"h1SecCont_pt");
+    TH1D* h1SecCorr_pt = AlidNdPtHelper::GenerateContCorrMatrix(h1RecSecTrackScaled_pt,h1RecTrackScaled_pt,"h1SecCorr_pt");
+    TH1D* h1SecCont_eta = AlidNdPtHelper::GenerateCorrMatrix(h1RecSecTrackScaled_eta,h1RecTrackScaled_eta,"h1SecCont_eta");
+    TH1D* h1SecCorr_eta = AlidNdPtHelper::GenerateContCorrMatrix(h1RecSecTrackScaled_eta,h1RecTrackScaled_eta,"h1SecCorr_eta");
+
+    CorrMatr->Add(h3SecCont);
+    CorrMatr->Add(h3SecCorr);
+    CorrMatr->Add(h2SecCont_zv_pt);
+    CorrMatr->Add(h2SecCorr_zv_pt);
+    CorrMatr->Add(h2SecCont_zv_eta);
+    CorrMatr->Add(h2SecCorr_zv_eta);
+    CorrMatr->Add(h2SecCont_pt_eta);
+    CorrMatr->Add(h2SecCorr_pt_eta);
+    CorrMatr->Add(h1SecCont_zv);
+    CorrMatr->Add(h1SecCorr_zv);
+    CorrMatr->Add(h1SecCont_pt);
+    CorrMatr->Add(h1SecCorr_pt);
+    CorrMatr->Add(h1SecCont_eta);
+    CorrMatr->Add(h1SecCorr_eta);
+
+    // plot pictures and save to gifdir
+    for (i=0; i < CorrMatr->LastIndex(); i++) {    
+        TCanvas* ctmp = PlotHist(CorrMatr->At(i),idstring);
+        if (gifdir && ctmp) {
+            TString gif(gifdir);
+            gif += '/';
+            gif += ctmp->GetName();
+            gif += ".gif";
+            ctmp->SaveAs(gif.Data(),"gif");     
+            delete ctmp;
+        }
+    }
+    for (i=0; i < ContHist->LastIndex(); i++) {    
+        TCanvas* ctmp = PlotHist(ContHist->At(i),idstring);
+        if (gifdir && ctmp) {
+            TString gif(gifdir);
+            gif += '/';
+            gif += ctmp->GetName();
+            gif += ".gif";
+            ctmp->SaveAs(gif.Data(),"gif");     
+            delete ctmp;
+        }
+   }    
+
+    // save all correction matrices and control histograms to file
+    if (!outfile) { return; }
+    TFile *out = TFile::Open(outfile,"RECREATE");
+    CorrMatr->Write();
+    ContHist->Write();
+    out->Close();
+    
+    return MCReconstructedEvents;
+
+}
+
+
+//_____________________________________________________________________________
+Double_t GetStrangenessCorrFactorPbPb(Double_t pt, Double_t s)
+{
+    // data driven correction factor for secondaries (PbPb)
+
+    if (pt <= 0.25) return 1.0;
+    if (pt <= 0.5) return GetLinearInterpolationValue(0.25,1.0,0.5,0.60+0.40*s, pt);
+    if (pt <= 1.0) return GetLinearInterpolationValue(0.5,0.60+0.40*s,1.0,0.53+0.47*s, pt);
+    if (pt <= 2.0) return GetLinearInterpolationValue(1.0,0.53+0.47*s,2.0,0.44+0.56*s, pt);
+    if (pt <= 5.0) return GetLinearInterpolationValue(2.0,0.44+0.56*s,5.0,0.33+0.67*s, pt);
+    return 0.33+0.67*s;
+}
+
+
+//___________________________________________________________________________
+Double_t GetLinearInterpolationValue(const Double_t x1,const  Double_t y1,const  Double_t x2,const  Double_t y2, const Double_t pt)
+{
+    //
+    // linear interpolation
+    //
+    return ((y2-y1)/(x2-x1))*pt+(y2-(((y2-y1)/(x2-x1))*x2)); 
+}
+
+//___________________________________________________________________________
+TCanvas* PlotHist(TObject* hobj, const char* label=0)
+{
+    TH1* h = dynamic_cast<TH1*>(hobj);
+    if (!h) return 0;
+    if (h->GetDimension() > 2) return 0;
+    h->SetStats(0);
+    if ( TString(h->GetName()).Contains("Events")) { h->SetStats(1); } 
+    TString t(label);
+    if (label) t += "_";
+    t += h->GetName();
+    h->SetTitle(t.Data());
+    TCanvas* c = new TCanvas(t.Data(),t.Data());
+    if (h->GetDimension() >= 1) {
+        TString xlabel(h->GetXaxis()->GetTitle());
+        if (xlabel.Contains("Pt")) { c->SetLogx();  h->GetXaxis()->SetRangeUser(0.1 , 100.); }
+    }
+    if (h->GetDimension() == 1) {
+        if (xlabel.Contains("p_{T}")) { c->SetLogx();  c->SetLogy();  h->GetXaxis()->SetRangeUser(0.1 , 100.); }
+    }
+    if (h->GetDimension() == 2) {  
+        TString ylabel(h->GetYaxis()->GetTitle());
+        if (ylabel.Contains("Pt")) { c->SetLogy(); h->GetYaxis()->SetRangeUser(0.1 , 100.); }
+        if (ylabel.Contains("p_{T}")) { c->SetLogy(); h->GetYaxis()->SetRangeUser(0.1 , 100.); }
+        h->Draw("COLZ");
+    }        
+    if (h->GetDimension() == 1) {
+        h->Draw();
+    }
+    return c;
+
+}
+
+Int_t CheckLoadLibrary(const char* library)
+{
+  // checks if a library is already loaded, if not loads the library
+
+  if (strlen(gSystem->GetLibraries(Form("%s.so", library), "", kFALSE)) > 0)
+    return 1;
+
+  return gSystem->Load(library);
+}
diff --git a/PWG0/dNdPt/macros/GenerateCorrMatr_pp.C b/PWG0/dNdPt/macros/GenerateCorrMatr_pp.C
new file mode 100644 (file)
index 0000000..7b0c7fa
--- /dev/null
@@ -0,0 +1,698 @@
+Double_t GenerateCorrMatr_pp(const char* mcfile, const char* mctask, const char* idstring ,const char* outfile, const char* gifdir = 0)
+//Double_t GenerateCorrMatr_pp()
+{
+//tmp setting
+// const char* mcfile = "/d/alice09/mknichel/train/V007.MC_pp/2011-05-05_2347.7147/mergedPeriods/MC_pp/7TeV/LHC10f6a/mknichel_dNdPtpp_TPCITS.root";
+// const char* mctask = "mknichel_dNdPtpp_TPCITS";
+// const char* idstring = "TPCITS";
+// const char* outfile = "/u/mknichel/alice/dNdPt_pp/temp/corrMatr_LHC10f6a_TPCITS.root";
+// const char* gifdir = "/u/mknichel/alice/dNdPt_pp/temp";
+
+TString fname (mcfile);
+
+TString id (idstring);
+TString taskname = "mknichel_dNdPtpp_" + id;
+TString objname = "dNdPtAnalysis_" + id;
+
+    // settings vor zVertex cut (event and track level)
+    Double_t zVert = 10.0;
+    
+    // setting on eta cut (track level)
+    Double_t eta = 0.8;
+    
+    // strangeness scaling factor (for secondaries from strange decays)
+    Double_t sscale = 2.0;  //ignored
+    
+    
+    // Set pt binning
+    const Int_t ptNbins = 31;
+    Double_t bins[32] = {0.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.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0,2.4,2.8, 3.0,  4.0, 50.0, 100.0 };
+    Double_t* binsPt = new Double_t[32];
+    for (int ibin=0; ibin<32; ibin++) {binsPt[ibin] = bins[ibin];}
+    
+
+  Int_t ptNbinsTrackEventCorr = 36;
+  Int_t etaNbins = 30;
+  Int_t zvNbins = 12;
+
+  Double_t binsMultDefault[28] = {-0.5, 0.5 , 1.5 , 2.5 , 3.5 , 4.5 , 5.5 , 6.5 , 7.5 , 8.5,
+                                     9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5,
+                                    19.5,20.5, 21.5, 22.5, 23.5, 24.5, 29.5, 149.5};
+
+  Double_t binsPtTrackEventCorrDefault[37] = {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.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.2,2.4,2.6,3.0,4.0,50.0};
+
+  Double_t binsPtDefault[69] = {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.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.2,2.4,2.6,2.8,3.0,3.2,3.4,3.6,3.8,4.0,4.5,5.0,5.5,6.0,6.5,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,18.0,20.0,22.0,24.0,26.0,28.0,30.0,32.0,34.0,36.0,40.0,45.0,50.0};
+
+  Double_t binsEtaDefault[31] = {-1.5,-1.4,-1.3,-1.2,-1.1,-1.0,-0.9,-0.8,-0.7,-0.6,-0.5,-0.4,-0.3,-0.2,-0.1,0.,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5};
+
+  Double_t binsZvDefault[13] = {-30.,-25.,-20.,-15.,-10.,-5.,0.,5.,10.,15.,20.,25.,30.};
+  
+    // binning for corrections (note difference for efficiency and secondaries)
+    if (fname.Contains("2.76TeV") || fname.Contains("900GeV")) {
+    
+    const Int_t ptNbinsSecCorr  = 28;
+    const Int_t ptNbinsEffCorr  = 31;
+    const Int_t etaNbinsCorr = 4;
+    const Int_t zvNbinsCorr  = 4;
+    const Int_t multNbinsCorr = 2;
+    Double_t ptBinsSecCorr[29] = {0.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.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.2, 1.4, 1.6, 2.0, 2.4, 3.0, 50.0, 100.0 };    
+    Double_t ptBinsEffCorr[32] = {0.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.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.2, 1.4, 1.6, 2.0, 2.4, 2.8, 3.0, 3.4, 4.0, 50.0, 100.0 };
+    Double_t etaBinsCorr[5] = {-0.8,-0.4,0.,0.4,0.8};
+    
+    Double_t zvBinsCorr[5] = {-10.,-5.,0.,5.,10.};
+    Double_t multBinsCorr[3] = {-0.5,0.5,500.};
+    
+    
+    } else {
+    
+    const Int_t ptNbinsSecCorr  = 38;
+    const Int_t ptNbinsEffCorr  = 50;
+    const Int_t etaNbinsCorr = 8;
+    const Int_t zvNbinsCorr  = 4;
+    const Int_t multNbinsCorr = 2;
+    Double_t ptBinsSecCorr[39] = {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.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.2,2.4,2.6,3.0,3.4,4.0,50.0,100.0};
+    Double_t ptBinsEffCorr[51] = {0.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.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 8.0, 10.0, 50.0, 100.0 };
+    Double_t etaBinsCorr[9] = {-0.8,-0.6,-0.4,-0.2,0.,0.2,0.4,0.6,0.8};
+    
+    Double_t zvBinsCorr[5] = {-10.,-5.,0.,5.,10.};
+    Double_t multBinsCorr[3] = {-0.5,0.5,500.};
+    
+    }
+    
+    
+    Int_t binsTrackEffCorr[3]={zvNbinsCorr,ptNbinsEffCorr,etaNbinsCorr};
+    Int_t binsTrackSecCorr[3]={zvNbinsCorr,ptNbinsSecCorr,etaNbinsCorr};
+    
+    THnSparse* hSTrackEffCorr = new THnSparseF("hSTrackEffCorr","Zv:pT:eta",3,binsTrackEffCorr);
+    hSTrackEffCorr->SetBinEdges(0,zvBinsCorr);
+    hSTrackEffCorr->SetBinEdges(1,ptBinsEffCorr);
+    hSTrackEffCorr->SetBinEdges(2,etaBinsCorr);
+//     hSTrackEffCorr->SetBinEdges(3,multBinsCorr);
+    hSTrackEffCorr->GetAxis(0)->SetTitle("Zv (cm)");
+    hSTrackEffCorr->GetAxis(1)->SetTitle("p_{T} (GeV/c)");
+    hSTrackEffCorr->GetAxis(2)->SetTitle("#eta");
+//     hSTrackEffCorr->GetAxis(3)->SetTitle("mult MB");
+    hSTrackEffCorr->Sumw2();    
+    
+    THnSparse* hSTrackSecCorr = new THnSparseF("hSTrackSecCorr","Zv:pT:eta",3,binsTrackSecCorr);    
+    hSTrackSecCorr->SetBinEdges(0,zvBinsCorr);
+    hSTrackSecCorr->SetBinEdges(1,ptBinsSecCorr);
+    hSTrackSecCorr->SetBinEdges(2,etaBinsCorr);
+//     hSTrackSecCorr->SetBinEdges(3,multBinsCorr);
+    hSTrackSecCorr->GetAxis(0)->SetTitle("Zv (cm)");
+    hSTrackSecCorr->GetAxis(1)->SetTitle("p_{T} (GeV/c)");
+    hSTrackSecCorr->GetAxis(2)->SetTitle("#eta");
+//     hSTrackSecCorr->GetAxis(3)->SetTitle("mult MB");
+    hSTrackSecCorr->Sumw2();
+    
+
+    // make plots nicer
+    gROOT->SetStyle("Plain");
+    gStyle->SetPalette(1);
+    
+    // array for all correction matrices
+    TObjArray* CorrMatr = new TObjArray();
+    
+    // array for all control histograms
+    TObjArray* ContHist = new TObjArray();
+    
+
+    // load mc information
+    TFile* fmc = TFile::Open(mcfile,"READ");
+    if (!fmc) return -1;
+    TList* lmc = dynamic_cast<TList*>(fmc->Get(taskname.Data()));
+    if (!lmc) return -1;
+    AlidNdPtAnalysis *obj = dynamic_cast<AlidNdPtAnalysis*>(lmc->FindObject(objname.Data()));
+    if (!obj) return -1;
+
+    //Event statistics
+    THnSparse *fRecEventMatrix = obj->GetRecEventMatrix(); //all reconstructed events  
+    TH2D* h2RecEventAll = fRecEventMatrix->Projection(0,1)->Clone("h2RecEventAll");
+    fRecEventMatrix->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    TH2D* h2RecEvent = fRecEventMatrix->Projection(0,1)->Clone("h2RecEvent");
+    Double_t MCReconstructedEvents = h2RecEvent->Integral();
+    Double_t MCReconstructedEventsAll = h2RecEventAll->Integral();
+    ContHist->Add(h2RecEvent);
+    ContHist->Add(h2RecEventAll);
+        
+    THnSparse *fTriggerEventMatrix = obj->GetTriggerEventMatrix(); //all triggered events
+    Double_t MCTriggeredEventsAll0mult =  obj->GetTriggerEventMatrix()->Projection(1)->Integral(1,1); // 0 contributers to vertex
+    TH2D* h2TriggerEventAll = fTriggerEventMatrix->Projection(0,1)->Clone("h2TriggerEventAll");
+    fTriggerEventMatrix->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    Double_t MCTriggeredEvents0mult =  obj->GetTriggerEventMatrix()->Projection(1)->Integral(1,1); // 0 contributers to vertex
+    TH2D* h2TriggerEvent = fTriggerEventMatrix->Projection(0,1)->Clone("h2TriggerEvent");
+    Double_t MCTriggeredEvents = h2TriggerEvent->Integral();
+    Double_t MCTriggeredEventsAll = h2TriggerEventAll->Integral();
+    ContHist->Add(h2TriggerEvent);
+    ContHist->Add(h2TriggerEventAll);
+        
+    THnSparse *fGenEventMatrix = obj->GetGenEventMatrix(); //all generated events
+    TH2D* h2GenEventAll = fGenEventMatrix->Projection(0,1)->Clone("h2GenEventAll");
+    fGenEventMatrix->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    TH2D* h2GenEvent = fGenEventMatrix->Projection(0,1)->Clone("h2GenEvent");
+    Double_t MCGeneratedEvents = h2GenEvent->Integral();
+    Double_t MCGeneratedEventsAll = h2GenEventAll->Integral(); 
+    ContHist->Add(h2RecEvent);
+    ContHist->Add(h2RecEventAll);
+    
+    THnSparse *fRecEventHist = obj->GetRecEventHist();
+    THnSparse *fRecEventHist2 = obj->GetRecEventHist2();
+       
+    printf("=== generated MC events for correction matrices    %lf ===\n",MCGeneratedEvents);
+    printf("=== triggered MC events for correction matrices    %lf ===\n",MCTriggeredEvents);
+    printf("=== recontructed MC events for correction matrices %lf ===\n",MCReconstructedEvents);
+    printf("\n");
+    printf("=== cut on the zVertex +- %lf ===\n",zVert);
+    printf("=== generated MC events (before zVertex cut)       %lf ===\n",MCGeneratedEventsAll);
+    printf("=== triggered MC events (before zVertex cut)       %lf ===\n",MCTriggeredEventsAll);
+    printf("=== recontructed MC events (before zVertex cut)    %lf ===\n",MCReconstructedEventsAll);
+    
+    TH1D* h1MCGeneratedEvents = new TH1D("h1MCGeneratedEvents","h1MCGeneratedEvents",1,0,1);
+    TH1D* h1MCTriggeredEvents = new TH1D("h1MCTriggeredEvents","h1MCTriggeredEvents",1,0,1);
+    TH1D* h1MCReconstructedEvents = new TH1D("h1MCReconstructedEvents","h1MCReconstructedEvents",1,0,1);
+    TH1D* h1MCGeneratedEventsAll = new TH1D("h1MCGeneratedEventsAll","h1MCGeneratedEventsAll",1,0,1);
+    TH1D* h1MCTriggeredEventsAll = new TH1D("h1MCTriggeredEventsAll","h1MCTriggeredEventsAll",1,0,1);
+    TH1D* h1MCReconstructedEventsAll = new TH1D("h1MCReconstructedEventsAll","h1MCReconstructedEventsAll",1,0,1);
+    TH1D* h1MCTriggeredEventsAll0mult = new TH1D("h1MCTriggeredEventsAll0mult","h1MCTriggeredEventsAll0mult",1,0,1);
+    TH1D* h1MCTriggeredEvents0mult = new TH1D("h1MCTriggeredEvents0mult","h1MCTriggeredEvents0mult",1,0,1);
+    
+    h1MCGeneratedEvents->Fill(0,MCGeneratedEvents);
+    h1MCGeneratedEvents->SetEntries(MCGeneratedEvents);
+    h1MCTriggeredEvents->Fill(0,MCTriggeredEvents);
+    h1MCTriggeredEvents->SetEntries(MCTriggeredEvents);
+    h1MCReconstructedEvents->Fill(0,MCReconstructedEvents);
+    h1MCReconstructedEvents->SetEntries(MCReconstructedEvents);
+    h1MCGeneratedEventsAll->Fill(0,MCGeneratedEventsAll);
+    h1MCGeneratedEventsAll->SetEntries(MCGeneratedEventsAll);
+    h1MCTriggeredEventsAll->Fill(0,MCTriggeredEventsAll);
+    h1MCTriggeredEventsAll->SetEntries(MCTriggeredEventsAll);
+    h1MCReconstructedEventsAll->Fill(0,MCReconstructedEventsAll);
+    h1MCReconstructedEventsAll->SetEntries(MCReconstructedEventsAll);
+    h1MCTriggeredEventsAll0mult->Fill(0,MCTriggeredEventsAll0mult);
+    h1MCTriggeredEventsAll0mult->SetEntries(MCTriggeredEventsAll0mult);
+    h1MCTriggeredEvents0mult->Fill(0,MCTriggeredEvents0mult);
+    h1MCTriggeredEvents0mult->SetEntries(MCTriggeredEvents0mult);
+    
+    
+    ContHist->Add(h1MCGeneratedEvents);
+    ContHist->Add(h1MCTriggeredEvents);
+    ContHist->Add(h1MCReconstructedEvents);
+    ContHist->Add(h1MCGeneratedEventsAll);
+    ContHist->Add(h1MCTriggeredEventsAll);
+    ContHist->Add(h1MCReconstructedEventsAll);
+    ContHist->Add(h1MCTriggeredEvents0mult);
+    ContHist->Add(h1MCTriggeredEventsAll0mult);
+    
+
+    // efficienfy and correction matrices for tigger and vertex efficiency
+    TH2D* h2EventTriggerEffAll  = AlidNdPtHelper::GenerateCorrMatrix(h2TriggerEventAll,h2GenEventAll,"h2EventTriggerEffAll");
+    TH2D* h2EventTriggerCorrAll = AlidNdPtHelper::GenerateCorrMatrix(h2GenEventAll,h2TriggerEventAll,"h2EventTriggerCorrAll"); 
+    TH2D* h2EventTriggerEff  = AlidNdPtHelper::GenerateCorrMatrix(h2TriggerEvent,h2GenEvent,"h2EventTriggerEff");
+    TH2D* h2EventTriggerCorr = AlidNdPtHelper::GenerateCorrMatrix(h2GenEvent,h2TriggerEvent,"h2EventTriggerCorr"); 
+
+    TH2D* h2EventRecEffAll  = AlidNdPtHelper::GenerateCorrMatrix(h2RecEventAll,h2TriggerEventAll,"h2EventRecEffAll");
+    TH2D* h2EventRecCorrAll = AlidNdPtHelper::GenerateCorrMatrix(h2TriggerEventAll,h2RecEventAll,"h2EventRecCorrAll");
+    TH2D* h2EventRecEff  = AlidNdPtHelper::GenerateCorrMatrix(h2RecEvent,h2TriggerEvent,"h2EventRecEff");
+    TH2D* h2EventRecCorr = AlidNdPtHelper::GenerateCorrMatrix(h2TriggerEvent,h2RecEvent,"h2EventRecCorr");
+
+    TH2D* h2EventEffAll  = AlidNdPtHelper::GenerateCorrMatrix(h2RecEventAll,h2GenEventAll,"h2EventEffAll");
+    TH2D* h2EventCorrAll = AlidNdPtHelper::GenerateCorrMatrix(h2GenEventAll,h2RecEventAll,"h2EventCorrAll");
+    TH2D* h2EventEff  = AlidNdPtHelper::GenerateCorrMatrix(h2RecEvent,h2GenEvent,"h2EventEff");
+    TH2D* h2EventCorr = AlidNdPtHelper::GenerateCorrMatrix(h2GenEvent,h2RecEvent,"h2EventCorr");
+
+    CorrMatr->Add(h2EventTriggerEffAll);
+    CorrMatr->Add(h2EventTriggerCorrAll);
+    CorrMatr->Add(h2EventTriggerEff);
+    CorrMatr->Add(h2EventTriggerCorr);
+    CorrMatr->Add(h2EventRecEffAll);
+    CorrMatr->Add(h2EventRecCorrAll);
+    CorrMatr->Add(h2EventRecEff);
+    CorrMatr->Add(h2EventRecCorr);
+    CorrMatr->Add(h2EventEffAll);
+    CorrMatr->Add(h2EventCorrAll);
+    CorrMatr->Add(h2EventEff);
+    CorrMatr->Add(h2EventCorr);
+    
+    THnSparse* hSMultCorrelation = obj->GetEventMultCorrelationMatrix()->Clone("hSMultCorrelation");
+    CorrMatr->Add(hSMultCorrelation);
+    TH2D* h2MultCorrelation = hSMultCorrelation->Projection(0,1)->Clone("h2MultCorrelation");
+    CorrMatr->Add(h2MultCorrelation);
+
+    // all recontructed
+    THnSparse *fRecTrackMatrix = obj->GetRecTrackMatrix();
+    fRecTrackMatrix->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    fRecTrackMatrix->GetAxis(2)->SetRangeUser(-eta, eta-0.01);//eta
+    TH3D* h3RecTrack = fRecTrackMatrix->Projection(0,1,2)->Clone("h3RecTrack");
+    TH2D* h2RecTrack_zv_pt  = fRecTrackMatrix->Projection(0,1)->Clone("h2RecTrack_zv_pt");
+    TH2D* h2RecTrack_zv_eta = fRecTrackMatrix->Projection(0,2)->Clone("h2RecTrack_zv_eta");
+    TH2D* h2RecTrack_pt_eta = fRecTrackMatrix->Projection(1,2)->Clone("h2RecTrack_pt_eta");
+    TH1D* h1RecTrack_zv  = fRecTrackMatrix->Projection(0)->Clone("h1RecTrack_zv");
+    TH1D* h1RecTrack_pt  = fRecTrackMatrix->Projection(1)->Clone("h1RecTrack_pt");
+    TH1D* h1RecTrack_eta = fRecTrackMatrix->Projection(2)->Clone("h1RecTrack_eta");
+    Double_t MCReconstructedTracks = h3RecTrack->Integral();    
+
+    ContHist->Add(h3RecTrack);
+    ContHist->Add(h2RecTrack_zv_pt);
+    ContHist->Add(h2RecTrack_zv_eta);
+    ContHist->Add(h2RecTrack_pt_eta);
+    ContHist->Add(h1RecTrack_zv);
+    ContHist->Add(h1RecTrack_pt);
+    ContHist->Add(h1RecTrack_eta);
+
+     // recontructed primary tracks
+    THnSparse *fRecPrimTrackMatrix = obj->GetRecPrimTrackMatrix();
+    THnSparse *fRecTrackMatrixScaled = fRecPrimTrackMatrix->Clone("fRecTrackMatrixScaled"); //used later for secondaries scaling
+    fRecPrimTrackMatrix->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    fRecPrimTrackMatrix->GetAxis(2)->SetRangeUser(-eta, eta-0.01);//eta
+    TH3D* h3RecPrimTrack = fRecPrimTrackMatrix->Projection(0,1,2)->Clone("h3RecPrimTrack");
+    TH2D* h2RecPrimTrack_zv_pt  = fRecPrimTrackMatrix->Projection(0,1)->Clone("h2RecPrimTrack_zv_pt");
+    TH2D* h2RecPrimTrack_zv_eta = fRecPrimTrackMatrix->Projection(0,2)->Clone("h2RecPrimTrack_zv_eta");
+    TH2D* h2RecPrimTrack_pt_eta = fRecPrimTrackMatrix->Projection(1,2)->Clone("h2RecPrimTrack_pt_eta");
+    TH1D* h1RecPrimTrack_zv  = fRecPrimTrackMatrix->Projection(0)->Clone("h1RecPrimTrack_zv");
+    TH1D* h1RecPrimTrack_pt  = fRecPrimTrackMatrix->Projection(1)->Clone("h1RecPrimTrack_pt");
+    TH1D* h1RecPrimTrack_eta = fRecPrimTrackMatrix->Projection(2)->Clone("h1RecPrimTrack_eta");
+    Double_t MCReconstructedPrimTracks = h3RecPrimTrack->Integral();
+
+    ContHist->Add(h3RecPrimTrack);
+    ContHist->Add(h2RecPrimTrack_zv_pt);
+    ContHist->Add(h2RecPrimTrack_zv_eta);
+    ContHist->Add(h2RecPrimTrack_pt_eta);
+    ContHist->Add(h1RecPrimTrack_zv);
+    ContHist->Add(h1RecPrimTrack_pt);
+    ContHist->Add(h1RecPrimTrack_eta);
+    
+    // recontructed secondary tracks
+    THnSparse *fRecSecTrackMatrix = obj->GetRecSecTrackMatrix();
+    THnSparse *fRecSecTrackMatrixScaled = fRecSecTrackMatrix->Clone("fRecSecTrackMatrixScaled"); //used later for secondaries scaling
+    fRecSecTrackMatrix->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    fRecSecTrackMatrix->GetAxis(2)->SetRangeUser(-eta, eta-0.01);//eta
+    TH3D* h3RecSecTrack = fRecSecTrackMatrix->Projection(0,1,2)->Clone("h3RecSecTrack");
+    TH2D* h2RecSecTrack_zv_pt  = fRecSecTrackMatrix->Projection(0,1)->Clone("h2RecSecTrack_zv_pt");
+    TH2D* h2RecSecTrack_zv_eta = fRecSecTrackMatrix->Projection(0,2)->Clone("h2RecSecTrack_zv_eta");
+    TH2D* h2RecSecTrack_pt_eta = fRecSecTrackMatrix->Projection(1,2)->Clone("h2RecSecTrack_pt_eta");
+    TH1D* h1RecSecTrack_zv  = fRecSecTrackMatrix->Projection(0)->Clone("h1RecSecTrack_zv");
+    TH1D* h1RecSecTrack_pt  = fRecSecTrackMatrix->Projection(1)->Clone("h1RecSecTrack_pt");
+    TH1D* h1RecSecTrack_eta = fRecSecTrackMatrix->Projection(2)->Clone("h1RecSecTrack_eta");
+    Double_t MCReconstructedSecTracks = h3RecSecTrack->Integral();
+
+    ContHist->Add(h3RecSecTrack);
+    ContHist->Add(h2RecSecTrack_zv_pt);
+    ContHist->Add(h2RecSecTrack_zv_eta);
+    ContHist->Add(h2RecSecTrack_pt_eta);
+    ContHist->Add(h1RecSecTrack_zv);
+    ContHist->Add(h1RecSecTrack_pt);
+    ContHist->Add(h1RecSecTrack_eta);
+    
+    // generated primary tracks
+    THnSparse *fGenPrimTrackMatrix = obj->GetGenPrimTrackMatrix();
+    fGenPrimTrackMatrix->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    fGenPrimTrackMatrix->GetAxis(2)->SetRangeUser(-eta, eta-0.01);//eta
+    TH3D* h3GenPrimTrack = fGenPrimTrackMatrix->Projection(0,1,2)->Clone("h3GenPrimTrack");
+    TH2D* h2GenPrimTrack_zv_Pt  = fGenPrimTrackMatrix->Projection(0,1)->Clone("h2GenPrimTrack_zv_pt");
+    TH2D* h2GenPrimTrack_zv_eta = fGenPrimTrackMatrix->Projection(0,2)->Clone("h2GenPrimTrack_zv_eta");
+    TH2D* h2GenPrimTrack_pt_eta = fGenPrimTrackMatrix->Projection(1,2)->Clone("h2GenPrimTrack_pt_eta");
+    TH1D* h1GenPrimTrack_zv  = fGenPrimTrackMatrix->Projection(0)->Clone("h1GenPrimTrack_zv");
+    TH1D* h1GenPrimTrack_pt  = fGenPrimTrackMatrix->Projection(1)->Clone("h1GenPrimTrack_pt");
+    TH1D* h1GenPrimTrack_eta = fGenPrimTrackMatrix->Projection(2)->Clone("h1GenPrimTrack_eta");
+    Double_t MCGeneratedPrimTracks = h3GenPrimTrack->Integral();
+
+    ContHist->Add(h3GenPrimTrack);
+    ContHist->Add(h2GenPrimTrack_zv_pt);
+    ContHist->Add(h2GenPrimTrack_zv_eta);
+    ContHist->Add(h2GenPrimTrack_pt_eta);
+    ContHist->Add(h1GenPrimTrack_zv);
+    ContHist->Add(h1GenPrimTrack_pt);
+    ContHist->Add(h1GenPrimTrack_eta);
+    printf("\n");
+    printf("==============================================================\n");    
+    printf("=== recontructed MC tracks              %lf ===\n",MCReconstructedTracks);
+    printf("=== recontructed MC secondary tracks    %lf ===\n",MCReconstructedSecTracks);
+    printf("=== recontructed MC primary tracks      %lf ===\n",MCReconstructedPrimTracks);
+    printf("=== generated MC primary track          %lf ===\n",MCGeneratedPrimTracks);
+    printf("==============================================================\n");    
+    printf("\n");
+    
+    // mc truth histogram (for self-consistency check)
+    TH1D* dNdPt_MC   = (TH1D*) h1GenPrimTrack_pt->Clone("dNdPt_MC");
+    TH1D* dNdEta_MC   =(TH1D*) h1GenPrimTrack_eta->Clone("dNdEta_MC");
+    // normalization and finalization
+    // 1/N_evt 1/(2 pi pt) 1/width 1/etarange
+   for (int ii=1; ii <= dNdPt_MC->GetNbinsX() ;ii++) {
+        Double_t pt = dNdPt_MC->GetBinCenter(ii);
+        Double_t width = dNdPt_MC->GetBinWidth(ii);
+        Double_t val = dNdPt_MC->GetBinContent(ii);
+        Double_t err = dNdPt_MC->GetBinError(ii);        
+        Double_t cval = (val)/(width * 2.0 * TMath::Pi() * 1.6 * MCGeneratedEvents * pt);
+        Double_t cerr = (err)/(width * 2.0 * TMath::Pi() * 1.6 * MCGeneratedEvents * pt);
+        dNdPt_MC->SetBinContent(ii,cval);
+        dNdPt_MC->SetBinError(ii,cerr);
+    }    
+    dNdPt_MC->SetMarkerStyle(21);
+    dNdPt_MC->SetTitle("; p_{T} (GeV/c) ; 1/N_{evt} 1/(2#pi p_{T}) (d^{2}N_{ch})/(d#eta dp_{T})^{-2}");
+    dNdEta_MC->Scale(1,"width");
+    dNdEta_MC->Scale(1./MCGeneratedEvents);        
+    ContHist->Add(dNdPt_MC);
+    ContHist->Add(dNdEta_MC);
+       
+
+   // Rebin for corrections (pt)
+   cout << "rebinning...." << endl;
+   
+   TH1D* h1RecPrimTrack_pt_Rebin = h1RecPrimTrack_pt->Rebin(ptNbins,"h1RecPrimTrack_pt_Rebin",binsPt);
+   TH1D* h1GenPrimTrack_pt_Rebin = h1GenPrimTrack_pt->Rebin(ptNbins,"h1GenPrimTrack_pt_Rebin",binsPt);
+   ContHist->Add(h1RecPrimTrack_pt_Rebin);
+   ContHist->Add(h1GenPrimTrack_pt_Rebin);
+
+       
+//    THnSparse *fSparseTriggerTrackEvent = obj->GetTriggerTrackEventMatrix();//Tracks from triggered events
+//    THnSparse *fSparseVtxTrackEvent = obj->GetRecTrackEventMatrix();//Tracks from events with rec. vtx
+//    THnSparse *fSparseGenTrackEvent = obj->GetGenTrackEventMatrix();//generated TrackEvent matrix
+
+    // tracking efficiencies + corrections  
+   TH2D* h2TrackEff_zv_pt   = AlidNdPtHelper::GenerateCorrMatrix(h2RecPrimTrack_zv_pt,h2GenPrimTrack_zv_pt,"h2TrackEff_zv_pt");
+   TH2D* h2TrackCorr_zv_pt  = AlidNdPtHelper::GenerateCorrMatrix(h2GenPrimTrack_zv_pt,h2RecPrimTrack_zv_pt,"h2TrackCorr_zv_pt");
+   TH2D* h2TrackEff_zv_eta  = AlidNdPtHelper::GenerateCorrMatrix(h2RecPrimTrack_zv_eta,h2GenPrimTrack_zv_eta,"h2TrackEff_zv_eta");
+   TH2D* h2TrackCorr_zv_eta = AlidNdPtHelper::GenerateCorrMatrix(h2GenPrimTrack_zv_eta,h2RecPrimTrack_zv_eta,"h2TrackCorr_zv_eta");
+   TH2D* h2TrackEff_pt_eta  = AlidNdPtHelper::GenerateCorrMatrix(h2RecPrimTrack_pt_eta,h2GenPrimTrack_pt_eta,"h2TrackEff_pt_eta");
+   TH2D* h2TrackCorr_pt_eta = AlidNdPtHelper::GenerateCorrMatrix(h2GenPrimTrack_pt_eta,h2RecPrimTrack_pt_eta,"h2TrackCorr_pt_eta");
+  
+    
+   TH1D* h1TrackEff_zv   = AlidNdPtHelper::GenerateCorrMatrix(h1RecPrimTrack_zv,h1GenPrimTrack_zv,"h1TrackEff_zv");
+   TH1D* h1TrackCorr_zv  = AlidNdPtHelper::GenerateCorrMatrix(h1GenPrimTrack_zv,h1RecPrimTrack_zv,"h1TrackCorr_zv");
+   TH1D* h1TrackEff_pt   = AlidNdPtHelper::GenerateCorrMatrix(h1RecPrimTrack_pt_Rebin,h1GenPrimTrack_pt_Rebin,"h1TrackEff_pt");
+   TH1D* h1TrackCorr_pt  = AlidNdPtHelper::GenerateCorrMatrix(h1GenPrimTrack_pt_Rebin,h1RecPrimTrack_pt_Rebin,"h1TrackCorr_pt");
+   TH1D* h1TrackEff_eta  = AlidNdPtHelper::GenerateCorrMatrix(h1RecPrimTrack_eta,h1GenPrimTrack_eta,"h1TrackEff_eta");
+   TH1D* h1TrackCorr_eta = AlidNdPtHelper::GenerateCorrMatrix(h1GenPrimTrack_eta,h1RecPrimTrack_eta,"h1TrackCorr_eta");
+   CorrMatr->Add(h2TrackEff_zv_pt);
+   CorrMatr->Add(h2TrackCorr_zv_pt);
+   CorrMatr->Add(h2TrackEff_zv_eta);
+   CorrMatr->Add(h2TrackCorr_zv_eta);
+   CorrMatr->Add(h2TrackEff_pt_eta);
+   CorrMatr->Add(h2TrackCorr_pt_eta);
+   CorrMatr->Add(h1TrackEff_zv);
+   CorrMatr->Add(h1TrackCorr_zv);
+   CorrMatr->Add(h1TrackEff_pt);
+   CorrMatr->Add(h1TrackCorr_pt);
+   CorrMatr->Add(h1TrackEff_eta);
+   CorrMatr->Add(h1TrackCorr_eta);
+
+   // scale the secondaries before calculating correction matrices
+   for (Long64_t i = 0; i < fRecSecTrackMatrixScaled->GetNbins(); i++) {
+       Int_t c[3];
+       Double_t val = fRecSecTrackMatrixScaled->GetBinContent(i,c);
+       Double_t err = fRecSecTrackMatrixScaled->GetBinError(i);
+       Double_t pt =  fRecSecTrackMatrixScaled->GetAxis(1)->GetBinCenter(c[1]);
+       Double_t scale = GetStrangenessCorrFactor(pt,sscale);
+//        Double_t scale = AlidNdPtHelper::GetStrangenessCorrFactor(pt);
+       fRecSecTrackMatrixScaled->SetBinContent(c,val*scale);
+       fRecSecTrackMatrixScaled->SetBinError(c,err*scale);
+    }
+    
+    // for correct determination of secondaries contamination, also the total total tracks have to be scaled
+    // this is done by taking primaries and adding the scaled secondaries
+    fRecTrackMatrixScaled->Add(fRecSecTrackMatrixScaled);
+
+    fRecSecTrackMatrixScaled->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    fRecSecTrackMatrixScaled->GetAxis(2)->SetRangeUser(-eta, eta-0.01);//eta
+    
+    TH3D* h3RecSecTrackScaled = fRecSecTrackMatrixScaled->Projection(0,1,2)->Clone("h3RecSecTrackScaled");
+    TH2D* h2RecSecTrackScaled_zv_pt  = fRecSecTrackMatrixScaled->Projection(0,1)->Clone("h2RecSecTrackScaled_zv_pt");
+    TH2D* h2RecSecTrackScaled_zv_eta = fRecSecTrackMatrixScaled->Projection(0,2)->Clone("h2RecSecTrackScaled_zv_eta");
+    TH2D* h2RecSecTrackScaled_pt_eta = fRecSecTrackMatrixScaled->Projection(1,2)->Clone("h2RecSecTrackScaled_pt_eta");
+    TH1D* h1RecSecTrackScaled_zv  = fRecSecTrackMatrixScaled->Projection(0)->Clone("h1RecSecTrackScaled_zv");
+    TH1D* h1RecSecTrackScaled_pt  = fRecSecTrackMatrixScaled->Projection(1)->Clone("h1RecSecTrackScaled_pt");
+    TH1D* h1RecSecTrackScaled_eta = fRecSecTrackMatrixScaled->Projection(2)->Clone("h1RecSecTrackScaled_eta");
+
+    ContHist->Add(h3RecSecTrackScaled);
+    ContHist->Add(h2RecSecTrackScaled_zv_pt);
+    ContHist->Add(h2RecSecTrackScaled_zv_eta);
+    ContHist->Add(h2RecSecTrackScaled_pt_eta);
+    ContHist->Add(h1RecSecTrackScaled_zv);
+    ContHist->Add(h1RecSecTrackScaled_pt);
+    ContHist->Add(h1RecSecTrackScaled_eta);    
+    
+    fRecTrackMatrixScaled->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    fRecTrackMatrixScaled->GetAxis(2)->SetRangeUser(-eta, eta-0.01);//eta
+    
+    TH3D* h3RecTrackScaled = fRecTrackMatrixScaled->Projection(0,1,2)->Clone("h3RecTrackScaled");
+    TH2D* h2RecTrackScaled_zv_pt  = fRecTrackMatrixScaled->Projection(0,1)->Clone("h2RecTrackScaled_zv_pt");
+    TH2D* h2RecTrackScaled_zv_eta = fRecTrackMatrixScaled->Projection(0,2)->Clone("h2RecTrackScaled_zv_eta");
+    TH2D* h2RecTrackScaled_pt_eta = fRecTrackMatrixScaled->Projection(1,2)->Clone("h2RecTrackScaled_pt_eta");
+    TH1D* h1RecTrackScaled_zv  = fRecTrackMatrixScaled->Projection(0)->Clone("h1RecTrackScaled_zv");
+    TH1D* h1RecTrackScaled_pt  = fRecTrackMatrixScaled->Projection(1)->Clone("h1RecTrackScaled_pt");
+    TH1D* h1RecTrackScaled_eta = fRecTrackMatrixScaled->Projection(2)->Clone("h1RecTrackScaled_eta");
+
+    ContHist->Add(h3RecTrackScaled);
+    ContHist->Add(h2RecTrackScaled_zv_pt);
+    ContHist->Add(h2RecTrackScaled_zv_eta);
+    ContHist->Add(h2RecTrackScaled_pt_eta);
+    ContHist->Add(h1RecTrackScaled_zv);
+    ContHist->Add(h1RecTrackScaled_pt);
+    ContHist->Add(h1RecTrackScaled_eta);
+    
+   // Rebin for corrections (pt)
+   TH1D* h1RecTrackScaled_pt_Rebin = h1RecTrackScaled_pt->Rebin(ptNbins,"h1RecTrackScaled_pt_Rebin",binsPt);
+   TH1D* h1RecSecTrackScaled_pt_Rebin = h1RecSecTrackScaled_pt->Rebin(ptNbins,"h1RecSecTrackScaled_pt_Rebin",binsPt);
+   ContHist->Add(h1RecTrackScaled_pt_Rebin);
+   ContHist->Add(h1RecSecTrackScaled_pt_Rebin);
+   
+    // create histograms for secondaries contamination and correction
+    
+    TH2D* h2SecCont_zv_pt  = AlidNdPtHelper::GenerateCorrMatrix(h2RecSecTrackScaled_zv_pt,h2RecTrackScaled_zv_pt,"h2SecCont_zv_pt");
+    TH2D* h2SecCorr_zv_pt  = AlidNdPtHelper::GenerateContCorrMatrix(h2RecSecTrackScaled_zv_pt,h2RecTrackScaled_zv_pt,"h2SecCorr_zv_pt");
+    TH2D* h2SecCont_zv_eta = AlidNdPtHelper::GenerateCorrMatrix(h2RecSecTrackScaled_zv_eta,h2RecTrackScaled_zv_eta,"h2SecCont_zv_eta");
+    TH2D* h2SecCorr_zv_eta = AlidNdPtHelper::GenerateContCorrMatrix(h2RecSecTrackScaled_zv_eta,h2RecTrackScaled_zv_eta,"h2SecCorr_zv_eta");
+    TH2D* h2SecCont_pt_eta = AlidNdPtHelper::GenerateCorrMatrix(h2RecSecTrackScaled_pt_eta,h2RecTrackScaled_pt_eta,"h2SecCont_pt_eta");
+    TH2D* h2SecCorr_pt_eta = AlidNdPtHelper::GenerateContCorrMatrix(h2RecSecTrackScaled_pt_eta,h2RecTrackScaled_pt_eta,"h2SecCorr_pt_eta");
+    TH1D* h1SecCont_zv = AlidNdPtHelper::GenerateCorrMatrix(h1RecSecTrackScaled_zv,h1RecTrackScaled_zv,"h1SecCont_zv");
+    TH1D* h1SecCorr_zv = AlidNdPtHelper::GenerateContCorrMatrix(h1RecSecTrackScaled_zv,h1RecTrackScaled_zv,"h1SecCorr_zv");
+    TH1D* h1SecCont_pt = AlidNdPtHelper::GenerateCorrMatrix(h1RecSecTrackScaled_pt_Rebin,h1RecTrackScaled_pt_Rebin,"h1SecCont_pt");
+    TH1D* h1SecCorr_pt = AlidNdPtHelper::GenerateContCorrMatrix(h1RecSecTrackScaled_pt_Rebin,h1RecTrackScaled_pt_Rebin,"h1SecCorr_pt");
+    TH1D* h1SecCont_eta = AlidNdPtHelper::GenerateCorrMatrix(h1RecSecTrackScaled_eta,h1RecTrackScaled_eta,"h1SecCont_eta");
+    TH1D* h1SecCorr_eta = AlidNdPtHelper::GenerateContCorrMatrix(h1RecSecTrackScaled_eta,h1RecTrackScaled_eta,"h1SecCorr_eta");
+
+    CorrMatr->Add(h2SecCont_zv_pt);
+    CorrMatr->Add(h2SecCorr_zv_pt);
+    CorrMatr->Add(h2SecCont_zv_eta);
+    CorrMatr->Add(h2SecCorr_zv_eta);
+    CorrMatr->Add(h2SecCont_pt_eta);
+    CorrMatr->Add(h2SecCorr_pt_eta);
+    CorrMatr->Add(h1SecCont_zv);
+    CorrMatr->Add(h1SecCorr_zv);
+    CorrMatr->Add(h1SecCont_pt);
+    CorrMatr->Add(h1SecCorr_pt);
+    CorrMatr->Add(h1SecCont_eta);
+    CorrMatr->Add(h1SecCorr_eta);
+    
+    //vertex distribution for events with no vertex
+    fGenEventMatrix->GetAxis(0)->SetRange();
+    fGenEventMatrix->GetAxis(1)->SetRange(1,1);
+    TH1D* h1GenEventMatrix_bin0_zv = (TH1D*) fGenEventMatrix->Projection(0)->Clone("h1GenEventMatrix_bin0_zv");
+    ContHist->Add(h1GenEventMatrix_bin0_zv);
+    
+    fTriggerEventMatrix->GetAxis(0)->SetRange();
+    fTriggerEventMatrix->GetAxis(1)->SetRange(1,1);
+    TH1D* h1TriggerEventMatrix_bin0_zv = (TH1D*) fTriggerEventMatrix->Projection(0)->Clone("h1TriggerEventMatrix_bin0_zv");
+    ContHist->Add(h1TriggerEventMatrix_bin0_zv);
+
+
+    fRecEventMatrix->GetAxis(0)->SetRange();
+    fRecEventMatrix->GetAxis(1)->SetRange();
+    TH1D* h1RecEventMatrix_zv = (TH1D*) fRecEventMatrix->Projection(0)->Clone("h1RecEventMatrix_zv");
+    h1RecEventMatrix_zv->Scale(1./h1RecEventMatrix_zv->Integral());
+    //ContHist->Add(h1TriggerEventMatrix_zv);
+   
+    TH1D* h1TriggerEff_bin0_zv   = AlidNdPtHelper::GenerateCorrMatrix(h1TriggerEventMatrix_bin0_zv,h1GenEventMatrix_bin0_zv,"h1TriggerEff_bin0_zv");
+    TH1D* h1TriggerCorr_bin0_zv  = AlidNdPtHelper::GenerateCorrMatrix(h1GenEventMatrix_bin0_zv,h1TriggerEventMatrix_bin0_zv,"h1TriggerCorr_bin0_zv");
+    CorrMatr->Add(h1TriggerEff_bin0_zv);
+    CorrMatr->Add(h1TriggerCorr_bin0_zv);
+    
+    TH1D* h1Ratio_zv = (TH1D*) h1GenEventMatrix_bin0_zv->Clone("h1Ratio_zv");
+    h1Ratio_zv->Scale(1./h1Ratio_zv->Integral());
+    h1Ratio_zv->Divide(h1RecEventMatrix_zv);
+    CorrMatr->Add(h1Ratio_zv);
+    
+    
+     // aded to correct sperately for zvert shape of triggered and untriggered bin0 events
+     fRecEventMatrix->GetAxis(0)->SetRange();
+     fRecEventMatrix->GetAxis(1)->SetRange();
+     fTriggerEventMatrix->GetAxis(1)->SetRangeUser(0,0);
+     fGenEventMatrix->GetAxis(1)->SetRangeUser(0,0);
+     
+     TH1D* rec_zv = fRecEventMatrix->Projection(0)->Clone("rec_zv");
+     TH1D* trig0_zv = fTriggerEventMatrix->Projection(0)->Clone("trig0_zv");
+     TH1D* corr_shape_trig0_zv = AlidNdPtHelper::GenerateCorrMatrix(trig0_zv,rec_zv,"corr_shape_trig0_zv");
+     CorrMatr->Add(corr_shape_trig0_zv);     
+     
+     TH1D* gen0_zv = fGenEventMatrix->Projection(0)->Clone("gen0_zv");
+     TH1D* gen0notrig_zv = gen0_zv->Clone("gen0notrig_zv");
+     gen0notrig_zv->Add(trig0_zv,-1.);
+     TH1D* corr_shape_notrig0_zv = AlidNdPtHelper::GenerateCorrMatrix(gen0notrig_zv,rec_zv,"corr_shape_notrig0_zv");
+     CorrMatr->Add(corr_shape_notrig0_zv); 
+         
+         
+   // efficienfy and correction for THnSparse
+    THnSparse* hSRecSecTrackMatrixScaled = AlidNdPtHelper::RebinTHnSparse(fRecSecTrackMatrixScaled,hSTrackSecCorr,"hSRecSecTrackMatrixScaled");
+    THnSparse* hSRecTrackMatrixScaled = AlidNdPtHelper::RebinTHnSparse(fRecTrackMatrixScaled,hSTrackSecCorr,"hSRecTrackMatrixScaled");
+    THnSparse* hSRecPrimTrackMatrix = AlidNdPtHelper::RebinTHnSparse(fRecPrimTrackMatrix,hSTrackEffCorr,"hSRecPrimTrackMatrix");
+    THnSparse* hSGenPrimTrackMatrix = AlidNdPtHelper::RebinTHnSparse(fGenPrimTrackMatrix,hSTrackEffCorr,"hSGenPrimTrackMatrix");
+    ContHist->Add(hSRecSecTrackMatrixScaled);
+    ContHist->Add(hSRecTrackMatrixScaled);
+    ContHist->Add(hSRecPrimTrackMatrix);
+    ContHist->Add(hSGenPrimTrackMatrix);
+    
+    THnSparse* hSTrackEff  = AlidNdPtHelper::GenerateCorrMatrix(hSRecPrimTrackMatrix,hSGenPrimTrackMatrix,"hSTrackEff");
+    THnSparse* hSTrackCorr = AlidNdPtHelper::GenerateCorrMatrix(hSGenPrimTrackMatrix,hSRecPrimTrackMatrix,"hSTrackCorr");
+    THnSparse* hSSecCont   = AlidNdPtHelper::GenerateCorrMatrix(hSRecSecTrackMatrixScaled,hSRecTrackMatrixScaled,"hSSecCont");
+    THnSparse* hSSecCorr   = AlidNdPtHelper::GenerateContCorrMatrix(hSRecSecTrackMatrixScaled,hSRecTrackMatrixScaled,"hSSecCorr");
+    CorrMatr->Add(hSTrackEff);
+    CorrMatr->Add(hSTrackCorr);
+    CorrMatr->Add(hSSecCont);
+    CorrMatr->Add(hSSecCorr);
+    
+    // create th3 from thnsparse, used for corrections
+    TH3D* h3RecPrimTrack_Rebin = hSRecPrimTrackMatrix->Projection(0,1,2)->Clone("h3RecPrimTrack_Rebin");
+    TH3D* h3GenPrimTrack_Rebin = hSGenPrimTrackMatrix->Projection(0,1,2)->Clone("h3GenPrimTrack_Rebin");
+    TH3D* h3RecSecTrackScaled_Rebin = hSRecSecTrackMatrixScaled->Projection(0,1,2)->Clone("h3RecSecTrackScaled_Rebin");
+    TH3D* h3RecTrackScaled_Rebin = hSRecTrackMatrixScaled->Projection(0,1,2)->Clone("h3RecTrackScaled_Rebin");
+   
+    TH3D* h3TrackEff  = AlidNdPtHelper::GenerateCorrMatrix(h3RecPrimTrack_Rebin,h3GenPrimTrack_Rebin,"h3TrackEff");
+    TH3D* h3TrackCorr = AlidNdPtHelper::GenerateCorrMatrix(h3GenPrimTrack_Rebin,h3RecPrimTrack_Rebin,"h3TrackCorr");    
+    TH3D* h3SecCont = AlidNdPtHelper::GenerateCorrMatrix(h3RecSecTrackScaled_Rebin,h3RecTrackScaled_Rebin,"h3SecCont");
+    TH3D* h3SecCorr = AlidNdPtHelper::GenerateContCorrMatrix(h3RecSecTrackScaled_Rebin,h3RecTrackScaled_Rebin,"h3SecCorr");
+    CorrMatr->Add(h3TrackEff);
+    CorrMatr->Add(h3TrackCorr);
+    CorrMatr->Add(h3SecCont);
+    CorrMatr->Add(h3SecCorr);
+    // check for trigger/vertex bias on track level
+    THnSparse* hSRecTrackEventMatrix = (THnSparse*) obj->GetRecTrackEventMatrix()->Clone("hSRecTrackEventMatrix");
+    THnSparse* hSGenTrackEventMatrix = (THnSparse*) obj->GetGenTrackEventMatrix()->Clone("hSGenTrackEventMatrix");
+    THnSparse* hSTriggerTrackEventMatrix = (THnSparse*) obj->GetTriggerTrackEventMatrix()->Clone("hSTriggerTrackEventMatrix");
+    
+    hSRecTrackEventMatrix->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    hSRecTrackEventMatrix->GetAxis(2)->SetRangeUser(-eta, eta-0.01);//eta    
+    hSGenTrackEventMatrix->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    hSGenTrackEventMatrix->GetAxis(2)->SetRangeUser(-eta, eta-0.01);//eta    
+    hSTriggerTrackEventMatrix->GetAxis(0)->SetRangeUser(-zVert, zVert-0.01);//zVer
+    hSTriggerTrackEventMatrix->GetAxis(2)->SetRangeUser(-eta, eta-0.01);//eta    
+    
+    
+    TH1D* h1TriggerBiasCorr_zv = AlidNdPtHelper::GenerateCorrMatrix(hSTriggerTrackEventMatrix->Projection(0),hSGenTrackEventMatrix->Projection(0),"h1TriggerBiasCorr_zv");
+    TH1D* h1TriggerBiasCorr_pt = AlidNdPtHelper::GenerateCorrMatrix(hSTriggerTrackEventMatrix->Projection(1),hSGenTrackEventMatrix->Projection(1),"h1TriggerBiasCorr_pt");
+    TH1D* h1TriggerBiasCorr_eta = AlidNdPtHelper::GenerateCorrMatrix(hSTriggerTrackEventMatrix->Projection(2),hSGenTrackEventMatrix->Projection(2),"h1TriggerBiasCorr_eta");
+    
+    TH1D* h1VertexBiasCorr_zv  = AlidNdPtHelper::GenerateCorrMatrix(hSRecTrackEventMatrix->Projection(0),hSTriggerTrackEventMatrix->Projection(0),"h1VertexBiasCorr_zv");
+    TH1D* h1VertexBiasCorr_pt  = AlidNdPtHelper::GenerateCorrMatrix(hSRecTrackEventMatrix->Projection(1),hSTriggerTrackEventMatrix->Projection(1),"h1VertexBiasCorr_pt");   
+    TH1D* h1VertexBiasCorr_eta  = AlidNdPtHelper::GenerateCorrMatrix(hSRecTrackEventMatrix->Projection(2),hSTriggerTrackEventMatrix->Projection(2),"h1VertexBiasCorr_eta");    
+    
+   ContHist->Add(h1TriggerBiasCorr_zv);    
+   ContHist->Add(h1TriggerBiasCorr_pt);    
+   ContHist->Add(h1TriggerBiasCorr_eta);    
+   ContHist->Add(h1VertexBiasCorr_zv);    
+   ContHist->Add(h1VertexBiasCorr_pt);    
+   ContHist->Add(h1VertexBiasCorr_eta);    
+
+    
+    // plot pictures and save to gifdir
+    for (i=0; i < CorrMatr->LastIndex(); i++) {    
+        TCanvas* ctmp = PlotHist(CorrMatr->At(i),idstring);
+        if (gifdir && ctmp) {
+            TString gif(gifdir);
+            gif += '/';
+            gif += ctmp->GetName();
+            gif += ".gif";
+            ctmp->SaveAs(gif.Data(),"gif");     
+            delete ctmp;
+        }
+    }
+    for (i=0; i < ContHist->LastIndex(); i++) {    
+        TCanvas* ctmp = PlotHist(ContHist->At(i),idstring);
+        if (gifdir && ctmp) {
+            TString gif(gifdir);
+            gif += '/';
+            gif += ctmp->GetName();
+            gif += ".gif";
+            ctmp->SaveAs(gif.Data(),"gif");     
+            delete ctmp;
+        }
+   }    
+
+    // save all correction matrices and control histograms to file
+    if (!outfile) { return; }
+    TFile *out = TFile::Open(outfile,"RECREATE");
+    CorrMatr->Write();
+    ContHist->Write();
+    out->Close();
+    
+    return MCReconstructedEvents;
+
+}
+
+
+//_____________________________________________________________________________
+Double_t GetStrangenessCorrFactor(Double_t pt, Double_t s)
+{
+    // data driven correction factor for secondaries (PbPb)
+
+    if (pt <= 0.17) return 1.0;
+    if (pt <= 0.4) return GetLinearInterpolationValue(0.17,1.0,0.4,1.07, pt);
+    if (pt <= 0.6) return GetLinearInterpolationValue(0.4,1.07,0.6,1.25, pt);
+    if (pt <= 1.2) return GetLinearInterpolationValue(0.6,1.25,1.2,1.5,  pt);
+    return 1.5;
+}
+
+
+//___________________________________________________________________________
+Double_t GetLinearInterpolationValue(const Double_t x1,const  Double_t y1,const  Double_t x2,const  Double_t y2, const Double_t pt)
+{
+    //
+    // linear interpolation
+    //
+    return ((y2-y1)/(x2-x1))*pt+(y2-(((y2-y1)/(x2-x1))*x2)); 
+}
+
+//___________________________________________________________________________
+TCanvas* PlotHist(TObject* hobj, const char* label=0)
+{
+    TH1* h = dynamic_cast<TH1*>(hobj);
+    if (!h) return 0;
+    if (h->GetDimension() > 2) return 0;
+    h->SetStats(0);
+    if ( TString(h->GetName()).Contains("Events")) { h->SetStats(1); } 
+    TString t(label);
+    if (label) t += "_";
+    t += h->GetName();
+    h->SetTitle(t.Data());
+    TCanvas* c = new TCanvas(t.Data(),t.Data());
+    if (h->GetDimension() >= 1) {
+        TString xlabel(h->GetXaxis()->GetTitle());
+        if (xlabel.Contains("Pt")) { c->SetLogx();  h->GetXaxis()->SetRangeUser(0.1 , 100.); }
+    }
+    if (h->GetDimension() == 1) {
+        if (xlabel.Contains("p_{T}")) { c->SetLogx();  c->SetLogy();  h->GetXaxis()->SetRangeUser(0.1 , 100.); }
+    }
+    if (h->GetDimension() == 2) {  
+        TString ylabel(h->GetYaxis()->GetTitle());
+        if (ylabel.Contains("Pt")) { c->SetLogy(); h->GetYaxis()->SetRangeUser(0.1 , 100.); }
+        if (ylabel.Contains("p_{T}")) { c->SetLogy(); h->GetYaxis()->SetRangeUser(0.1 , 100.); }
+        h->Draw("COLZ");
+    }        
+    if (h->GetDimension() == 1) {
+        h->Draw();
+    }
+    return c;
+
+}
+
+Int_t CheckLoadLibrary(const char* library)
+{
+  // checks if a library is already loaded, if not loads the library
+
+  if (strlen(gSystem->GetLibraries(Form("%s.so", library), "", kFALSE)) > 0)
+    return 1;
+
+  return gSystem->Load(library);
+}