]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Updates to UE leading-track analysis
authorjgrosseo <jgrosseo@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 28 Sep 2010 14:05:30 +0000 (14:05 +0000)
committerjgrosseo <jgrosseo@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 28 Sep 2010 14:05:30 +0000 (14:05 +0000)
tracking efficiency and contamination in separate histogram
optional reduction of memory footprint by not filling steps needed for the evaluation of the
corrections
systematic study of effect of particle composition
added macro to correct distributions to SVN

PWG4/JetTasks/AliAnalyseLeadingTrackUE.cxx
PWG4/JetTasks/AliAnalyseLeadingTrackUE.h
PWG4/JetTasks/AliAnalysisTaskLeadingTrackUE.cxx
PWG4/JetTasks/AliAnalysisTaskLeadingTrackUE.h
PWG4/JetTasks/AliUEHist.cxx
PWG4/JetTasks/AliUEHist.h
PWG4/JetTasks/AliUEHistograms.cxx
PWG4/JetTasks/AliUEHistograms.h
PWG4/macros/AddTaskLeadingTrackUE.C
PWG4/macros/underlyingevent/correct.C [new file with mode: 0644]

index 9379da918efb36544719f2772d92f18d4bf88842..8e16c2058a29fe64a89195210a891efc811c3891 100644 (file)
@@ -166,6 +166,34 @@ TObjArray*  AliAnalyseLeadingTrackUE::FindLeadingObjects(TObject *obj)
   }
 
 
+//-------------------------------------------------------------------
+TObjArray* AliAnalyseLeadingTrackUE::GetAcceptedParticles(TObject* obj, TObject* arrayMC, Bool_t onlyprimaries, Int_t particleSpecies)
+{
+  // Returns an array of particles that pass the cuts, if arrayMC is given each reconstructed particle is replaced by its corresponding MC particles, depending on the parameter onlyprimaries only for primaries 
+  // particleSpecies: -1 all particles are returned
+  //                  0 (pions) 1 (kaons) 2 (protons) 3 (others) particles
+
+  Int_t nTracks = NParticles(obj);
+  TObjArray* tracks = new TObjArray;
+  // Loop over tracks or jets
+  for (Int_t ipart=0; ipart<nTracks; ++ipart) {
+    AliVParticle* part = ParticleWithCuts( obj, ipart, onlyprimaries, particleSpecies );
+    if (!part) continue;
+    
+    if (arrayMC && arrayMC->InheritsFrom("TClonesArray") && obj->InheritsFrom("AliAODEvent")) {
+      Int_t label = ((AliAODTrack*)part)->GetLabel();
+      // re-define part as the matched MC particle
+      part = (AliAODMCParticle*)ParticleWithCuts(arrayMC, TMath::Abs(label),onlyprimaries, particleSpecies);
+      if (!part)continue;
+    }
+    
+    tracks->Add(part);
+  }
+
+  return tracks;
+}
+
 //-------------------------------------------------------------------
 TObjArray* AliAnalyseLeadingTrackUE::GetMinMaxRegion(TList *transv1, TList *transv2)
 {
@@ -231,9 +259,11 @@ Int_t  AliAnalyseLeadingTrackUE::NParticles(TObject* obj)
 
 
 //-------------------------------------------------------------------
-AliVParticle*  AliAnalyseLeadingTrackUE::ParticleWithCuts(TObject* obj, Int_t ipart, Bool_t onlyprimaries)
+AliVParticle*  AliAnalyseLeadingTrackUE::ParticleWithCuts(TObject* obj, Int_t ipart, Bool_t onlyprimaries, Int_t particleSpecies)
 {
   // Returns track or MC particle at position "ipart" if passes selection criteria
+  // particleSpecies: -1 all particles are returned
+  //                  0 (pions) 1 (kaons) 2 (protons) 3 (others) particles
   AliVParticle *part=0;
   
   if (obj->InheritsFrom("TClonesArray")){ // AOD-MC PARTICLE
@@ -250,6 +280,35 @@ AliVParticle*  AliAnalyseLeadingTrackUE::ParticleWithCuts(TObject* obj, Int_t ip
                                  TMath::Abs(pdgCode)==321;    // Kaon
                 if (!isHadron) return 0;                                 
                }
+        if (particleSpecies != -1) {
+                // find the primary mother
+                AliVParticle* mother = part;
+                while (!((AliAODMCParticle*)mother)->IsPhysicalPrimary())
+                {
+                  if (((AliAODMCParticle*)mother)->GetMother() < 0)
+                  {
+                    mother = 0;
+                    break;
+                  }
+                    
+                  mother = (AliVParticle*) arrayMC->At(((AliAODMCParticle*)mother)->GetMother());
+                  if (!mother)
+                    break;
+                }
+                
+                if (mother)
+                {
+                  Int_t pdgCode = ((AliAODMCParticle*)mother)->GetPdgCode();
+                  if (particleSpecies == 0 && TMath::Abs(pdgCode)!=211)
+                          return 0;
+                  if (particleSpecies == 1 && TMath::Abs(pdgCode)!=321)
+                          return 0;
+                  if (particleSpecies == 2 && TMath::Abs(pdgCode)!=2212)
+                          return 0;
+                  if (particleSpecies == 3 && (TMath::Abs(pdgCode)==211 || TMath::Abs(pdgCode)==321 || TMath::Abs(pdgCode)==2212))
+                          return 0;
+                }
+        }
   
   }else if (obj->InheritsFrom("TObjArray")){ // list of AliVParticle
        TObjArray *array = dynamic_cast<TObjArray*>(obj);
@@ -409,7 +468,7 @@ TObjArray*  AliAnalyseLeadingTrackUE::SortRegions(const AliVParticle* leading, T
        if (TMath::Abs(leadVect.DeltaPhi(partVect)) > k120rad ) region = -2;  //backward
        
        // skip leading particle 
-       if (leading == part)
+        if (leading == part)
          continue;
        
        if (!region)continue;
index 7095be60dfa1733b1922b234c766e185b58ea053..9c5f823ce1c7f1528a32a4714e41b9b15e983aff 100644 (file)
@@ -47,9 +47,10 @@ class AliAnalyseLeadingTrackUE : public TObject {
   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
-  AliVParticle*  ParticleWithCuts(TObject* obj, Int_t ipart, Bool_t onlyprimaries = kTRUE );                     // Returns track or MC particle at position "ipart" if passes selection criteria
+  AliVParticle*  ParticleWithCuts(TObject* obj, Int_t ipart, Bool_t onlyprimaries = kTRUE, Int_t particleSpecies = -1);                     // Returns track or MC particle at position "ipart" if passes selection criteria
   void          QSortTracks(TObjArray &a, Int_t first, Int_t last);               // Sort by pT an array of AliVParticles 
   TObjArray*     SortRegions(const AliVParticle* leading, TObject* obj, TObject* arrayMC, Bool_t onlyprimaries = kTRUE); // Assign particles to towards, away or transverse regions
+  TObjArray*     GetAcceptedParticles(TObject* obj, TObject* arrayMC, Bool_t onlyprimaries = kTRUE, Int_t particleSpecies = -1); 
   Bool_t         TriggerSelection(const TObject* obj);                                   // Select good triggers with AliPhysicsSelection class
   Bool_t         VertexSelection(const TObject* obj, Int_t ntracks, Double_t zed);       // Vertex selection: see implementation
 
index 207aea12aa5b22ffb4e1799403fc678073ad665d..027a959afe2477dd089803abd09d3b24a6ef84ed 100644 (file)
@@ -79,6 +79,7 @@ AliAnalysisTask(name,""),
 // general configuration
 fDebug(0),
 fMode(0),
+fReduceMemoryFootprint(kFALSE),
 // pointers to UE classes
 fAnalyseUE(0x0),
 fHistosUE(0x0),
@@ -115,6 +116,13 @@ fAvgTrials(1)
 
 }
 
+AliAnalysisTaskLeadingTrackUE::~AliAnalysisTaskLeadingTrackUE() 
+{ 
+  // destructor
+  
+  if (fListOfHistos  && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) 
+    delete fListOfHistos;
+}
 
 /************** INTERFACE METHODS *****************************/
 
@@ -294,8 +302,9 @@ void  AliAnalysisTaskLeadingTrackUE::AddSettingsTree()
 //____________________________________________________________________
 void  AliAnalysisTaskLeadingTrackUE::AnalyseCorrectionMode()
 {
-  
   // Run the analysis on MC to get the correction maps
+  //
+  // if fReduceMemoryFootprint step 3,4,5,7,9 are not filled
 
   PostData(0,fListOfHistos);
   
@@ -349,9 +358,9 @@ void  AliAnalysisTaskLeadingTrackUE::AnalyseCorrectionMode()
   if (fAnalyseUE->TriggerSelection(fInputHandler))
   {
     // PILEUP-CUT 
-    Bool_t select = kTRUE;
+    Bool_t select = kFALSE;
     if (fSelectBit) select = AliAnalysisHelperJetTasks::TestSelectInfo(fSelectBit);
-    if (!select)
+    if (select)
       fHistosUE->FillEvent(fillId, -2);
     else
     {
@@ -384,7 +393,20 @@ void  AliAnalysisTaskLeadingTrackUE::AnalyseCorrectionMode()
              // STEP 2
              fHistosUE->Fill(fillId,AliUEHist::kCFStepVertex,leadingMC,(TList*)regionSortedParticlesMC->At(0),(TList*)regionSortedParticlesMC->At(1),(TList*)regionsMinMaxMC->At(0),(TList*)regionsMinMaxMC->At(1));
     
-      
+              // fill here for tracking efficiency
+              // loop over particle species
+             for (Int_t particleSpecies = 0; particleSpecies < 4; particleSpecies++)
+              {
+               TObjArray* primMCParticles = fAnalyseUE->GetAcceptedParticles(fArrayMC, 0x0, kTRUE, particleSpecies);
+               TObjArray* primRecoTracksMatched = fAnalyseUE->GetAcceptedParticles(fAOD, fArrayMC, kTRUE, particleSpecies);
+               TObjArray* allRecoTracksMatched = fAnalyseUE->GetAcceptedParticles(fAOD, fArrayMC, kFALSE, particleSpecies);
+              
+               fHistosUE->FillTrackingEfficiency(primMCParticles, primRecoTracksMatched, allRecoTracksMatched, particleSpecies);
+              
+               delete primMCParticles;
+               delete primRecoTracksMatched;
+               delete allRecoTracksMatched;
+             }
       
              // Get Reconstructed leading particle *******************************
              TObjArray *ltRECO = fAnalyseUE->FindLeadingObjects(fAOD);
@@ -402,16 +424,18 @@ void  AliAnalysisTaskLeadingTrackUE::AnalyseCorrectionMode()
                // Fill UE containers (step, leading track, towards particles, away particles, transverse MIN and MAX particles)
                // (MC-true leading particle and MC-true all particles)
                // STEP 3
-               fHistosUE->Fill(fillId,AliUEHist::kCFStepAnaTopology,leadingMC,(TList*)regionSortedParticlesMC->At(0),(TList*)regionSortedParticlesMC->At(1),(TList*)regionsMinMaxMC->At(0),(TList*)regionsMinMaxMC->At(1));
+               if (!fReduceMemoryFootprint)
+                 fHistosUE->Fill(fillId,AliUEHist::kCFStepAnaTopology,leadingMC,(TList*)regionSortedParticlesMC->At(0),(TList*)regionSortedParticlesMC->At(1),(TList*)regionsMinMaxMC->At(0),(TList*)regionsMinMaxMC->At(1));
       
                //Sort RECO particles w.r.t. MC-leading and return matched (primary) MC particle 
                // (you cannot sort tracks w.r.t. RECO-leading and plot it vs. MC-leading ...)
-               TObjArray *regionSortedParticlesRECOLTMC = (TObjArray*)fAnalyseUE->SortRegions(leadingMC, fAOD, fArrayMC); 
+               TObjArray *regionSortedParticlesRECOLTMC = (TObjArray*)fAnalyseUE->SortRegions(leadingMC, fAOD, fArrayMC, kTRUE); 
                TObjArray *regionsMinMaxRECOLTMC = (TObjArray*)fAnalyseUE->GetMinMaxRegion((TList*)regionSortedParticlesRECOLTMC->At(2),(TList*)regionSortedParticlesRECOLTMC->At(3));
                // Fill UE containers (step, leading track, towards particles, away particles, transverse MIN and MAX particles)
                // (MC leading particle and RECO-matched (quantities from MC particle)  all particles)
                // STEP 4
-               fHistosUE->Fill(fillId,AliUEHist::kCFStepTrackedOnlyPrim,leadingMC,(TList*)regionSortedParticlesRECOLTMC->At(0),(TList*)regionSortedParticlesRECOLTMC->At(1),(TList*)regionsMinMaxRECOLTMC->At(0),(TList*)regionsMinMaxRECOLTMC->At(1));
+               if (!fReduceMemoryFootprint)
+                 fHistosUE->Fill(fillId,AliUEHist::kCFStepTrackedOnlyPrim,leadingMC,(TList*)regionSortedParticlesRECOLTMC->At(0),(TList*)regionSortedParticlesRECOLTMC->At(1),(TList*)regionsMinMaxRECOLTMC->At(0),(TList*)regionsMinMaxRECOLTMC->At(1));
                // comparing this step with step 3 (for all-tracks observables) you get the tracking efficiency
         
                //Sort RECO particles w.r.t. MC-leading and return matched (primary+secondary) MC particle 
@@ -422,7 +446,8 @@ void  AliAnalysisTaskLeadingTrackUE::AnalyseCorrectionMode()
                // Fill UE containers (step, leading track, towards particles, away particles, transverse MIN and MAX particles)
                // (MC leading particle and RECO-matched (quantities from MC particle)  all particles)
                // STEP 5
-               fHistosUE->Fill(fillId,AliUEHist::kCFStepTracked,leadingMC,(TList*)regionSortedParticlesRECOLTMC2->At(0),(TList*)regionSortedParticlesRECOLTMC2->At(1),(TList*)regionsMinMaxRECOLTMC2->At(0),(TList*)regionsMinMaxRECOLTMC2->At(1));
+               if (!fReduceMemoryFootprint)
+                  fHistosUE->Fill(fillId,AliUEHist::kCFStepTracked,leadingMC,(TList*)regionSortedParticlesRECOLTMC2->At(0),(TList*)regionSortedParticlesRECOLTMC2->At(1),(TList*)regionsMinMaxRECOLTMC2->At(0),(TList*)regionsMinMaxRECOLTMC2->At(1));
                // comparing this step with step 3 (for all-tracks observables) you get the tracking efficiency
           
                // SWITCH TO RECONSTRUCTED TRACKS  ************************************
@@ -437,7 +462,8 @@ void  AliAnalysisTaskLeadingTrackUE::AnalyseCorrectionMode()
         
                // STEP 8 for reduced efficiency study
                FillReducedEfficiency(fillId, AliUEHist::kCFStepBiasStudy, ltRECO, kFALSE);
-               FillReducedEfficiency(fillId, AliUEHist::kCFStepBiasStudy2, ltRECO, kTRUE);
+               if (!fReduceMemoryFootprint)
+                  FillReducedEfficiency(fillId, AliUEHist::kCFStepBiasStudy2, ltRECO, kTRUE);
         
                // count number of reco tracks above 150 MeV/c
                Int_t nRecoTracks = 0; 
@@ -502,9 +528,9 @@ void  AliAnalysisTaskLeadingTrackUE::AnalyseDataMode()
   // Trigger selection ************************************************
   if (!fAnalyseUE->TriggerSelection(fInputHandler)) return;
   // PILEUP-CUT 
-  Bool_t select = kTRUE;
+  Bool_t select = kFALSE;
   if (fSelectBit) select = AliAnalysisHelperJetTasks::TestSelectInfo(fSelectBit);
-  if (!select) 
+  if (select) 
   {
     fHistosUE->FillEvent(eventId, -2);
     return;
index 89f4b66cb905fabb904f6000c65a752ed7fcec0c..8824cb8f6d0e355c7b30c8858ed566201ab9a6ec 100644 (file)
@@ -46,7 +46,7 @@ class  AliAnalysisTaskLeadingTrackUE : public AliAnalysisTask
   {
   public:
     AliAnalysisTaskLeadingTrackUE(const char* name="AliAnalysisTaskLeadingTrackUE");
-    virtual           ~AliAnalysisTaskLeadingTrackUE() {if ( fListOfHistos ) delete fListOfHistos; }
+    virtual           ~AliAnalysisTaskLeadingTrackUE();
        
       
     // Implementation of interace methods
@@ -62,6 +62,7 @@ class  AliAnalysisTaskLeadingTrackUE : public AliAnalysisTask
     // general configuration
     virtual     void    SetDebugLevel( Int_t level )  { fDebug = level; }
     virtual     void    SetMode(Int_t mode)           { fMode  = mode;  }
+    virtual     void    SetReduceMemoryFootprint(Bool_t flag) { fReduceMemoryFootprint = flag; }
     
     // histogram settings
     void               SetPtRangeInHist( Int_t bin, Double_t min, Double_t max ) {
@@ -100,6 +101,7 @@ class  AliAnalysisTaskLeadingTrackUE : public AliAnalysisTask
     Int_t               fDebug;           //  Debug flag
     Int_t              fMode;            //  fMode = 0: data-like analysis 
                                          //  fMode = 1: corrections analysis   
+    Bool_t              fReduceMemoryFootprint; // reduce memory consumption by writing less debug histograms
     
     // Pointers to external UE classes
     AliAnalyseLeadingTrackUE*     fAnalyseUE;      //! points to class containing common analysis algorithms
index 904da10caf2eb1c9ff9a38b793f94ebc17b36e48..4480b0337f978a85d0fe37837532f5a03d6317c8 100644 (file)
@@ -43,6 +43,7 @@ AliUEHist::AliUEHist(const char* reqHist) :
   TObject(),
   fkRegions(4),
   fEventHist(0),
+  fTrackHistEfficiency(0),
   fEtaMin(0),
   fEtaMax(0),
   fPtMin(0),
@@ -105,6 +106,10 @@ AliUEHist::AliUEHist(const char* reqHist) :
   for (Int_t i=0; i<=kNMultiplicityBins; i++)
     multiplicityBins[i] = -0.5 + i;
   multiplicityBins[kNMultiplicityBins] = 200;
+
+  // particle species
+  const Int_t kNSpeciesBins = 4; // pi, K, p, rest
+  Double_t speciesBins[] = { -0.5, 0.5, 1.5, 2.5, 3.5 };
   
   trackBins[3] = multiplicityBins;
   iTrackBin[3] = kNMultiplicityBins;
@@ -176,6 +181,16 @@ AliUEHist::AliUEHist(const char* reqHist) :
   fEventHist->SetVarTitle(1, trackAxisTitle[3]);
   
   SetStepNames(fEventHist);
+  
+  iTrackBin[2] = kNSpeciesBins;
+
+  fTrackHistEfficiency = new AliCFContainer("fTrackHistEfficiency", "Tracking efficiency", 3, 3, iTrackBin);
+  fTrackHistEfficiency->SetBinLimits(0, trackBins[0]);
+  fTrackHistEfficiency->SetVarTitle(0, trackAxisTitle[0]);
+  fTrackHistEfficiency->SetBinLimits(1, trackBins[1]);
+  fTrackHistEfficiency->SetVarTitle(1, trackAxisTitle[1]);
+  fTrackHistEfficiency->SetBinLimits(2, speciesBins);
+  fTrackHistEfficiency->SetVarTitle(2, "particle species");
 }
 
 //_____________________________________________________________________________
@@ -183,6 +198,7 @@ AliUEHist::AliUEHist(const AliUEHist &c) :
   TObject(),
   fkRegions(4),
   fEventHist(0),
+  fTrackHistEfficiency(0),
   fEtaMin(0),
   fEtaMax(0),
   fPtMin(0),
@@ -227,6 +243,12 @@ AliUEHist::~AliUEHist()
     fEventHist = 0;
   }
   
+  if (fTrackHistEfficiency)
+  {
+    delete fTrackHistEfficiency;
+    fTrackHistEfficiency = 0;
+  }
+
   if (fCache)
   {
     delete fCache;
@@ -258,6 +280,9 @@ void AliUEHist::Copy(TObject& c) const
 
   if (fEventHist)
     target.fEventHist = dynamic_cast<AliCFContainer*> (fEventHist->Clone());
+  
+  if (fTrackHistEfficiency)
+    target.fTrackHistEfficiency = dynamic_cast<AliCFContainer*> (fTrackHistEfficiency->Clone());
 }
 
 //____________________________________________________________________
@@ -277,7 +302,7 @@ Long64_t AliUEHist::Merge(TCollection* list)
   TObject* obj;
 
   // collections of objects
-  const Int_t kMaxLists = fkRegions+1;
+  const Int_t kMaxLists = fkRegions+2;
   TList** lists = new TList*[kMaxLists];
   
   for (Int_t i=0; i<kMaxLists; i++)
@@ -295,6 +320,7 @@ Long64_t AliUEHist::Merge(TCollection* list)
         lists[i]->Add(entry->fTrackHist[i]);
     
     lists[fkRegions]->Add(entry->fEventHist);
+    lists[fkRegions+1]->Add(entry->fTrackHistEfficiency);
 
     count++;
   }
@@ -303,6 +329,7 @@ Long64_t AliUEHist::Merge(TCollection* list)
       fTrackHist[i]->Merge(lists[i]);
   
   fEventHist->Merge(lists[fkRegions]);
+  fTrackHistEfficiency->Merge(lists[fkRegions+1]);
 
   for (Int_t i=0; i<kMaxLists; i++)
     delete lists[i];
@@ -656,10 +683,12 @@ void AliUEHist::Correct(AliUEHist* corrections)
       vertexCorrectionObs->SetBinContent(i, vertexCorrection->Interpolate(xPos));
   }
  
+  #if 0
   new TCanvas;
   vertexCorrection->DrawCopy();
   vertexCorrectionObs->SetLineColor(2);
   vertexCorrectionObs->DrawCopy("same");
+  #endif
   
   CorrectTracks(kCFStepVertex, kCFStepTriggered, vertexCorrectionObs, 3);
   CorrectEvents(kCFStepVertex, kCFStepTriggered, vertexCorrectionObs, 1);
@@ -672,33 +701,51 @@ void AliUEHist::Correct(AliUEHist* corrections)
 }
 
 //____________________________________________________________________
-TH1* AliUEHist::GetTrackEfficiency(CFStep step1, CFStep step2, Int_t axis1, Int_t axis2)
+TH1* AliUEHist::GetTrackEfficiency(CFStep step1, CFStep step2, Int_t axis1, Int_t axis2, Int_t source)
 {
   // creates a track-level efficiency by dividing step2 by step1
   // projected to axis1 and axis2 (optional if >= 0)
+  //
+  // source: 0 = fTrackHist; 1 = fTrackHistEfficiency
   
   // integrate over regions
   // cache it for efficiency (usually more than one efficiency is requested)
-  if (!fCache)
+  
+  AliCFContainer* sourceContainer = 0;
+  
+  if (source == 0)
   {
-    fCache = (AliCFContainer*) fTrackHist[0]->Clone();
-    for (Int_t i = 1; i < fkRegions; i++)
-      if (fTrackHist[i])
-        fCache->Add(fTrackHist[i]);
+    if (!fCache)
+    {
+      fCache = (AliCFContainer*) fTrackHist[0]->Clone();
+      for (Int_t i = 1; i < fkRegions; i++)
+        if (fTrackHist[i])
+          fCache->Add(fTrackHist[i]);
+    }
+    sourceContainer = fCache;
   }
-      
+  else if (source == 1)
+  {
+    sourceContainer = fTrackHistEfficiency;
+    // step offset because we start with kCFStepAnaTopology
+    step1 = (CFStep) ((Int_t) step1 - (Int_t) kCFStepAnaTopology);
+    step2 = (CFStep) ((Int_t) step2 - (Int_t) kCFStepAnaTopology);
+  }
+  else
+    return 0;
+        
   // reset all limits and set the right ones except those in axis1 and axis2
-  ResetBinLimits(fCache->GetGrid(step1));
-  ResetBinLimits(fCache->GetGrid(step2));
+  ResetBinLimits(sourceContainer->GetGrid(step1));
+  ResetBinLimits(sourceContainer->GetGrid(step2));
   if (fEtaMax > fEtaMin && axis1 != 0 && axis2 != 0)
   {
-    fCache->GetGrid(step1)->SetRangeUser(0, fEtaMin, fEtaMax);
-    fCache->GetGrid(step2)->SetRangeUser(0, fEtaMin, fEtaMax);
+    sourceContainer->GetGrid(step1)->SetRangeUser(0, fEtaMin, fEtaMax);
+    sourceContainer->GetGrid(step2)->SetRangeUser(0, fEtaMin, fEtaMax);
   }
   if (fPtMax > fPtMin && axis1 != 1 && axis2 != 1)
   {
-    fCache->GetGrid(step1)->SetRangeUser(1, fPtMin, fPtMax);
-    fCache->GetGrid(step2)->SetRangeUser(1, fPtMin, fPtMax);
+    sourceContainer->GetGrid(step1)->SetRangeUser(1, fPtMin, fPtMax);
+    sourceContainer->GetGrid(step2)->SetRangeUser(1, fPtMin, fPtMax);
   }
   
   TH1* measured = 0;
@@ -706,13 +753,13 @@ TH1* AliUEHist::GetTrackEfficiency(CFStep step1, CFStep step2, Int_t axis1, Int_
     
   if (axis2 >= 0)
   {
-    generated = fCache->Project(axis1, axis2, step1);
-    measured = fCache->Project(axis1, axis2, step2);
+    generated = sourceContainer->Project(axis1, axis2, step1);
+    measured = sourceContainer->Project(axis1, axis2, step2);
   }
   else
   {
-    generated = fCache->Project(axis1, step1);
-    measured = fCache->Project(axis1, step2);
+    generated = sourceContainer->Project(axis1, step1);
+    measured = sourceContainer->Project(axis1, step2);
   }
   
   // check for bins with less than 100 entries, print warning
@@ -797,6 +844,9 @@ TH1* AliUEHist::GetTrackEfficiency(CFStep step1, CFStep step2, Int_t axis1, Int_
   
   delete generated;
   
+  ResetBinLimits(sourceContainer->GetGrid(step1));
+  ResetBinLimits(sourceContainer->GetGrid(step2));
+  
   return measured;
 }
 
@@ -1088,3 +1138,23 @@ const char* AliUEHist::GetStepTitle(CFStep step)
   
   return 0;
 }
+
+//____________________________________________________________________
+void AliUEHist::CopyReconstructedData(AliUEHist* from)
+{
+  // copies those histograms extracted from ESD to this object
+  
+  // TODO at present only the pointers are copied
+  
+  for (Int_t region=0; region<4; region++)
+  {
+    if (!fTrackHist[region])
+      continue;
+  
+    fTrackHist[region]->SetGrid(AliUEHist::kCFStepReconstructed, from->fTrackHist[region]->GetGrid(AliUEHist::kCFStepReconstructed));
+    fTrackHist[region]->SetGrid(AliUEHist::kCFStepBiasStudy,     from->fTrackHist[region]->GetGrid(AliUEHist::kCFStepBiasStudy));
+  }
+    
+  fEventHist->SetGrid(AliUEHist::kCFStepReconstructed, from->fEventHist->GetGrid(AliUEHist::kCFStepReconstructed));
+  fEventHist->SetGrid(AliUEHist::kCFStepBiasStudy,     from->fEventHist->GetGrid(AliUEHist::kCFStepBiasStudy));
+}
index 606912e71914d7a97b6977e5bd9f4a9eda7ac6be..f853fa5728a9f1e98545ff18971feb93d5049c47 100644 (file)
@@ -36,13 +36,16 @@ class AliUEHist : public TObject
   
   AliCFContainer* GetTrackHist(Region region) { return fTrackHist[region]; }
   AliCFContainer* GetEventHist() { return fEventHist; }
+  AliCFContainer* GetTrackHistEfficiency()     { return fTrackHistEfficiency; }
   
   void SetTrackHist(Region region, AliCFContainer* hist) { fTrackHist[region] = hist; }
   void SetEventHist(AliCFContainer* hist) { fEventHist = hist; }
   
+  void CopyReconstructedData(AliUEHist* from);
+  
   TH1D* GetUEHist(CFStep step, Region region, Float_t ptLeadMin = -1, Float_t ptLeadMax = -1);
   
-  TH1* GetTrackEfficiency(CFStep step1, CFStep step2, Int_t axis1, Int_t axis2 = -1);
+  TH1* GetTrackEfficiency(CFStep step1, CFStep step2, Int_t axis1, Int_t axis2 = -1, Int_t source = 1);
   TH1* GetEventEfficiency(CFStep step1, CFStep step2, Int_t axis1, Int_t axis2 = -1, Float_t ptLeadMin = -1, Float_t ptLeadMax = -1);
   TH1* GetBias(CFStep step1, CFStep step2, Int_t region, const char* axis, Float_t leadPtMin = 0, Float_t leadPtMax = 0);
   
@@ -86,6 +89,7 @@ protected:
 
   AliCFContainer* fTrackHist[4];      // container for track level distributions in four regions (toward, away, min, max) and at four analysis steps
   AliCFContainer* fEventHist;         // container for event level distribution at four analysis steps
+  AliCFContainer* fTrackHistEfficiency; // container for tracking efficiency and contamination (all particles filled including leading one): axes: eta, pT, particle species
   
   Float_t fEtaMin;                    // eta min for projections
   Float_t fEtaMax;                    // eta max for projections
@@ -98,7 +102,7 @@ protected:
   
   AliCFContainer* fCache;             //! cache variable for GetTrackEfficiency
   
-  ClassDef(AliUEHist, 2) // underlying event histogram container
+  ClassDef(AliUEHist, 3) // underlying event histogram container
 };
 
 #endif
index ef1dd9cf1c6a233293ddfbb5188ab95cf8b7d028..51b08a3760d13582a0ab9a770d37a3d9736219bb 100644 (file)
@@ -223,7 +223,7 @@ void AliUEHistograms::Fill(Int_t eventType, AliUEHist::CFStep step, AliVParticle
     FillRegion(AliUEHist::kAway,   step, leading, away, multiplicity);
     FillRegion(AliUEHist::kMin,    step, leading, min, multiplicity);
     FillRegion(AliUEHist::kMax,    step, leading, max, multiplicity);
-  
     Double_t vars[2];
     vars[0] = leading->Pt();
     vars[1] = multiplicity;
@@ -301,6 +301,39 @@ void AliUEHistograms::Fill(AliVParticle* leadingMC, AliVParticle* leadingReco)
   }
 }
   
+//____________________________________________________________________
+void AliUEHistograms::FillTrackingEfficiency(TObjArray* mc, TObjArray* recoPrim, TObjArray* recoAll, Int_t particleType)
+{
+  // fills the tracking efficiency objects
+  //
+  // mc: all primary MC particles
+  // recoPrim: reconstructed primaries (again MC particles)
+  // recoAll: reconstructed (again MC particles)
+  // particleType is: 0 for pion, 1 for kaon, 2 for proton, 3 for others
+  
+  for (Int_t step=0; step<3; step++)
+  {
+    TObjArray* list = mc;
+    if (step == 1)
+      list = recoPrim;
+    else if (step == 2)
+      list = recoAll;
+      
+    for (Int_t i=0; i<list->GetEntries(); i++)
+    {
+      AliVParticle* particle = (AliVParticle*) list->At(i);
+      Double_t vars[2];
+      vars[0] = particle->Eta();
+      vars[1] = particle->Pt();
+      vars[2] = particleType;
+      
+      fNumberDensitypT->GetTrackHistEfficiency()->Fill(vars, step);
+      fSumpT->GetTrackHistEfficiency()->Fill(vars, step);
+      fNumberDensityPhi->GetTrackHistEfficiency()->Fill(vars, step);
+    }
+  }
+}
+
 //____________________________________________________________________
 void AliUEHistograms::FillEvent(Int_t eventType, Int_t step)
 {
@@ -480,3 +513,12 @@ Long64_t AliUEHistograms::Merge(TCollection* list)
 
   return count+1;
 }
+
+void AliUEHistograms::CopyReconstructedData(AliUEHistograms* from)
+{
+  // copies those histograms extracted from ESD to this object
+  
+  fNumberDensitypT->CopyReconstructedData(from->fNumberDensitypT);
+  fSumpT->CopyReconstructedData(from->fSumpT);
+  fNumberDensityPhi->CopyReconstructedData(from->fNumberDensityPhi);
+}
index 7a988ec9c0a3d373b7ff11619c17b4f5ede48c55..1877e2c7804ea47881e70a87c05f9b04674d2879 100644 (file)
@@ -27,6 +27,9 @@ class AliUEHistograms : public TObject
   void Fill(Int_t eventType, AliUEHist::CFStep step, AliVParticle* leading, TList* toward, TList* away, TList* min, TList* max);
   void Fill(AliVParticle* leadingMC, AliVParticle* leadingReco);
   void FillEvent(Int_t eventType, Int_t step);
+  void FillTrackingEfficiency(TObjArray* mc, TObjArray* recoPrim, TObjArray* recoAll, Int_t particleType);
+  
+  void CopyReconstructedData(AliUEHistograms* from);
   
   AliUEHist* GetNumberDensitypT() { return fNumberDensitypT; }
   AliUEHist* GetSumpT() { return fSumpT; }
index 2f2f4d11aa61c6c0c75d9690fd13c2bc25788b14..6929beb9bc4bc08ba50eddb78e8f5e53a5a8e5c3 100644 (file)
@@ -47,9 +47,12 @@ void ConfigTaskUE(AliAnalysisTaskLeadingTrackUE * ueana){
   ueana->SetDebugLevel(0); \r
   ueana->SetPtRangeInHist(100, 0., 100.);\r
   ueana->SetFilterBit(16);  \r
+  //ueana->SetFilterBit(16+32);  \r
   ueana->SetTrackEtaCut(0.8);\r
   ueana->SetLeadingTrackEtaCut(0.8);\r
-  \r
+  ueana->SetEventSelectionBit(AliAnalysisHelperJetTasks::kIsPileUp);\r
+  //ueana->SetReduceMemoryFootprint(kTRUE);\r
\r
   if (1)\r
   {\r
     file = TFile::Open("$ALICE_ROOT/PWG4/JetTasks/inputFiles/ue_trackingefficiency.root");\r
diff --git a/PWG4/macros/underlyingevent/correct.C b/PWG4/macros/underlyingevent/correct.C
new file mode 100644 (file)
index 0000000..2de1ea6
--- /dev/null
@@ -0,0 +1,341 @@
+const char* objectName = "PWG4_LeadingTrackUE/histosLeadingTrackUE";
+//const char* objectName = "PWG4_LeadingTrackUE/histosLeadingTrackUE_filterbit32";
+
+void SetRanges(TAxis* axis)
+{
+  if (strcmp(axis->GetTitle(), "leading p_{T} (GeV/c)") == 0)
+    axis->SetRangeUser(0, 10);
+
+  if (strcmp(axis->GetTitle(), "multiplicity") == 0)
+    axis->SetRangeUser(0, 10);
+}
+
+void SetRanges(TH1* hist)
+{
+  SetRanges(hist->GetXaxis());
+  SetRanges(hist->GetYaxis());
+  SetRanges(hist->GetZaxis());
+}
+
+void Prepare1DPlot(TH1* hist)
+{
+  hist->SetLineWidth(2);
+  hist->SetStats(kFALSE);
+
+  hist->GetXaxis()->SetLabelOffset(0.02);
+  hist->GetXaxis()->SetTitleOffset(1.3);
+  hist->GetYaxis()->SetTitleOffset(1.3);
+
+  SetRanges(hist);
+}
+
+void DrawRatio(TH1* corr, TH1* mc, const char* name)
+{
+  mc->SetLineColor(2);
+
+  TCanvas* canvas3 = new TCanvas(name, name, 600, 600);
+  canvas3->Range(0, 0, 1, 1);
+
+  TPad* pad1 = new TPad(Form("%s_1", name), "", 0, 0.5, 0.98, 0.98);
+  pad1->Draw();
+
+  TPad* pad2 = new TPad(Form("%s_2", name), "", 0, 0.02, 0.98, 0.5);
+  pad2->Draw();
+
+  pad1->SetRightMargin(0.01);
+  pad2->SetRightMargin(0.01);
+  pad1->SetTopMargin(0.05);
+  pad1->SetLeftMargin(0.13);
+  pad2->SetLeftMargin(0.13);
+  pad2->SetBottomMargin(0.22);
+  
+  // no border between them
+  pad1->SetBottomMargin(0);
+  pad2->SetTopMargin(0);
+
+  pad1->cd();
+  pad1->SetGridx();
+  pad1->SetGridy();
+
+  TLegend* legend = new TLegend(0.15, 0.65, 0.55, 0.90);
+  legend->SetFillColor(0);
+  legend->AddEntry(corr, "Corrected");
+  legend->AddEntry(mc, "MC prediction");
+  legend->SetTextSize(0.08);
+
+  Prepare1DPlot(corr);
+
+  TH2F* dummy = new TH2F("dummy", "", 100, corr->GetXaxis()->GetBinLowEdge(1), corr->GetXaxis()->GetBinUpEdge(corr->GetNbinsX()), 1000, 0, TMath::Max(corr->GetMaximum(), mc->GetMaximum()) * 1.1);
+  dummy->SetStats(kFALSE);
+  dummy->SetXTitle(corr->GetXaxis()->GetTitle());
+  dummy->SetYTitle(corr->GetYaxis()->GetTitle());
+  dummy->GetYaxis()->SetTitleOffset(1);
+  Prepare1DPlot(dummy);
+
+  dummy->GetXaxis()->SetLabelSize(0.08);
+  dummy->GetYaxis()->SetLabelSize(0.08);
+  dummy->GetXaxis()->SetTitleSize(0.08);
+  dummy->GetYaxis()->SetTitleSize(0.08);
+  dummy->GetYaxis()->SetTitleOffset(0.8);
+  dummy->DrawCopy();
+
+  corr->Draw("SAME");
+  mc->Draw("SAME");
+
+  legend->Draw();
+
+  pad2->cd();
+  //pad2->SetBottomMargin(0.15);
+  //pad2->SetGridx();
+  //pad2->SetGridy();
+
+  TH1* ratio = (TH1*) mc->Clone("ratio");
+  ratio->Divide(corr);
+
+  Float_t minR = TMath::Min(0.91, ratio->GetMinimum() * 0.95);
+  Float_t maxR = TMath::Max(1.09, ratio->GetMaximum() * 1.05);
+  
+  minR = 0.8;
+  maxR = 1.2;
+
+  TH1F dummy3("dummy3", ";;Ratio: MC / corr", 100, corr->GetXaxis()->GetBinLowEdge(1), corr->GetXaxis()->GetBinUpEdge(corr->GetNbinsX()));
+  dummy3.SetXTitle(corr->GetXaxis()->GetTitle());
+  Prepare1DPlot(&dummy3);
+  dummy3.SetStats(kFALSE);
+  for (Int_t i=1; i<=100; ++i)
+       dummy3.SetBinContent(i, 1);
+  dummy3.GetYaxis()->SetRangeUser(minR, maxR);
+  dummy3.SetLineWidth(2);
+  dummy3.GetXaxis()->SetLabelSize(0.08);
+  dummy3.GetYaxis()->SetLabelSize(0.08);
+  dummy3.GetXaxis()->SetTitleSize(0.08);
+  dummy3.GetYaxis()->SetTitleSize(0.08);
+  dummy3.GetYaxis()->SetTitleOffset(0.8);
+  dummy3.DrawCopy();
+
+  ratio->Draw("SAME");
+
+  canvas3->Modified();
+}
+
+void loadlibs()
+{
+  gSystem->Load("libANALYSIS");
+  gSystem->Load("libANALYSISalice");
+  gSystem->Load("libCORRFW");
+  gSystem->Load("libJETAN");
+  gSystem->Load("libPWG4JetTasks");
+}
+
+void CompareBias(const char* mcFile = "PWG4_JetTasksOutput.root", Int_t region)
+{
+  loadlibs();
+
+  TFile::Open(mcFile);
+  list = (TList*) gFile->Get(objectName);
+  AliUEHistograms* h = (AliUEHistograms*) list->FindObject("AliUEHistograms");
+  h->SetEtaRange(-0.79, 0.79);
+  h->SetPtRange(0.51, 100);
+  h->SetCombineMinMax(kTRUE);
+  
+  biasFromData = (TH1*) h->GetNumberDensitypT()->GetBias(AliUEHist::kCFStepBiasStudy, AliUEHist::kCFStepReconstructed, region, "z")->Clone("biasFromData");
+  biasFromData2 = (TH1*) h->GetNumberDensitypT()->GetBias(AliUEHist::kCFStepBiasStudy2, AliUEHist::kCFStepReconstructed, region, "z")->Clone("biasFromData2");
+  //biasFromData = (TH1*) h->GetNumberDensitypT()->GetBias(AliUEHist::kCFStepReconstructed, AliUEHist::kCFStepRealLeading, region, "z")->Clone("biasFromData");
+  biasFromMC   = (TH1*) h->GetNumberDensitypT()->GetBias(AliUEHist::kCFStepReconstructed, AliUEHist::kCFStepTracked, region, "z")->Clone("biasFromMC");
+  //biasFromMC   = (TH1*) h->GetNumberDensitypT()->GetBias(AliUEHist::kCFStepReconstructed, AliUEHist::kCFStepRealLeading, region, "z")->Clone("biasFromMC");
+  
+/*  biasFromData->Draw();
+  biasFromMC->SetLineColor(2);
+  biasFromMC->Draw("SAME");
+  return;*/
+  
+  DrawRatio(biasFromData, biasFromMC, "bias: data vs MC");
+  DrawRatio(biasFromData, biasFromData2, "bias: data vs data two step");
+}
+  
+void CompareBiasWithData(const char* mcFile = "PWG4_JetTasksOutput.root", const char* dataFile = "esd.root")
+{
+  loadlibs();
+
+  file1 = TFile::Open(mcFile);
+  list = (TList*) file1->Get(objectName);
+  AliUEHistograms* h = (AliUEHistograms*) list->FindObject("AliUEHistograms");
+  h->SetEtaRange(-0.79, 0.79);
+  h->SetPtRange(0.51, 100);
+  
+  biasFromMC   = (TH1*) h->GetNumberDensitypT()->GetBias(AliUEHist::kCFStepReconstructed, AliUEHist::kCFStepTracked, "z")->Clone("biasFromMC");
+  
+  file2 = TFile::Open(dataFile);
+  list = (TList*) file2->Get(objectName);
+  AliUEHistograms* h2 = (AliUEHistograms*) list->FindObject("AliUEHistograms");
+  h2->SetEtaRange(-0.79, 0.79);
+  h2->SetPtRange(0.51, 100);
+  
+  biasFromData = (TH1*) h2->GetNumberDensitypT()->GetBias(AliUEHist::kCFStepBiasStudy, AliUEHist::kCFStepReconstructed, "z")->Clone("biasFromData");
+  biasFromData2 = (TH1*) h2->GetNumberDensitypT()->GetBias(AliUEHist::kCFStepBiasStudy2, AliUEHist::kCFStepReconstructed, "z")->Clone("biasFromData2");
+  
+  DrawRatio(biasFromData, biasFromMC, "bias: data vs MC");
+  DrawRatio(biasFromData, biasFromData2, "bias: data vs data two step");
+}
+
+void Compare(const char* fileName1, const char* fileName2, Int_t step1, Int_t step2)
+{
+  loadlibs();
+
+  file1 = TFile::Open(fileName1);
+  list = (TList*) file1->Get(objectName);
+  AliUEHistograms* h = (AliUEHistograms*) list->FindObject("AliUEHistograms");
+  h->SetEtaRange(-0.79, 0.79);
+  h->SetPtRange(0.51, 100);
+
+  file2 = TFile::Open(fileName2);
+  list = (TList*) file2->Get(objectName);
+  AliUEHistograms* h2 = (AliUEHistograms*) list->FindObject("AliUEHistograms");
+  h2->SetEtaRange(-0.79, 0.79);
+  h2->SetPtRange(0.51, 100);
+
+  Int_t region = 0;
+    
+  TH1* hist1 = h->GetNumberDensitypT()->GetUEHist(step1, region);
+  TH1* hist2 = h2->GetNumberDensitypT()->GetUEHist(step2, region);
+
+  DrawRatio(hist1, hist2, "compare");
+}  
+
+void CompareRaw(const char* fileName1, const char* fileName2)
+{
+  loadlibs();
+
+  Compare(fileName1, fileName2, AliUEHist::kCFStepReconstructed, AliUEHist::kCFStepReconstructed);
+}
+
+void ProfileMultiplicity(const char* fileName = "PWG4_JetTasksOutput.root")
+{
+  loadlibs();
+
+  TFile::Open(fileName);
+  list = (TList*) gFile->Get(objectName);
+  AliUEHistograms* h = (AliUEHistograms*) list->FindObject("AliUEHistograms");
+
+  new TCanvas;
+  h->GetCorrelationMultiplicity()->Draw("colz");
+  gPad->SetLogz();
+
+  new TCanvas;
+  h->GetCorrelationMultiplicity()->ProfileX()->DrawCopy()->Fit("pol1", "", "", 1, 10);
+}
+
+void SetupRanges(void* obj)
+{
+  ((AliUEHistograms*) obj)->SetEtaRange(-0.79, 0.79);
+  ((AliUEHistograms*) obj)->SetPtRange(0.51, 100);
+  ((AliUEHistograms*) obj)->SetCombineMinMax(kTRUE);
+}
+
+void DrawRatios(const char* name, void* correctedVoid, void* comparisonVoid, Int_t compareStep = -1, Int_t compareRegion = 2)
+{
+  AliUEHist* corrected = (AliUEHist*) correctedVoid;
+  AliUEHist* comparison = (AliUEHist*) comparisonVoid;
+
+  Int_t beginStep = AliUEHist::kCFStepAll;
+  Int_t endStep = AliUEHist::kCFStepReconstructed;
+  
+  if (compareStep != -1)
+  {
+    beginStep = compareStep;
+    endStep = compareStep;
+  }
+  
+  Int_t beginRegion = 0;
+  Int_t endRegion = 2;
+  
+  if (compareRegion != -1)
+  {
+    beginRegion = compareRegion;
+    endRegion = compareRegion;
+  }
+
+  for (Int_t step=beginStep; step<=endStep; step++)
+  {
+    for (Int_t region=beginRegion; region <= endRegion; region++)
+    {
+      TH1* corrHist = corrected->GetUEHist(step, region);
+      TH1* mcHist   = comparison->GetUEHist(step, region);
+      
+      DrawRatio(corrHist, mcHist, Form("%s: step %d %s %s", name, step, corrected->GetStepTitle(step), corrected->GetRegionTitle(region)));
+    }
+  }
+}
+
+void DrawRatios(void* correctedVoid, void* comparisonVoid, Int_t compareStep = -1, Int_t compareRegion = 2)
+{
+  AliUEHistograms* corrected = (AliUEHistograms*) correctedVoid;
+  AliUEHistograms* comparison = (AliUEHistograms*) comparisonVoid;
+
+  DrawRatios("Number density", corrected->GetNumberDensitypT(), comparison->GetNumberDensitypT(), compareStep, compareRegion);
+  if (compareStep != -1)
+  {
+    DrawRatios("Pt sum", corrected->GetSumpT(), comparison->GetSumpT(), compareStep, compareRegion);
+    //DrawRatios("Phi correlation", corrected->GetNumberDensityPhi(), comparison->GetNumberDensityPhi(), compareStep, compareRegion);
+  }
+}
+
+void correctMC(const char* fileNameCorrections, const char* fileNameESD = 0, Int_t compareStep = -1, Int_t compareRegion = 2)
+{
+  // corrects the reconstructed step in fileNameESD with fileNameCorr
+  // if fileNameESD is 0 data from fileNameCorr is taken
+  // afterwards the corrected distributions are compared with the MC stored in fileNameESD
+  
+  loadlibs();
+  
+  TFile::Open(fileNameCorrections);
+  list = (TList*) gFile->Get(objectName);
+  AliUEHistograms* corr = (AliUEHistograms*) list->FindObject("AliUEHistograms");
+  
+  if (fileNameESD)
+  {
+    file2 = TFile::Open(fileNameESD);
+    list = (TList*) file2->Get(objectName);
+  }
+  AliUEHistograms* testSample = (AliUEHistograms*) list->FindObject("AliUEHistograms");
+    
+  // copy to esd object
+  AliUEHistograms* esd = new AliUEHistograms;
+  esd->CopyReconstructedData(testSample);
+  
+  SetupRanges(corr);
+  SetupRanges(testSample);
+  SetupRanges(esd);
+  
+  esd->Correct(corr);
+  
+  DrawRatios(testSample, esd, compareStep, compareRegion);
+}
+
+// function to compare only final step for all regions and distributions
+
+void correctData(const char* fileNameCorrections, const char* fileNameESD, Int_t compareStep = -1, Int_t compareRegion = 2)
+{
+  // corrects fileNameESD with fileNameCorrections and compares the two
+  
+  loadlibs();
+  
+  TFile::Open(fileNameCorrections);
+  list = (TList*) gFile->Get(objectName);
+  AliUEHistograms* corr = (AliUEHistograms*) list->FindObject("AliUEHistograms");
+  
+  file2 = TFile::Open(fileNameESD);
+  list = (TList*) file2->Get(objectName);
+  AliUEHistograms* esd = (AliUEHistograms*) list->FindObject("AliUEHistograms");
+  
+  SetupRanges(corr);
+  SetupRanges(esd);
+  
+  esd->Correct(corr);
+  
+  file3 = TFile::Open("corrected.root", "RECREATE");
+  esd->Write();
+  file3->Close();
+  
+  DrawRatios(corr, esd, compareStep, compareRegion);
+}