]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGLF/SPECTRA/ChargedHadrons/dNdPt/AlidNdPtEfficiency.cxx
end-of-line normalization
[u/mrichter/AliRoot.git] / PWGLF / SPECTRA / ChargedHadrons / dNdPt / AlidNdPtEfficiency.cxx
index 0756f338920ea3b3753478a9f130767c5ff368ca..799cee608a60ca7dea0b10b9b277fdc5b1cd55c6 100644 (file)
-/**************************************************************************\r
- * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r
- *                                                                        *\r
- * Author: The ALICE Off-line Project.                                    *\r
- * Contributors are mentioned in the code where appropriate.              *\r
- *                                                                        *\r
- * Permission to use, copy, modify and distribute this software and its   *\r
- * documentation strictly for non-commercial purposes is hereby granted   *\r
- * without fee, provided that the above copyright notice appears in all   *\r
- * copies and that both the copyright notice and this permission notice   *\r
- * appear in the supporting documentation. The authors make no claims     *\r
- * about the suitability of this software for any purpose. It is          *\r
- * provided "as is" without express or implied warranty.                  *\r
- **************************************************************************/\r
-//------------------------------------------------------------------------------\r
-// AlidNdPtEfficiency class. \r
-//\r
-// a. functionality:\r
-// - fills generic cut histograms\r
-// - generates cuts (selection criteria)\r
-//\r
-// b. data members:\r
-// - generic cut histograms\r
-// - control histograms\r
-//\r
-// Author: J.Otwinowski 18/11/2010 \r
-//------------------------------------------------------------------------------\r
-#include "TH1.h"\r
-#include "TH2.h"\r
-\r
-#include "AliHeader.h"  \r
-#include "AliGenEventHeader.h"  \r
-#include "AliStack.h"  \r
-#include "AliESDEvent.h"  \r
-#include "AliMCEvent.h"  \r
-#include "AliESDtrackCuts.h"  \r
-#include "AliLog.h" \r
-#include "AliTracker.h" \r
-\r
-#include "AlidNdPtEventCuts.h"\r
-#include "AlidNdPtAcceptanceCuts.h"\r
-#include "AlidNdPtBackgroundCuts.h"\r
-#include "AlidNdPtAnalysis.h"\r
-#include "AliPhysicsSelection.h"\r
-\r
-#include "AliPWG0Helper.h"\r
-#include "AlidNdPtHelper.h"\r
-#include "AlidNdPtEfficiency.h"\r
-\r
-using namespace std;\r
-\r
-ClassImp(AlidNdPtEfficiency)\r
-\r
-//_____________________________________________________________________________\r
-  AlidNdPtEfficiency::AlidNdPtEfficiency(): AlidNdPt(),\r
-  fAnalysisFolder(0),\r
-  fRecMCTrackHistTPCITS(0),\r
-  fRecMCTrackHistITSTPC(0)\r
-{\r
-  // default constructor\r
-  Init();\r
-}\r
-\r
-//_____________________________________________________________________________\r
-AlidNdPtEfficiency::AlidNdPtEfficiency(Char_t* name, Char_t* title): AlidNdPt(name,title),\r
-  fAnalysisFolder(0),\r
-  fRecMCTrackHistTPCITS(0),\r
-  fRecMCTrackHistITSTPC(0)\r
-{\r
-  // constructor\r
-  Init();\r
-}\r
-\r
-//_____________________________________________________________________________\r
-AlidNdPtEfficiency::~AlidNdPtEfficiency() {\r
-  // \r
-  if(fRecMCTrackHistTPCITS) delete fRecMCTrackHistTPCITS; fRecMCTrackHistTPCITS=0;\r
-  if(fRecMCTrackHistITSTPC) delete fRecMCTrackHistITSTPC; fRecMCTrackHistITSTPC=0;\r
-\r
-  if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;\r
-}\r
-\r
-//_____________________________________________________________________________\r
-void AlidNdPtEfficiency::Init(){\r
-  //\r
-  // Init histograms\r
-  //\r
-  const Int_t ptNbins = 63; \r
-  const Double_t ptMin = 0.; \r
-  const Double_t ptMax = 20.; \r
-\r
-  Double_t binsPt[ptNbins+1] = {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,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,18.0, 20.,25.,30.,35.,40.,50};\r
-\r
-  // \r
-  // THnSparse track histograms\r
-  //\r
-\r
-  // TPC -> ITS matching efficiency\r
-  // eta:phi:pt:isPrim:charge:isMatch:isTPC\r
-  Int_t binsRecMCTrackHistTPCITS[7]=  { 30,  90,             ptNbins, 2,   3,  2,  2  };\r
-  Double_t minRecMCTrackHistTPCITS[7]={-1.5, 0.,             ptMin,   0., -1., 0., 0. };\r
-  Double_t maxRecMCTrackHistTPCITS[7]={ 1.5, 2.*TMath::Pi(), ptMax,   2.,  2., 2., 2. };\r
-\r
-  fRecMCTrackHistTPCITS = new THnSparseF("fRecMCTrackHistTPCITS","eta:phi:pt:isPrim:charge:isMatch:isTPC",7,binsRecMCTrackHistTPCITS,minRecMCTrackHistTPCITS,maxRecMCTrackHistTPCITS);\r
-  fRecMCTrackHistTPCITS->SetBinEdges(2,binsPt);\r
-  fRecMCTrackHistTPCITS->GetAxis(0)->SetTitle("#eta");\r
-  fRecMCTrackHistTPCITS->GetAxis(1)->SetTitle("#phi (rad)");\r
-  fRecMCTrackHistTPCITS->GetAxis(2)->SetTitle("p_{T} (GeV/c)");\r
-  fRecMCTrackHistTPCITS->GetAxis(3)->SetTitle("isPrim");\r
-  fRecMCTrackHistTPCITS->GetAxis(4)->SetTitle("charge");\r
-  fRecMCTrackHistTPCITS->GetAxis(5)->SetTitle("isMatch");\r
-  fRecMCTrackHistTPCITS->GetAxis(6)->SetTitle("isTPC");\r
-  fRecMCTrackHistTPCITS->Sumw2();\r
-\r
-  // ITS -> TPC matching efficiency\r
-  // eta:phi:pt:isPrim:charge:isMatch\r
-  Int_t binsRecMCTrackHistITSTPC[6]=  { 30,  90,             ptNbins,   2,   3,  2 };\r
-  Double_t minRecMCTrackHistITSTPC[6]={-1.5, 0.,             ptMin,     0., -1., 0 };\r
-  Double_t maxRecMCTrackHistITSTPC[6]={ 1.5, 2.*TMath::Pi(), ptMax,     2.,  2., 2.};\r
-\r
-  fRecMCTrackHistITSTPC = new THnSparseF("fRecMCTrackHistITSTPC","eta:phi:pt:isPrim:charge:isMatch",6,binsRecMCTrackHistITSTPC,minRecMCTrackHistITSTPC,maxRecMCTrackHistITSTPC);\r
-  fRecMCTrackHistITSTPC->SetBinEdges(2,binsPt);\r
-  fRecMCTrackHistITSTPC->GetAxis(0)->SetTitle("#eta");\r
-  fRecMCTrackHistITSTPC->GetAxis(1)->SetTitle("#phi (rad)");\r
-  fRecMCTrackHistITSTPC->GetAxis(2)->SetTitle("p_{T} (GeV/c)");\r
-  fRecMCTrackHistITSTPC->GetAxis(3)->SetTitle("isPrim");\r
-  fRecMCTrackHistITSTPC->GetAxis(4)->SetTitle("charge");\r
-  fRecMCTrackHistITSTPC->GetAxis(5)->SetTitle("isMatch");\r
-  fRecMCTrackHistITSTPC->Sumw2();\r
-\r
-  // init output folder\r
-  fAnalysisFolder = CreateFolder("folderdNdPt","Analysis dNdPt Folder");\r
-}\r
-\r
-//_____________________________________________________________________________\r
-void AlidNdPtEfficiency::Process(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent)\r
-{\r
-  //\r
-  // Process real and/or simulated events\r
-  //\r
-  if(!esdEvent) {\r
-    AliDebug(AliLog::kError, "esdEvent not available");\r
-    return;\r
-  }\r
-\r
-  // get selection cuts\r
-  AlidNdPtEventCuts *evtCuts      = GetEventCuts(); \r
-  AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts(); \r
-  AliESDtrackCuts *esdTrackCuts   = GetTrackCuts(); \r
-\r
-  if(!evtCuts || !accCuts  || !esdTrackCuts) {\r
-    AliDebug(AliLog::kError, "cuts not available");\r
-    return;\r
-  }\r
-\r
-   \r
-\r
-  // trigger selection\r
-  Bool_t isEventTriggered = kTRUE;\r
-   \r
-  // use MC information\r
-  AliHeader* header = 0;\r
-  AliGenEventHeader* genHeader = 0;\r
-  AliStack* stack = 0;\r
-  TArrayF vtxMC(3);\r
-\r
-  Int_t multMCTrueTracks = 0;\r
-  if(IsUseMCInfo())\r
-  {\r
-    //\r
-    if(!mcEvent) {\r
-      AliDebug(AliLog::kError, "mcEvent not available");\r
-      return;\r
-    }\r
-    // get MC event header\r
-    header = mcEvent->Header();\r
-    if (!header) {\r
-      AliDebug(AliLog::kError, "Header not available");\r
-      return;\r
-    }\r
-    // MC particle stack\r
-    stack = mcEvent->Stack();\r
-    if (!stack) {\r
-      AliDebug(AliLog::kError, "Stack not available");\r
-      return;\r
-    }\r
-\r
-    // get MC vertex\r
-    genHeader = header->GenEventHeader();\r
-    if (!genHeader) {\r
-      AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");\r
-      return;\r
-    }\r
-    genHeader->PrimaryVertex(vtxMC);\r
-\r
-    // multipliticy of all MC primary tracks\r
-    // in Zv, pt and eta ranges)\r
-    multMCTrueTracks = AlidNdPtHelper::GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);\r
-\r
-  } // end bUseMC\r
-\r
-  // get reconstructed vertex  \r
-  const AliESDVertex* vtxESD = 0; \r
-  if(evtCuts->IsRecVertexRequired()) \r
-  {\r
-     if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {\r
-        vtxESD = esdEvent->GetPrimaryVertexTPC();\r
-    }\r
-    else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {\r
-      vtxESD = esdEvent->GetPrimaryVertexTracks();\r
-    }\r
-    else {\r
-       return;\r
-    }\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
-\r
-  TObjArray *allChargedTracks=0;\r
-  //printf("isEventOK %d, isEventTriggered %d \n",isEventOK,isEventTriggered);\r
-\r
-  // check event cuts\r
-  if(isEventOK && isEventTriggered)\r
-  {\r
-    // get all charged tracks\r
-    allChargedTracks = AlidNdPtHelper::GetAllChargedTracks(esdEvent,GetAnalysisMode());\r
-    if(!allChargedTracks) return;\r
-\r
-    Int_t entries = allChargedTracks->GetEntries();\r
-    Bool_t isTPC = kFALSE;\r
-    Bool_t isMatch = kFALSE;\r
-\r
-    // TPC -> ITS prolongation efficiency\r
-    for(Int_t iTrack=0; iTrack<entries;++iTrack) \r
-    {\r
-      AliESDtrack *track = (AliESDtrack*)allChargedTracks->At(iTrack);\r
-      if(!track) continue;\r
-\r
-      isTPC = kFALSE;\r
-\r
-      if(track->Charge()==0) continue;\r
-      if(!track->GetTPCInnerParam()) continue;\r
-      if(!(track->GetStatus()&AliESDtrack::kTPCrefit)) continue;\r
-\r
-      // check loose cuts for TPC tracks\r
-      if(!esdTrackCuts->AcceptTrack(track))  { continue; } \r
-\r
-      isTPC = kTRUE;\r
-      isMatch = kFALSE;\r
-      if( (track->GetStatus()&AliESDtrack::kITSrefit) && \r
-         (track->HasPointOnITSLayer(0) || track->HasPointOnITSLayer(1)) ) \r
-      {\r
-        isMatch = kTRUE;\r
-      }\r
-\r
-      //\r
-      FillHistograms(track, stack, isMatch, isTPC, kFALSE);\r
-      //if(tpcTrack) delete tpcTrack;\r
-    } \r
-\r
-    //\r
-    // ITS -> TPC prolongation efficiency\r
-    //\r
-    for(Int_t iTrack=0; iTrack<entries;++iTrack) \r
-    {\r
-      AliESDtrack *track = (AliESDtrack*)allChargedTracks->At(iTrack);\r
-      if(!track) continue;\r
-\r
-      //\r
-      // ITS stand alone tracks\r
-      //\r
-      if(!(track->GetStatus() & AliESDtrack::kITSpureSA)) continue;\r
-      if(!(track->GetStatus() & AliESDtrack::kITSrefit)) continue;\r
-      if(track->GetNcls(0)<4) continue;\r
-      if(!track->HasPointOnITSLayer(0) && !track->HasPointOnITSLayer(1)) continue;\r
-\r
-      // Check matching with TPC only track\r
-      for(Int_t jTrack=0; jTrack<entries;++jTrack) \r
-      {\r
-        isMatch = kFALSE;\r
-\r
-        if(iTrack==jTrack) continue;\r
-\r
-        AliESDtrack *track2 = (AliESDtrack*)allChargedTracks->At(jTrack);\r
-        if(!track2) continue;\r
-        if(track2->Charge()==0) continue;\r
-       if(!track2->GetTPCInnerParam()) continue;\r
-        if(!(track2->GetStatus() & AliESDtrack::kTPCrefit)) continue;\r
-\r
-        // Get TPC only tracks (must be deleted by user) \r
-        AliESDtrack* tpcTrack2 = AliESDtrackCuts::GetTPCOnlyTrack(esdEvent, jTrack);\r
-        if(!tpcTrack2) continue;\r
-        if(!tpcTrack2->RelateToVertex(vtxESD,esdEvent->GetMagneticField(),100.)) { delete tpcTrack2; continue; } \r
-\r
-        // check loose cuts for TPC tracks\r
-        if(!esdTrackCuts->AcceptTrack(tpcTrack2)) { delete tpcTrack2; continue; }\r
-\r
-        // check matching\r
-        if (TMath::Abs(track->GetY() - tpcTrack2->GetY()) > 3) { delete tpcTrack2; continue; }\r
-        if (TMath::Abs(track->GetSnp() - tpcTrack2->GetSnp()) > 0.2) { delete tpcTrack2; continue; }\r
-        if (TMath::Abs(track->GetTgl() - tpcTrack2->GetTgl()) > 0.2) { delete tpcTrack2; continue; }\r
-\r
-       isMatch = kTRUE;\r
-       if(tpcTrack2) { \r
-         delete tpcTrack2;\r
-       }\r
-         break;\r
-      }\r
-\r
-       //\r
-       FillHistograms(track, stack, isMatch, kFALSE, kTRUE);\r
-    } \r
-  }\r
-\r
-  if(allChargedTracks) delete allChargedTracks; allChargedTracks = 0;\r
-\r
-}\r
-\r
-//_____________________________________________________________________________\r
-void AlidNdPtEfficiency::FillHistograms(AliESDtrack *const esdTrack, AliStack *const stack, const Bool_t isMatch, const Bool_t isTPC,  const Bool_t isITSTPC) const\r
-{\r
-  //\r
-  // Fill ESD track and MC histograms \r
-  //\r
-  if(!esdTrack) return;\r
-  Int_t charge = esdTrack->Charge();\r
-  if(charge == 0.) return;\r
-\r
-  Float_t pt = esdTrack->Pt();\r
-  Float_t eta = esdTrack->Eta();\r
-  Float_t phi = esdTrack->Phi();\r
-\r
-  //\r
-  // Fill rec vs MC information\r
-  //\r
-  Bool_t isPrim = kTRUE;\r
-\r
-  if(IsUseMCInfo()) {\r
-    if(!stack) return;\r
-    Int_t label = esdTrack->GetLabel(); \r
-    if(label < 0.) return; // fake ITS track\r
-    TParticle* particle = stack->Particle(label);\r
-    if(!particle) return;\r
-    if(particle->GetPDG() && particle->GetPDG()->Charge()==0.) return;\r
-    isPrim = stack->IsPhysicalPrimary(label);\r
-  }\r
-\r
-  // fill histo\r
-  Double_t vRecMCTrackHist[6] = { eta,phi,pt,isPrim,charge,isMatch }; \r
-  Double_t vRecMCTrackHistTPCITS[7] = { eta,phi,pt,isPrim,charge,isMatch,isTPC }; \r
-\r
-  if(isITSTPC) {\r
-    fRecMCTrackHistITSTPC->Fill(vRecMCTrackHist);\r
-  }\r
-  else {\r
-    fRecMCTrackHistTPCITS->Fill(vRecMCTrackHistTPCITS);\r
-  }\r
-}\r
-\r
-//_____________________________________________________________________________\r
-Long64_t AlidNdPtEfficiency::Merge(TCollection* const list) \r
-{\r
-  // Merge list of objects (needed by PROOF)\r
-\r
-  if (!list)\r
-  return 0;\r
-\r
-  if (list->IsEmpty())\r
-  return 1;\r
-\r
-  TIterator* iter = list->MakeIterator();\r
-  TObject* obj = 0;\r
-\r
-  // collection of generated histograms\r
-  Int_t count=0;\r
-  while((obj = iter->Next()) != 0) {\r
-    AlidNdPtEfficiency* entry = dynamic_cast<AlidNdPtEfficiency*>(obj);\r
-    if (entry == 0) continue; \r
-  \r
-    // track histo\r
-    fRecMCTrackHistTPCITS->Add(entry->fRecMCTrackHistTPCITS);\r
-    fRecMCTrackHistITSTPC->Add(entry->fRecMCTrackHistITSTPC);\r
-\r
-  count++;\r
-  }\r
-\r
-return count;\r
-}\r
-\r
-//_____________________________________________________________________________\r
-void AlidNdPtEfficiency::Analyse() \r
-{\r
-  //\r
-  // Analyse histograms\r
-  //\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
-\r
-\r
-  //\r
-  // get cuts\r
-  //\r
-  AlidNdPtEventCuts *evtCuts = GetEventCuts(); \r
-  AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts(); \r
-  AliESDtrackCuts *esdTrackCuts = GetTrackCuts(); \r
-\r
-  if(!evtCuts || !accCuts || !esdTrackCuts) {\r
-    Error("AlidNdPtEfficiency::Analyse()", "cuts not available");\r
-    return;\r
-  }\r
-\r
-  //\r
-  // TPC->ITS efficiency\r
-  //\r
-\r
-  //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
-  aFolderObj->Add(h1Dc);\r
-  fRecMCTrackHistTPCITS->GetAxis(5)->SetRange(1,2);  \r
-  fRecMCTrackHistTPCITS->GetAxis(6)->SetRange(1,2);  \r
-\r
-  //eff vs phi\r
-  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
-  aFolderObj->Add(h1Dc);\r
-  fRecMCTrackHistTPCITS->GetAxis(5)->SetRange(1,2);  \r
-  fRecMCTrackHistTPCITS->GetAxis(6)->SetRange(1,2);  \r
-\r
-  //eff vs pT\r
-  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
-  aFolderObj->Add(h1Dc);\r
-  fRecMCTrackHistTPCITS->GetAxis(5)->SetRange(1,2);  \r
-  fRecMCTrackHistTPCITS->GetAxis(6)->SetRange(1,2);  \r
-\r
-\r
-  //\r
-  // ITS->TPC efficiency\r
-  //\r
-\r
-  fRecMCTrackHistITSTPC->GetAxis(0)->SetRangeUser(-1.5, 1.499);  \r
-  fRecMCTrackHistITSTPC->GetAxis(5)->SetRange(1,2);  \r
-\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
-  aFolderObj->Add(h1Dc);\r
-  fRecMCTrackHistITSTPC->GetAxis(5)->SetRange(1,2);  \r
-\r
-  //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
-  aFolderObj->Add(h1Dc);\r
-  fRecMCTrackHistITSTPC->GetAxis(5)->SetRange(1,2);  \r
-\r
-  //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
-  aFolderObj->Add(h1Dc);\r
-  fRecMCTrackHistITSTPC->GetAxis(5)->SetRange(1,2);  \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
-}\r
-\r
-//_____________________________________________________________________________\r
-TFolder* AlidNdPtEfficiency::ExportToFolder(TObjArray * const array) \r
-{\r
-  // recreate folder avery time and export objects to new one\r
-  //\r
-  AlidNdPtEfficiency * comp=this;\r
-  TFolder *folder = comp->GetAnalysisFolder();\r
-\r
-  TString name, title;\r
-  TFolder *newFolder = 0;\r
-  Int_t i = 0;\r
-  Int_t size = array->GetSize();\r
-\r
-  if(folder) { \r
-     // get name and title from old folder\r
-     name = folder->GetName();  \r
-     title = folder->GetTitle();  \r
-\r
-        // delete old one\r
-     delete folder;\r
-\r
-        // create new one\r
-     newFolder = CreateFolder(name.Data(),title.Data());\r
-     newFolder->SetOwner();\r
-\r
-        // add objects to folder\r
-     while(i < size) {\r
-          newFolder->Add(array->At(i));\r
-          i++;\r
-        }\r
-  }\r
-\r
-return newFolder;\r
-}\r
-\r
-//_____________________________________________________________________________\r
-TFolder* AlidNdPtEfficiency::CreateFolder(TString name,TString title) { \r
-// create folder for analysed histograms\r
-//\r
-TFolder *folder = 0;\r
-  folder = new TFolder(name.Data(),title.Data());\r
-\r
-  return folder;\r
-}\r
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+//------------------------------------------------------------------------------
+// AlidNdPtEfficiency class. 
+//
+// a. functionality:
+// - fills generic cut histograms
+// - generates cuts (selection criteria)
+//
+// b. data members:
+// - generic cut histograms
+// - control histograms
+//
+// Author: J.Otwinowski 18/11/2010 
+//------------------------------------------------------------------------------
+#include "TH1.h"
+#include "TH2.h"
+
+#include "AliHeader.h"  
+#include "AliGenEventHeader.h"  
+#include "AliStack.h"  
+#include "AliESDEvent.h"  
+#include "AliMCEvent.h"  
+#include "AliESDtrackCuts.h"  
+#include "AliLog.h" 
+#include "AliTracker.h" 
+
+#include "AlidNdPtEventCuts.h"
+#include "AlidNdPtAcceptanceCuts.h"
+#include "AlidNdPtBackgroundCuts.h"
+#include "AlidNdPtAnalysis.h"
+#include "AliPhysicsSelection.h"
+
+#include "AliPWG0Helper.h"
+#include "AlidNdPtHelper.h"
+#include "AlidNdPtEfficiency.h"
+
+using namespace std;
+
+ClassImp(AlidNdPtEfficiency)
+
+//_____________________________________________________________________________
+  AlidNdPtEfficiency::AlidNdPtEfficiency(): AlidNdPt(),
+  fAnalysisFolder(0),
+  fRecMCTrackHistTPCITS(0),
+  fRecMCTrackHistITSTPC(0)
+{
+  // default constructor
+  Init();
+}
+
+//_____________________________________________________________________________
+AlidNdPtEfficiency::AlidNdPtEfficiency(Char_t* name, Char_t* title): AlidNdPt(name,title),
+  fAnalysisFolder(0),
+  fRecMCTrackHistTPCITS(0),
+  fRecMCTrackHistITSTPC(0)
+{
+  // constructor
+  Init();
+}
+
+//_____________________________________________________________________________
+AlidNdPtEfficiency::~AlidNdPtEfficiency() {
+  // 
+  if(fRecMCTrackHistTPCITS) delete fRecMCTrackHistTPCITS; fRecMCTrackHistTPCITS=0;
+  if(fRecMCTrackHistITSTPC) delete fRecMCTrackHistITSTPC; fRecMCTrackHistITSTPC=0;
+
+  if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;
+}
+
+//_____________________________________________________________________________
+void AlidNdPtEfficiency::Init(){
+  //
+  // Init histograms
+  //
+  const Int_t ptNbins = 63; 
+  const Double_t ptMin = 0.; 
+  const Double_t ptMax = 20.; 
+
+  Double_t binsPt[ptNbins+1] = {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,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,18.0, 20.,25.,30.,35.,40.,50};
+
+  // 
+  // THnSparse track histograms
+  //
+
+  // TPC -> ITS matching efficiency
+  // eta:phi:pt:isPrim:charge:isMatch:isTPC
+  Int_t binsRecMCTrackHistTPCITS[7]=  { 30,  90,             ptNbins, 2,   3,  2,  2  };
+  Double_t minRecMCTrackHistTPCITS[7]={-1.5, 0.,             ptMin,   0., -1., 0., 0. };
+  Double_t maxRecMCTrackHistTPCITS[7]={ 1.5, 2.*TMath::Pi(), ptMax,   2.,  2., 2., 2. };
+
+  fRecMCTrackHistTPCITS = new THnSparseF("fRecMCTrackHistTPCITS","eta:phi:pt:isPrim:charge:isMatch:isTPC",7,binsRecMCTrackHistTPCITS,minRecMCTrackHistTPCITS,maxRecMCTrackHistTPCITS);
+  fRecMCTrackHistTPCITS->SetBinEdges(2,binsPt);
+  fRecMCTrackHistTPCITS->GetAxis(0)->SetTitle("#eta");
+  fRecMCTrackHistTPCITS->GetAxis(1)->SetTitle("#phi (rad)");
+  fRecMCTrackHistTPCITS->GetAxis(2)->SetTitle("p_{T} (GeV/c)");
+  fRecMCTrackHistTPCITS->GetAxis(3)->SetTitle("isPrim");
+  fRecMCTrackHistTPCITS->GetAxis(4)->SetTitle("charge");
+  fRecMCTrackHistTPCITS->GetAxis(5)->SetTitle("isMatch");
+  fRecMCTrackHistTPCITS->GetAxis(6)->SetTitle("isTPC");
+  fRecMCTrackHistTPCITS->Sumw2();
+
+  // ITS -> TPC matching efficiency
+  // eta:phi:pt:isPrim:charge:isMatch
+  Int_t binsRecMCTrackHistITSTPC[6]=  { 30,  90,             ptNbins,   2,   3,  2 };
+  Double_t minRecMCTrackHistITSTPC[6]={-1.5, 0.,             ptMin,     0., -1., 0 };
+  Double_t maxRecMCTrackHistITSTPC[6]={ 1.5, 2.*TMath::Pi(), ptMax,     2.,  2., 2.};
+
+  fRecMCTrackHistITSTPC = new THnSparseF("fRecMCTrackHistITSTPC","eta:phi:pt:isPrim:charge:isMatch",6,binsRecMCTrackHistITSTPC,minRecMCTrackHistITSTPC,maxRecMCTrackHistITSTPC);
+  fRecMCTrackHistITSTPC->SetBinEdges(2,binsPt);
+  fRecMCTrackHistITSTPC->GetAxis(0)->SetTitle("#eta");
+  fRecMCTrackHistITSTPC->GetAxis(1)->SetTitle("#phi (rad)");
+  fRecMCTrackHistITSTPC->GetAxis(2)->SetTitle("p_{T} (GeV/c)");
+  fRecMCTrackHistITSTPC->GetAxis(3)->SetTitle("isPrim");
+  fRecMCTrackHistITSTPC->GetAxis(4)->SetTitle("charge");
+  fRecMCTrackHistITSTPC->GetAxis(5)->SetTitle("isMatch");
+  fRecMCTrackHistITSTPC->Sumw2();
+
+  // init output folder
+  fAnalysisFolder = CreateFolder("folderdNdPt","Analysis dNdPt Folder");
+}
+
+//_____________________________________________________________________________
+void AlidNdPtEfficiency::Process(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent)
+{
+  //
+  // Process real and/or simulated events
+  //
+  if(!esdEvent) {
+    AliDebug(AliLog::kError, "esdEvent not available");
+    return;
+  }
+
+  // get selection cuts
+  AlidNdPtEventCuts *evtCuts      = GetEventCuts(); 
+  AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts(); 
+  AliESDtrackCuts *esdTrackCuts   = GetTrackCuts(); 
+
+  if(!evtCuts || !accCuts  || !esdTrackCuts) {
+    AliDebug(AliLog::kError, "cuts not available");
+    return;
+  }
+
+   
+
+  // trigger selection
+  Bool_t isEventTriggered = kTRUE;
+   
+  // use MC information
+  AliHeader* header = 0;
+  AliGenEventHeader* genHeader = 0;
+  AliStack* stack = 0;
+  TArrayF vtxMC(3);
+
+  Int_t multMCTrueTracks = 0;
+  if(IsUseMCInfo())
+  {
+    //
+    if(!mcEvent) {
+      AliDebug(AliLog::kError, "mcEvent not available");
+      return;
+    }
+    // get MC event header
+    header = mcEvent->Header();
+    if (!header) {
+      AliDebug(AliLog::kError, "Header not available");
+      return;
+    }
+    // MC particle stack
+    stack = mcEvent->Stack();
+    if (!stack) {
+      AliDebug(AliLog::kError, "Stack not available");
+      return;
+    }
+
+    // get MC vertex
+    genHeader = header->GenEventHeader();
+    if (!genHeader) {
+      AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
+      return;
+    }
+    genHeader->PrimaryVertex(vtxMC);
+
+    // multipliticy of all MC primary tracks
+    // in Zv, pt and eta ranges)
+    multMCTrueTracks = AlidNdPtHelper::GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);
+
+  } // end bUseMC
+
+  // get reconstructed vertex  
+  const AliESDVertex* vtxESD = 0; 
+  if(evtCuts->IsRecVertexRequired()) 
+  {
+     if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {
+        vtxESD = esdEvent->GetPrimaryVertexTPC();
+    }
+    else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {
+      vtxESD = esdEvent->GetPrimaryVertexTracks();
+    }
+    else {
+       return;
+    }
+  }
+  Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD); 
+  //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);
+  //printf("GetAnalysisMode() %d \n",GetAnalysisMode());
+
+  TObjArray *allChargedTracks=0;
+  //printf("isEventOK %d, isEventTriggered %d \n",isEventOK,isEventTriggered);
+
+  // check event cuts
+  if(isEventOK && isEventTriggered)
+  {
+    // get all charged tracks
+    allChargedTracks = AlidNdPtHelper::GetAllChargedTracks(esdEvent,GetAnalysisMode());
+    if(!allChargedTracks) return;
+
+    Int_t entries = allChargedTracks->GetEntries();
+    Bool_t isTPC = kFALSE;
+    Bool_t isMatch = kFALSE;
+
+    // TPC -> ITS prolongation efficiency
+    for(Int_t iTrack=0; iTrack<entries;++iTrack) 
+    {
+      AliESDtrack *track = (AliESDtrack*)allChargedTracks->At(iTrack);
+      if(!track) continue;
+
+      isTPC = kFALSE;
+
+      if(track->Charge()==0) continue;
+      if(!track->GetTPCInnerParam()) continue;
+      if(!(track->GetStatus()&AliESDtrack::kTPCrefit)) continue;
+
+      // check loose cuts for TPC tracks
+      if(!esdTrackCuts->AcceptTrack(track))  { continue; } 
+
+      isTPC = kTRUE;
+      isMatch = kFALSE;
+      if( (track->GetStatus()&AliESDtrack::kITSrefit) && 
+         (track->HasPointOnITSLayer(0) || track->HasPointOnITSLayer(1)) ) 
+      {
+        isMatch = kTRUE;
+      }
+
+      //
+      FillHistograms(track, stack, isMatch, isTPC, kFALSE);
+      //if(tpcTrack) delete tpcTrack;
+    } 
+
+    //
+    // ITS -> TPC prolongation efficiency
+    //
+    for(Int_t iTrack=0; iTrack<entries;++iTrack) 
+    {
+      AliESDtrack *track = (AliESDtrack*)allChargedTracks->At(iTrack);
+      if(!track) continue;
+
+      //
+      // ITS stand alone tracks
+      //
+      if(!(track->GetStatus() & AliESDtrack::kITSpureSA)) continue;
+      if(!(track->GetStatus() & AliESDtrack::kITSrefit)) continue;
+      if(track->GetNcls(0)<4) continue;
+      if(!track->HasPointOnITSLayer(0) && !track->HasPointOnITSLayer(1)) continue;
+
+      // Check matching with TPC only track
+      for(Int_t jTrack=0; jTrack<entries;++jTrack) 
+      {
+        isMatch = kFALSE;
+
+        if(iTrack==jTrack) continue;
+
+        AliESDtrack *track2 = (AliESDtrack*)allChargedTracks->At(jTrack);
+        if(!track2) continue;
+        if(track2->Charge()==0) continue;
+       if(!track2->GetTPCInnerParam()) continue;
+        if(!(track2->GetStatus() & AliESDtrack::kTPCrefit)) continue;
+
+        // Get TPC only tracks (must be deleted by user) 
+        AliESDtrack* tpcTrack2 = AliESDtrackCuts::GetTPCOnlyTrack(esdEvent, jTrack);
+        if(!tpcTrack2) continue;
+        if(!tpcTrack2->RelateToVertex(vtxESD,esdEvent->GetMagneticField(),100.)) { delete tpcTrack2; continue; } 
+
+        // check loose cuts for TPC tracks
+        if(!esdTrackCuts->AcceptTrack(tpcTrack2)) { delete tpcTrack2; continue; }
+
+        // check matching
+        if (TMath::Abs(track->GetY() - tpcTrack2->GetY()) > 3) { delete tpcTrack2; continue; }
+        if (TMath::Abs(track->GetSnp() - tpcTrack2->GetSnp()) > 0.2) { delete tpcTrack2; continue; }
+        if (TMath::Abs(track->GetTgl() - tpcTrack2->GetTgl()) > 0.2) { delete tpcTrack2; continue; }
+
+       isMatch = kTRUE;
+       if(tpcTrack2) { 
+         delete tpcTrack2;
+       }
+         break;
+      }
+
+       //
+       FillHistograms(track, stack, isMatch, kFALSE, kTRUE);
+    } 
+  }
+
+  if(allChargedTracks) delete allChargedTracks; allChargedTracks = 0;
+
+}
+
+//_____________________________________________________________________________
+void AlidNdPtEfficiency::FillHistograms(AliESDtrack *const esdTrack, AliStack *const stack, const Bool_t isMatch, const Bool_t isTPC,  const Bool_t isITSTPC) const
+{
+  //
+  // Fill ESD track and MC histograms 
+  //
+  if(!esdTrack) return;
+  Int_t charge = esdTrack->Charge();
+  if(charge == 0.) return;
+
+  Float_t pt = esdTrack->Pt();
+  Float_t eta = esdTrack->Eta();
+  Float_t phi = esdTrack->Phi();
+
+  //
+  // Fill rec vs MC information
+  //
+  Bool_t isPrim = kTRUE;
+
+  if(IsUseMCInfo()) {
+    if(!stack) return;
+    Int_t label = esdTrack->GetLabel(); 
+    if(label < 0.) return; // fake ITS track
+    TParticle* particle = stack->Particle(label);
+    if(!particle) return;
+    if(particle->GetPDG() && particle->GetPDG()->Charge()==0.) return;
+    isPrim = stack->IsPhysicalPrimary(label);
+  }
+
+  // fill histo
+  Double_t vRecMCTrackHist[6] = { eta,phi,pt,isPrim,charge,isMatch }; 
+  Double_t vRecMCTrackHistTPCITS[7] = { eta,phi,pt,isPrim,charge,isMatch,isTPC }; 
+
+  if(isITSTPC) {
+    fRecMCTrackHistITSTPC->Fill(vRecMCTrackHist);
+  }
+  else {
+    fRecMCTrackHistTPCITS->Fill(vRecMCTrackHistTPCITS);
+  }
+}
+
+//_____________________________________________________________________________
+Long64_t AlidNdPtEfficiency::Merge(TCollection* const list) 
+{
+  // Merge list of objects (needed by PROOF)
+
+  if (!list)
+  return 0;
+
+  if (list->IsEmpty())
+  return 1;
+
+  TIterator* iter = list->MakeIterator();
+  TObject* obj = 0;
+
+  // collection of generated histograms
+  Int_t count=0;
+  while((obj = iter->Next()) != 0) {
+    AlidNdPtEfficiency* entry = dynamic_cast<AlidNdPtEfficiency*>(obj);
+    if (entry == 0) continue; 
+  
+    // track histo
+    fRecMCTrackHistTPCITS->Add(entry->fRecMCTrackHistTPCITS);
+    fRecMCTrackHistITSTPC->Add(entry->fRecMCTrackHistITSTPC);
+
+  count++;
+  }
+
+return count;
+}
+
+//_____________________________________________________________________________
+void AlidNdPtEfficiency::Analyse() 
+{
+  //
+  // Analyse histograms
+  //
+  TH1::AddDirectory(kFALSE);
+  TObjArray *aFolderObj = new TObjArray;
+  if(!aFolderObj) return; 
+
+  TH1D *h1Dall = 0; 
+  TH1D *h1D = 0; 
+  TH1D *h1Dc = 0; 
+
+
+  //
+  // get cuts
+  //
+  AlidNdPtEventCuts *evtCuts = GetEventCuts(); 
+  AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts(); 
+  AliESDtrackCuts *esdTrackCuts = GetTrackCuts(); 
+
+  if(!evtCuts || !accCuts || !esdTrackCuts) {
+    Error("AlidNdPtEfficiency::Analyse()", "cuts not available");
+    return;
+  }
+
+  //
+  // TPC->ITS efficiency
+  //
+
+  //eff vs eta
+  fRecMCTrackHistTPCITS->GetAxis(6)->SetRange(2,2);  
+  h1Dall = (TH1D *)fRecMCTrackHistTPCITS->Projection(0);
+  if(!h1Dall) return;
+  fRecMCTrackHistTPCITS->GetAxis(5)->SetRange(2,2);  
+  h1D = (TH1D *)fRecMCTrackHistTPCITS->Projection(0);
+  if(!h1D) return;
+
+  h1Dc = (TH1D *)h1D->Clone("eff_vs_eta_TPCITS");
+  h1Dc->Divide(h1Dall);
+  aFolderObj->Add(h1Dc);
+  fRecMCTrackHistTPCITS->GetAxis(5)->SetRange(1,2);  
+  fRecMCTrackHistTPCITS->GetAxis(6)->SetRange(1,2);  
+
+  //eff vs phi
+  fRecMCTrackHistTPCITS->GetAxis(6)->SetRange(2,2);  
+  fRecMCTrackHistTPCITS->GetAxis(0)->SetRangeUser(-0.8, 0.799);  
+  h1Dall = (TH1D *)fRecMCTrackHistTPCITS->Projection(1);
+  if(!h1Dall) return;
+  fRecMCTrackHistTPCITS->GetAxis(5)->SetRange(2,2);  
+  h1D = (TH1D *)fRecMCTrackHistTPCITS->Projection(1);
+  if(!h1D) return;
+
+  h1Dc = (TH1D *)h1D->Clone("eff_vs_phi_TPCITS");
+  h1Dc->Divide(h1Dall);
+  aFolderObj->Add(h1Dc);
+  fRecMCTrackHistTPCITS->GetAxis(5)->SetRange(1,2);  
+  fRecMCTrackHistTPCITS->GetAxis(6)->SetRange(1,2);  
+
+  //eff vs pT
+  fRecMCTrackHistTPCITS->GetAxis(6)->SetRange(2,2);  
+  fRecMCTrackHistTPCITS->GetAxis(0)->SetRangeUser(-0.8, 0.799);  
+  h1Dall = (TH1D *)fRecMCTrackHistTPCITS->Projection(2);
+  if(!h1Dall) return;
+  fRecMCTrackHistTPCITS->GetAxis(5)->SetRange(2,2);  
+  h1D = (TH1D *)fRecMCTrackHistTPCITS->Projection(2);
+  if(!h1D) return;
+
+  h1Dc = (TH1D *)h1D->Clone("eff_vs_pT_TPCITS");
+  h1Dc->Divide(h1Dall);
+  aFolderObj->Add(h1Dc);
+  fRecMCTrackHistTPCITS->GetAxis(5)->SetRange(1,2);  
+  fRecMCTrackHistTPCITS->GetAxis(6)->SetRange(1,2);  
+
+
+  //
+  // ITS->TPC efficiency
+  //
+
+  fRecMCTrackHistITSTPC->GetAxis(0)->SetRangeUser(-1.5, 1.499);  
+  fRecMCTrackHistITSTPC->GetAxis(5)->SetRange(1,2);  
+
+  //eff vs eta
+  h1Dall = (TH1D *)fRecMCTrackHistITSTPC->Projection(0);
+  if(!h1Dall) return;
+  fRecMCTrackHistITSTPC->GetAxis(5)->SetRange(2,2);  
+  h1D = (TH1D *)fRecMCTrackHistITSTPC->Projection(0);
+  if(!h1D) return;
+
+  h1Dc = (TH1D *)h1D->Clone("eff_vs_eta_ITSTPC");
+  h1Dc->Divide(h1Dall);
+  aFolderObj->Add(h1Dc);
+  fRecMCTrackHistITSTPC->GetAxis(5)->SetRange(1,2);  
+
+  //eff vs phi
+  fRecMCTrackHistITSTPC->GetAxis(0)->SetRangeUser(-0.8, 0.799);  
+  h1Dall = (TH1D *)fRecMCTrackHistITSTPC->Projection(1);
+  if(!h1Dall) return;
+  fRecMCTrackHistITSTPC->GetAxis(5)->SetRange(2,2);  
+  h1D = (TH1D *)fRecMCTrackHistITSTPC->Projection(1);
+  if(!h1D) return;
+
+  h1Dc = (TH1D *)h1D->Clone("eff_vs_phi_ITSTPC");
+  h1Dc->Divide(h1Dall);
+  aFolderObj->Add(h1Dc);
+  fRecMCTrackHistITSTPC->GetAxis(5)->SetRange(1,2);  
+
+  //eff vs pT
+  fRecMCTrackHistITSTPC->GetAxis(0)->SetRangeUser(-0.8, 0.799);  
+  h1Dall = (TH1D *)fRecMCTrackHistITSTPC->Projection(2);
+  if(!h1Dall) return;
+  fRecMCTrackHistITSTPC->GetAxis(5)->SetRange(2,2);  
+  h1D = (TH1D *)fRecMCTrackHistITSTPC->Projection(2);
+  if(!h1D) return;
+
+  h1Dc = (TH1D *)h1D->Clone("eff_vs_pT_ITSTPC");
+  h1Dc->Divide(h1Dall);
+  aFolderObj->Add(h1Dc);
+  fRecMCTrackHistITSTPC->GetAxis(5)->SetRange(1,2);  
+  
+  // export objects to analysis folder
+  fAnalysisFolder = ExportToFolder(aFolderObj);
+  if(!fAnalysisFolder) {
+    if(aFolderObj) delete aFolderObj;
+    return;
+  }
+
+  // delete only TObjArray
+  if(aFolderObj) delete aFolderObj;
+}
+
+//_____________________________________________________________________________
+TFolder* AlidNdPtEfficiency::ExportToFolder(TObjArray * const array) 
+{
+  // recreate folder avery time and export objects to new one
+  //
+  AlidNdPtEfficiency * comp=this;
+  TFolder *folder = comp->GetAnalysisFolder();
+
+  TString name, title;
+  TFolder *newFolder = 0;
+  Int_t i = 0;
+  Int_t size = array->GetSize();
+
+  if(folder) { 
+     // get name and title from old folder
+     name = folder->GetName();  
+     title = folder->GetTitle();  
+
+        // delete old one
+     delete folder;
+
+        // create new one
+     newFolder = CreateFolder(name.Data(),title.Data());
+     newFolder->SetOwner();
+
+        // add objects to folder
+     while(i < size) {
+          newFolder->Add(array->At(i));
+          i++;
+        }
+  }
+
+return newFolder;
+}
+
+//_____________________________________________________________________________
+TFolder* AlidNdPtEfficiency::CreateFolder(TString name,TString title) { 
+// create folder for analysed histograms
+//
+TFolder *folder = 0;
+  folder = new TFolder(name.Data(),title.Data());
+
+  return folder;
+}