]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG1/TPC/AliPerformanceEff.cxx
- changes by Markus Koehler
[u/mrichter/AliRoot.git] / PWG1 / TPC / AliPerformanceEff.cxx
index 6f033728fddf3ee9647e5a6ea7440eddd40064fb..55c019ab4aa89c86ffd2b2b7d62fec0c41ffa007 100644 (file)
@@ -114,17 +114,17 @@ void AliPerformanceEff::Init()
 {\r
   // Init histograms\r
   //\r
+\r
   // set pt bins\r
   Int_t nPtBins = 50;\r
-  Double_t ptMin = 1.e-2, ptMax = 10.;\r
+  Double_t ptMin = 1.e-2, ptMax = 20.;\r
 \r
   Double_t *binsPt = 0;\r
+\r
   if (IsHptGenerator())  { \r
-    nPtBins = 100; ptMax = 100.;\r
-    binsPt = CreateLogAxis(nPtBins,ptMin,ptMax);\r
-  } else {\r
-    binsPt = CreateLogAxis(nPtBins,ptMin,ptMax);\r
-  }\r
+        ptMax = 100.;\r
+  } \r
+   binsPt = CreateLogAxis(nPtBins,ptMin,ptMax);\r
 \r
   /*\r
   Int_t nPtBins = 31;\r
@@ -137,12 +137,12 @@ void AliPerformanceEff::Init()
   }\r
   */\r
 \r
-  //mceta:mcphi:mcpt:pid:recStatus:findable\r
-  Int_t binsEffHisto[6]={30,144,nPtBins,5,2,2};\r
-  Double_t minEffHisto[6]={-1.5,0.,ptMin,0.,0.,0.};\r
-  Double_t maxEffHisto[6]={ 1.5,2.*TMath::Pi(), ptMax,5.,2.,2.};\r
+  //mceta:mcphi:mcpt:pid:recStatus:findable:charge\r
+  Int_t binsEffHisto[7]={30,144,nPtBins,5,2,2,3};\r
+  Double_t minEffHisto[7]={-1.5,0.,ptMin,0.,0.,0.,-1.5};\r
+  Double_t maxEffHisto[7]={ 1.5,2.*TMath::Pi(), ptMax,5.,2.,2.,1.5};\r
 \r
-  fEffHisto = new THnSparseF("fEffHisto","mceta:mcphi:mcpt:pid:recStatus:findable",6,binsEffHisto,minEffHisto,maxEffHisto);\r
+  fEffHisto = new THnSparseF("fEffHisto","mceta:mcphi:mcpt:pid:recStatus:findable:charge",7,binsEffHisto,minEffHisto,maxEffHisto);\r
   fEffHisto->SetBinEdges(2,binsPt);\r
 \r
   fEffHisto->GetAxis(0)->SetTitle("#eta_{mc}");\r
@@ -151,14 +151,15 @@ void AliPerformanceEff::Init()
   fEffHisto->GetAxis(3)->SetTitle("pid");\r
   fEffHisto->GetAxis(4)->SetTitle("recStatus");\r
   fEffHisto->GetAxis(5)->SetTitle("findable");\r
+  fEffHisto->GetAxis(6)->SetTitle("charge");\r
   fEffHisto->Sumw2();\r
 \r
-  //mceta:mcphi:mcpt:pid:recStatus:findable:mcR:mother_phi:mother_eta\r
-  Int_t binsEffSecHisto[9]={30,60,nPtBins,5,2,2,100,60,30};\r
-  Double_t minEffSecHisto[9]={-1.5,0.,ptMin,0.,0.,0.,0.,0.,-1.5};\r
-  Double_t maxEffSecHisto[9]={ 1.5,2.*TMath::Pi(), ptMax,5.,2.,2.,200,2.*TMath::Pi(),1.5};\r
+  //mceta:mcphi:mcpt:pid:recStatus:findable:mcR:mother_phi:mother_eta:charge\r
+  Int_t binsEffSecHisto[10]={30,60,nPtBins,5,2,2,100,60,30,3};\r
+  Double_t minEffSecHisto[10]={-1.5,0.,ptMin,0.,0.,0.,0.,0.,-1.5,-1.5};\r
+  Double_t maxEffSecHisto[10]={ 1.5,2.*TMath::Pi(), ptMax,5.,2.,2.,200,2.*TMath::Pi(),1.5,1.5};\r
 \r
-  fEffSecHisto = new THnSparseF("fEffSecHisto","mceta:mcphi:mcpt:pid:recStatus:findable:mcR:mother_phi:mother_eta",9,binsEffSecHisto,minEffSecHisto,maxEffSecHisto);\r
+  fEffSecHisto = new THnSparseF("fEffSecHisto","mceta:mcphi:mcpt:pid:recStatus:findable:mcR:mother_phi:mother_eta:charge",10,binsEffSecHisto,minEffSecHisto,maxEffSecHisto);\r
   fEffSecHisto->SetBinEdges(2,binsPt);\r
 \r
   fEffSecHisto->GetAxis(0)->SetTitle("#eta_{mc}");\r
@@ -170,6 +171,7 @@ void AliPerformanceEff::Init()
   fEffSecHisto->GetAxis(6)->SetTitle("mcR (cm)");\r
   fEffSecHisto->GetAxis(7)->SetTitle("mother_phi (rad)");\r
   fEffSecHisto->GetAxis(8)->SetTitle("mother_eta");\r
+  fEffSecHisto->GetAxis(9)->SetTitle("charge");\r
   fEffSecHisto->Sumw2();\r
 \r
   // init cuts\r
@@ -186,13 +188,32 @@ void AliPerformanceEff::Init()
 void AliPerformanceEff::ProcessTPC(AliMCEvent* const mcEvent, AliESDEvent *const esdEvent)\r
 {\r
   // Fill TPC only efficiency comparison information \r
-  Int_t *labelsRec =  new Int_t[esdEvent->GetNumberOfTracks()];\r
-  if(!labelsRec) \r
-     AliDebug(AliLog::kError, "Cannot create labelsRec");\r
+  if(!esdEvent) return;\r
+  if(!mcEvent) return;\r
 \r
-  Int_t *labelsAllRec =  new Int_t[esdEvent->GetNumberOfTracks()];\r
-  if(!labelsAllRec) \r
-     AliDebug(AliLog::kError, "Cannot create labelsAllRec");\r
+  AliStack *stack = mcEvent->Stack();\r
+  if (!stack) {\r
+    AliDebug(AliLog::kError, "Stack not available");\r
+    return;\r
+  }\r
+\r
+  Int_t *labelsRec =  NULL;\r
+  labelsRec =  new Int_t[esdEvent->GetNumberOfTracks()];\r
+  if(!labelsRec) \r
+  {\r
+     Printf("Cannot create labelsRec");\r
+     return;\r
+  }\r
+  for(Int_t i=0;i<esdEvent->GetNumberOfTracks();i++) { labelsRec[i] = 0; }\r
+\r
+  Int_t *labelsAllRec =  NULL;\r
+  labelsAllRec =  new Int_t[esdEvent->GetNumberOfTracks()];\r
+  if(!labelsAllRec) { \r
+     delete  [] labelsRec;\r
+     Printf("Cannot create labelsAllRec");\r
+     return;\r
+  }\r
+  for(Int_t i=0;i<esdEvent->GetNumberOfTracks();i++) { labelsAllRec[i] = 0; }\r
 \r
   // loop over rec. tracks\r
   AliESDtrack *track=0;\r
@@ -201,6 +222,10 @@ void AliPerformanceEff::ProcessTPC(AliMCEvent* const mcEvent, AliESDEvent *const
     track = esdEvent->GetTrack(iTrack);\r
     if(!track) continue;\r
     if(track->Charge()==0) continue;\r
+\r
+    // if not fUseKinkDaughters don't use tracks with kink index > 0\r
+    if(!fUseKinkDaughters && track->GetKinkIndex(0) > 0) continue;\r
+\r
     Int_t label = TMath::Abs(track->GetLabel()); \r
     labelsAllRec[iTrack]=label;\r
 \r
@@ -214,14 +239,6 @@ void AliPerformanceEff::ProcessTPC(AliMCEvent* const mcEvent, AliESDEvent *const
   // \r
   // MC histograms for efficiency studies\r
   //\r
-  if(!mcEvent) return;\r
\r
-  AliStack *stack = mcEvent->Stack();\r
-  if (!stack) {\r
-    AliDebug(AliLog::kError, "Stack not available");\r
-    return;\r
-  }\r
-\r
   Int_t nPart  = stack->GetNtrack();\r
   //Int_t nPart  = stack->GetNprimary();\r
   for (Int_t iMc = 0; iMc < nPart; ++iMc) \r
@@ -235,6 +252,18 @@ void AliPerformanceEff::ProcessTPC(AliMCEvent* const mcEvent, AliESDEvent *const
     Bool_t prim = stack->IsPhysicalPrimary(iMc);\r
     if(!prim) continue;\r
 \r
+    // --- check for double filling in stack\r
+    // use only particles with no daughters in the list of primaries\r
+    Int_t nDaughters =  particle->GetNDaughters();\r
+    \r
+    for( Int_t iDaught=0; iDaught < particle->GetNDaughters(); iDaught++ ) {\r
+      if( particle->GetDaughter(iDaught) < stack->GetNprimary() )\r
+       nDaughters++;\r
+    }\r
+    if( nDaughters > 0 ) \r
+      continue;\r
+    // --- check for double filling in stack\r
+\r
     Bool_t findable = kFALSE;\r
     for(Int_t iRec=0; iRec<esdEvent->GetNumberOfTracks(); ++iRec) \r
     {\r
@@ -267,10 +296,12 @@ void AliPerformanceEff::ProcessTPC(AliMCEvent* const mcEvent, AliESDEvent *const
     Float_t mcphi =  particle->Phi();\r
     if(mcphi<0) mcphi += 2.*TMath::Pi();\r
     Float_t mcpt = particle->Pt();\r
-\r
+    Float_t charge = 0.;\r
+    if (particle->GetPDG()->Charge() < 0)  charge = -1.;    \r
+    else if (particle->GetPDG()->Charge() > 0)  charge = 1.;\r
 \r
     // Fill histograms\r
-    Double_t vEffHisto[6] = {mceta, mcphi, mcpt, pid, recStatus, findable}; \r
+    Double_t vEffHisto[7] = {mceta, mcphi, mcpt, pid, recStatus, findable, charge}; \r
     fEffHisto->Fill(vEffHisto);\r
   }\r
 \r
@@ -282,13 +313,26 @@ void AliPerformanceEff::ProcessTPC(AliMCEvent* const mcEvent, AliESDEvent *const
 void AliPerformanceEff::ProcessTPCSec(AliMCEvent* const mcEvent, AliESDEvent *const esdEvent)\r
 {\r
   // Fill TPC only efficiency comparison information for secondaries\r
-  Int_t *labelsRec =  new Int_t[esdEvent->GetNumberOfTracks()];\r
-  if(!labelsRec) \r
-     AliDebug(AliLog::kError, "Cannot create labelsRec");\r
 \r
-  Int_t *labelsAllRec =  new Int_t[esdEvent->GetNumberOfTracks()];\r
-  if(!labelsAllRec) \r
-     AliDebug(AliLog::kError, "Cannot create labelsAllRec");\r
+  if(!esdEvent) return;\r
+\r
+  Int_t *labelsRecSec =  NULL;\r
+  labelsRecSec =  new Int_t[esdEvent->GetNumberOfTracks()];\r
+  if(!labelsRecSec) \r
+  {\r
+     Printf("Cannot create labelsRecSec");\r
+     return;\r
+  }\r
+  for(Int_t i=0;i<esdEvent->GetNumberOfTracks();i++) { labelsRecSec[i] = 0; }\r
+\r
+  Int_t *labelsAllRecSec =  NULL;\r
+  labelsAllRecSec =  new Int_t[esdEvent->GetNumberOfTracks()];\r
+  if(!labelsAllRecSec) { \r
+     delete [] labelsRecSec;\r
+     Printf("Cannot create labelsAllRecSec");\r
+     return;\r
+  }\r
+  for(Int_t i=0;i<esdEvent->GetNumberOfTracks();i++) { labelsAllRecSec[i] = 0; }\r
 \r
   // loop over rec. tracks\r
   AliESDtrack *track=0;\r
@@ -298,13 +342,17 @@ void AliPerformanceEff::ProcessTPCSec(AliMCEvent* const mcEvent, AliESDEvent *co
     track = esdEvent->GetTrack(iTrack);\r
     if(!track) continue;\r
     if(track->Charge()==0) continue;\r
+\r
+    // if not fUseKinkDaughters don't use tracks with kink index > 0\r
+    if(!fUseKinkDaughters && track->GetKinkIndex(0) > 0) continue;\r
+\r
     Int_t label = TMath::Abs(track->GetLabel()); \r
-    labelsAllRec[multAll]=label;\r
+    labelsAllRecSec[multAll]=label;\r
     multAll++;\r
 \r
     // TPC only\r
     if(IsRecTPC(track) != 0) {\r
-      labelsRec[multRec]=label;\r
+      labelsRecSec[multRec]=label;\r
       multRec++;\r
     }\r
   }\r
@@ -312,13 +360,10 @@ void AliPerformanceEff::ProcessTPCSec(AliMCEvent* const mcEvent, AliESDEvent *co
   // \r
   // MC histograms for efficiency studies\r
   //\r
-  if(!mcEvent) return;\r
+  if(mcEvent)  { \r
  \r
   AliStack *stack = mcEvent->Stack();\r
-  if (!stack) {\r
-    AliDebug(AliLog::kError, "Stack not available");\r
-    return;\r
-  }\r
+  if (stack) {\r
 \r
   Int_t nPart  = stack->GetNtrack();\r
   //Int_t nPart  = stack->GetNprimary();\r
@@ -345,7 +390,7 @@ void AliPerformanceEff::ProcessTPCSec(AliMCEvent* const mcEvent, AliESDEvent *co
     for(Int_t iRec=0; iRec<multAll; ++iRec) \r
     {\r
       // check findable\r
-      if(iMc == labelsAllRec[iRec]) \r
+      if(iMc == labelsAllRecSec[iRec]) \r
       {\r
         findable = IsFindable(mcEvent,iMc);\r
        break;\r
@@ -356,7 +401,7 @@ void AliPerformanceEff::ProcessTPCSec(AliMCEvent* const mcEvent, AliESDEvent *co
     for(Int_t iRec=0; iRec<multRec; ++iRec) \r
     {\r
       // check reconstructed\r
-      if(iMc == labelsRec[iRec]) \r
+      if(iMc == labelsRecSec[iRec]) \r
       {\r
         recStatus = kTRUE;\r
         break;\r
@@ -385,13 +430,19 @@ void AliPerformanceEff::ProcessTPCSec(AliMCEvent* const mcEvent, AliESDEvent *co
     Float_t mother_phi = mother->Phi();\r
     if(mother_phi<0) mother_phi += 2.*TMath::Pi();\r
 \r
+    Float_t charge = 0.;\r
+    if (particle->GetPDG()->Charge() < 0)  charge = -1.;    \r
+    else if (particle->GetPDG()->Charge() > 0)  charge = 1.;\r
+\r
     // Fill histograms\r
-    Double_t vEffSecHisto[9] = { mceta, mcphi, mcpt, pid, recStatus, findable, mcR, mother_phi, mother_eta }; \r
+    Double_t vEffSecHisto[10] = { mceta, mcphi, mcpt, pid, recStatus, findable, mcR, mother_phi, mother_eta, charge }; \r
     fEffSecHisto->Fill(vEffSecHisto);\r
   }\r
+  }\r
+  }\r
 \r
-  if(labelsRec) delete [] labelsRec; labelsRec = 0;\r
-  if(labelsAllRec) delete [] labelsAllRec; labelsAllRec = 0;\r
+  if(labelsRecSec) delete [] labelsRecSec; labelsRecSec = 0;\r
+  if(labelsAllRecSec) delete [] labelsAllRecSec; labelsAllRecSec = 0;\r
 }\r
 \r
 \r
@@ -401,13 +452,33 @@ void AliPerformanceEff::ProcessTPCSec(AliMCEvent* const mcEvent, AliESDEvent *co
 void AliPerformanceEff::ProcessTPCITS(AliMCEvent* const mcEvent, AliESDEvent *const esdEvent)\r
 {\r
   // Fill efficiency comparison information\r
-  Int_t *labelsRec =  new Int_t[esdEvent->GetNumberOfTracks()];\r
-  if(!labelsRec) \r
-     AliDebug(AliLog::kError, "Cannot create labelsRec");\r
 \r
-  Int_t *labelsAllRec =  new Int_t[esdEvent->GetNumberOfTracks()];\r
-  if(!labelsAllRec) \r
-     AliDebug(AliLog::kError, "Cannot create labelsAllRec");\r
+  if(!esdEvent) return;\r
+  if(!mcEvent) return;\r
+\r
+  AliStack *stack = mcEvent->Stack();\r
+  if (!stack) {\r
+    AliDebug(AliLog::kError, "Stack not available");\r
+    return;\r
+  }\r
+\r
+  Int_t *labelsRecTPCITS =  NULL;\r
+  labelsRecTPCITS =  new Int_t[esdEvent->GetNumberOfTracks()];\r
+  if(!labelsRecTPCITS) \r
+  {\r
+     Printf("Cannot create labelsRecTPCITS");\r
+     return;\r
+  }\r
+  for(Int_t i=0;i<esdEvent->GetNumberOfTracks();i++) { labelsRecTPCITS[i] = 0; }\r
+\r
+  Int_t *labelsAllRecTPCITS =  NULL;\r
+  labelsAllRecTPCITS =  new Int_t[esdEvent->GetNumberOfTracks()];\r
+  if(!labelsAllRecTPCITS) { \r
+     delete [] labelsRecTPCITS;\r
+     Printf("Cannot create labelsAllRecTPCITS");\r
+     return;\r
+  }\r
+  for(Int_t i=0;i<esdEvent->GetNumberOfTracks();i++) { labelsAllRecTPCITS[i] = 0; }\r
 \r
   // loop over rec. tracks\r
   AliESDtrack *track=0;\r
@@ -416,25 +487,21 @@ void AliPerformanceEff::ProcessTPCITS(AliMCEvent* const mcEvent, AliESDEvent *co
     track = esdEvent->GetTrack(iTrack);\r
     if(!track) continue;\r
     if(track->Charge()==0) continue;\r
+\r
+    // if not fUseKinkDaughters don't use tracks with kink index > 0\r
+    if(!fUseKinkDaughters && track->GetKinkIndex(0) > 0) continue;\r
+\r
     Int_t label = TMath::Abs(track->GetLabel()); \r
-    labelsAllRec[iTrack]=label;\r
+    labelsAllRecTPCITS[iTrack]=label;\r
 \r
     // iTPC+ITS\r
     if(IsRecTPCITS(track) != 0) \r
-      labelsRec[iTrack]=label;\r
+      labelsRecTPCITS[iTrack]=label;\r
   }\r
 \r
   // \r
   // MC histograms for efficiency studies\r
   //\r
-  if(!mcEvent) return;\r
\r
-  AliStack *stack = mcEvent->Stack();\r
-  if (!stack) {\r
-    AliDebug(AliLog::kError, "Stack not available");\r
-    return;\r
-  }\r
-\r
   //Int_t nPart  = stack->GetNtrack();\r
   Int_t nPart  = stack->GetNprimary();\r
   for (Int_t iMc = 0; iMc < nPart; ++iMc) \r
@@ -452,7 +519,7 @@ void AliPerformanceEff::ProcessTPCITS(AliMCEvent* const mcEvent, AliESDEvent *co
     for(Int_t iRec=0; iRec<esdEvent->GetNumberOfTracks(); ++iRec) \r
     {\r
       // check findable\r
-      if(iMc == labelsAllRec[iRec]) \r
+      if(iMc == labelsAllRecTPCITS[iRec]) \r
       {\r
         findable = IsFindable(mcEvent,iMc);\r
        break;\r
@@ -463,7 +530,7 @@ void AliPerformanceEff::ProcessTPCITS(AliMCEvent* const mcEvent, AliESDEvent *co
     for(Int_t iRec=0; iRec<esdEvent->GetNumberOfTracks(); ++iRec) \r
     {\r
       // check reconstructed\r
-      if(iMc == labelsRec[iRec]) \r
+      if(iMc == labelsRecTPCITS[iRec]) \r
       {\r
         recStatus = kTRUE;\r
         break;\r
@@ -481,26 +548,49 @@ void AliPerformanceEff::ProcessTPCITS(AliMCEvent* const mcEvent, AliESDEvent *co
     if(mcphi<0) mcphi += 2.*TMath::Pi();\r
     Float_t mcpt = particle->Pt();\r
 \r
+    Float_t charge = 0.;\r
+    if (particle->GetPDG()->Charge() < 0)  charge = -1.;    \r
+    else if (particle->GetPDG()->Charge() > 0)  charge = 1.;\r
+    \r
     // Fill histograms\r
-    Double_t vEffHisto[6] = { mceta, mcphi, mcpt, pid, recStatus, findable}; \r
+    Double_t vEffHisto[7] = { mceta, mcphi, mcpt, pid, recStatus, findable, charge}; \r
     fEffHisto->Fill(vEffHisto);\r
   }\r
 \r
-  if(labelsRec) delete [] labelsRec; labelsRec = 0;\r
-  if(labelsAllRec) delete [] labelsAllRec; labelsAllRec = 0;\r
+  if(labelsRecTPCITS) delete [] labelsRecTPCITS; labelsRecTPCITS = 0;\r
+  if(labelsAllRecTPCITS) delete [] labelsAllRecTPCITS; labelsAllRecTPCITS = 0;\r
 }\r
 \r
 //_____________________________________________________________________________\r
 void AliPerformanceEff::ProcessConstrained(AliMCEvent* const mcEvent, AliESDEvent *const esdEvent)\r
 {\r
   // Process comparison information \r
-  Int_t *labelsRec =  new Int_t[esdEvent->GetNumberOfTracks()];\r
-  if(!labelsRec) \r
-     AliDebug(AliLog::kError, "Cannot create labelsRec");\r
+  if(!esdEvent) return;\r
+  if(!mcEvent) return;\r
 \r
-  Int_t *labelsAllRec =  new Int_t[esdEvent->GetNumberOfTracks()];\r
-  if(!labelsAllRec) \r
-     AliDebug(AliLog::kError, "Cannot create labelsAllRec");\r
+  AliStack *stack = mcEvent->Stack();\r
+  if (!stack) {\r
+    AliDebug(AliLog::kError, "Stack not available");\r
+    return;\r
+  }\r
+\r
+  Int_t *labelsRecConstrained =  NULL;\r
+  labelsRecConstrained =  new Int_t[esdEvent->GetNumberOfTracks()];\r
+  if(!labelsRecConstrained) \r
+  {\r
+     Printf("Cannot create labelsRecConstrained");\r
+     return;\r
+  }\r
+  for(Int_t i=0;i<esdEvent->GetNumberOfTracks();i++) { labelsRecConstrained[i] = 0; }\r
+\r
+  Int_t *labelsAllRecConstrained =  NULL;\r
+  labelsAllRecConstrained =  new Int_t[esdEvent->GetNumberOfTracks()];\r
+  if(!labelsAllRecConstrained) { \r
+     delete [] labelsRecConstrained;\r
+     Printf("Cannot create labelsAllRecConstrained");\r
+     return;\r
+  }\r
+  for(Int_t i=0;i<esdEvent->GetNumberOfTracks();i++) { labelsAllRecConstrained[i] = 0; }\r
 \r
   // loop over rec. tracks\r
   AliESDtrack *track=0;\r
@@ -509,25 +599,23 @@ void AliPerformanceEff::ProcessConstrained(AliMCEvent* const mcEvent, AliESDEven
     track = esdEvent->GetTrack(iTrack);\r
     if(!track) continue;\r
     if(track->Charge()==0) continue;\r
+\r
+    // if not fUseKinkDaughters don't use tracks with kink index > 0\r
+    if(!fUseKinkDaughters && track->GetKinkIndex(0) > 0) continue;\r
+\r
     Int_t label = TMath::Abs(track->GetLabel()); \r
-    labelsAllRec[iTrack]=label;\r
+    labelsAllRecConstrained[iTrack]=label;\r
 \r
     // Constrained\r
     if(IsRecConstrained(track) != 0) \r
-      labelsRec[iTrack]=label;\r
+      labelsRecConstrained[iTrack]=label;\r
 \r
   }\r
 \r
   // \r
   // MC histograms for efficiency studies\r
   //\r
-  if(!mcEvent) return;\r
  \r
-  AliStack *stack = mcEvent->Stack();\r
-  if (!stack) {\r
-    AliDebug(AliLog::kError, "Stack not available");\r
-    return;\r
-  }\r
 \r
   //Int_t nPart  = stack->GetNtrack();\r
   Int_t nPart  = stack->GetNprimary();\r
@@ -546,7 +634,7 @@ void AliPerformanceEff::ProcessConstrained(AliMCEvent* const mcEvent, AliESDEven
     for(Int_t iRec=0; iRec<esdEvent->GetNumberOfTracks(); ++iRec) \r
     {\r
       // check findable\r
-      if(iMc == labelsAllRec[iRec]) \r
+      if(iMc == labelsAllRecConstrained[iRec]) \r
       {\r
         findable = IsFindable(mcEvent,iMc);\r
        break;\r
@@ -557,7 +645,7 @@ void AliPerformanceEff::ProcessConstrained(AliMCEvent* const mcEvent, AliESDEven
     for(Int_t iRec=0; iRec<esdEvent->GetNumberOfTracks(); ++iRec) \r
     {\r
       // check reconstructed\r
-      if(iMc == labelsRec[iRec]) \r
+      if(iMc == labelsRecConstrained[iRec]) \r
       {\r
         recStatus = kTRUE;\r
         break;\r
@@ -575,13 +663,17 @@ void AliPerformanceEff::ProcessConstrained(AliMCEvent* const mcEvent, AliESDEven
     if(mcphi<0) mcphi += 2.*TMath::Pi();\r
     Float_t mcpt = particle->Pt();\r
 \r
+    Float_t charge = 0.;\r
+    if (particle->GetPDG()->Charge() < 0)  charge = -1.;    \r
+    else if (particle->GetPDG()->Charge() > 0)  charge = 1.;\r
+\r
     // Fill histograms\r
-    Double_t vEffHisto[6] = { mceta, mcphi, mcpt, pid, recStatus, findable}; \r
+    Double_t vEffHisto[7] = { mceta, mcphi, mcpt, pid, recStatus, findable, charge}; \r
     fEffHisto->Fill(vEffHisto);\r
   }\r
 \r
-  if(labelsRec) delete [] labelsRec; labelsRec = 0;\r
-  if(labelsAllRec) delete [] labelsAllRec; labelsAllRec = 0;\r
+  if(labelsRecConstrained) delete [] labelsRecConstrained; labelsRecConstrained = 0;\r
+  if(labelsAllRecConstrained) delete [] labelsAllRecConstrained; labelsAllRecConstrained = 0;\r
 }\r
 \r
 //_____________________________________________________________________________\r
@@ -819,6 +911,7 @@ void AliPerformanceEff::Analyse()
   //\r
   TH1::AddDirectory(kFALSE);\r
   TObjArray *aFolderObj = new TObjArray;\r
+  if(!aFolderObj) return;\r
   char title[256];\r
 \r
   //\r
@@ -830,106 +923,66 @@ void AliPerformanceEff::Analyse()
   fEffHisto->GetAxis(0)->SetRangeUser(-0.9,0.89); // eta range\r
   fEffHisto->GetAxis(2)->SetRangeUser(0.1,10.);   // pt range\r
 \r
-\r
   // rec efficiency vs pt\r
   fEffHisto->GetAxis(3)->SetRangeUser(0.,3.99);  // reconstructed \r
-  TH1D *ptAll = fEffHisto->Projection(2);\r
 \r
-  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.);  // reconstructed \r
-  TH1D *ptRec = fEffHisto->Projection(2);\r
-  TH1D *ptRecc = (TH1D*)ptRec->Clone();\r
-  ptRecc->Divide(ptRec,ptAll,1,1,"B");\r
-  ptRecc->SetName("ptRecEff");\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,2.);   // charge all\r
+  aFolderObj->Add(AddHistoEff(2, "ptRecEff", "rec. efficiency"));\r
 \r
-  ptRecc->GetXaxis()->SetTitle(fEffHisto->GetAxis(2)->GetTitle());\r
-  ptRecc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency",fEffHisto->GetAxis(2)->GetTitle());\r
-  ptRecc->SetTitle(title);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,0.);   // charge negativ\r
+  aFolderObj->Add(AddHistoEff(2, "ptRecEffNeg", "rec. efficiency neg."));\r
 \r
-  ptRecc->SetBit(TH1::kLogX);\r
-  aFolderObj->Add(ptRecc);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(0.,2.);    // charge positiv\r
+  aFolderObj->Add(AddHistoEff(2, "ptRecEffPos", "rec. efficiency pos."));\r
 \r
   // rec efficiency vs pid vs pt\r
+  fEffHisto->GetAxis(3)->SetRangeUser(2.,2.);    // pions\r
+  \r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,2.);   // charge all\r
+  aFolderObj->Add(AddHistoEff(2, "ptRecEffPi", "rec. efficiency (pions)"));\r
\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,0.);   // charge negativ\r
+  aFolderObj->Add(AddHistoEff(2, "ptRecEffPiNeg", "rec. efficiency (pions) neg."));\r
 \r
-  fEffHisto->GetAxis(4)->SetRangeUser(0.,1.); \r
-  fEffHisto->GetAxis(3)->SetRangeUser(2.,2.); // pions\r
-\r
-  TH1D *ptAllPi = fEffHisto->Projection(2);\r
-\r
-  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed\r
-  TH1D *ptRecPi = fEffHisto->Projection(2);\r
-  TH1D *ptRecPic = (TH1D*)ptRecPi->Clone();\r
-  ptRecPic->Divide(ptRecPi,ptAllPi,1,1,"B");\r
-  ptRecPic->SetName("ptRecEffPi");\r
-\r
-  ptRecPic->GetXaxis()->SetTitle(fEffHisto->GetAxis(2)->GetTitle());\r
-  ptRecPic->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (pions)",fEffHisto->GetAxis(2)->GetTitle());\r
-  ptRecPic->SetTitle(title);\r
-\r
-  ptRecPic->SetBit(TH1::kLogX);\r
-  aFolderObj->Add(ptRecPic);\r
-\r
-  fEffHisto->GetAxis(4)->SetRangeUser(0.,1.); \r
-  fEffHisto->GetAxis(3)->SetRangeUser(3.,3.); // kaons\r
-  TH1D *ptAllK = fEffHisto->Projection(2);\r
-\r
-  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed\r
-  TH1D *ptRecK = fEffHisto->Projection(2);\r
-\r
-  TH1D *ptRecKc = (TH1D*)ptRecK->Clone();\r
-  ptRecKc->Divide(ptRecK,ptAllK,1,1,"B");\r
-  ptRecKc->SetName("ptRecEffK");\r
-\r
-  ptRecKc->GetXaxis()->SetTitle(fEffHisto->GetAxis(2)->GetTitle());\r
-  ptRecKc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (kaons)",fEffHisto->GetAxis(2)->GetTitle());\r
-  ptRecKc->SetTitle(title);\r
-\r
-\r
-  ptRecKc->SetBit(TH1::kLogX);\r
-  aFolderObj->Add(ptRecKc);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(0.,2.);    // charge positiv\r
+  aFolderObj->Add(AddHistoEff(2, "ptRecEffPiPos", "rec. efficiency (pions) pos."));\r
 \r
-  fEffHisto->GetAxis(4)->SetRangeUser(0.,1.); \r
-  fEffHisto->GetAxis(3)->SetRangeUser(4.,4.); // protons\r
-  TH1D *ptAllP = fEffHisto->Projection(2);\r
 \r
-  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed\r
-  TH1D *ptRecP = fEffHisto->Projection(2);\r
-  TH1D *ptRecPc = (TH1D*)ptRecP->Clone();\r
-  ptRecPc->Divide(ptRecP,ptAllP,1,1,"B");\r
-  ptRecPc->SetName("ptRecEffP");\r
+  fEffHisto->GetAxis(3)->SetRangeUser(3.,3.);    // kaons\r
+  \r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,2.);   // charge all\r
+  aFolderObj->Add(AddHistoEff(2, "ptRecEffK", "rec. efficiency (kaons)"));\r
+  \r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,0.);   // charge negativ\r
+  aFolderObj->Add(AddHistoEff(2, "ptRecEffKNeg", "rec. efficiency (kaons) neg."));\r
\r
+  fEffHisto->GetAxis(6)->SetRangeUser(0.,2.);    // charge positiv\r
+  aFolderObj->Add(AddHistoEff(2, "ptRecEffKPos", "rec. efficiency (kaons) pos."));\r
\r
+  \r
+  fEffHisto->GetAxis(3)->SetRangeUser(4.,4.);    // protons\r
 \r
-  ptRecPc->GetXaxis()->SetTitle(fEffHisto->GetAxis(2)->GetTitle());\r
-  ptRecPc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (protons)",fEffHisto->GetAxis(2)->GetTitle());\r
-  ptRecPc->SetTitle(title);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,2.);   // charge all\r
+  aFolderObj->Add(AddHistoEff(2, "ptRecEffP", "rec. efficiency (protons)"));\r
 \r
-  ptRecPc->SetBit(TH1::kLogX);\r
-  aFolderObj->Add(ptRecPc);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,0.);   // charge negativ\r
+  aFolderObj->Add(AddHistoEff(2, "ptRecEffPNeg", "rec. efficiency (protons) neg."));\r
\r
+  fEffHisto->GetAxis(6)->SetRangeUser(0.,2.);    // charge positiv\r
+  aFolderObj->Add(AddHistoEff(2, "ptRecEffPPos", "rec. efficiency (protons) pos."));\r
 \r
   // findable efficiency vs pt\r
-\r
   fEffHisto->GetAxis(3)->SetRangeUser(0.,4.); \r
-  fEffHisto->GetAxis(4)->SetRangeUser(0.,1.); \r
   fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // findable\r
-  TH1D *ptAllF = fEffHisto->Projection(2);\r
-\r
-  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.);\r
-  fEffHisto->GetAxis(5)->SetRangeUser(1.,1.);\r
 \r
-  TH1D *ptRecF = fEffHisto->Projection(2); // rec findable\r
-  TH1D *ptRecFc = (TH1D*)ptRecF->Clone();\r
-  ptRecFc->Divide(ptRecF,ptAllF,1,1,"B");\r
-  ptRecFc->SetName("ptRecEffF");\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,2.);   // charge all\r
+  aFolderObj->Add(AddHistoEff(2, "ptRecEffF", "rec. efficiency (findable)"));\r
 \r
-  ptRecFc->GetXaxis()->SetTitle(fEffHisto->GetAxis(2)->GetTitle());\r
-  ptRecFc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (findable)",fEffHisto->GetAxis(2)->GetTitle());\r
-  ptRecFc->SetTitle(title);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,0.);   // charge negativ\r
+  aFolderObj->Add(AddHistoEff(2, "ptRecEffFNeg", "rec. efficiency (findable) neg."));\r
 \r
-  ptRecFc->SetBit(TH1::kLogX);\r
-  aFolderObj->Add(ptRecFc);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(0.,2.);    // charge positiv\r
+  aFolderObj->Add(AddHistoEff(2, "ptRecEffFPos", "rec. efficiency (findable) pos."));\r
 \r
   //\r
   // efficiency vs eta\r
@@ -937,100 +990,68 @@ void AliPerformanceEff::Analyse()
 \r
   fEffHisto->GetAxis(0)->SetRangeUser(-1.5,1.5); // eta range\r
   fEffHisto->GetAxis(2)->SetRangeUser(0.2,10.); // pt range\r
-  fEffHisto->GetAxis(4)->SetRangeUser(0.,1.);   // all\r
   fEffHisto->GetAxis(5)->SetRangeUser(0.,1.);   // all\r
 \r
-  TH1D *etaAll = fEffHisto->Projection(0);\r
+  // rec efficiency vs eta\r
+  fEffHisto->GetAxis(3)->SetRangeUser(0.,4.);  // reconstructed \r
 \r
-  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.);  // reconstructed \r
-  TH1D *etaRec = fEffHisto->Projection(0);\r
-  TH1D *etaRecc = (TH1D*)etaRec->Clone();\r
-  etaRecc->Divide(etaRec,etaAll,1,1,"B");\r
-  etaRecc->SetName("etaRecEff");\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,2.);   // charge all\r
+  aFolderObj->Add(AddHistoEff(0, "etaRecEff", "rec. efficiency"));\r
 \r
-  etaRecc->GetXaxis()->SetTitle(fEffHisto->GetAxis(0)->GetTitle());\r
-  etaRecc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency",fEffHisto->GetAxis(0)->GetTitle());\r
-  etaRecc->SetTitle(title);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,0.);   // charge negativ\r
+  aFolderObj->Add(AddHistoEff(0, "etaRecEffNeg", "rec. efficiency neg."));\r
 \r
-  aFolderObj->Add(etaRecc);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(0.,2.);    // charge positiv\r
+  aFolderObj->Add(AddHistoEff(0, "etaRecEffPos", "rec. efficiency pos."));\r
 \r
   // rec efficiency vs pid vs eta\r
-  fEffHisto->GetAxis(4)->SetRangeUser(0.,1.); \r
-  fEffHisto->GetAxis(3)->SetRangeUser(2.,2.); // pions\r
-\r
-  TH1D *etaAllPi = fEffHisto->Projection(0);\r
-\r
-  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed\r
-  TH1D *etaRecPi = fEffHisto->Projection(0);\r
-  TH1D *etaRecPic = (TH1D*)etaRecPi->Clone();\r
-  etaRecPic->Divide(etaRecPi,etaAllPi,1,1,"B");\r
-  etaRecPic->SetName("etaRecEffPi");\r
-\r
-  etaRecPic->GetXaxis()->SetTitle(fEffHisto->GetAxis(0)->GetTitle());\r
-  etaRecPic->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (pions)",fEffHisto->GetAxis(0)->GetTitle());\r
-  etaRecPic->SetTitle(title);\r
-\r
-  aFolderObj->Add(etaRecPic);\r
-\r
-  fEffHisto->GetAxis(4)->SetRangeUser(0.,1.); \r
-  fEffHisto->GetAxis(3)->SetRangeUser(3.,3.); // kaons\r
-  TH1D *etaAllK = fEffHisto->Projection(0);\r
-\r
-  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed\r
-  TH1D *etaRecK = fEffHisto->Projection(0);\r
-\r
-  TH1D *etaRecKc = (TH1D*)etaRecK->Clone();\r
-  etaRecKc->Divide(etaRecK,etaAllK,1,1,"B");\r
-  etaRecKc->SetName("etaRecEffK");\r
-\r
-  etaRecKc->GetXaxis()->SetTitle(fEffHisto->GetAxis(0)->GetTitle());\r
-  etaRecKc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (kaons)",fEffHisto->GetAxis(0)->GetTitle());\r
-  etaRecKc->SetTitle(title);\r
+  fEffHisto->GetAxis(3)->SetRangeUser(2.,2.);    // pions\r
+  \r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,2.);   // charge all\r
+  aFolderObj->Add(AddHistoEff(0, "etaRecEffPi", "rec. efficiency (pions)"));\r
 \r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,0.);   // charge negativ\r
+  aFolderObj->Add(AddHistoEff(0, "etaRecEffPiNeg", "rec. efficiency (pions) neg."));\r
 \r
-  aFolderObj->Add(etaRecKc);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(0.,2.);    // charge positiv\r
+  aFolderObj->Add(AddHistoEff(0, "etaRecEffPiPos", "rec. efficiency (pions) pos."));\r
 \r
-  fEffHisto->GetAxis(4)->SetRangeUser(0.,1.); \r
-  fEffHisto->GetAxis(3)->SetRangeUser(4.,4.); // protons\r
-  TH1D *etaAllP = fEffHisto->Projection(0);\r
 \r
-  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed\r
-  TH1D *etaRecP = fEffHisto->Projection(0);\r
-  TH1D *etaRecPc = (TH1D*)etaRecP->Clone();\r
-  etaRecPc->Divide(etaRecP,etaAllP,1,1,"B");\r
-  etaRecPc->SetName("etaRecEffP");\r
+  fEffHisto->GetAxis(3)->SetRangeUser(3.,3.);    // kaons\r
+  \r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,2.);   // charge all\r
+  aFolderObj->Add(AddHistoEff(0, "etaRecEffK", "rec. efficiency (kaons)"));\r
 \r
-  etaRecPc->GetXaxis()->SetTitle(fEffHisto->GetAxis(0)->GetTitle());\r
-  etaRecPc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (protons)",fEffHisto->GetAxis(0)->GetTitle());\r
-  etaRecPc->SetTitle(title);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,0.);   // charge negativ\r
+  aFolderObj->Add(AddHistoEff(0, "etaRecEffKNeg", "rec. efficiency (kaons) neg."));\r
+  \r
+  fEffHisto->GetAxis(6)->SetRangeUser(0.,2.);    // charge positiv\r
+  aFolderObj->Add(AddHistoEff(0, "etaRecEffKPos", "rec. efficiency (kaons) pos."));\r
+  \r
+  \r
+  fEffHisto->GetAxis(3)->SetRangeUser(4.,4.);    // protons\r
 \r
-  aFolderObj->Add(etaRecPc);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,2.);   // charge all\r
+  aFolderObj->Add(AddHistoEff(0, "etaRecEffP", "rec. efficiency (protons)"));\r
\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,0.);   // charge negativ\r
+  aFolderObj->Add(AddHistoEff(0, "etaRecEffPNeg", "rec. efficiency (protons) neg."));\r
+  \r
+  fEffHisto->GetAxis(6)->SetRangeUser(0.,2.);    // charge positiv\r
+  aFolderObj->Add(AddHistoEff(0, "etaRecEffPPos", "rec. efficiency (protons) pos."));\r
 \r
   // findable efficiency vs eta\r
-\r
   fEffHisto->GetAxis(3)->SetRangeUser(0.,4.); \r
-  fEffHisto->GetAxis(4)->SetRangeUser(0.,1.); \r
   fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // findable\r
-  TH1D *etaAllF = fEffHisto->Projection(0);\r
 \r
-  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.);\r
-  fEffHisto->GetAxis(5)->SetRangeUser(1.,1.);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,2.);   // charge all\r
+  aFolderObj->Add(AddHistoEff(0, "etaRecEffF", "rec. efficiency (findable)"));\r
 \r
-  TH1D *etaRecF = fEffHisto->Projection(0); // rec findable\r
-  TH1D *etaRecFc = (TH1D*)etaRecF->Clone();\r
-  etaRecFc->Divide(etaRecF,etaAllF,1,1,"B");\r
-  etaRecFc->SetName("etaRecEffF");\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,0.);   // charge negativ\r
+  aFolderObj->Add(AddHistoEff(0, "etaRecEffFNeg", "rec. efficiency (findable) neg."));\r
 \r
-  etaRecFc->GetXaxis()->SetTitle(fEffHisto->GetAxis(0)->GetTitle());\r
-  etaRecFc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (findable)",fEffHisto->GetAxis(0)->GetTitle());\r
-  etaRecFc->SetTitle(title);\r
-\r
-  aFolderObj->Add(etaRecFc);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(0.,2.);    // charge positiv\r
+  aFolderObj->Add(AddHistoEff(0, "etaRecEffFPos", "rec. efficiency (findable) pos."));\r
 \r
   //\r
   // efficiency vs phi\r
@@ -1038,100 +1059,68 @@ void AliPerformanceEff::Analyse()
 \r
   fEffHisto->GetAxis(0)->SetRangeUser(-0.9,0.9); // eta range\r
   fEffHisto->GetAxis(2)->SetRangeUser(0.2,10.); // pt range\r
-  fEffHisto->GetAxis(4)->SetRangeUser(0.,1.);   // all\r
   fEffHisto->GetAxis(5)->SetRangeUser(0.,1.);   // all\r
 \r
-  TH1D *phiAll = fEffHisto->Projection(1);\r
+  // rec efficiency vs phi\r
+  fEffHisto->GetAxis(3)->SetRangeUser(0.,4.);  // reconstructed \r
 \r
-  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.);  // reconstructed \r
-  TH1D *phiRec = fEffHisto->Projection(1);\r
-  TH1D *phiRecc = (TH1D*)phiRec->Clone();\r
-  phiRecc->Divide(phiRec,phiAll,1,1,"B");\r
-  phiRecc->SetName("phiRecEff");\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,2.);   // charge all\r
+  aFolderObj->Add(AddHistoEff(1, "phiRecEff", "rec. efficiency"));\r
 \r
-  phiRecc->GetXaxis()->SetTitle(fEffHisto->GetAxis(1)->GetTitle());\r
-  phiRecc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency",fEffHisto->GetAxis(1)->GetTitle());\r
-  phiRecc->SetTitle(title);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,0.);   // charge negativ\r
+  aFolderObj->Add(AddHistoEff(1, "phiRecEffNeg", "rec. efficiency neg."));\r
 \r
-  aFolderObj->Add(phiRecc);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(0.,2.);    // charge positiv\r
+  aFolderObj->Add(AddHistoEff(1, "phiRecEffPos", "rec. efficiency pos."));\r
 \r
   // rec efficiency vs pid vs phi\r
-  fEffHisto->GetAxis(4)->SetRangeUser(0.,1.); \r
-  fEffHisto->GetAxis(3)->SetRangeUser(2.,2.); // pions\r
-\r
-  TH1D *phiAllPi = fEffHisto->Projection(1);\r
-\r
-  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed\r
-  TH1D *phiRecPi = fEffHisto->Projection(1);\r
-  TH1D *phiRecPic = (TH1D*)phiRecPi->Clone();\r
-  phiRecPic->Divide(phiRecPi,phiAllPi,1,1,"B");\r
-  phiRecPic->SetName("phiRecEffPi");\r
-\r
-  phiRecPic->GetXaxis()->SetTitle(fEffHisto->GetAxis(1)->GetTitle());\r
-  phiRecPic->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (pions)",fEffHisto->GetAxis(1)->GetTitle());\r
-  phiRecPic->SetTitle(title);\r
-\r
-  aFolderObj->Add(phiRecPic);\r
-\r
-  fEffHisto->GetAxis(4)->SetRangeUser(0.,1.); \r
-  fEffHisto->GetAxis(3)->SetRangeUser(3.,3.); // kaons\r
-  TH1D *phiAllK = fEffHisto->Projection(1);\r
-\r
-  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed\r
-  TH1D *phiRecK = fEffHisto->Projection(1);\r
+  fEffHisto->GetAxis(3)->SetRangeUser(2.,2.);    // pions\r
+  \r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,2.);   // charge all\r
+  aFolderObj->Add(AddHistoEff(1, "phiRecEffPi", "rec. efficiency (pions)"));\r
 \r
-  TH1D *phiRecKc = (TH1D*)phiRecK->Clone();\r
-  phiRecKc->Divide(phiRecK,phiAllK,1,1,"B");\r
-  phiRecKc->SetName("phiRecEffK");\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,0.);   // charge negativ\r
+  aFolderObj->Add(AddHistoEff(1, "phiRecEffPiNeg", "rec. efficiency (pions) neg."));\r
 \r
-  phiRecKc->GetXaxis()->SetTitle(fEffHisto->GetAxis(1)->GetTitle());\r
-  phiRecKc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (kaons)",fEffHisto->GetAxis(1)->GetTitle());\r
-  phiRecKc->SetTitle(title);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(0.,2.);    // charge positiv\r
+  aFolderObj->Add(AddHistoEff(1, "phiRecEffPiPos", "rec. efficiency (pions) pos."));\r
 \r
 \r
-  aFolderObj->Add(phiRecKc);\r
+  fEffHisto->GetAxis(3)->SetRangeUser(3.,3.);    // kaons\r
+  \r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,2.);   // charge all\r
+  aFolderObj->Add(AddHistoEff(1, "phiRecEffK", "rec. efficiency (kaons)"));\r
 \r
-  fEffHisto->GetAxis(4)->SetRangeUser(0.,1.); \r
-  fEffHisto->GetAxis(3)->SetRangeUser(4.,4.); // protons\r
-  TH1D *phiAllP = fEffHisto->Projection(1);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,0.);   // charge negativ\r
+  aFolderObj->Add(AddHistoEff(1, "phiRecEffKNeg", "rec. efficiency (kaons) neg."));\r
 \r
-  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // reconstructed\r
-  TH1D *phiRecP = fEffHisto->Projection(1);\r
-  TH1D *phiRecPc = (TH1D*)phiRecP->Clone();\r
-  phiRecPc->Divide(phiRecP,phiAllP,1,1,"B");\r
-  phiRecPc->SetName("phiRecEffP");\r
+  fEffHisto->GetAxis(6)->SetRangeUser(0.,2.);    // charge positiv\r
+  aFolderObj->Add(AddHistoEff(1, "phiRecEffKPos", "rec. efficiency (kaons) pos."));\r
\r
+  \r
+  fEffHisto->GetAxis(3)->SetRangeUser(4.,4.);    // protons\r
 \r
-  phiRecPc->GetXaxis()->SetTitle(fEffHisto->GetAxis(1)->GetTitle());\r
-  phiRecPc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (protons)",fEffHisto->GetAxis(1)->GetTitle());\r
-  phiRecPc->SetTitle(title);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,2.);   // charge all\r
+  aFolderObj->Add(AddHistoEff(1, "phiRecEffP", "rec. efficiency (protons)"));\r
 \r
-  aFolderObj->Add(phiRecPc);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,0.);   // charge negativ\r
+  aFolderObj->Add(AddHistoEff(1, "phiRecEffPNeg", "rec. efficiency (protons) neg."));\r
\r
+  fEffHisto->GetAxis(6)->SetRangeUser(0.,2.);    // charge positiv\r
+  aFolderObj->Add(AddHistoEff(1, "phiRecEffPPos", "rec. efficiency (protons) pos."));\r
 \r
   // findable efficiency vs phi\r
-\r
   fEffHisto->GetAxis(3)->SetRangeUser(0.,4.); \r
-  fEffHisto->GetAxis(4)->SetRangeUser(0.,1.); \r
   fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // findable\r
-  TH1D *phiAllF = fEffHisto->Projection(1);\r
-\r
-  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.);\r
-  fEffHisto->GetAxis(5)->SetRangeUser(1.,1.);\r
-\r
-  TH1D *phiRecF = fEffHisto->Projection(1); // rec findable\r
-  TH1D *phiRecFc = (TH1D*)phiRecF->Clone();\r
-  phiRecFc->Divide(phiRecF,phiAllF,1,1,"B");\r
-  phiRecFc->SetName("phiRecEffF");\r
 \r
-  phiRecFc->GetXaxis()->SetTitle(fEffHisto->GetAxis(1)->GetTitle());\r
-  phiRecFc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (findable)",fEffHisto->GetAxis(1)->GetTitle());\r
-  phiRecFc->SetTitle(title);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,2.);   // charge all\r
+  aFolderObj->Add(AddHistoEff(1, "phiRecEffF", "rec. efficiency (findable)"));\r
 \r
-  aFolderObj->Add(phiRecFc);\r
+  fEffHisto->GetAxis(6)->SetRangeUser(-2.,0.);   // charge negativ\r
+  aFolderObj->Add(AddHistoEff(1, "phiRecEffFNeg", "rec. efficiency (findable) neg."));\r
\r
+  fEffHisto->GetAxis(6)->SetRangeUser(0.,2.);    // charge positiv\r
+  aFolderObj->Add(AddHistoEff(1, "phiRecEffFPos", "rec. efficiency (findable) pos."));\r
   }\r
   else {\r
   // \r
@@ -1160,7 +1149,7 @@ void AliPerformanceEff::Analyse()
 \r
   ptRecc->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(2)->GetTitle());\r
   ptRecc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency",fEffSecHisto->GetAxis(2)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency",fEffSecHisto->GetAxis(2)->GetTitle());\r
   ptRecc->SetTitle(title);\r
 \r
   ptRecc->SetBit(TH1::kLogX);\r
@@ -1181,7 +1170,7 @@ void AliPerformanceEff::Analyse()
 \r
   ptRecElec->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(2)->GetTitle());\r
   ptRecElec->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (electrons)",fEffSecHisto->GetAxis(2)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency (electrons)",fEffSecHisto->GetAxis(2)->GetTitle());\r
   ptRecElec->SetTitle(title);\r
 \r
   ptRecElec->SetBit(TH1::kLogX);\r
@@ -1202,7 +1191,7 @@ void AliPerformanceEff::Analyse()
 \r
   ptRecPic->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(2)->GetTitle());\r
   ptRecPic->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (pions)",fEffSecHisto->GetAxis(2)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency (pions)",fEffSecHisto->GetAxis(2)->GetTitle());\r
   ptRecPic->SetTitle(title);\r
 \r
   ptRecPic->SetBit(TH1::kLogX);\r
@@ -1221,7 +1210,7 @@ void AliPerformanceEff::Analyse()
 \r
   ptRecKc->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(2)->GetTitle());\r
   ptRecKc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (kaons)",fEffSecHisto->GetAxis(2)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency (kaons)",fEffSecHisto->GetAxis(2)->GetTitle());\r
   ptRecKc->SetTitle(title);\r
 \r
 \r
@@ -1240,7 +1229,7 @@ void AliPerformanceEff::Analyse()
 \r
   ptRecPc->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(2)->GetTitle());\r
   ptRecPc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (protons)",fEffSecHisto->GetAxis(2)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency (protons)",fEffSecHisto->GetAxis(2)->GetTitle());\r
   ptRecPc->SetTitle(title);\r
 \r
   ptRecPc->SetBit(TH1::kLogX);\r
@@ -1263,7 +1252,7 @@ void AliPerformanceEff::Analyse()
 \r
   ptRecFc->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(2)->GetTitle());\r
   ptRecFc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (findable)",fEffSecHisto->GetAxis(2)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency (findable)",fEffSecHisto->GetAxis(2)->GetTitle());\r
   ptRecFc->SetTitle(title);\r
 \r
   ptRecFc->SetBit(TH1::kLogX);\r
@@ -1286,7 +1275,7 @@ void AliPerformanceEff::Analyse()
 \r
   etaRecc->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(0)->GetTitle());\r
   etaRecc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency",fEffSecHisto->GetAxis(0)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency",fEffSecHisto->GetAxis(0)->GetTitle());\r
   etaRecc->SetTitle(title);\r
 \r
   aFolderObj->Add(etaRecc);\r
@@ -1305,7 +1294,7 @@ void AliPerformanceEff::Analyse()
 \r
   etaRecElec->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(0)->GetTitle());\r
   etaRecElec->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (electrons)",fEffSecHisto->GetAxis(0)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency (electrons)",fEffSecHisto->GetAxis(0)->GetTitle());\r
   etaRecElec->SetTitle(title);\r
 \r
   aFolderObj->Add(etaRecElec);\r
@@ -1324,7 +1313,7 @@ void AliPerformanceEff::Analyse()
 \r
   etaRecPic->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(0)->GetTitle());\r
   etaRecPic->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (pions)",fEffSecHisto->GetAxis(0)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency (pions)",fEffSecHisto->GetAxis(0)->GetTitle());\r
   etaRecPic->SetTitle(title);\r
 \r
   aFolderObj->Add(etaRecPic);\r
@@ -1342,7 +1331,7 @@ void AliPerformanceEff::Analyse()
 \r
   etaRecKc->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(0)->GetTitle());\r
   etaRecKc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (kaons)",fEffSecHisto->GetAxis(0)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency (kaons)",fEffSecHisto->GetAxis(0)->GetTitle());\r
   etaRecKc->SetTitle(title);\r
 \r
 \r
@@ -1360,7 +1349,7 @@ void AliPerformanceEff::Analyse()
 \r
   etaRecPc->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(0)->GetTitle());\r
   etaRecPc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (protons)",fEffSecHisto->GetAxis(0)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency (protons)",fEffSecHisto->GetAxis(0)->GetTitle());\r
   etaRecPc->SetTitle(title);\r
 \r
   aFolderObj->Add(etaRecPc);\r
@@ -1382,7 +1371,7 @@ void AliPerformanceEff::Analyse()
 \r
   etaRecFc->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(0)->GetTitle());\r
   etaRecFc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (findable)",fEffSecHisto->GetAxis(0)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency (findable)",fEffSecHisto->GetAxis(0)->GetTitle());\r
   etaRecFc->SetTitle(title);\r
 \r
   aFolderObj->Add(etaRecFc);\r
@@ -1407,7 +1396,7 @@ void AliPerformanceEff::Analyse()
 \r
   phiRecc->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(1)->GetTitle());\r
   phiRecc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency",fEffSecHisto->GetAxis(1)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency",fEffSecHisto->GetAxis(1)->GetTitle());\r
   phiRecc->SetTitle(title);\r
 \r
   aFolderObj->Add(phiRecc);\r
@@ -1426,7 +1415,7 @@ void AliPerformanceEff::Analyse()
 \r
   phiRecElec->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(1)->GetTitle());\r
   phiRecElec->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (electrons)",fEffSecHisto->GetAxis(1)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency (electrons)",fEffSecHisto->GetAxis(1)->GetTitle());\r
   phiRecElec->SetTitle(title);\r
 \r
   aFolderObj->Add(phiRecElec);\r
@@ -1445,7 +1434,7 @@ void AliPerformanceEff::Analyse()
 \r
   phiRecPic->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(1)->GetTitle());\r
   phiRecPic->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (pions)",fEffSecHisto->GetAxis(1)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency (pions)",fEffSecHisto->GetAxis(1)->GetTitle());\r
   phiRecPic->SetTitle(title);\r
 \r
   aFolderObj->Add(phiRecPic);\r
@@ -1463,7 +1452,7 @@ void AliPerformanceEff::Analyse()
 \r
   phiRecKc->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(1)->GetTitle());\r
   phiRecKc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (kaons)",fEffSecHisto->GetAxis(1)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency (kaons)",fEffSecHisto->GetAxis(1)->GetTitle());\r
   phiRecKc->SetTitle(title);\r
 \r
 \r
@@ -1481,7 +1470,7 @@ void AliPerformanceEff::Analyse()
 \r
   phiRecPc->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(1)->GetTitle());\r
   phiRecPc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (protons)",fEffSecHisto->GetAxis(1)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency (protons)",fEffSecHisto->GetAxis(1)->GetTitle());\r
   phiRecPc->SetTitle(title);\r
 \r
   aFolderObj->Add(phiRecPc);\r
@@ -1503,7 +1492,7 @@ void AliPerformanceEff::Analyse()
 \r
   phiRecFc->GetXaxis()->SetTitle(fEffSecHisto->GetAxis(1)->GetTitle());\r
   phiRecFc->GetYaxis()->SetTitle("efficiency");\r
-  sprintf(title,"%s vs %s","rec. efficiency (findable)",fEffSecHisto->GetAxis(1)->GetTitle());\r
+  snprintf(title,256,"%s vs %s","rec. efficiency (findable)",fEffSecHisto->GetAxis(1)->GetTitle());\r
   phiRecFc->SetTitle(title);\r
 \r
   aFolderObj->Add(phiRecFc);\r
@@ -1561,3 +1550,31 @@ TFolder *folder = 0;
 \r
   return folder;\r
 }\r
+\r
+\r
+//_____________________________________________________________________________\r
+TH1D* AliPerformanceEff::AddHistoEff(Int_t axis, const Char_t *name, const Char_t* vsTitle) {\r
+  // Create and add rec efficiency vs pt, eta, phi\r
+  \r
+  char title[256];\r
+\r
+  fEffHisto->GetAxis(4)->SetRangeUser(0.,1.);    // all\r
+  TH1D *all = fEffHisto->Projection(axis);\r
+\r
+  fEffHisto->GetAxis(4)->SetRangeUser(1.,1.);    // reconstructed \r
+  TH1D *rec = fEffHisto->Projection(axis);\r
+  TH1D *recc = (TH1D*)rec->Clone();\r
+\r
+  recc->Divide(rec,all,1,1,"B");\r
+  recc->SetName(name);\r
+\r
+  recc->GetXaxis()->SetTitle(fEffHisto->GetAxis(axis)->GetTitle());\r
+  recc->GetYaxis()->SetTitle("efficiency");\r
+\r
+  snprintf(title,256,"%s vs %s",vsTitle, fEffHisto->GetAxis(axis)->GetTitle());  \r
+  recc->SetTitle(title);\r
+\r
+  if (axis == 2 ) recc->SetBit(TH1::kLogX);\r
+\r
+  return recc;\r
+}\r