]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Some updates to the UE task (Sara):
authorjgrosseo <jgrosseo@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 14 Oct 2010 16:51:25 +0000 (16:51 +0000)
committerjgrosseo <jgrosseo@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 14 Oct 2010 16:51:25 +0000 (16:51 +0000)
- updated track cut definition to split effect of tracks with SPD and SDD clusters
- AliAnalysisTaskCorrectionsUE contains analysis of amount of secondaries in data (DCA sideband fit)

PWG4/JetTasks/AliAnalyseLeadingTrackUE.cxx
PWG4/JetTasks/AliAnalyseLeadingTrackUE.h
PWG4/JetTasks/AliAnalysisTaskCorrectionsUE.cxx
PWG4/JetTasks/AliAnalysisTaskCorrectionsUE.h

index 8e16c2058a29fe64a89195210a891efc811c3891..4fbd1329c30ad9583f0bcc8ff8c9731fe47ff354 100644 (file)
@@ -69,7 +69,10 @@ AliAnalyseLeadingTrackUE::AliAnalyseLeadingTrackUE() :
   fDebug(0),
   fFilterBit(16),
   fOnlyHadrons(kFALSE),
-  fTrackEtaCut(0.8)
+  fTrackEtaCut(0.8),
+  fEsdTrackCuts(0x0), 
+  fEsdTrackCutsSPD(0x0), 
+  fEsdTrackCutsSDD(0x0) 
 {
   // constructor
 }
@@ -93,45 +96,34 @@ AliAnalyseLeadingTrackUE::~AliAnalyseLeadingTrackUE()
 
 
 //____________________________________________________________________
-Bool_t AliAnalyseLeadingTrackUE::ApplyCuts(TObject* track, Int_t filterbit)
+Bool_t AliAnalyseLeadingTrackUE::ApplyCuts(TObject* track)
 {
-  // Reproduces the cuts of the corresponding bit in the ESD->AOD filtering
-  // (see $ALICE_ROOT/ANALYSIS/macros/AddTaskESDFilter.C)
-
-  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts();
-  switch (filterbit){
-   /*case 16:
-   // tighter cuts on primary particles for high pT tracks
-   // needed as input for jetfinder 
-   esdTrackCuts->SetMinNClustersTPC(50);
-   esdTrackCuts->SetMaxChi2PerClusterTPC(3.5);
-   esdTrackCuts->SetRequireTPCRefit(kTRUE);
-   esdTrackCuts->SetMaxDCAToVertexXY(2.4);
-   esdTrackCuts->SetMaxDCAToVertexZ(3.2);
-   esdTrackCuts->SetDCAToVertex2D(kTRUE);
-   esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
-   esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
-   esdTrackCuts->SetRequireITSRefit(kTRUE); // additional cut 
-   break;
-   */
-
-   case 16:
-   esdTrackCuts->GetStandardITSTPCTrackCuts2009(kTRUE);
-   break;
-
-   default:
-   if (fDebug > 1) AliFatal("Set of cuts not defined");
-   break;
-   }
   
   // select track according to set of cuts
-  if (! esdTrackCuts->IsSelected(track) )return kFALSE;
-  
+  if (! fEsdTrackCuts->IsSelected(track) )return kFALSE;
+  if (!fEsdTrackCutsSPD->IsSelected(track) && fEsdTrackCutsSDD->IsSelected(track)) return kFALSE;
+
   return kTRUE;
 }
 
 
+//____________________________________________________________________
+void AliAnalyseLeadingTrackUE::DefineESDCuts(Int_t /*filterbit*/){
+  
+   // Reproduces the cuts of the corresponding bit in the ESD->AOD filtering
+   // (see $ALICE_ROOT/ANALYSIS/macros/AddTaskESDFilter.C)
 
+   fEsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010();
+   fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kNone);
+   // Add SPD requirement 
+   fEsdTrackCutsSPD = new AliESDtrackCuts("SPD", "Require 1 cluster in SPD");
+   fEsdTrackCutsSPD->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
+   // Add SDD requirement 
+   fEsdTrackCutsSDD = new AliESDtrackCuts("SDD", "Require 1 cluster in first layer SDD");
+   fEsdTrackCutsSDD->SetClusterRequirementITS(AliESDtrackCuts::kSDD,AliESDtrackCuts::kFirst);
+}
 
 
 //____________________________________________________________________
@@ -249,6 +241,9 @@ Int_t  AliAnalyseLeadingTrackUE::NParticles(TObject* obj)
   }else if (obj->InheritsFrom("AliESDEvent")){  // RECO ESD tracks
        AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(obj);
         nTracks = esdEvent->GetNumberOfTracks();
+  }else if (obj->InheritsFrom("AliMCEvent")){  // RECO ESD tracks
+       AliMCEvent *mcEvent = dynamic_cast<AliMCEvent*>(obj);
+        nTracks = mcEvent->GetNumberOfTracks();
   }else {
        if (fDebug > 1) AliFatal(" Analysis type not defined !!! ");
        return 0;
@@ -352,7 +347,7 @@ AliVParticle*  AliAnalyseLeadingTrackUE::ParticleWithCuts(TObject* obj, Int_t ip
         part = esdEvent->GetTrack(ipart);
        if (!part)return 0;
        // track selection cuts
-       if (!( ApplyCuts(part, fFilterBit)) )return 0; 
+       if (!( ApplyCuts(part)) )return 0; 
        
        // only primary candidates (does not exist for ESD tracks??????)
        //if ( ((AliAODTrack*)part)->IsPrimaryCandidate() )return 0;
index 9c5f823ce1c7f1528a32a4714e41b9b15e983aff..61c445aee4d4ef2cc1b56e53fcc889552bffddc2 100644 (file)
@@ -16,6 +16,7 @@
 class AliAODEvent;
 class AliAODInputHandler;
 class AliESDEvent;
+class AliESDtrackCuts;
 class AliAODTrack;
 class AliESDTrack;
 class AliGenPythiaEventHeader;
@@ -43,7 +44,8 @@ class AliAnalyseLeadingTrackUE : public TObject {
                                                                                             fOnlyHadrons = onlyhadrons;
                                                                                             fTrackEtaCut = etacut;     }
   void  SetDebug(Int_t debug) { fDebug = debug; } 
-  Bool_t         ApplyCuts(TObject* track, Int_t filterbit);                       // Reproduces the cuts of the corresponding bit in the ESD->AOD filtering
+  Bool_t         ApplyCuts(TObject* track);                       // Reproduces the cuts of the corresponding bit in the ESD->AOD filtering
+  void           DefineESDCuts(Int_t filterbit);                                 // Emulate filterbit
   TObjArray*     FindLeadingObjects(TObject* obj);                                 // Looks for leading track or MC particle
   TObjArray*     GetMinMaxRegion(TList* transv1, TList* transv2);                  // Sorts the transverse regions in MIN and MAX
   Int_t          NParticles(TObject *obj);                                         // Counts tracks or MC particles
@@ -59,6 +61,9 @@ class AliAnalyseLeadingTrackUE : public TObject {
   Int_t          fFilterBit;         // track selection cuts
   Bool_t         fOnlyHadrons;       // consider only charged Pions, Protons and Kaons 
   Double_t       fTrackEtaCut;       // pseudo-rapidity limit of transverse regions     
-    ClassDef(AliAnalyseLeadingTrackUE,0)
+  AliESDtrackCuts *fEsdTrackCuts;    // set of cuts when reading ESD
+  AliESDtrackCuts *fEsdTrackCutsSPD;    // set of cuts when reading ESD
+  AliESDtrackCuts *fEsdTrackCutsSDD;    // set of cuts when reading ESD
+  ClassDef(AliAnalyseLeadingTrackUE,0)
 };
 #endif
index c52e29a833e106cf043e3e7c3f529847611a872c..7c95938eb65eff265c11d29758b2032ab1ba1e9b 100644 (file)
 ////////////////////////////////////////////////////////////////////////
 //
 // Analysis class to Correct Underlying Event studies
-// (requires input AOD)
 //
-// Different analysis are performed according to input.
+// This class needs as input ESDs.\r
+// The output is an analysis-specific container.\r
 //
-// Run on MC:
-// - fraction of diffractive events after different cuts
-// - tracking efficiency and contamination
-// 
-// Run on DATA:
-// - fraction of events after different cuts
-// - vertex reconstruction efficiency
-//
-// vallero@physi.uni-heidelberg.de
+// The class is used to get the contamination from secondaries\r
+// from tracks DCA distribution \r
+// as function of track pT and pseudo-rapidity.\r
+// It provides additional information for the corrections \r
+// that can not be retrieved by the AliAnalysisTaskLeadingTackUE\r
+// task, which is running on AODs.\r
 // 
 ////////////////////////////////////////////////////////////////////////
 
 #include <TROOT.h>
 #include <TChain.h>
-#include <TCanvas.h>
-#include <TFile.h>
+//#include <TCanvas.h>\r
+//#include <TFile.h>\r
 #include <TList.h>
 #include <TMath.h>
-#include <TProfile.h>
+//#include <TProfile.h>\r
 #include <TTree.h>
-#include <TVector3.h>
+//#include <TVector3.h>\r
+#include <TH3F.h>\r
 
-#include "AliAnalyseUE.h"
+#include "AliAnalyseLeadingTrackUE.h"\r
+#include "AliAnalysisFilter.h"\r
 #include "AliAnalysisHelperJetTasks.h"
 #include "AliAnalysisManager.h"
 #include "AliAnalysisTaskCorrectionsUE.h"
 #include "AliAODHandler.h"
 #include "AliESDHandler.h"
 #include "AliESDtrack.h"
+#include "AliESDtrackCuts.h"\r
 #include "AliESDEvent.h"
 #include "AliAODInputHandler.h"
 #include "AliESDInputHandler.h"
 #include "AliCFManager.h"
 #include "AliGenDPMjetEventHeader.h"
 #include "AliGenPythiaEventHeader.h"
-#include "AliHistogramsUE.h"
 #include "AliInputEventHandler.h"
 #include "AliLog.h"
 #include "AliMCEventHandler.h"
 #include "AliAnalysisHelperJetTasks.h"
 
+class TCanvas;\r
+class TFile;\r
+class TProfile;\r
+class TVector3; \r
+\r
 ClassImp( AliAnalysisTaskCorrectionsUE)
 
 // Define global pointer
@@ -72,47 +76,33 @@ AliAnalysisTaskCorrectionsUE* AliAnalysisTaskCorrectionsUE::fgTaskCorrectionsUE=
 //____________________________________________________________________
 AliAnalysisTaskCorrectionsUE:: AliAnalysisTaskCorrectionsUE(const char* name):
 AliAnalysisTask(name,""),
-fAnaUE(0x0),
-fAOD(0x0), 
+fAnalyseUE(0x0),\r
+fDebug(0),\r
+fESDEvent(0x0),\r
 fESDHandler(0x0),
-fAODBranch("jets"),
-fCFManager(0x0),
-fDebug(0),
-fHistosUE(0x0),
 fInputHandler(0x0),
 fListOfHistos(0x0),  
+fMcEvent(0x0),\r
 fMcHandler(0x0),
-fMcEvent(0x0),
-fBinsPtInHist(30),     
-fIsNorm2Area(kTRUE),
-fMaxJetPtInHist(300.), 
-fMinJetPtInHist(0.),
-fConstrainDistance(kTRUE),
-fMinDistance(0.2),
-fSimulateChJetPt(kFALSE),
-fUseAliStack(kTRUE),
-fUseMCParticleBranch(kFALSE),
-fnTracksVertex(3),  // QA tracks pointing to principal vertex (= 3 default) 
-fZVertex(5.),
-fAnaType(1),         
-fConePosition(1),
-fConeRadius(0.7),
-fFilterBit(0xFF),
-fJetsOnFly(kFALSE),
-fRegionType(1),
-fUseChargeHadrons(kFALSE),
-fUseChPartJet(kFALSE),
-fUsePositiveCharge(kTRUE),
-fUseSingleCharge(kFALSE),
-fOrdering(1),
-fChJetPtMin(5.0),
-fJet1EtaCut(0.2),
-fJet2DeltaPhiCut(2.616),    // 150 degrees
-fJet2RatioPtCut(0.8),
-fJet3PtCut(15.),
+fMode(0),\r
+fOutCFcont(0x0),\r
+fhEntries(0x0),\r
+fhFakes(0x0),\r
+fhPtMCAll(0x0),\r
+fhPtMCPrim(0x0),\r
+fhPtMCSec(0x0),\r
+fhPtMCPrimFake(0x0),\r
+fhPtMCSecFake(0x0),\r
+fnTracksVertex(1),  // QA tracks pointing to principal vertex  \r
+fZVertex(10.),\r
+fhVertexContributors(0x0),\r
+fhVertexReso(0x0),\r
 fTrackEtaCut(0.9),
 fTrackPtCut(0.),
-fAvgTrials(1)
+fEsdTrackCuts(0x0),\r
+fEsdTrackCutsSPD(0x0),\r
+fEsdTrackCutsSDD(0x0),\r
+fEsdTrackCutsDCA(0x0)\r
 {
   // Default constructor
   // Define input and output slots here
@@ -120,59 +110,9 @@ fAvgTrials(1)
   DefineInput(0, TChain::Class());
   // Output slot #0 writes into a TList container
   DefineOutput(0, TList::Class());
-  DefineOutput(1, AliCFContainer::Class());
-
-}
 
-//____________________________________________________________________
-AliAnalysisTaskCorrectionsUE:: AliAnalysisTaskCorrectionsUE(const AliAnalysisTaskCorrectionsUE & original):
-AliAnalysisTask(),
-fAnaUE(original.fAnaUE),
-fAOD(original.fAOD),            
-fESDHandler(original.fESDHandler),            
-fAODBranch(original.fAODBranch),
-fCFManager(original.fCFManager),
-fDebug(original.fDebug),
-fHistosUE(original.fHistosUE),
-fInputHandler(original.fInputHandler),
-fListOfHistos(original.fListOfHistos),  
-fMcHandler(original.fMcHandler),
-fMcEvent(original.fMcEvent),
-fBinsPtInHist(original.fBinsPtInHist),     
-fIsNorm2Area(original.fIsNorm2Area),
-fMaxJetPtInHist(original.fMaxJetPtInHist), 
-fMinJetPtInHist(original.fMinJetPtInHist),
-fConstrainDistance(original.fConstrainDistance),
-fMinDistance(original.fMinDistance),
-fSimulateChJetPt(original.fSimulateChJetPt),
-fUseAliStack(original.fUseAliStack),
-fUseMCParticleBranch(original.fUseMCParticleBranch),
-fnTracksVertex(original.fnTracksVertex),  // QA tracks pointing to principal vertex (= 3 default) 
-fZVertex(original.fZVertex),
-fAnaType(original.fAnaType),         
-fConePosition(original.fConePosition),
-fConeRadius(original.fConeRadius),
-fFilterBit(original.fFilterBit),
-fJetsOnFly(original.fJetsOnFly),
-fRegionType(original.fRegionType),
-fUseChargeHadrons(original.fUseChargeHadrons),
-fUseChPartJet(original.fUseChPartJet),
-fUsePositiveCharge(original.fUsePositiveCharge),
-fUseSingleCharge(original.fUseSingleCharge),
-fOrdering(original.fOrdering),
-fChJetPtMin(original.fChJetPtMin),
-fJet1EtaCut(original.fJet1EtaCut),
-fJet2DeltaPhiCut(original.fJet2DeltaPhiCut),    // 150 degrees
-fJet2RatioPtCut(original.fJet2RatioPtCut),
-fJet3PtCut(original.fJet3PtCut),
-fTrackEtaCut(original.fTrackEtaCut),
-fTrackPtCut(original.fTrackPtCut),
-fAvgTrials(original.fAvgTrials)
-{
-  // Copy constructor
 }
 
-
 //______________________________________________________________
 AliAnalysisTaskCorrectionsUE & AliAnalysisTaskCorrectionsUE::operator = (const AliAnalysisTaskCorrectionsUE & /*source*/)
 {
@@ -180,31 +120,12 @@ AliAnalysisTaskCorrectionsUE & AliAnalysisTaskCorrectionsUE::operator = (const A
   return *this;
 }
 
+\r
+/************** INTERFACE METHODS *****************************/\r
+\r
 //______________________________________________________________
 Bool_t AliAnalysisTaskCorrectionsUE::Notify()
 {
-  //
-  // Implemented Notify() to read the cross sections
-  // and number of trials from pyxsec.root
-  // Copy from AliAnalysisTaskJFSystematics
-  fAvgTrials = 1;
-  TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
-  Float_t xsection = 0;
-  Float_t trials  = 1;
-  if(tree){
-       TFile *curfile = tree->GetCurrentFile();
-       if (!curfile) {
-               Error("Notify","No current file");
-               return kFALSE;
-               }
-       
-       AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,trials); 
-        fHistosUE->GetXsec()->Fill("<#sigma>",xsection);
-
-       // construct average trials
-       Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
-       if(trials>=nEntries && nEntries>0.)fAvgTrials = trials/nEntries;
-       }
   
   return kTRUE;
 
@@ -214,55 +135,58 @@ Bool_t AliAnalysisTaskCorrectionsUE::Notify()
 void AliAnalysisTaskCorrectionsUE::ConnectInputData(Option_t* /*option*/)
 {
   // Connect the input data  
-  
-  // We need AODs with tracks and jets.
-  // Since AODs can either be connected to the InputEventHandler 
-  // or to the OutputEventHandler ( the AOD is created by a previous task in the train )
-  // we need to check where it is and get the pointer to AODEvent in the right way
-  
-  // Delta AODs are also accepted
-  
  
   if (fDebug > 1) AliInfo("ConnectInputData() ");
   
   //Get the input handler
-  TObject* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
-
-  if( handler && handler->InheritsFrom("AliAODInputHandler") ) { // input AOD
-       fAOD = ((AliAODInputHandler*)handler)->GetEvent();
-       if(!fJetsOnFly){
-               if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODInputHandler");
-               }else{
-               if (fDebug > 1) AliInfo(" ==== Tracks from AliAODInputHandler / Jets on-the-fly");
-               }
-       } else {  //output AOD
-       handler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
-       if( handler && handler->InheritsFrom("AliAODHandler") ) {
-               fAOD = ((AliAODHandler*)handler)->GetAOD();
-               if (!fJetsOnFly){
-                       if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODHandler");
-                       } else {
-                       if (fDebug > 1) AliInfo(" ==== Tracks from AliAODHandler / Jets on-the-fly");
-                       }
-               }else {
-               AliFatal("I can't get any AOD Event Handler");
-               return;
-               }
-       }
-
-  //Get ESD input handler
-  AliInputEventHandler *inputHandler = dynamic_cast<AliInputEventHandler*>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
-   AliESDEvent *esdEvent = (AliESDEvent*)inputHandler->GetEvent();
-   if (!esdEvent && fDebug > 1) {
-       AliInfo("********************** No ESD event: cannot retrive DCA values from AOD !!! ");
-  }else fAnaUE->SetESDEvent(esdEvent);
+  fESDHandler = (AliESDInputHandler*)AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();\r
+  if ( !fESDHandler && fDebug > 0 ) {\r
+       AliFatal(" No ESD event handler connected !!! ");\r
+       return;\r
+       }\r
+
+  //Get ESD event\r
+   fESDEvent = (AliESDEvent*)fESDHandler->GetEvent();\r
+   if (!fESDEvent && fDebug > 1) {\r
+       AliFatal(" No ESD event retrieved !!! ");\r
+        return;\r
+       }\r
 
   //Get MC handler 
   fMcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
-  //Initialize AliAnalysisUE class
-  fAnaUE->Initialize(fAnaType, fAOD, fConeRadius, fDebug, fFilterBit, fJet1EtaCut, fJet2DeltaPhiCut, fJet2RatioPtCut, fJet3PtCut, fOrdering, fRegionType, fSimulateChJetPt, fTrackEtaCut, fTrackPtCut, fUseChargeHadrons, fUseChPartJet, fUsePositiveCharge, fUseSingleCharge, fHistosUE);
+  \r
+  // Define track cuts\r
+  fEsdTrackCuts = new AliESDtrackCuts("ITSTPC", "ITS+TPC standard 2009 cuts w.o. SPD cluster requirement nor DCA cut");\r
+  // TPC  \r
+  fEsdTrackCuts->SetRequireTPCStandAlone(kTRUE); // to get chi2 and ncls of kTPCin\r
+  fEsdTrackCuts->SetMinNClustersTPC(70);\r
+  //fEsdTrackCuts->SetMinNClustersTPC(90); // ***** TMP *****\r
+  fEsdTrackCuts->SetMaxChi2PerClusterTPC(4);\r
+  fEsdTrackCuts->SetAcceptKinkDaughters(kFALSE);\r
+  fEsdTrackCuts->SetRequireTPCRefit(kTRUE);\r
+  // ITS\r
+  fEsdTrackCuts->SetRequireITSRefit(kTRUE);\r
+  fEsdTrackCuts->SetRequireSigmaToVertex(kFALSE);\r
+  fEsdTrackCuts->SetMaxDCAToVertexZ(2); // new for pile-up !!!\r
+\r
+  // Add SPD requirement \r
+  fEsdTrackCutsSPD = new AliESDtrackCuts("SPD", "Require 1 cluster in SPD");\r
+  fEsdTrackCutsSPD->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);\r
+  \r
+  // Add SDD requirement \r
+  fEsdTrackCutsSDD = new AliESDtrackCuts("SDD", "Require 1 cluster in first layer SDD");\r
+  fEsdTrackCutsSDD->SetClusterRequirementITS(AliESDtrackCuts::kSDD,AliESDtrackCuts::kFirst);\r
+  \r
+  // Add DCA cuts \r
+  fEsdTrackCutsDCA = new AliESDtrackCuts("DCA", "pT dependent DCA cut");\r
+  // 7*(0.0050+0.0060/pt^0.9)\r
+  fEsdTrackCutsDCA->SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9");\r
+  \r
+  fEsdTrackCutsDCA->SetMaxDCAToVertexZ(1.e6);\r
+  fEsdTrackCutsDCA->SetDCAToVertex2D(kFALSE);\r
+\r
+  // emulates filterbit when getting leading-track from ESD\r
+  fAnalyseUE->DefineESDCuts(16); // any number = standard ITS+TPC + (SPD or SDD)\r
 }
 
 //____________________________________________________________________
@@ -272,19 +196,13 @@ void  AliAnalysisTaskCorrectionsUE::CreateOutputObjects()
   
   if (fDebug > 1) AliInfo("CreateOutPutData()");
    
-  // Create pointer to AliAnalysisUE, a class implementing the main analysis algorithms
-  fAnaUE = new AliAnalyseUE();
-  if (!fAnaUE){
+  // Create pointer to AliAnalyseLeadingTrackUE, a class implementing the main analysis algorithms\r
+  fAnalyseUE = new AliAnalyseLeadingTrackUE();\r
+  if (!fAnalyseUE){\r
      AliError("UE analysis class not initialized!!!");
      return;
   }
-  // Create pointer to AliHistogramsUE, a class handling histogram creation/filling
-  fHistosUE = new AliHistogramsUE();
-  if (!fHistosUE){
-     AliError("UE histograms class not initialized!!!");
-     return;
-  }
-
+  \r
   // Create list of output histograms
   if (fListOfHistos != NULL){
        delete fListOfHistos;
@@ -295,235 +213,427 @@ void  AliAnalysisTaskCorrectionsUE::CreateOutputObjects()
        fListOfHistos->SetOwner(kTRUE); 
        }
   
+  // Create CF container\r
+  CreateContainer();\r
+  // number of events\r
+  fhEntries = new TH1F("fhEntries","Entries",1,0.,2.); \r
+  fListOfHistos->Add(fhEntries);\r
+  // tracks contributing to the vertex\r
+  fhVertexContributors = new TH1F("fhVertexContributors","Tracks in vertex",51, -0.5, 50.5);\r
+  fhVertexContributors->GetXaxis()->SetTitle("# tracks in vertex");\r
+  fhVertexContributors->GetYaxis()->SetTitle("Entries");\r
+  fListOfHistos->Add(fhVertexContributors);\r
+  // vertex resolution\r
+  fhVertexReso = new TH3F("fhVertexReso","Vertex resolution",51,-0.5,50.5,100,0.,0.05,100.,0.,0.1); \r
+  fhVertexContributors->GetXaxis()->SetTitle("# tracks in vertex");\r
+  fhVertexContributors->GetYaxis()->SetTitle("Resolution XY (cm)");\r
+  fhVertexContributors->GetZaxis()->SetTitle("Resolution Z (cm)");\r
+  fListOfHistos->Add(fhVertexReso);\r
   
-  //Initialize output histograms
-  fHistosUE->CreateHistogramsCorrections(fListOfHistos,fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist, fTrackEtaCut);
+  // number of fake tracks\r
+  fhFakes = new TH1F("fhFakes","Fraction of fake tracks",5,-0.5,4.5);\r
+  fhFakes->GetXaxis()->SetBinLabel(1,"No MC");\r
+  fhFakes->GetXaxis()->SetBinLabel(2,"Unique MC primary");\r
+  fhFakes->GetXaxis()->SetBinLabel(3,"Unique MC secondary");\r
+  fhFakes->GetXaxis()->SetBinLabel(4,"Multiple MC");\r
+  fListOfHistos->Add(fhFakes);\r
+  \r
+  //pT distributions\r
+  fhPtMCAll = new TH1F("fhPtMCAll","All MC particles reconstructed",100,0., 20.);\r
+  fListOfHistos->Add(fhPtMCAll);\r
+  fhPtMCPrim = new TH1F("fhPtMCPrim","Primary MC particles reconstructed",100,0., 20.);\r
+  fListOfHistos->Add(fhPtMCPrim);\r
+  fhPtMCSec = new TH1F("fhPtMCSec","Secondary MC particles reconstructed",100,0., 20.);\r
+  fListOfHistos->Add(fhPtMCSec);\r
+  fhPtMCPrimFake = new TH1F("fhPtMCPrimFake","Fake primary MC particles reconstructed",100,0., 20.);\r
+  fListOfHistos->Add(fhPtMCPrimFake);\r
+  fhPtMCSecFake = new TH1F("fhPtMCSecFake","Fake secondary MC particles reconstructed",100,0., 20.);\r
+  fListOfHistos->Add(fhPtMCSecFake);\r
+\r
+\r
+  // Add task configuration to output list \r
   AddSettingsTree();
-
-  //Configure the CF manager
-  if (fCFManager != NULL){
-       delete fCFManager;
-        fCFManager = NULL;
-       }
-  if (!fCFManager){
-        fCFManager = new AliCFManager();
-       }
-  fHistosUE->CreateCorrectionsContainer(fCFManager,fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist, fTrackEtaCut,fJet1EtaCut);
+    \r
 
   //Post outputs
   PostData(0,fListOfHistos);
-  PostData(1,fCFManager->GetEventContainer());
-
\r
 }
 
 //____________________________________________________________________
 void  AliAnalysisTaskCorrectionsUE::Exec(Option_t */*option*/)
 {
-
-  Bool_t flag=kTRUE;
-
-  //Determine the corrections
+  \r
+  // Get MC event\r
   if (fMcHandler){
        fMcEvent = fMcHandler->MCEvent();
                if ( fDebug > 3 ) AliInfo( " Processing MC event..." );
-  }else{
-               if ( fDebug > 3 ) AliInfo( " Processing DATA event..." );
+       if (fMode && !fMcEvent) return;\r
        }
   
-
-  flag = EvaluateCorrections(); 
-
+  // Do the analysis\r
+  AnalyseCorrectionMode();\r
+
+  \r
+ PostData(0,fListOfHistos);\r
+
+}\r
+\r
+//____________________________________________________________________\r
+void  AliAnalysisTaskCorrectionsUE::Terminate(Option_t */*option*/)\r
+{\r
+  // Terminate analysis\r
   
-  if (flag){ //executed if event passes trigger+vertex selection
-       //Fetch the pythia header info and get the trials
-       Float_t nTrials = 1;
-       if (fMcHandler && fMcEvent) {
-               AliGenPythiaEventHeader*  pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(fMcEvent);
-               if(pythiaGenHeader) nTrials = pythiaGenHeader->Trials();
+  if (fDebug >1) AliAnalysisHelperJetTasks::PrintDirectorySize("PWG4_JetTasksOutput.root");\r
+  \r
+  if (!gROOT->IsBatch()){\r
+       fListOfHistos = dynamic_cast<TList*> (GetOutputData(0));\r
+       if (!fListOfHistos){\r
+               AliError("Histogram List is not available");\r
+               return;\r
                }
-       fHistosUE->GetTrials()->Fill("#sum{ntrials}",fAvgTrials);
-       PostData(0,fListOfHistos);
-       PostData(1,fCFManager->GetEventContainer());
-       }
+\r
+  } else {\r
+        AliInfo(" Batch mode, not histograms will be shown...");\r
+  }\r
+\r
+  \r
 }
 
+\r
+/******************** ANALYSIS METHODS *****************************/\r
+\r
 //____________________________________________________________________
 void  AliAnalysisTaskCorrectionsUE::AddSettingsTree()
 {
   //Write settings to output list
-  TTree *settingsTree   = new TTree("UECorrectionsSettings","Analysis Settings in UE corrections");
-  settingsTree->Branch("fFilterBit", &fFilterBit,"FilterBit/I");
-  settingsTree->Branch("fConeRadius", &fConeRadius,"Rad/D");
-  settingsTree->Branch("fJet1EtaCut", &fJet1EtaCut, "LeadJetEtaCut/D");
-  settingsTree->Branch("fJet2DeltaPhiCut", &fJet2DeltaPhiCut, "DeltaPhi/D");
-  settingsTree->Branch("fJet2RatioPtCut", &fJet2RatioPtCut, "Jet2Ratio/D");
-  settingsTree->Branch("fJet3PtCut", &fJet3PtCut, "Jet3PtCut/D");
+  TTree *settingsTree   = new TTree("UEAnalysisSettings","Analysis Settings in UE estimation");\r
+  settingsTree->Branch("fnTracksVertex", &fnTracksVertex, "TracksInVertex/D");\r
+  settingsTree->Branch("fZVertex", &fZVertex, "VertexZCut/D");\r
   settingsTree->Branch("fTrackPtCut", &fTrackPtCut, "TrackPtCut/D");
   settingsTree->Branch("fTrackEtaCut", &fTrackEtaCut, "TrackEtaCut/D");
-  settingsTree->Branch("fAnaType", &fAnaType, "Ana/I");        
-  settingsTree->Branch("fRegionType", &fRegionType,"Reg/I");
-  settingsTree->Branch("fOrdering", &fOrdering,"OrderMeth/I");
-  settingsTree->Branch("fUseChPartJet", &fUseChPartJet,"UseChPart/O");
-  settingsTree->Branch("fUseChargeHadrons", &fUseChargeHadrons,"UseChHadrons/O");
-  settingsTree->Branch("fUseSingleCharge", &fUseSingleCharge,"UseSingleCh/O");
-  settingsTree->Branch("fUsePositiveCharge", &fUsePositiveCharge,"UsePositiveCh/O");
   settingsTree->Fill();
   fListOfHistos->Add(settingsTree);
-} 
-
+}  \r
 
 //____________________________________________________________________
-Bool_t  AliAnalysisTaskCorrectionsUE::EvaluateCorrections()
+void AliAnalysisTaskCorrectionsUE::AnalyseCorrectionMode()\r
 {
-  
-  /////////////////////////////////////////////////////////////////////////
-  // 
-  // EVENT SELECTION:
-  // CF containers are filled to get the number of entries after every cut.
-  // *** Cuts: ***
-  // 0 - triggered
-  // 1 - physics selection
-  // 2 - vertex selection
-  // 3 - event topology
-  // 4 - leading track pT cut
-  // 5 - leading track correctly identified
-  // *** Variables: ***
-  // 0 - leading track pT (reco)
-  // 1 - leading track eta (reco)
-  // 2 - process type:
-  //   1: non diffractive
-  //   2: double diffractive
-  //   4: single diffractive
-  // 3 - leading track pT (true)
-  // 4 - leading track eta (true)
-  // 5 - delta eta (reco-true)
-  // 6 - delta phi (reco-true)
-  // 7 - radius (reco-true)
-  //
-  // TRACK-LEVEL CORRECTIONS:
-  // Fill histograms similar to AliAnalysisTaskUE.
-  //
-  /////////////////////////////////////////////////////////////////////////
 
-  Double_t containerInput[8];// relevant variables (see above)  
-  
-  //PROCESS TYPE (ND,SD,DD)
-  AliAnalysisHelperJetTasks::MCProcessType eventId = AliAnalysisHelperJetTasks::kInvalidProcess;
-  if (fMcHandler && fMcEvent) {
-               AliGenEventHeader* genHeader = fMcEvent->GenEventHeader();
-               eventId = AliAnalysisHelperJetTasks::GetPythiaEventProcessType(genHeader,kFALSE);
-               if (eventId<0){
-               eventId = AliAnalysisHelperJetTasks::GetDPMjetEventProcessType(genHeader,kFALSE);
+  // Analyse the event\r
+  Int_t labelMC  = -1;\r
+  if (fMcHandler && fMcEvent){\r
+       // Only consider MC events within the vtx-z region used also as cut on the reconstructed vertex\r
+       if (!fAnalyseUE->VertexSelection(fMcEvent, 0, fZVertex))  \r
+       return; \r
+       // Get MC-true leading particle \r
+       TObjArray *ltMC = (TObjArray*)fAnalyseUE->FindLeadingObjects(fMcEvent);\r
+       AliVParticle* leadingMC = 0;\r
+       if (ltMC){\r
+               leadingMC = (AliVParticle*) ltMC->At(0);\r
                }
-               if (eventId<0 && fDebug>1)AliInfo("No Pythia or Phojet Header retrived!"); 
-  }else if (fDebug>1) AliInfo("No MC handler or Event!"); 
-
-  //Initialize container inputs 
-  for (Int_t i =0; i<8; i++){  
-       containerInput[i]=-999.;
+       if (!leadingMC)return; \r
+       labelMC = TMath::Abs(leadingMC->GetLabel());\r
+       }\r
+
+  // Trigger selection ************************************************\r
+  if (!fAnalyseUE->TriggerSelection(fESDHandler)) return;\r
+  \r
+  // PILEUP-CUT ****** NEW !!!!!!!!! **************\r
+  Bool_t select = kTRUE;\r
+  //select = AliAnalysisHelperJetTasks::TestSelectInfo(AliAnalysisHelperJetTasks::kIsPileUp);\r
+  if (! select) return;\r
+  \r
+  // Vertex selection *************************************************\r
+  \r
+  if(!fAnalyseUE->VertexSelection(fESDEvent, 0, fZVertex)) return;\r
+  AliESDVertex* vertex = (AliESDVertex*)fESDEvent->GetPrimaryVertex();\r
+  Int_t nvtx = vertex->GetNContributors();\r
+  fhVertexContributors->Fill(nvtx);\r
+  if (fMcHandler){\r
+               AliVVertex *vertexMC = (AliVVertex*)fMcEvent->GetPrimaryVertex();\r
+               if (vertexMC){\r
+                       Double_t diffx = vertexMC->GetX()-vertex->GetX();\r
+                       Double_t diffy = vertexMC->GetY()-vertex->GetY();\r
+                       Double_t diffxy = TMath::Sqrt(TMath::Power(diffx,2)+TMath::Power(diffy,2));\r
+                       //Double_t diffxy = TMath::Abs(diffx); // **** TMP ****\r
+                       //Double_t diffxy = diffy;\r
+                       Double_t diffz = TMath::Abs(vertexMC->GetZ()-vertex->GetZ());\r
+               \r
+                       fhVertexReso->Fill(nvtx,diffxy,diffz);\r
+               }else if (fDebug>1)Printf("******* NO MC VERTEX ********");\r
        }
+\r
+  if(!fAnalyseUE->VertexSelection(fESDEvent, fnTracksVertex, fZVertex)) return;\r
+\r
+  // Get Reconstructed leading particle *******************************\r
+  TObjArray *ltRECO = fAnalyseUE->FindLeadingObjects(fESDEvent);\r
+  if (!ltRECO){\r
+       delete[] ltRECO;\r
+       return;\r
+       }\r
+  Int_t labelReco= TMath::Abs(((AliVParticle*)ltRECO->At(0))->GetLabel());\r
   
-  //Assign process type
-  if (eventId == 1 ) containerInput[2]=1.; //Non diffractive
-  if (eventId == 2 ) containerInput[2]=2.; //Double diffractive
-  if (eventId == 4 ) containerInput[2]=4.; //Single diffractive
   
-  // Execute analysis for current event ******************************
+  // Loop on tracks\r
+  Int_t nTracks = fESDEvent->GetNumberOfTracks();\r
+  if (!nTracks)return;\r
+  // count accepted events\r
+  fhEntries->Fill(1.);\r
+\r
+  Int_t npart=0;\r
+  Bool_t *labelsArray = 0; \r
+  if (fMcHandler){\r
+       npart = fMcEvent->GetNumberOfTracks();\r
+        labelsArray = new Bool_t[npart];\r
+       for(Int_t j = 0; j<npart; j++){\r
+               labelsArray[j] = kFALSE;\r
+               }\r
+       }\r
+\r
+  for (Int_t i = 0; i < nTracks; i++){\r
+       AliESDtrack *track = fESDEvent->GetTrack(i);\r
+       // only charged\r
+       if (!track || !track->Charge())continue;\r
+        // apply cuts\r
+       Bool_t cut = fEsdTrackCuts->AcceptTrack(track);\r
+       Bool_t cutSPD = fEsdTrackCutsSPD->AcceptTrack(track);\r
+       Bool_t cutSDD = fEsdTrackCutsSDD->AcceptTrack(track);\r
+       Bool_t cutDCA = fEsdTrackCutsDCA->AcceptTrack(track);\r
+       \r
+       //Exclude the MC leading track\r
+       Double_t matchLeading = 1.;//no match\r
+       if (fMcHandler){\r
+               if (TMath::Abs(track->GetLabel())==labelMC) matchLeading=0.; //match MC leading\r
+               if (TMath::Abs(track->GetLabel())==labelReco) {\r
+                       matchLeading=2.;//match RECO leading\r
+                       if (labelMC == labelReco)matchLeading = 3.; // match both (mc = reco leading)\r
+                       }\r
+               }\r
+       // Fill step0 (all tracks) \r
+       FillContainer(track, 0,kFALSE,matchLeading);         \r
+       // Fill step1 (no SPD cluster requirement - no DCA cut )\r
+       if ( cut ) FillContainer(track,1,kFALSE,matchLeading);\r
+       // Fill step2\r
+       if ( cut && cutDCA && (cutSPD || cutSDD)) FillContainer(track,2,kFALSE,matchLeading);\r
+       // Fill step3-step4-step5 \r
+       if ( cut && cutDCA && !cutSPD && !cutSDD) FillContainer(track,3,kTRUE,matchLeading);\r
+       if ( cut && cutDCA && cutSPD) FillContainer(track,4,kTRUE,matchLeading);\r
+       if ( cut && cutDCA && !cutSPD && cutSDD) FillContainer(track,5,kTRUE,matchLeading);\r
+        // Fill step 6 - temporary just to define the standard track cuts  \r
+       if ( cut && cutSPD ) FillContainer(track,6,kFALSE,matchLeading);\r
+       //if ( cut && cutSPD ) FillContainer(track,6,kTRUE,matchLeading); // ***** TMP *****\r
+       if ( cut && (cutSPD || cutSDD) ) FillContainer(track,7,kFALSE,matchLeading);\r
+       // Study contamination form fakes\r
+       if (fMcHandler){\r
+                       \r
+               // consider standard ITS+TPC cuts without SPD cluster requirement\r
+               if (cut && cutDCA){\r
+                       //check if it points back to any MC\r
+                       Int_t label = TMath::Abs(track->GetLabel());\r
+                       AliVParticle *part = (AliVParticle*)fMcEvent->GetTrack(label);  \r
+                       if (!part){\r
+                               fhFakes->Fill(0.);\r
+                               //Printf("*************** NO MC PARTICLE ************************");\r
+                               continue;\r
+                               }\r
+                               \r
+                       fhPtMCAll->Fill(part->Pt()); \r
+                       // Check if label is not already in array\r
+                       if (!labelsArray[label]){\r
+                               labelsArray[label]= kTRUE;\r
+                               if (fMcEvent->IsPhysicalPrimary(label)){\r
+                                       fhFakes->Fill(1.);\r
+                                       fhPtMCPrim->Fill(part->Pt());\r
+                               }else{\r
+                                       fhFakes->Fill(2.);\r
+                                       fhPtMCSec->Fill(part->Pt());\r
+                                       }\r
+                       }else{\r
+                               fhFakes->Fill(3.);\r
+                               if (fMcEvent->IsPhysicalPrimary(label))fhPtMCPrimFake->Fill(part->Pt());\r
+                               else fhPtMCSecFake->Fill(part->Pt());\r
+                               }\r
+                  }    \r
+               }\r
+       } // end loop on tracks\r
+       if(labelsArray)\r
+       delete[] labelsArray;\r
+\r
+}\r
+\r
+\r
+//____________________________________________________________________\r
+void AliAnalysisTaskCorrectionsUE::CreateContainer()\r
+{\r
   
-  // Get jets and order by pT
-  TVector3 jetVect[3];
-  *jetVect = fAnaUE->GetOrderedClusters(fAODBranch, fUseChPartJet, fChJetPtMin );
+  // Create the output CF container\r
+  // relevant variables \r
+  UInt_t iprim  = 0; // 0: primaries, 1: secondaries from strangness, 2: secondaries form material \r
+  UInt_t iptmc  = 1;\r
+  UInt_t ipt    = 2;\r
+  UInt_t ieta   = 3;\r
+  UInt_t idcaxy = 4;\r
+  UInt_t idcaz  = 5;\r
+  UInt_t imatch = 6;\r
+  UInt_t icharge = 7;\r
+  // set-up the grid\r
+  UInt_t nstep = 8;\r
+  const Int_t nvar  = 8;\r
+  const Int_t nbin0 = 5;  // prim\r
+  const Int_t nbin1 = 20; // pt resolution\r
+  const Int_t nbin2 = 39; // pt \r
+  const Int_t nbin3 = 20; // eta\r
+  const Int_t nbin4 = 100; // dca xy\r
+  const Int_t nbin5 = 100; // dca z\r
+  const Int_t nbin6 = 4; // matching with leading track\r
+  const Int_t nbin7 = 2;\r
+\r
+  // array for the number of bins in each dimension\r
+  Int_t iBin[nvar];\r
+  iBin[0] = nbin0;\r
+  iBin[1] = nbin1;\r
+  iBin[2] = nbin2;\r
+  iBin[3] = nbin3;\r
+  iBin[4] = nbin4;\r
+  iBin[5] = nbin5;\r
+  iBin[6] = nbin6;\r
+  iBin[7] = nbin7;\r
   
-  //now define leading track pT and eta
-  containerInput[0]=jetVect[0].Pt();
-  containerInput[1]=jetVect[0].Eta();
-
-  fCFManager->GetEventContainer()->Fill(containerInput,kCFStepTriggered);  //fill CF container 
+  // primaries\r
+  Double_t primBins[7] = {-0.5,0.5,1.5,2.5,3.5,4.5,5.5};\r
+  // matching with leading-track\r
+  Double_t matchBins[5] = {-0.5,0.5,1.5,2.5,3.5};\r
+
+  // pT resolution\r
+  Double_t resoBins[nbin1+1];\r
+  for (Int_t i=0; i<=nbin1; i++)\r
+    resoBins[i] = -1.0 + 0.1 * i;\r
   
-  // Physics selection ************************************************
-  fInputHandler = (AliInputEventHandler*)AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
-  if (!fAnaUE->TriggerSelection(fInputHandler)) return kFALSE;
+  // pT\r
+  Double_t ptBins[nbin2+1] = {0.0, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0, 25.0, 30.0, 35.0, 40.0, 45.0, 50.0, 100.0};\r
   
-  fCFManager->GetEventContainer()->Fill(containerInput, kCFStepPhysSelect); //fill CF container
+  // eta\r
+  Double_t etaBins[nbin3+1];\r
+  for (Int_t i=0; i<=nbin3; i++)\r
+    etaBins[i] = -1.0 + 0.1 * i;\r
   
-  // Event selection (vertex) *****************************************
+  // dca xy\r
+  Double_t dcaxyBins[nbin4+1];\r
+  for (Int_t i=0; i<=nbin4; i++)\r
+    dcaxyBins[i] = -1.+0.02 * i;\r
   
-  if(!fAnaUE->VertexSelection(fAOD,fnTracksVertex,fZVertex)) return kFALSE;
-  //if(!fAnaUE->VertexSelectionOld(fAOD)) return kFALSE; // temporary to compare with old task and to have same cuts for MC !!!
-
-  fCFManager->GetEventContainer()->Fill(containerInput, kCFStepVertexSelect); //fill CF container
-   
-   // Select events according to analysis type *************************
-   // (in the leading track analysis it should not happen that there are no "jets")
-   if( jetVect[0].Pt() < 0. ) {
-       if( fDebug > 1 ) AliInfo("\n   Skipping Event, not jet found...");
-       return kTRUE;
-    } else {
-       if (fDebug >1 ) AliInfo(Form("\n   Pt Leading Jet = %6.1f eta=%5.3f ",  jetVect[0].Pt(), jetVect[0].Eta() ));
-       }
+  // dca z\r
+  Double_t dcazBins[nbin5+1];\r
+  for (Int_t i=0; i<=nbin5; i++)\r
+    dcazBins[i] = -5.0 + 0.1 * i;\r
\r
+  // charge \r
+  Double_t chargeBins[nbin7+1] = {-1.,0.,1.};\r
+
+  // create container\r
+  // set variables\r
+  fOutCFcont = new AliCFContainer("fOutCFcont","Output Container",nstep,nvar,iBin);\r
+  fOutCFcont->SetBinLimits(iprim,primBins);\r
+  fOutCFcont->SetVarTitle(iprim, "Particle type");\r
+  fOutCFcont->SetBinLimits(iptmc,resoBins);\r
+  fOutCFcont->SetVarTitle(iptmc, "#Delta p_{T} (DATA-MC) (GeV/c)");\r
+  fOutCFcont->SetBinLimits(ipt,ptBins);\r
+  fOutCFcont->SetVarTitle(ipt, "p_{T} (GeV/c)");\r
+  fOutCFcont->SetBinLimits(ieta,etaBins);\r
+  fOutCFcont->SetVarTitle(ieta, "#eta");\r
+  fOutCFcont->SetBinLimits(idcaxy,dcaxyBins);\r
+  fOutCFcont->SetVarTitle(idcaxy, " DCA_{XY} (cm)");\r
+  fOutCFcont->SetBinLimits(idcaz,dcazBins);\r
+  fOutCFcont->SetVarTitle(idcaz, " DCA_{Z} (cm)");\r
+  fOutCFcont->SetBinLimits(imatch,matchBins);\r
+  fOutCFcont->SetVarTitle(imatch, "Matching with leading-track");\r
+  fOutCFcont->SetBinLimits(icharge,chargeBins);\r
+  fOutCFcont->SetVarTitle(icharge, "Charge");\r
+\r
+  // set steps\r
+  fOutCFcont->SetStepTitle(0,"all tracks");\r
+  fOutCFcont->SetStepTitle(1,"ITS+TPC cuts (no SPD cluster requirement and DCA cut)");\r
+  fOutCFcont->SetStepTitle(2,"add DCA cut");\r
+  fOutCFcont->SetStepTitle(3,"NO SPD cluster, NO SDD cluster in first layer");\r
+  fOutCFcont->SetStepTitle(4,"YES SPD cluster, NO SDD cluster in first layer");\r
+  fOutCFcont->SetStepTitle(5,"NO SPD cluster, YES SDD cluster in first layer");\r
+  fOutCFcont->SetStepTitle(6,"ITS+TPC cuts - no DCA cut - SPD cut");\r
+  fOutCFcont->SetStepTitle(7,"ITS+TPC cuts - no DCA cut - SPD or SDD cut");\r
+  fListOfHistos->Add(fOutCFcont);\r
+\r
+}\r
+\r
+\r
+void  AliAnalysisTaskCorrectionsUE::FillContainer(AliESDtrack *track, Int_t step,Bool_t mcvertex, Double_t matchLeading)\r
+{\r
+\r
+  // Fill the CF container\r
+\r
+  Double_t vars[8];\r
+  Double_t prim = -1.;\r
   
+  if (track->Charge() > 0.) vars[7] = 0.5;\r
+  else vars[7] = -0.5;\r
   
-  if ( ! (fAnaUE->AnaTypeSelection(jetVect))) return kTRUE;
-   
-   
-   // For the events selected check the real MC leading particle
-   // (only when running on MC)
-   TVector3 jetVectMC[3];
-   if (fMcEvent){
-       *jetVectMC = fAnaUE->GetLeadingTracksMC(fMcEvent); 
-       if (fAnaUE->AnaTypeSelection(jetVectMC) ){
-               //now define leading track pT and eta
-               containerInput[3]=jetVectMC[0].Pt();
-               containerInput[4]=jetVectMC[0].Eta();
-               //Check distance between real and reco leading-particle
-               containerInput[5] = jetVect[0].Eta()-jetVectMC[0].Eta();
-               containerInput[6] = TMath::Abs(jetVect[0].Phi()-jetVectMC[0].Phi());
-               if (containerInput[6] >= 2.*TMath::Pi())containerInput[6] -= 2.*TMath::Pi(); 
-               containerInput[7] = sqrt(TMath::Power(containerInput[5],2.) + TMath::Power(containerInput[6],2.));
-               } 
-       }  
-   
-   fCFManager->GetEventContainer()->Fill(containerInput, kCFStepAnaTopology); //fill CF container
-   
-   //Cut on the leading track pT 
-   if (!(jetVect[0].Pt() >= 1.)) return kTRUE;
-   // (only when running on MC)   
-   if (fMcEvent){ 
-       if (!(jetVectMC[0].Pt()>= 1.)){
-               containerInput[3]=containerInput[4]=-999.;
-               containerInput[5]=containerInput[6]=containerInput[7]=-999.;
+  if (fMcHandler){\r
+       // determine if points back to a primary\r
+       Int_t label = TMath::Abs(track->GetLabel());\r
+       \r
+       AliMCParticle *part = (AliMCParticle*)fMcEvent->GetTrack(label);  \r
+       for (Int_t i=0; i<=6;i++) vars[i] = -999.;\r
+       if (part) { //PRIMARY\r
+               if (fMcEvent->IsPhysicalPrimary(label)){\r
+                       prim = 0.;\r
+               }else { //SECONDARY\r
+                       // decide if strange\r
+                       Int_t labelm = TMath::Abs(part->GetMother());\r
+                       AliMCParticle *mother = (AliMCParticle*)fMcEvent->GetTrack(labelm);  \r
+                       Int_t code = mother->PdgCode();\r
+                       Int_t mfl = Int_t (code/ TMath::Power(10, Int_t(TMath::Log10(code))));\r
+                        if  (mfl == 3) prim = 1.;\r
+                               else{   \r
+                                       //Printf("***** PROCESS : %d",part->Particle()->GetUniqueID());  \r
+                                       if (TMath::Abs(code) == 211) prim = 2.; // charged pion decay\r
+                                       else if (part->Particle()->GetUniqueID() == 13 )prim = 3.; // hadronic interactions\r
+                                       else if (part->Particle()->GetUniqueID() == 5 )prim = 4.; // photon conversions\r
+                                       else prim = 5.; // other?\r
+                               }\r
+                       }\r
+               vars[1]= part->Pt()-track->Pt();\r
+               // In step 2 fill MC pT for contamination study\r
+               if (step == 2)vars[2]=part->Pt();\r
                }
-       }       
-   
-   fCFManager->GetEventContainer()->Fill(containerInput, kCFStepLtPtCut1); //fill CF container
-
-   // Check if leading track is correctly identified
-   // (only when running on MC)
-   if (fMcEvent){
-       Int_t labelLt = fAnaUE->GetLtLabel();
-       Int_t labelLtMC = fAnaUE->GetLtMCLabel();
-       if (labelLt == labelLtMC){
-               fCFManager->GetEventContainer()->Fill(containerInput, kCFStepLtCorrect); //fill CF container
-               } 
-       }
-
-   // For track efficiency and contamination
-   // (only when running on MC)
-   if (fMcEvent){
-       //Run once on reco...
-       fAnaUE->FindMaxMinRegions( jetVect,  fConePosition, 0, 0 );//normal track cut 
-       fAnaUE->FindMaxMinRegions( jetVect,  fConePosition, 0, 1 );//for efficiency: cut on pT and eta are set on MC true  
-       //and once on MC true
-        fAnaUE->FindMaxMinRegions( jetVect,  fConePosition, 1, 0 );
-  }else{
-       // For d0 distribution, runs only on real data
-       fAnaUE->FindMaxMinRegions( jetVect,  fConePosition, 0, 0 );//run on real data 
-       }
-
-
-   return kTRUE;
+       }\r
+  vars[0]=prim;\r
+
+  if (step != 2)vars[2]=track->Pt();\r
+  vars[3]=track->Eta();\r
+
+  Bool_t dcaControlFlag = kFALSE;\r
+  if (mcvertex && fMcHandler){\r
+          // we want DCA w.r.t. MC vertex\r
+         AliVVertex *vtxMC = (AliVVertex*)fMcEvent->GetPrimaryVertex();\r
+         dcaControlFlag = track->RelateToVertex((AliESDVertex*)vtxMC,(Double_t)fESDEvent->GetMagneticField(),10000.);\r
+         }else{\r
+         AliESDVertex* vertex = (AliESDVertex*)fESDEvent->GetPrimaryVertex();\r
+         dcaControlFlag = track->RelateToVertex(vertex,(Double_t)fESDEvent->GetMagneticField(),10000.);\r
+         }\r
+  if (dcaControlFlag){\r
+       Float_t dca[2];\r
+       Float_t dcaCov[2];\r
+       track->GetImpactParameters(dca,dcaCov);\r
+       vars[4]=dca[0];\r
+       vars[5]=dca[1];\r
+       }         \r
+
+
+  vars[6]= matchLeading;\r
+  fOutCFcont->Fill(vars,step);\r
+\r
 }
 
+\r
 //____________________________________________________________________
 AliAnalysisTaskCorrectionsUE* AliAnalysisTaskCorrectionsUE::Instance()
 { 
@@ -537,29 +647,3 @@ AliAnalysisTaskCorrectionsUE* AliAnalysisTaskCorrectionsUE::Instance()
        }
 }
 
-//____________________________________________________________________
-void  AliAnalysisTaskCorrectionsUE::Terminate(Option_t */*option*/)
-{
-  // Terminate analysis
-  
-  if (fDebug >1) AliAnalysisHelperJetTasks::PrintDirectorySize("PWG4_JetTasksOutput.root");
-  
-  if (!gROOT->IsBatch()){
-       fListOfHistos = dynamic_cast<TList*> (GetOutputData(0));
-       if (!fListOfHistos){
-               AliError("Histogram List is not available");
-               return;
-               }
-
-  } else {
-        AliInfo(" Batch mode, not histograms will be shown...");
-  }
-
-  
-}
-
-//____________________________________________________________________
-void  AliAnalysisTaskCorrectionsUE::WriteSettings()
-{ 
-
-}
index 7b0876b5081da395ab6b42cdbcf647be92712b2a..b040789fabc3a0f07f356bbee527c171311e627c 100644 (file)
@@ -8,34 +8,34 @@
 //
 // Analysis class to Correct Underlying Event studies
 //
-// This class needs as input AOD with track and Jets.
-// The output is a list of histograms
-//
-// AOD can be either connected to the InputEventHandler  
-// for a chain of AOD files 
-// or 
-// to the OutputEventHandler
-// for a chain of ESD files, so this case class should be 
-// in the train after the Jet finder
+// This class needs as input ESDs.\r
+// The output is an analysis-specific container.\r
 //
+// The class is used to get the contamination from secondaries\r
+// from tracks DCA distribution \r
+// as function of track pT and pseudo-rapidity.\r
+// It provides additional information for the corrections \r
+// that can not be retrieved by the AliAnalysisTaskLeadingTackUE\r
+// task, which is running on AODs.\r
 // 
-// vallero@physi.uni-heidelberg.de
 ////////////////////////////////////////////////////////////////////////
 
 #include "AliAnalysisTask.h"
 
-class AliAnalyseUE;
-class AliCFManager;
-class AliHistogramsUE;
+class AliAnalyseLeadingTrackUE;\r
+class AliESDtrackCuts;\r
 class AliInputEventHandler;
 class AliAODEvent;
+class AliCFContainer;\r
 class AliESDEvent;
+class AliESDtrack;\r
 class AliAODInputHandler;
-class AliESDEventHandler;
+class AliESDInputHandler;\r
 class AliMCEventHandler;
 class AliMCEvent;
 class TH1F;
 class TH2F;
+class TH3F;\r
 class TH1I;
 class TProfile;
 class TTree;
@@ -44,17 +44,13 @@ class TVector3;
 class  AliAnalysisTaskCorrectionsUE : public AliAnalysisTask
   {
   public:
-    
-    enum {
-       kCFStepTriggered     = 0,
-       kCFStepPhysSelect    = 1, 
-       kCFStepVertexSelect  = 2,
-       kCFStepAnaTopology   = 3,
-       kCFStepLtPtCut1      = 4,
-       kCFStepLtCorrect     = 5
-    };
-
-
+    // track cuts steps\r
+    enum CFSteps {\r
+       kCFStepAll     = 0,\r
+       kCFStepCuts    = 1, // standard ITS+TPC 2009 cuts w.o. DCA cut and SPD cluster requirement\r
+       kCFStepSPD     = 2, // add SPD cluster requirement\r
+       kCFStepDCA     = 3  // add pT dependent DCA cut\r
+       };\r
 
     AliAnalysisTaskCorrectionsUE(const char* name="AliAnalysisTaskCorrectionsUE");
     virtual           ~AliAnalysisTaskCorrectionsUE() {if ( fListOfHistos ) delete fListOfHistos; }
@@ -72,206 +68,57 @@ class  AliAnalysisTaskCorrectionsUE : public AliAnalysisTask
     virtual     void   Terminate(Option_t *);
 
     //  Setters/Getters
-    virtual     void         SetDebugLevel( Int_t level )  { fDebug = level; }
-    virtual    Int_t         GetDebugLevel() const { return fDebug; }
-    
-    void       SetPtRangeInHist( Int_t bin, Double_t min, Double_t max ) {
-                       fBinsPtInHist = bin; 
-                       fMinJetPtInHist = min; 
-                       fMaxJetPtInHist = max; 
-                       }
-
-    // Read AODs
-    void         SelectAODBranch(const char* val)     { fAODBranch = val;   }
-    virtual       TString               GetAODBranch() const { return fAODBranch;   }
-    virtual       AliAODEvent*   GetAOD() const               { return fAOD; } 
-
-    // Setters/Getters for MC
-    void       SetConstrainDistance(Bool_t val1, Double_t val2){ fMinDistance = val2; fConstrainDistance = val1;}
-    void       SetSimulateChJetPt(){fSimulateChJetPt = kTRUE;}
-    void       SetUseAODMCParticle(){fUseAliStack = kFALSE;}
-    void       SetUseMCBranch(){fUseMCParticleBranch = kTRUE;}
-
-    virtual  Bool_t    GetConstrainDistance() const {return fConstrainDistance;}
-    virtual  Double_t  GetMinDistance()       const {return fMinDistance;}
-    virtual  Bool_t    GetSimulateChJetPt()   const {return fSimulateChJetPt;}
-    virtual  Bool_t    GetUseAODMCParticle()  const {return fUseAliStack;}
-    virtual  Bool_t    GetUseMCParticleBranch() const {return fUseMCParticleBranch;}
+    virtual     void   SetDebugLevel( Int_t level )  { fDebug = level; }\r
+    virtual     void   SetMode(Int_t mode)           { fMode  = mode;  }\r
 
     //Event QA
-    void  SetZVertex( Double_t val ) { fZVertex = val; }
+    void  SetZVertex( Double_t val )          { fZVertex = val; }\r
     void  SetTracksInVertex( Int_t val ){ fnTracksVertex = val; }
-    void  SetCFManager(AliCFManager* cfm){ fCFManager = cfm; }
-    AliCFManager* GetCFManager() const {return fCFManager;}
 
-    // Setters/Getters for UE Analysis
-    void   SetAnaTopology( Int_t val )       { fAnaType = val;    }
-    void   SetConePosition(Int_t val)        { fConePosition= val; }
-    void   SetConeRadius( Double_t val )     { fConeRadius = val; }
-    void   SetDoNotNormalizeQuantities()     { fIsNorm2Area = kFALSE; }
-    void   SetFilterBit( UInt_t val )        { fFilterBit = val;  }
-    void   SetJetsOnFly( Bool_t val )        { fJetsOnFly = val;  }
-    void   SetPtSumOrdering( Int_t val )     { fOrdering = val;   }
-    void   SetRegionType( Int_t val )        { fRegionType = val; }
-    void   SetUseChargeHadrons( Bool_t val ) { fUseChargeHadrons = val; }
-    void   SetUseChPartJet( Int_t val )      { fUseChPartJet = val; }
-    void   SetUseNegativeChargeType()        { fUsePositiveCharge = kFALSE; }
-    void   SetUseSingleCharge()              { fUseSingleCharge = kTRUE; } 
-    
-    virtual Int_t     GetAnaTopology()  const                    { return fAnaType; }
-    virtual Int_t     GetConePosition() const             { return fConePosition; }
-    virtual Double_t  GetConeRadius()          const             { return fConeRadius; }
-    virtual Bool_t    GetDoNotNormalizeQuantities() const { return fIsNorm2Area; }
-    virtual UInt_t    GetFilterBit()    const            { return fFilterBit;  }
-    virtual Bool_t    GetJetsOnFly()    const            { return fJetsOnFly;  }
-    virtual Int_t     GetPtSumOrdering() const            { return fOrdering;   }
-    virtual Int_t     GetRegionType()    const            { return fRegionType; }
-    virtual Bool_t    GetUseChargeHadrons() const         { return fUseChargeHadrons; }
-    virtual Int_t     GetUseChPartJet() const             { return fUseChPartJet; }
-    virtual Bool_t    GetUseNegativeChargeType()    const { return fUsePositiveCharge; }
-    virtual Bool_t    GetUseSingleCharge()  const         { return fUseSingleCharge; } 
-    
-    // Jet cuts
-    void   SetJet1EtaCut( Double_t val )      { fJet1EtaCut = val; }
-    void   SetJet2DeltaPhiCut( Double_t val ) { fJet2DeltaPhiCut = val; }
-    void   SetJet2RatioPtCut( Double_t val )  { fJet2RatioPtCut = val; }
-    void   SetJet3PtCut( Double_t val )       { fJet3PtCut = val; }
-    void   SetPtMinChPartJet( Double_t val )  { fChJetPtMin = val; }
-    
-    virtual Double_t   GetJet1EtaCut()       const         { return fJet1EtaCut; }
-    virtual Double_t   GetJet2DeltaPhiCut()  const        { return fJet2DeltaPhiCut; }
-    virtual Double_t   GetJet2RatioPtCut()   const         { return fJet2RatioPtCut; }
-    virtual Double_t   GetJet3PtCut()        const         { return fJet3PtCut; }
-    virtual Double_t   GetPtMinChPartJet()   const         { return fChJetPtMin; }
-    
-    // track cuts
-    void   SetTrackEtaCut( Double_t val ) { fTrackEtaCut = val; }
-    void   SetTrackPtCut( Double_t val )  { fTrackPtCut = val; }
-
-    virtual Double_t   GetTrackEtaCut()  const         { return fTrackEtaCut; }
-    virtual Double_t   GetTrackPtCut()   const         { return fTrackPtCut; }
-    
+    // Track selection cuts\r
+    void  SetTrackEtaCut( Double_t val ) { fTrackEtaCut = val; }\r
+    void  SetTrackPtCut( Double_t val )  { fTrackPtCut = val; }\r
        
   protected:
-    static AliAnalysisTaskCorrectionsUE*     fgTaskCorrectionsUE;        // Pointer to single instance
+    static     AliAnalysisTaskCorrectionsUE*     fgTaskCorrectionsUE;        // Pointer to single instance\r
   private:
-    void         AddSettingsTree();
-    Bool_t       EvaluateCorrections();
-    void         FillAvePartPtRegion( Double_t leadingE, Double_t ptMax, Double_t ptMin );
-    void         FillMultRegion( Double_t leadingE, Double_t nTrackPtmax, Double_t nTrackPtmin, Double_t ptMin );
-    void         FillSumPtRegion( Double_t leadingE, Double_t ptMax, Double_t ptMin );
-    TObjArray*   FindChargedParticleJets();
-    Int_t        IsTrackInsideRegion(TVector3 *jetVect, TVector3 *partVect);
-    void         WriteSettings();
-    
-    AliAnalyseUE*  fAnaUE;           //! points to AliAnalyseUE class
-    AliAODEvent*   fAOD;             //! AOD Event 
-    AliESDEventHandler*   fESDHandler;        //! ESD Event
-    TString        fAODBranch;       //  Jet branch name from standard AOD
-    AliCFManager*  fCFManager;       //  pointer to CORRECTION FRAMEWORK manager
-    Int_t          fDebug;           //  Debug flag
-    AliHistogramsUE* fHistosUE;      //  Points to UE histograms class
-    AliInputEventHandler* fInputHandler; // Input event handler
-    TList*         fListOfHistos;    //  Output list of histograms
-    AliMCEventHandler* fMcHandler;   //  pointer to MC handler
-    AliMCEvent*        fMcEvent;     //  pointer to MC event
-    
-    // Config
-    Int_t          fBinsPtInHist;     //  # bins for Pt histos range
-    Bool_t         fIsNorm2Area;      // Apply Area Normalization to collected observables
-    Double_t       fMaxJetPtInHist;   //  max Jet Pt value for histo range
-    Double_t       fMinJetPtInHist;   //  min Jet Pt value for histo range
-    
-    // For MC
-    Bool_t        fConstrainDistance;    // Constrain Distance between rec jet and pyth
-    Double_t       fMinDistance;          // Minimum distance between rec jet and pyth
-    Bool_t         fSimulateChJetPt;      // Naive simulation of charged jet Pt from original Jet in MC Header
-    Bool_t         fUseAliStack;          // Use AliSatck for particle info otherwise "mcparticles" branch in AOD
-    Bool_t         fUseMCParticleBranch;  // Run Over mcparticles branch in AOD
-    
-    // Cuts Events type
+    void       AddSettingsTree();                                  // add list of settings to output list\r
+    // Analysis methods\r
+    void       AnalyseCorrectionMode();                            // main algorithm to get correction maps\r
+    void       CreateContainer();                                 // create the output CF container\r
+    void       FillContainer(AliESDtrack *track, Int_t step,Bool_t mcvertex, Double_t matchLeading); // fill container \r
+    AliAnalyseLeadingTrackUE*       fAnalyseUE;         //! points to AliAnalyseLeadingTrackUE class\r
+    Int_t                           fDebug;             //  Debug flag\r
+    AliESDEvent*                    fESDEvent;          //! ESD Event\r
+    AliESDInputHandler*             fESDHandler;        //! ESD Input Handler\r
+    AliInputEventHandler*           fInputHandler;      //  Input event handler\r
+    TList*                          fListOfHistos;      //  Output list of histograms\r
+    AliMCEvent*                     fMcEvent;           //  pointer to MC event\r
+    AliMCEventHandler*              fMcHandler;         //  pointer to MC handler\r
+    Int_t                          fMode;              //  fMode = 0: data-like analysis \r
+                                                       //  fMode = 1: corrections analysis     \r
+    AliCFContainer*                fOutCFcont;         //  output CF container   \r
+    TH1F*                          fhEntries;          //  count events         \r
+    TH1F*                          fhFakes;            //  counts the amount of fake tracks \r
+    TH1F*                           fhPtMCAll;          //  pT distribution of all accepted MC tracks \r
+    TH1F*                           fhPtMCPrim;         //  pT distribution MC primaries\r
+    TH1F*                           fhPtMCSec;          //  pT distribution MC secondaries\r
+    TH1F*                           fhPtMCPrimFake;     //  pT distribution MC fake primaries\r
+    TH1F*                           fhPtMCSecFake;      //  pT distribution MC fake secondaries\r
+\r
+    // Cuts Events QA\r
     Int_t          fnTracksVertex;        // QA tracks pointing to principal vertex (= 3 default) 
     Double_t       fZVertex;              // Position of Vertex in Z direction
-    
-    // Cuts UE analysis
-    Int_t          fAnaType;              // Analysis type on jet topology: 
-                                               //     1=inclusive  (default) 
-                                               //     2=back to back inclusive
-                                               //     3=back to back exclusive
-                                               //     4=Pt max (max Pt track in region)
-                                               //     5=gama jet (back to back) ???
-                                               //  Minimum bias
-                                               //     31 = Semi jet (charged leading particle jets)
-                                               //     32 = Random jetcone  ?
-                                               //     33 = Swiss chees   ?
-    
-    
-    Int_t          fConePosition;         // This parameter set how will cone center in transversal zone will be set
-                                          //    1 : To be used in any jet topology (default value)
-                                          //        eta_cone = eta_leadingjet
-                                          //        phi_cone = phi_leadingjet + - 90
-                                          //    2 : To be used in multiple jet topology (code will cry otherwise)
-                                          //        eta_cone = (eta_leadingjet + eta_subleadingjet)/2
-                                          //        phi_cone = phi_leadingjet + - 90
-    
-    Double_t       fConeRadius;           // if selected Cone-like region type, set Radius (=0.7 default)
-    
-    UInt_t         fFilterBit;            // Select tracks from an specific track cut (default 0xFF all track selected)
-    
-    Bool_t         fJetsOnFly;            // if jets are reconstructed on the fly from AOD tracks (see ConnectInputData() )
-    
-    // UE analysis is conducted in different type of regions
-    // Transverse are those like defined in: R. Field Acta Physica Polonica B. Vol 36 No. 2 pg 167 (2005) 
-    // Cone regions like defined in: Phys. Rev. D 70, 072002 (2004)
-    Int_t         fRegionType;           // 1 = transverse regions (default)
-                                          // 2 = cone regions   
-    
-
-
-    Bool_t         fUseChargeHadrons;     // Only use charge hadrons
-    Bool_t         fUseChPartJet;         // Use "Charged Particle Jet" instead of jets from AOD see FindChargedParticleJets()
-    
-    // Theoreticians ask for tools charge-aware
-    // especially those which are related to multiplicity and MC-tunings
-    // see arXiv:hep-ph/0507008v3
-    Bool_t         fUsePositiveCharge;    //If Single type of charge used then set which one (=kTRUE default positive)
-    Bool_t         fUseSingleCharge;      //Make analysis for a single type of charge (=kFALSE default)
-    
-    Int_t          fOrdering;             //  Pt and multiplicity summation ordering:
-                   //     1=CDF-like -independent sorting according quantity to be scored: Double sorting- (default)
-                   //        if Pt summation will be scored take Pt minimum between both zones and 
-                   //        fill Pt Max. and Min. histog. accordingly
-                   //        if Multiplicity summation will be scored take Mult. minimum between both zones and 
-                   //        fill Mult Max and Min histog. accordingly
-                   //       Bib:
-                   //     2=Marchesini-like (Only Pt sorting: Single sorting)
-                   //        sort only according Pt summation scored, find minimum between both zones and
-                   //        fill Pt and Multiplicity Max and Min summation histog. following only this criterium
-                   //        Bib: Phys. Rev. D 38, 3419 (1988)
-                   //     3=Nameless pt per track single sorting
-                   //        sort according to pt per track scored in each transverse zone 
-                   //        lowest values indicates minimum zone.   
-                   //     4=User Selection sorting (NOTE: USER must implement it within cxx)
-   
-    
-    // Jet cuts 
-    Double_t      fChJetPtMin;       // Min Pt for charged Particle Jet
-    Double_t      fJet1EtaCut;       // |jet1 eta| < fJet1EtaCut   (fAnaType = 1,2,3)
-    Double_t      fJet2DeltaPhiCut;  // |Jet1.Phi - Jet2.Phi| < fJet2DeltaPhiCut (fAnaType = 2,3)
-    Double_t      fJet2RatioPtCut;   // Jet2.Pt/Jet1Pt > fJet2RatioPtCut  (fAnaType = 2,3)
-    Double_t      fJet3PtCut;        // Jet3.Pt < fJet3PtCut  (fAnaType = 3)
-
-    // track cuts
-    Double_t      fTrackEtaCut;      // Eta cut on tracks in the regions (fRegionType=1)
-    Double_t      fTrackPtCut;       // Pt cut of tracks in the regions
-   
-    // MC cross-section 
-    Double_t      fAvgTrials;        // average trials used to fill the fh1Trials histogram in case we do not have trials on a event by event basis
-    //TProfile*     fh1Xsec;           //!
-    //TH1F*         fh1Trials;         //!
-   
-
-    ClassDef( AliAnalysisTaskCorrectionsUE, 5); // Analysis task for Underlying Event analysis
+    TH1F*          fhVertexContributors;  // Plot number of contributors in vertex  \r
+    TH3F*          fhVertexReso;          //  vertex resolution in XY and Z vs. number of contributors\r
+    // Track cuts\r
+    Double_t       fTrackEtaCut;          // Eta cut on tracks in the regions (fRegionType=1)\r
+    Double_t       fTrackPtCut;           // Pt cut of tracks in the regions\r
+    AliESDtrackCuts* fEsdTrackCuts;       // ITS+TPC 2009 cuts (no SPD requirement, no DCA cut) \r
+    AliESDtrackCuts* fEsdTrackCutsSPD;     // Require 1 cluser in SPD\r
+    AliESDtrackCuts* fEsdTrackCutsSDD;     // Require 1 cluser in 1st layer SDD\r
+    AliESDtrackCuts* fEsdTrackCutsDCA;     // Add pT dependent DCA cut\r
+    ClassDef( AliAnalysisTaskCorrectionsUE, 5); // Analysis task to correct Underlying Event analysis\r
   };
 
 #endif