]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGGA/CaloTrackCorrelations/AliAnaParticleHadronCorrelation.cxx
add missing check on origin histograms
[u/mrichter/AliRoot.git] / PWGGA / CaloTrackCorrelations / AliAnaParticleHadronCorrelation.cxx
index 1e9c24fde4373c2ce21031826d63b7a0c0a55ab5..16c600fad9ea3762cbb6675a7e61b492613afb4d 100755 (executable)
 
 // --- ROOT system ---
 //#include "TClonesArray.h"
-#include "TClass.h"
-#include "TMath.h"
-#include "TH3D.h"
-#include "TDatabasePDG.h"
+#include <TClass.h>
+#include <TMath.h>
+#include <TH2F.h>
+#include <TDatabasePDG.h>
 
 //---- ANALYSIS system ----
 #include "AliNeutralMesonSelection.h" 
 #include "AliAnaParticleHadronCorrelation.h" 
 #include "AliCaloTrackReader.h"
-#include "AliCaloPID.h"
 #include "AliAODPWG4ParticleCorrelation.h"
 #include "AliFiducialCut.h"
 #include "AliVTrack.h"
@@ -51,6 +50,9 @@
 #include "AliStack.h"
 #include "AliAODMCParticle.h"
 #include "AliMixedEvent.h"
+#include "AliAnalysisManager.h"
+#include "AliInputEventHandler.h"
+#include "AliEventplane.h"
 
 ClassImp(AliAnaParticleHadronCorrelation)
 
@@ -64,54 +66,952 @@ ClassImp(AliAnaParticleHadronCorrelation)
     fSelectIsolated(0),             fMakeSeveralUE(0),              
     fUeDeltaPhiMaxCut(0.),          fUeDeltaPhiMinCut(0.), 
     fPi0AODBranchName(""),          fNeutralCorr(0),       
-    fPi0Trigger(0),                 fMakeAbsoluteLeading(0),        
-    fLeadingTriggerIndex(-1),       
+    fPi0Trigger(0),                 fDecayTrigger(0),
+    fMakeAbsoluteLeading(0),        fMakeNearSideLeading(0),      
+    fLeadingTriggerIndex(-1),       fHMPIDCorrelation(0),  fFillBradHisto(0),
     fNAssocPtBins(0),               fAssocPtBinLimit(),
+    fCorrelVzBin(0),
+    fListMixTrackEvents(),          fListMixCaloEvents(),
+    fUseMixStoredInReader(0),       fFillNeutralEventMixPool(0),
+    fM02MaxCut(0),                  fM02MinCut(0),  
+    fFillPileUpHistograms(0),       
     //Histograms
-    fhPtLeading(0),                 fhPhiLeading(0),       
-    fhEtaLeading(0),                fhDeltaPhiDeltaEtaCharged(0),
+    fhPtInput(0),                   fhPtFidCut(0),
+    fhPtLeading(0),                 fhPtLeadingVtxBC0(0),
+    fhPtLeadingVzBin(0),            fhPtLeadingBin(0),                 
+    fhPhiLeading(0),                fhEtaLeading(0),   
+    fhPtLeadingMC(),
+    fhPtLeadingCentrality(0),       fhPtLeadingEventPlane(0), 
+    fhLeadingEventPlaneCentrality(0),
+    fhPtLeadingMixed(0),            fhPtLeadingMixedVzBin(0), fhPtLeadingMixedBin(0),              
+    fhPhiLeadingMixed(0),           fhEtaLeadingMixed(0), 
+    fhDeltaPhiDeltaEtaCharged(0),
     fhPhiCharged(0),                fhEtaCharged(0), 
     fhDeltaPhiCharged(0),           fhDeltaEtaCharged(0), 
     fhDeltaPhiChargedPt(0),         fhDeltaPhiUeChargedPt(0), 
-    fhPtImbalanceCharged(0),        fhPtImbalanceUeCharged(0),
-    fhPtImbalancePosCharged(0),     fhPtImbalanceNegCharged(0),
-    fhPtHbpCharged(0),              fhPtHbpUeCharged(0),
+    fhUePart(0),
+    fhXECharged(0),                 fhXEUeCharged(0),
+    fhXEPosCharged(0),              fhXENegCharged(0),
+    fhPtHbpXECharged(0),            fhPtHbpXEUeCharged(0),
+    fhZTCharged(0),                 fhZTUeCharged(0),
+    fhZTPosCharged(0),              fhZTNegCharged(0),
+    fhPtHbpZTCharged(0),            fhPtHbpZTUeCharged(0),
+    fhXEChargedMC(),                fhDeltaPhiChargedMC(),  
+    fhDeltaPhiDeltaEtaChargedPtA3GeV(0),
+    fhDeltaPhiChargedPtA3GeV(0),    fhDeltaEtaChargedPtA3GeV(0),
+    //Pile-Up
+    fhDeltaPhiChargedPileUp(),      fhDeltaEtaChargedPileUp(),
+    fhDeltaPhiChargedPtA3GeVPileUp(), fhDeltaEtaChargedPtA3GeVPileUp(),
+    fhXEChargedPileUp(),            fhXEUeChargedPileUp(),
+    fhZTChargedPileUp(),            fhZTUeChargedPileUp(), 
+    fhPtTrigChargedPileUp(),
+    fhDeltaPhiChargedOtherBC(),     fhDeltaPhiChargedPtA3GeVOtherBC(),
+    fhXEChargedOtherBC(),           fhXEUeChargedOtherBC(),
+    fhZTChargedOtherBC(),           fhZTUeChargedOtherBC(),
+    fhPtTrigChargedOtherBC(),
+    fhDeltaPhiChargedBC0(),         fhDeltaPhiChargedPtA3GeVBC0(),
+    fhXEChargedBC0(),               fhXEUeChargedBC0(),
+    fhZTChargedBC0(),               fhZTUeChargedBC0(),
+    fhPtTrigChargedBC0(),
+    fhDeltaPhiChargedVtxBC0(),      fhDeltaPhiChargedPtA3GeVVtxBC0(),
+    fhXEChargedVtxBC0(),            fhXEUeChargedVtxBC0(),
+    fhZTChargedVtxBC0(),            fhZTUeChargedVtxBC0(),
+    fhPtTrigChargedVtxBC0(),
     fhDeltaPhiUeLeftCharged(0),     fhDeltaPhiUeRightCharged(0),
-    fhPtImbalanceUeLeftCharged(0),  fhPtImbalanceUeRightCharged(0),
-    fhPtHbpUeLeftCharged(0),        fhPtHbpUeRightCharged(0), 
+    fhDeltaPhiUeLeftUpCharged(0),   fhDeltaPhiUeRightUpCharged(0),
+    fhDeltaPhiUeLeftDownCharged(0), fhDeltaPhiUeRightDownCharged(0),
+    fhXEUeLeftCharged(0),           fhXEUeRightCharged(0),
+    fhXEUeLeftUpCharged(0),         fhXEUeRightUpCharged(0),
+    fhXEUeLeftDownCharged(0),       fhXEUeRightDownCharged(0),
+    fhPtHbpXEUeLeftCharged(0),      fhPtHbpXEUeRightCharged(0), 
+    fhZTUeLeftCharged(0),           fhZTUeRightCharged(0),
+    fhPtHbpZTUeLeftCharged(0),      fhPtHbpZTUeRightCharged(0), 
     fhPtTrigPout(0),                fhPtTrigCharged(0),
     fhTrigDeltaPhiCharged(0x0),     fhTrigDeltaEtaCharged(0x0),
-    fhTrigCorr(0x0),                fhTrigUeCorr(0x0),
-    fhAssocPt(0),                   fhAssocPtBkg(0),  
-    fhDeltaPhiAssocPtBin(0),        fhDeltaPhiAssocPtBinHMPID(0),fhDeltaPhiAssocPtBinHMPIDAcc(0),
+    fhTrigXECorr(0x0),              fhTrigXEUeCorr(0x0),
+    fhTrigZTCorr(0x0),              fhTrigZTUeCorr(0x0),
+    fhAssocPtBkg(0),                fhDeltaPhiDeltaEtaAssocPtBin(0),
+    fhDeltaPhiAssocPtBin(0),        
+    fhDeltaPhiAssocPtBinDEta08(0),  fhDeltaPhiAssocPtBinDEta0(0),
+    fhDeltaPhiAssocPtBinHMPID(0),   fhDeltaPhiAssocPtBinHMPIDAcc(0),
     fhDeltaPhiBradAssocPtBin(0),    fhDeltaPhiBrad(0),
-    fhXEAssocPtBin(0),              fhXE(0),
+    fhXEAssocPtBin(0),              fhZTAssocPtBin(0),             
     fhDeltaPhiDeltaEtaNeutral(0), 
     fhPhiNeutral(0),                fhEtaNeutral(0), 
     fhDeltaPhiNeutral(0),           fhDeltaEtaNeutral(0),
     fhDeltaPhiNeutralPt(0),         fhDeltaPhiUeNeutralPt(0), 
-    fhPtImbalanceNeutral(0),        fhPtImbalanceUeNeutral(0),
-    fhPtHbpNeutral(0),              fhPtHbpUeNeutral(0),
+    fhXENeutral(0),                 fhXEUeNeutral(0),
+    fhPtHbpXENeutral(0),            fhPtHbpXEUeNeutral(0),
+    fhZTNeutral(0),                 fhZTUeNeutral(0),
+    fhPtHbpZTNeutral(0),            fhPtHbpZTUeNeutral(0),
     fhDeltaPhiUeLeftNeutral(0),     fhDeltaPhiUeRightNeutral(0),
-    fhPtImbalanceUeLeftNeutral(0),  fhPtImbalanceUeRightNeutral(0),
-    fhPtHbpUeLeftNeutral(0),        fhPtHbpUeRightNeutral(0),
+    fhXEUeLeftNeutral(0),           fhXEUeRightNeutral(0),
+    fhPtHbpXEUeLeftNeutral(0),      fhPtHbpXEUeRightNeutral(0),
+    fhZTUeLeftNeutral(0),           fhZTUeRightNeutral(0),
+    fhPtHbpZTUeLeftNeutral(0),      fhPtHbpZTUeRightNeutral(0),
     fhPtPi0DecayRatio(0),
-    fhDeltaPhiDecayCharged(0),      fhPtImbalanceDecayCharged(0), 
-    fhDeltaPhiDecayNeutral(0),      fhPtImbalanceDecayNeutral(0),
-    fh2phiLeadingParticle(0x0),
-    fhMCLeadingCount(0),
+    fhDeltaPhiDecayCharged(0),      fhXEDecayCharged(0), fhZTDecayCharged(0), 
+    fhDeltaPhiDecayNeutral(0),      fhXEDecayNeutral(0), fhZTDecayNeutral(0),
+    fhDeltaPhiDecayChargedAssocPtBin(0), 
+    fhXEDecayChargedAssocPtBin(0),  fhZTDecayChargedAssocPtBin(0),                
+    fh2phiLeadingParticle(0x0),     fhMCPtLeading(0),
+    fhMCPhiLeading(0),              fhMCEtaLeading(0),
     fhMCEtaCharged(0),              fhMCPhiCharged(0), 
     fhMCDeltaEtaCharged(0),         fhMCDeltaPhiCharged(0x0),
     fhMCDeltaPhiDeltaEtaCharged(0), fhMCDeltaPhiChargedPt(0),
-    fhMCPtImbalanceCharged(0),
-    fhMCPtHbpCharged(0),
-    fhMCPtTrigPout(0),
-    fhMCPtAssocDeltaPhi(0)
-{
-  //Default Ctor
-  
+    fhMCPtXECharged(0),             fhMCPtXEUeCharged(0),
+    fhMCPtHbpXECharged(0),          fhMCPtHbpXEUeCharged(0),
+    fhMCUePart(0),
+    fhMCPtZTCharged(0),             fhMCPtHbpZTCharged(0),
+    fhMCPtTrigPout(0),              fhMCPtAssocDeltaPhi(0),
+    //Mixing
+    fhNEventsTrigger(0),            fhNtracksMB(0),                 fhNclustersMB(0),
+    fhMixDeltaPhiCharged(0),        fhMixDeltaPhiDeltaEtaCharged(0),
+    fhMixXECharged(0),              fhMixXEUeCharged(0),            fhMixHbpXECharged(0),
+    fhMixDeltaPhiChargedAssocPtBin(),
+    fhMixDeltaPhiChargedAssocPtBinDEta08(),
+    fhMixDeltaPhiChargedAssocPtBinDEta0(),
+    fhMixDeltaPhiDeltaEtaChargedAssocPtBin(),
+    fhEventBin(0),                  fhEventMixBin(0)
+{ 
+  //Default Ctor 
+    
   //Initialize parameters
   InitParameters();
+  
+  for(Int_t i = 0; i < 7; i++)
+  { 
+    fhPtLeadingMC[i] = 0;
+    fhXEChargedMC[i] = 0;
+    fhDeltaPhiChargedMC[i] = 0;
+  }
+  
+  for(Int_t i = 0; i < 7; i++)
+  {
+    fhPtLeadingPileUp             [i] = 0 ;
+    fhDeltaPhiChargedPileUp       [i] = 0 ; fhDeltaEtaChargedPileUp       [i] = 0 ;
+    fhXEChargedPileUp             [i] = 0 ; fhXEUeChargedPileUp           [i] = 0 ;
+    fhZTChargedPileUp             [i] = 0 ; fhZTUeChargedPileUp           [i] = 0 ;
+    fhPtTrigChargedPileUp         [i] = 0 ;
+    fhDeltaPhiChargedPtA3GeVPileUp[i] = 0 ; fhDeltaEtaChargedPtA3GeVPileUp[i] = 0 ;
+  }
+  
+}
+
+//_________________________________________________________________
+AliAnaParticleHadronCorrelation::~AliAnaParticleHadronCorrelation()
+{
+  // Remove event containers
+  
+  if(DoOwnMix())
+  {
+    if(fListMixTrackEvents)
+    {      
+      for(Int_t iz=0; iz < GetNZvertBin(); iz++)
+      {
+        for(Int_t ic=0; ic < GetNCentrBin(); ic++)
+        {
+          for(Int_t irp=0; irp<GetNRPBin(); irp++)
+          {
+            Int_t bin = GetEventMixBin(ic, iz, irp);
+            fListMixTrackEvents[bin]->Delete() ;
+            delete fListMixTrackEvents[bin] ;
+          }
+        }
+      }
+    }
+
+    delete[] fListMixTrackEvents;
+
+    if(fListMixCaloEvents)
+    {      
+      for(Int_t iz=0; iz < GetNZvertBin(); iz++)
+      {
+        for(Int_t ic=0; ic < GetNCentrBin(); ic++)
+        {
+          for(Int_t irp=0; irp<GetNRPBin(); irp++)
+          {
+            Int_t bin = GetEventMixBin(ic, iz, irp);
+            fListMixCaloEvents[bin]->Delete() ;
+            delete fListMixCaloEvents[bin] ;
+          }
+        }
+      }
+    }
+  
+    delete[] fListMixCaloEvents;
+    
+  }
+}
+
+//______________________________________________________________________________________________________________________________________________________
+void AliAnaParticleHadronCorrelation::FillChargedAngularCorrelationHistograms(Float_t ptAssoc,  Float_t ptTrig,      Int_t   bin,
+                                                                              Float_t phiAssoc, Float_t phiTrig,     Float_t &     deltaPhi,
+                                                                              Float_t etaAssoc, Float_t etaTrig,  
+                                                                              Bool_t  decay,    Float_t hmpidSignal, Int_t  outTOF,
+                                                                              Int_t nTracks,       Int_t   mcTag)
+{
+  // Fill angular correlation related histograms
+  
+  Float_t deltaEta    = etaTrig-etaAssoc;
+          deltaPhi    = phiTrig-phiAssoc;
+  Float_t deltaPhiOrg = deltaPhi;
+  
+  if(deltaPhi <= -TMath::PiOver2()) deltaPhi+=TMath::TwoPi();
+  if(deltaPhi > 3*TMath::PiOver2()) deltaPhi-=TMath::TwoPi();
+  
+  fhEtaCharged       ->Fill(ptAssoc,etaAssoc);
+  fhPhiCharged       ->Fill(ptAssoc,phiAssoc);
+  fhDeltaEtaCharged  ->Fill(ptTrig ,deltaEta);
+  fhDeltaPhiCharged  ->Fill(ptTrig ,deltaPhi);
+  fhDeltaPhiChargedPt->Fill(ptAssoc, deltaPhi);
+  fhDeltaPhiDeltaEtaCharged->Fill(deltaPhi, deltaEta);
+  
+  if(ptAssoc > 3 )
+  {
+    fhDeltaEtaChargedPtA3GeV        ->Fill(ptTrig  ,deltaEta);
+    fhDeltaPhiChargedPtA3GeV        ->Fill(ptTrig  ,deltaPhi);
+    fhDeltaPhiDeltaEtaChargedPtA3GeV->Fill(deltaPhi, deltaEta);    
+  }   
+  
+  // Pile up studies
+  
+  if(fFillPileUpHistograms)
+  {
+    if     (outTOF==1)
+    {
+      fhDeltaPhiChargedOtherBC->Fill(ptTrig ,deltaPhi) ;
+      if(ptAssoc > 3 ) fhDeltaPhiChargedPtA3GeVOtherBC->Fill(ptTrig ,deltaPhi) ;
+    }
+    else if(outTOF==0)
+    {
+        fhDeltaPhiChargedBC0->Fill(ptTrig ,deltaPhi) ;
+        if(ptAssoc > 3 ) fhDeltaPhiChargedPtA3GeVBC0->Fill(ptTrig ,deltaPhi) ;
+    }
+    
+    Int_t vtxBC = GetReader()->GetVertexBC();
+    if(vtxBC == 0 || vtxBC==AliVTrack::kTOFBCNA)
+    {
+      fhDeltaPhiChargedVtxBC0->Fill(ptTrig ,deltaPhi) ;
+      if(ptAssoc > 3 ) fhDeltaPhiChargedPtA3GeVVtxBC0->Fill(ptTrig ,deltaPhi) ;
+    }
+    
+    if(GetReader()->IsPileUpFromSPD())               { fhDeltaEtaChargedPileUp[0]->Fill(ptTrig ,deltaEta) ; fhDeltaPhiChargedPileUp[0]->Fill(ptTrig ,deltaPhi) ; }
+    if(GetReader()->IsPileUpFromEMCal())             { fhDeltaEtaChargedPileUp[1]->Fill(ptTrig ,deltaEta) ; fhDeltaPhiChargedPileUp[1]->Fill(ptTrig ,deltaPhi) ; }
+    if(GetReader()->IsPileUpFromSPDOrEMCal())        { fhDeltaEtaChargedPileUp[2]->Fill(ptTrig ,deltaEta) ; fhDeltaPhiChargedPileUp[2]->Fill(ptTrig ,deltaPhi) ; }
+    if(GetReader()->IsPileUpFromSPDAndEMCal())       { fhDeltaEtaChargedPileUp[3]->Fill(ptTrig ,deltaEta) ; fhDeltaPhiChargedPileUp[3]->Fill(ptTrig ,deltaPhi) ; }
+    if(GetReader()->IsPileUpFromSPDAndNotEMCal())    { fhDeltaEtaChargedPileUp[4]->Fill(ptTrig ,deltaEta) ; fhDeltaPhiChargedPileUp[4]->Fill(ptTrig ,deltaPhi) ; }
+    if(GetReader()->IsPileUpFromEMCalAndNotSPD())    { fhDeltaEtaChargedPileUp[5]->Fill(ptTrig ,deltaEta) ; fhDeltaPhiChargedPileUp[5]->Fill(ptTrig ,deltaPhi) ; }
+    if(GetReader()->IsPileUpFromNotSPDAndNotEMCal()) { fhDeltaEtaChargedPileUp[6]->Fill(ptTrig ,deltaEta) ; fhDeltaPhiChargedPileUp[6]->Fill(ptTrig ,deltaPhi) ; }
+    
+    if(ptAssoc > 3 )
+    {
+      if(GetReader()->IsPileUpFromSPD())               { fhDeltaEtaChargedPtA3GeVPileUp[0]->Fill(ptTrig ,deltaEta) ; fhDeltaPhiChargedPtA3GeVPileUp[0]->Fill(ptTrig ,deltaPhi) ; }
+      if(GetReader()->IsPileUpFromEMCal())             { fhDeltaEtaChargedPtA3GeVPileUp[1]->Fill(ptTrig ,deltaEta) ; fhDeltaPhiChargedPtA3GeVPileUp[1]->Fill(ptTrig ,deltaPhi) ; }
+      if(GetReader()->IsPileUpFromSPDOrEMCal())        { fhDeltaEtaChargedPtA3GeVPileUp[2]->Fill(ptTrig ,deltaEta) ; fhDeltaPhiChargedPtA3GeVPileUp[2]->Fill(ptTrig ,deltaPhi) ; }
+      if(GetReader()->IsPileUpFromSPDAndEMCal())       { fhDeltaEtaChargedPtA3GeVPileUp[3]->Fill(ptTrig ,deltaEta) ; fhDeltaPhiChargedPtA3GeVPileUp[3]->Fill(ptTrig ,deltaPhi) ; }
+      if(GetReader()->IsPileUpFromSPDAndNotEMCal())    { fhDeltaEtaChargedPtA3GeVPileUp[4]->Fill(ptTrig ,deltaEta) ; fhDeltaPhiChargedPtA3GeVPileUp[4]->Fill(ptTrig ,deltaPhi) ; }
+      if(GetReader()->IsPileUpFromEMCalAndNotSPD())    { fhDeltaEtaChargedPtA3GeVPileUp[5]->Fill(ptTrig ,deltaEta) ; fhDeltaPhiChargedPtA3GeVPileUp[5]->Fill(ptTrig ,deltaPhi) ; }
+      if(GetReader()->IsPileUpFromNotSPDAndNotEMCal()) { fhDeltaEtaChargedPtA3GeVPileUp[6]->Fill(ptTrig ,deltaEta) ; fhDeltaPhiChargedPtA3GeVPileUp[6]->Fill(ptTrig ,deltaPhi) ; }
+    }
+  }
+  
+  if(IsDataMC())
+  {
+    Int_t mcIndex = GetMCTagHistogramIndex(mcTag);
+    fhDeltaPhiChargedMC[mcIndex]->Fill(ptTrig , deltaPhi);
+  }  
+  
+  if(fDecayTrigger && decay) fhDeltaPhiDecayCharged   ->Fill(ptTrig  , deltaPhi);      
+  
+  Double_t  dphiBrad = -100;
+  if(fFillBradHisto)
+  {
+    dphiBrad = atan2(sin(deltaPhiOrg), cos(deltaPhiOrg))/TMath::Pi();//-1 to 1
+    if(TMath::Abs(dphiBrad)>0.325 && TMath::Abs(dphiBrad)<0.475)  //Hardcoded values, BAD, FIXME
+    {
+      fhAssocPtBkg->Fill(ptTrig, ptAssoc);
+    }
+    
+    if(dphiBrad<-1./3) dphiBrad += 2;
+    fhDeltaPhiBrad->Fill(ptTrig, dphiBrad);
+  }
+  
+  // Fill histograms in bins of associated particle pT
+  if(bin>=0)
+  {
+      fhDeltaPhiDeltaEtaAssocPtBin    [bin]->Fill(deltaPhi,deltaEta);
+
+      fhDeltaPhiAssocPtBin            [bin]->Fill(ptTrig, deltaPhi);
+    
+    if(TMath::Abs(deltaEta)> 0.8) 
+      fhDeltaPhiAssocPtBinDEta08      [bin]->Fill(ptTrig, deltaPhi);
+
+    if(TMath::Abs(deltaEta)< 0.01) 
+      fhDeltaPhiAssocPtBinDEta0       [bin]->Fill(ptTrig, deltaPhi);
+    
+    if (fFillBradHisto)
+      fhDeltaPhiBradAssocPtBin        [bin]->Fill(ptTrig, dphiBrad);
+    
+    if(fDecayTrigger && decay)
+      fhDeltaPhiDecayChargedAssocPtBin[bin]->Fill(ptTrig, deltaPhi);      
+    
+    if(fHMPIDCorrelation)
+    {
+      if( hmpidSignal > 0 )
+      {
+        //printf("Track pt %f with HMPID signal %f \n",pt,hmpidSignal);
+        fhDeltaPhiAssocPtBinHMPID[bin]->Fill(ptTrig, deltaPhi);        
+      }
+      
+      if(phiAssoc > 5*TMath::DegToRad() && phiAssoc < 20*TMath::DegToRad())
+      {
+        //printf("Track pt %f in HMPID acceptance phi %f \n ",pt,phi*TMath::RadToDeg() );
+        fhDeltaPhiAssocPtBinHMPIDAcc[bin]->Fill(ptTrig, deltaPhi);        
+      }
+    }
+  }
+  
+  //fill different multiplicity histogram
+  if(DoEventSelect())
+  {
+    for(Int_t im = 0; im<GetMultiBin(); im++)
+    {
+      if(nTracks < ( GetMaxMulti() - GetMinMulti() )/GetMultiBin()*(im+1))
+      {
+        fhTrigDeltaPhiCharged[im]->Fill(ptTrig,deltaPhi);
+        fhTrigDeltaEtaCharged[im]->Fill(ptTrig,deltaEta);
+      }
+    }
+  }  
+}
+
+//____________________________________________________________________________________________________________________________________________________
+Bool_t AliAnaParticleHadronCorrelation::FillChargedMCCorrelationHistograms(Float_t mcAssocPt,      Float_t mcAssocPhi, Float_t mcAssocEta,
+                                                                           Float_t mcTrigPt, Float_t mcTrigPhi,  Float_t mcTrigEta)
+{
+  // Fill MC histograms independently of AOD or ESD
+  
+  //Select only hadrons in pt range
+  if(mcAssocPt < fMinAssocPt || mcAssocPt > fMaxAssocPt) return kTRUE ; // exclude but continue
+  
+  if(mcAssocPhi < 0) mcAssocPhi+=TMath::TwoPi();    
+  
+  //remove trigger itself for correlation when use charged triggers 
+  if(TMath::Abs(mcAssocPt -mcTrigPt ) < 1e-6 && 
+     TMath::Abs(mcAssocPhi-mcTrigPhi) < 1e-6 && 
+     TMath::Abs(mcAssocEta-mcTrigEta) < 1e-6)            return kTRUE ; // exclude but continue       
+  
+  // Absolute leading?
+  if( fMakeAbsoluteLeading && mcAssocPt > mcTrigPt )     return kFALSE; // jump event
+  
+  //jump out this event if near side associated partile pt larger than trigger
+  if( fMakeNearSideLeading && mcAssocPt > mcTrigPt && 
+     TMath::Abs(mcAssocPhi-mcTrigPhi)<TMath::PiOver2() ) return kFALSE; // jump event
+  
+  Float_t mcdeltaPhi= mcTrigPhi-mcAssocPhi; 
+  if(mcdeltaPhi <= -TMath::PiOver2()) mcdeltaPhi+=TMath::TwoPi();
+  if(mcdeltaPhi > 3*TMath::PiOver2()) mcdeltaPhi-=TMath::TwoPi();            
+  
+  Float_t mcxE    =-mcAssocPt/mcTrigPt*TMath::Cos(mcdeltaPhi);// -(mcAssocPx*pxprim+mcAssocPy*pyprim)/(mcTrigPt*mcTrigPt);  
+  Float_t mchbpXE =-100 ;
+  if(mcxE > 0 ) mchbpXE = TMath::Log(1./mcxE);
+  
+  Float_t mczT    = mcAssocPt/mcTrigPt ;
+  Float_t mchbpZT =-100 ;
+  if(mczT > 0 ) mchbpZT = TMath::Log(1./mczT);
+  
+  //Selection within angular range
+  if( mcdeltaPhi< -TMath::PiOver2())  mcdeltaPhi+=TMath::TwoPi();
+  if( mcdeltaPhi>3*TMath::PiOver2())  mcdeltaPhi-=TMath::TwoPi();              
+  
+  Double_t mcpout = mcAssocPt*TMath::Sin(mcdeltaPhi) ; 
+  
+  if(GetDebug() > 0 )  
+    printf("AliAnaParticleHadronCorrelation::MakeMCChargedCorrelation() - Charged hadron: track Pt %f, track Phi %f, phi trigger %f. Cuts:  delta phi  %2.2f < %2.2f < %2.2f, pT min %2.2f \n",
+           mcAssocPt,mcAssocPhi, mcTrigPhi,fDeltaPhiMinCut, mcdeltaPhi, fDeltaPhiMaxCut, GetMinPt());              
+  
+  // Fill Histograms
+  fhMCEtaCharged     ->Fill(mcAssocPt, mcAssocEta);
+  fhMCPhiCharged     ->Fill(mcAssocPt, mcAssocPhi);
+  fhMCDeltaEtaCharged->Fill(mcTrigPt,    mcTrigEta-mcAssocEta);
+  fhMCDeltaPhiCharged->Fill(mcTrigPt,    mcdeltaPhi);
+  fhMCPtAssocDeltaPhi->Fill(mcAssocPt, mcdeltaPhi);
+  
+  fhMCDeltaPhiDeltaEtaCharged->Fill(mcdeltaPhi,mcTrigEta-mcAssocEta);
+  
+  //delta phi cut for correlation
+  if( (mcdeltaPhi > fDeltaPhiMinCut) && (mcdeltaPhi < fDeltaPhiMaxCut) ) 
+  {
+    fhMCDeltaPhiChargedPt->Fill(mcAssocPt,mcdeltaPhi);
+    fhMCPtXECharged      ->Fill(mcTrigPt,mcxE); 
+    fhMCPtHbpXECharged   ->Fill(mcTrigPt,mchbpXE);
+    fhMCPtZTCharged      ->Fill(mcTrigPt,mczT); 
+    fhMCPtHbpZTCharged   ->Fill(mcTrigPt,mchbpZT);
+    fhMCPtTrigPout       ->Fill(mcTrigPt, mcpout) ;
+  }
+
+  //underlying event
+  if ( (mcdeltaPhi > fUeDeltaPhiMinCut) && (mcdeltaPhi < fUeDeltaPhiMaxCut) )   
+    {
+       Double_t randomphi = gRandom->Uniform(TMath::Pi()/2,3*TMath::Pi()/2);
+       Double_t mcUexE = -(mcAssocPt/mcTrigPt)*TMath::Cos(randomphi);
+  
+       if(mcUexE < 0.) mcUexE = -mcUexE;
+    
+       fhMCPtXEUeCharged->Fill(mcTrigPt,mcUexE);
+       if(mcUexE > 0) fhMCPtHbpXEUeCharged->Fill(mcTrigPt,TMath::Log(1/mcUexE));
+
+       fhMCUePart->Fill(mcTrigPt);
+    }
+  
+  return kTRUE;
+} 
+
+//___________________________________________________________________________________________________________________
+void AliAnaParticleHadronCorrelation::FillChargedMomentumImbalanceHistograms(Float_t ptTrig,   Float_t ptAssoc, 
+                                                                             Float_t xE,       Float_t hbpXE, 
+                                                                             Float_t zT,       Float_t hbpZT, 
+                                                                             Float_t pout,
+                                                                             Int_t   nTracks,  Int_t   charge,
+                                                                             Int_t   bin,      Bool_t  decay,
+                                                                             Int_t   outTOF,   Int_t   mcTag)
+
+{
+  // Fill mostly momentum imbalance related histograms
+  
+  fhXECharged         ->Fill(ptTrig , xE); 
+  fhPtHbpXECharged    ->Fill(ptTrig , hbpXE);
+  fhZTCharged         ->Fill(ptTrig , zT); 
+  fhPtHbpZTCharged    ->Fill(ptTrig , hbpZT);
+  fhPtTrigPout        ->Fill(ptTrig , pout) ;
+  fhPtTrigCharged     ->Fill(ptTrig , ptAssoc) ;
+  
+  // Pile up studies
+  if(fFillPileUpHistograms) 
+  {
+    if     (outTOF==1)
+    {
+      fhXEChargedOtherBC    ->Fill(ptTrig,xE);
+      fhZTChargedOtherBC    ->Fill(ptTrig,zT);
+      fhPtTrigChargedOtherBC->Fill(ptTrig,ptAssoc);
+    }
+    else if(outTOF==0)
+    {
+      fhXEChargedBC0    ->Fill(ptTrig,xE);
+      fhZTChargedBC0    ->Fill(ptTrig,zT);
+      fhPtTrigChargedBC0->Fill(ptTrig,ptAssoc);
+    }
+
+    Int_t vtxBC = GetReader()->GetVertexBC();
+    if(vtxBC == 0 || vtxBC==AliVTrack::kTOFBCNA)
+    {
+      fhXEChargedVtxBC0    ->Fill(ptTrig,xE);
+      fhZTChargedVtxBC0    ->Fill(ptTrig,zT);
+      fhPtTrigChargedVtxBC0->Fill(ptTrig,ptAssoc);
+    }
+       
+    if(GetReader()->IsPileUpFromSPD())                { fhXEChargedPileUp[0]->Fill(ptTrig,xE); fhZTChargedPileUp[0]->Fill(ptTrig,zT); fhPtTrigChargedPileUp[0]->Fill(ptTrig,ptAssoc); }
+    if(GetReader()->IsPileUpFromEMCal())              { fhXEChargedPileUp[1]->Fill(ptTrig,xE); fhZTChargedPileUp[1]->Fill(ptTrig,zT); fhPtTrigChargedPileUp[1]->Fill(ptTrig,ptAssoc); }
+    if(GetReader()->IsPileUpFromSPDOrEMCal())         { fhXEChargedPileUp[2]->Fill(ptTrig,xE); fhZTChargedPileUp[2]->Fill(ptTrig,zT); fhPtTrigChargedPileUp[2]->Fill(ptTrig,ptAssoc); }
+    if(GetReader()->IsPileUpFromSPDAndEMCal())        { fhXEChargedPileUp[3]->Fill(ptTrig,xE); fhZTChargedPileUp[3]->Fill(ptTrig,zT); fhPtTrigChargedPileUp[3]->Fill(ptTrig,ptAssoc); }
+    if(GetReader()->IsPileUpFromSPDAndNotEMCal())     { fhXEChargedPileUp[4]->Fill(ptTrig,xE); fhZTChargedPileUp[4]->Fill(ptTrig,zT); fhPtTrigChargedPileUp[4]->Fill(ptTrig,ptAssoc); }
+    if(GetReader()->IsPileUpFromEMCalAndNotSPD())     { fhXEChargedPileUp[5]->Fill(ptTrig,xE); fhZTChargedPileUp[5]->Fill(ptTrig,zT); fhPtTrigChargedPileUp[5]->Fill(ptTrig,ptAssoc); }
+    if(GetReader()->IsPileUpFromNotSPDAndNotEMCal())  { fhXEChargedPileUp[6]->Fill(ptTrig,xE); fhZTChargedPileUp[6]->Fill(ptTrig,zT); fhPtTrigChargedPileUp[6]->Fill(ptTrig,ptAssoc); }
+  }
+  
+  if(IsDataMC())
+  {
+    Int_t mcIndex = GetMCTagHistogramIndex(mcTag);
+    fhXEChargedMC      [mcIndex]->Fill(ptTrig , xE      ); 
+  }  
+  
+  if(fDecayTrigger && decay)
+  {          
+    fhXEDecayCharged->Fill(ptTrig,xE); 
+    fhZTDecayCharged->Fill(ptTrig,zT);
+  } // photon decay pi0/eta trigger        
+  
+  if(bin >= 0 )//away side 
+  {
+    fhXEAssocPtBin[bin]->Fill(ptTrig, xE) ;
+    fhZTAssocPtBin[bin]->Fill(ptTrig, zT) ;
+    
+    if(fDecayTrigger && decay)
+    {          
+      fhXEDecayChargedAssocPtBin[bin]->Fill(ptTrig, xE); 
+      fhZTDecayChargedAssocPtBin[bin]->Fill(ptTrig, zT);
+    }
+  }        
+  
+  if(charge > 0)
+  {
+    fhXEPosCharged->Fill(ptTrig,xE) ;
+    fhZTPosCharged->Fill(ptTrig,zT) ;
+  }
+  else  
+  {
+    fhXENegCharged->Fill(ptTrig,xE) ;
+    fhZTNegCharged->Fill(ptTrig,zT) ;
+  }
+  
+  //fill different multiplicity histogram
+  if(DoEventSelect())
+  {
+    for(Int_t im=0; im<GetMultiBin(); im++)
+    {
+      if(nTracks < ( GetMaxMulti() - GetMinMulti() )/GetMultiBin()*(im+1))
+      {
+        fhTrigXECorr[im]->Fill(ptTrig,xE);
+        fhTrigZTCorr[im]->Fill(ptTrig,zT);
+      }
+    }
+  } //multiplicity events selection
+} 
+
+//_______________________________________________________________________________________________________________________
+void AliAnaParticleHadronCorrelation::FillChargedUnderlyingEventHistograms(Float_t ptTrig,   Float_t ptAssoc,
+                                                                           Float_t deltaPhi, Int_t nTracks, Int_t outTOF)
+{
+  // Fill underlying event histograms
+  
+  fhDeltaPhiUeChargedPt->Fill(ptAssoc,deltaPhi);
+  
+  Double_t randomphi = gRandom->Uniform(fDeltaPhiMinCut,fDeltaPhiMaxCut);
+  Double_t uexE = -(ptAssoc/ptTrig)*TMath::Cos(randomphi);
+  Double_t uezT =   ptAssoc/ptTrig;
+  
+  if(uexE < 0.) uexE = -uexE;
+    
+  fhXEUeCharged->Fill(ptTrig,uexE);
+  if(uexE > 0) fhPtHbpXEUeCharged->Fill(ptTrig,TMath::Log(1/uexE));
+  
+  fhZTUeCharged->Fill(ptTrig,uezT);
+  if(uexE > 0) fhPtHbpZTUeCharged->Fill(ptTrig,TMath::Log(1/uezT));
+  
+  // Pile up studies
+  
+  if(fFillPileUpHistograms)
+  {
+    if     (outTOF==1)
+    {
+      fhXEUeChargedOtherBC->Fill(ptTrig,uexE);
+      fhZTUeChargedOtherBC->Fill(ptTrig,uezT);
+    }
+    else if(outTOF==0)
+    {
+      fhXEUeChargedBC0->Fill(ptTrig,uexE);
+      fhZTUeChargedBC0->Fill(ptTrig,uezT);
+    }
+    
+    Int_t vtxBC = GetReader()->GetVertexBC();
+    if(vtxBC == 0 || vtxBC==AliVTrack::kTOFBCNA)
+    {
+      fhXEUeChargedVtxBC0->Fill(ptTrig,uexE);
+      fhZTUeChargedVtxBC0->Fill(ptTrig,uezT);
+    }
+
+    if(GetReader()->IsPileUpFromSPD())               { fhXEUeChargedPileUp[0]->Fill(ptTrig,uexE); fhZTUeChargedPileUp[0]->Fill(ptTrig,uezT);}
+    if(GetReader()->IsPileUpFromEMCal())             { fhXEUeChargedPileUp[1]->Fill(ptTrig,uexE); fhZTUeChargedPileUp[1]->Fill(ptTrig,uezT);}
+    if(GetReader()->IsPileUpFromSPDOrEMCal())        { fhXEUeChargedPileUp[2]->Fill(ptTrig,uexE); fhZTUeChargedPileUp[2]->Fill(ptTrig,uezT);}
+    if(GetReader()->IsPileUpFromSPDAndEMCal())       { fhXEUeChargedPileUp[3]->Fill(ptTrig,uexE); fhZTUeChargedPileUp[3]->Fill(ptTrig,uezT);}
+    if(GetReader()->IsPileUpFromSPDAndNotEMCal())    { fhXEUeChargedPileUp[4]->Fill(ptTrig,uexE); fhZTUeChargedPileUp[4]->Fill(ptTrig,uezT);}
+    if(GetReader()->IsPileUpFromEMCalAndNotSPD())    { fhXEUeChargedPileUp[5]->Fill(ptTrig,uexE); fhZTUeChargedPileUp[5]->Fill(ptTrig,uezT);}
+    if(GetReader()->IsPileUpFromNotSPDAndNotEMCal()) { fhXEUeChargedPileUp[6]->Fill(ptTrig,uexE); fhZTUeChargedPileUp[6]->Fill(ptTrig,uezT);}
+  }
+  
+  if(DoEventSelect())
+  {
+    for(Int_t im=0; im<GetMultiBin(); im++)
+    {
+      if(nTracks < ( GetMaxMulti() - GetMinMulti() )/GetMultiBin()*(im+1))
+      {
+        fhTrigXEUeCorr[im]->Fill(ptTrig,uexE); // xE? CHECK
+        fhTrigZTUeCorr[im]->Fill(ptTrig,uezT); // zT? CHECK
+      }
+    }
+  } //multiplicity events selection
+}
+
+//_____________________________________________________________________________________________________
+void AliAnaParticleHadronCorrelation::FillChargedUnderlyingEventSidesHistograms(Float_t ptTrig, 
+                                                                                Float_t ptAssoc, 
+                                                                                Float_t deltaPhi)
+{
+ // Fill underlying event histograms to the left and right of trigger
+  if((deltaPhi<-fUeDeltaPhiMinCut) || (deltaPhi >2*fUeDeltaPhiMaxCut))
+  {  
+    fhDeltaPhiUeLeftCharged->Fill(ptAssoc,deltaPhi); 
+    Double_t randomphi = gRandom->Uniform(fDeltaPhiMinCut,fDeltaPhiMaxCut);
+    Double_t uexE = -(ptAssoc/ptTrig)*TMath::Cos(randomphi);
+    Double_t uezT =   ptAssoc/ptTrig;
+  
+    if(uexE < 0.) uexE = -uexE;
+    
+    fhXEUeLeftCharged->Fill(ptTrig,uexE);
+    if(uexE > 0) fhPtHbpXEUeLeftCharged->Fill(ptTrig,TMath::Log(1/uexE));
+  
+    fhZTUeLeftCharged->Fill(ptTrig,uezT);
+    if(uexE > 0) fhPtHbpZTUeLeftCharged->Fill(ptTrig,TMath::Log(1/uezT));
+    fhDeltaPhiUeLeftCharged->Fill(ptAssoc, deltaPhi);
+  }
+  
+  if((deltaPhi > fUeDeltaPhiMinCut) && (deltaPhi < fUeDeltaPhiMaxCut))
+  {  
+    fhDeltaPhiUeRightCharged->Fill(ptAssoc,deltaPhi); 
+    Double_t randomphi = gRandom->Uniform(fDeltaPhiMinCut,fDeltaPhiMaxCut);
+    Double_t uexE = -(ptAssoc/ptTrig)*TMath::Cos(randomphi);
+    Double_t uezT =   ptAssoc/ptTrig;
+  
+    if(uexE < 0.) uexE = -uexE;
+    
+    fhXEUeRightCharged->Fill(ptTrig,uexE);
+    if(uexE > 0) fhPtHbpXEUeRightCharged->Fill(ptTrig,TMath::Log(1/uexE));
+  
+    fhZTUeRightCharged->Fill(ptTrig,uezT);
+    if(uexE > 0) fhPtHbpZTUeRightCharged->Fill(ptTrig,TMath::Log(1/uezT));
+    fhDeltaPhiUeRightCharged->Fill(ptAssoc, deltaPhi);
+  }
+
+  if((deltaPhi<-fUeDeltaPhiMinCut) && (deltaPhi >-TMath::Pi()/2))
+  {  
+    fhDeltaPhiUeLeftDownCharged->Fill(ptAssoc,deltaPhi); 
+    Double_t randomphi = gRandom->Uniform(fDeltaPhiMinCut,fDeltaPhiMaxCut);
+    Double_t uexE = -(ptAssoc/ptTrig)*TMath::Cos(randomphi);
+    
+    if(uexE < 0.) uexE = -uexE;
+    
+    fhXEUeLeftDownCharged->Fill(ptTrig,uexE);
+  }
+  
+  if((deltaPhi>2*fUeDeltaPhiMaxCut) && (deltaPhi <3*TMath::Pi()/2))
+  {  
+    fhDeltaPhiUeLeftUpCharged->Fill(ptAssoc,deltaPhi); 
+    Double_t randomphi = gRandom->Uniform(fDeltaPhiMinCut,fDeltaPhiMaxCut);
+    Double_t uexE = -(ptAssoc/ptTrig)*TMath::Cos(randomphi);
+    
+    if(uexE < 0.) uexE = -uexE;
+    
+    fhXEUeLeftUpCharged->Fill(ptTrig,uexE);
+  }
+  
+  if((deltaPhi > TMath::Pi()/2) && (deltaPhi < fUeDeltaPhiMaxCut))
+  {  
+    fhDeltaPhiUeRightUpCharged->Fill(ptAssoc,deltaPhi); 
+    Double_t randomphi = gRandom->Uniform(fDeltaPhiMinCut,fDeltaPhiMaxCut);
+    Double_t uexE = -(ptAssoc/ptTrig)*TMath::Cos(randomphi);
+    
+    if(uexE < 0.) uexE = -uexE;
+    
+    fhXEUeRightUpCharged->Fill(ptTrig,uexE);
+  }
+  
+  if((deltaPhi > fUeDeltaPhiMinCut) && (deltaPhi < TMath::Pi()/2))
+  {  
+    fhDeltaPhiUeRightDownCharged->Fill(ptAssoc,deltaPhi); 
+    Double_t randomphi = gRandom->Uniform(fDeltaPhiMinCut,fDeltaPhiMaxCut);
+    Double_t uexE = -(ptAssoc/ptTrig)*TMath::Cos(randomphi);
+    
+    if(uexE < 0.) uexE = -uexE;
+    
+    fhXEUeRightDownCharged->Fill(ptTrig,uexE);
+  }  
+} 
+
+//______________________________________________________________________________________________________________________________
+void AliAnaParticleHadronCorrelation::FillDecayPhotonCorrelationHistograms(Float_t ptAssoc,     Float_t phiAssoc, 
+                                                                           TLorentzVector mom1, TLorentzVector mom2,
+                                                                           Bool_t bChargedOrNeutral)
+{
+  // Do correlation with decay photons of triggered pi0 or eta
+  
+  // Calculate the correlation parameters
+  Float_t ptDecay1 = mom1.Pt();
+  Float_t ptDecay2 = mom2.Pt();
+  
+  Float_t zTDecay1 = -100, zTDecay2 = -100;
+  if(ptDecay1) zTDecay1 = ptAssoc/ptDecay1 ;
+  if(ptDecay2) zTDecay2 = ptAssoc/ptDecay2 ;
+  
+  Float_t deltaPhiDecay1 = mom1.Phi()-phiAssoc;
+  if(deltaPhiDecay1< -TMath::PiOver2()) deltaPhiDecay1+=TMath::TwoPi();
+  if(deltaPhiDecay1>3*TMath::PiOver2()) deltaPhiDecay1-=TMath::TwoPi();
+  
+  Float_t deltaPhiDecay2 = mom2.Phi()-phiAssoc;
+  if(deltaPhiDecay2< -TMath::PiOver2()) deltaPhiDecay2+=TMath::TwoPi();
+  if(deltaPhiDecay2>3*TMath::PiOver2()) deltaPhiDecay2-=TMath::TwoPi();
+  
+  Float_t xEDecay1   =-zTDecay1*TMath::Cos(deltaPhiDecay1); // -(px*pxTrig+py*pyTrig)/(ptTrig*ptTrig);
+  Float_t xEDecay2   =-zTDecay2*TMath::Cos(deltaPhiDecay2); // -(px*pxTrig+py*pyTrig)/(ptTrig*ptTrig);
+  
+  if(bChargedOrNeutral) // correlate with charges
+  {
+    fhDeltaPhiDecayCharged->Fill(ptDecay1, deltaPhiDecay1);
+    fhDeltaPhiDecayCharged->Fill(ptDecay2, deltaPhiDecay2);
+    
+    if(GetDebug() > 1) printf("AliAnaParticleHadronCorrelation::FillDecayPhotonHistograms( Charged corr) - deltaPhoton1 = %f, deltaPhoton2 = %f \n", deltaPhiDecay1, deltaPhiDecay2);
+    
+    if( (deltaPhiDecay1 > fDeltaPhiMinCut) && ( deltaPhiDecay1 < fDeltaPhiMaxCut) )
+    {
+      fhZTDecayCharged->Fill(ptDecay1,zTDecay1); 
+      fhXEDecayCharged->Fill(ptDecay1,xEDecay1); 
+    }
+    if( (deltaPhiDecay2 > fDeltaPhiMinCut) && ( deltaPhiDecay2 < fDeltaPhiMaxCut) )
+    {
+      fhZTDecayCharged->Fill(ptDecay2,zTDecay2);
+      fhXEDecayCharged->Fill(ptDecay2,xEDecay2);
+    }
+  }
+  else // correlate with neutrals
+  {
+    fhDeltaPhiDecayCharged->Fill(ptDecay1, deltaPhiDecay1);
+    fhDeltaPhiDecayCharged->Fill(ptDecay2, deltaPhiDecay2);
+    
+    if(GetDebug() > 1) printf("AliAnaParticleHadronCorrelation::FillDecayPhotonHistograms(Neutral corr) - deltaPhoton1 = %f, deltaPhoton2 = %f \n", deltaPhiDecay1, deltaPhiDecay2);
+    
+    if( (deltaPhiDecay1 > fDeltaPhiMinCut) && ( deltaPhiDecay1 < fDeltaPhiMaxCut) )
+    {
+      fhZTDecayCharged->Fill(ptDecay1,zTDecay1); 
+      fhXEDecayCharged->Fill(ptDecay1,xEDecay1); 
+    }
+    if( (deltaPhiDecay2 > fDeltaPhiMinCut) && ( deltaPhiDecay2 < fDeltaPhiMaxCut) )
+    {
+      fhZTDecayCharged->Fill(ptDecay2,zTDecay2);
+      fhXEDecayCharged->Fill(ptDecay2,xEDecay2);
+    }    
+  }
+}
+
+//______________________________________________________________________________________________________________________________________________________
+void AliAnaParticleHadronCorrelation::FillNeutralAngularCorrelationHistograms(Float_t ptAssoc,  Float_t ptTrig,  
+                                                                              Float_t phiAssoc, Float_t phiTrig,  Float_t &     deltaPhi,
+                                                                              Float_t etaAssoc, Float_t etaTrig)
+{
+  // Fill angular correlation related histograms
+  
+  Float_t deltaEta    = etaTrig-etaAssoc;
+  deltaPhi    = phiTrig-phiAssoc;
+  
+  if(deltaPhi <= -TMath::PiOver2()) deltaPhi+=TMath::TwoPi();
+  if(deltaPhi > 3*TMath::PiOver2()) deltaPhi-=TMath::TwoPi();
+  
+  fhEtaNeutral     ->Fill(ptAssoc,etaAssoc);
+  fhPhiNeutral     ->Fill(ptAssoc,phiAssoc);
+  fhDeltaEtaNeutral->Fill(ptTrig ,deltaEta);
+  fhDeltaPhiNeutral->Fill(ptTrig ,deltaPhi);
+  
+  if(ptAssoc > 2 ) fhDeltaPhiDeltaEtaNeutral->Fill(deltaPhi, deltaEta);
+  
+}
+
+//_____________________________________________________________________________________________________________________________
+void AliAnaParticleHadronCorrelation::FillNeutralUnderlyingEventSidesHistograms(Float_t ptTrig,   Float_t ptAssoc, 
+                                                                                Float_t xE,       Float_t hbpXE, 
+                                                                                Float_t zT,       Float_t hbpZT, 
+                                                                                Float_t deltaPhi)
+{
+  // Fill underlying event histograms to the left and right of trigger
+  
+  if((deltaPhi<-fUeDeltaPhiMinCut) && (deltaPhi >-fUeDeltaPhiMaxCut))
+  {  
+    fhDeltaPhiUeLeftNeutral->Fill(ptAssoc, deltaPhi);
+    fhXEUeLeftNeutral      ->Fill(ptTrig , xE);
+    fhPtHbpXEUeLeftNeutral ->Fill(ptTrig , hbpXE);
+    fhZTUeLeftNeutral      ->Fill(ptTrig , zT);
+    fhPtHbpZTUeLeftNeutral ->Fill(ptTrig , hbpZT);
+  }
+  
+  if((deltaPhi > fUeDeltaPhiMinCut) && (deltaPhi < fUeDeltaPhiMaxCut))
+  {  
+    fhDeltaPhiUeRightNeutral->Fill(ptAssoc, deltaPhi);
+    fhXEUeRightNeutral      ->Fill(ptTrig , xE);
+    fhPtHbpXEUeRightNeutral ->Fill(ptTrig , hbpXE);
+    fhZTUeRightNeutral      ->Fill(ptTrig , zT);
+    fhPtHbpZTUeRightNeutral ->Fill(ptTrig , hbpZT);
+  }
+} 
+
+//______________________________________________________
+void AliAnaParticleHadronCorrelation::FillEventMixPool()
+{
+  // Fill the pool with tracks if requested
+    
+  if(DoOwnMix())
+  {
+    FillChargedEventMixPool();
+    
+    if(OnlyIsolated() || fFillNeutralEventMixPool)
+      FillNeutralEventMixPool();
+  }
+  
+}
+
+//_____________________________________________________________
+void AliAnaParticleHadronCorrelation::FillChargedEventMixPool()
+{
+  // Mixed event pool filling for tracks
+    
+  if(fUseMixStoredInReader && GetReader()->GetLastTracksMixedEvent() == GetEventNumber())
+  {
+    //printf("%s : Pool already filled for this event !!!\n",GetInputAODName().Data());
+    return ; // pool filled previously for another trigger
+  }
+  
+  Int_t nTracks = GetCTSTracks()->GetEntriesFast();
+    
+  AliAnalysisManager   * manager      = AliAnalysisManager::GetAnalysisManager();
+  AliInputEventHandler * inputHandler = dynamic_cast<AliInputEventHandler*>(manager->GetInputEventHandler());
+  
+  if(!inputHandler) return ;
+    
+  // Do mixing only with MB event (or the chosen mask), if not skip
+  if( !(inputHandler->IsEventSelected( ) & GetReader()->GetMixEventTriggerMask()) ) return ;
+  
+  fhNtracksMB->Fill(nTracks);
+  
+  Int_t eventBin = GetEventMixBin();
+  
+  //Check that the bin exists, if not (bad determination of RP, centrality or vz bin) do nothing
+  if(eventBin < 0) return;
+  
+  TObjArray * mixEventTracks = new TObjArray;
+  
+  if(fUseMixStoredInReader) 
+  {
+    fListMixTrackEvents[eventBin] = GetReader()->GetListWithMixedEventsForTracks(eventBin);
+  }
+  
+  if(!fListMixTrackEvents[eventBin]) fListMixTrackEvents[eventBin] = new TList();
+  
+  //printf("%s ***** Pool Event bin : %d - nTracks %d\n",GetInputAODName().Data(),eventBin, GetCTSTracks()->GetEntriesFast());
+  
+  TList * pool = fListMixTrackEvents[eventBin];
+  
+  TVector3 p3;  
+  for(Int_t ipr = 0;ipr < GetCTSTracks()->GetEntriesFast() ; ipr ++ )
+  {
+    AliVTrack * track = (AliVTrack *) (GetCTSTracks()->At(ipr)) ;
+    
+    Double_t mom[3] = {track->Px(),track->Py(),track->Pz()};
+    p3.SetXYZ(mom[0],mom[1],mom[2]);
+    Float_t pt   = p3.Pt();
+    
+    //Select only hadrons in pt range
+    if(pt < fMinAssocPt || pt > fMaxAssocPt) continue ;
+    
+    AliAODPWG4Particle * mixedTrack = new AliAODPWG4Particle(mom[0],mom[1],mom[2],0);
+    mixedTrack->SetDetector("CTS");
+    mixedTrack->SetChargedBit(track->Charge()>0);
+    mixEventTracks->Add(mixedTrack);
+  }
+  
+  //Set the event number where the last event was added, to avoid double pool filling
+  GetReader()->SetLastTracksMixedEvent(GetEventNumber());
+  
+  //printf("Add event to pool with %d tracks \n ",mixEventTracks->GetEntries());
+  pool->AddFirst(mixEventTracks);
+  mixEventTracks = 0;
+  
+  //printf("Pool size %d, max %d\n",pool->GetSize(), GetNMaxEvMix());
+
+  if(pool->GetSize() > GetNMaxEvMix())
+  {//Remove last event
+    TClonesArray * tmp = static_cast<TClonesArray*>(pool->Last()) ;
+    pool->RemoveLast() ;
+    delete tmp ;
+  }
+}
+
+//_____________________________________________________________
+void AliAnaParticleHadronCorrelation::FillNeutralEventMixPool()
+{
+  // Mixed event pool filling for neutral clusters
+  // Right now only for EMCAL and in isolation case
+  
+  //printf("FillNeutralEventMixPool for %s\n",GetInputAODName().Data());
+  
+  TObjArray * pl = GetEMCALClusters();
+  //if (GetAODObjArrayName.Contains("PHOS") )pl    = GetPHOSClusters();
+  //else                                     pl    = GetEMCALClusters();
+  
+  Int_t nClusters   = pl->GetEntriesFast();
+  
+  if(fUseMixStoredInReader && GetReader()->GetLastCaloMixedEvent() == GetEventNumber())
+  {
+    //printf("%s : Pool already filled for this event !!!\n",GetInputAODName().Data());
+    return ; // pool filled previously for another trigger
+  }
+  
+  AliAnalysisManager   * manager      = AliAnalysisManager::GetAnalysisManager();
+  AliInputEventHandler * inputHandler = dynamic_cast<AliInputEventHandler*>(manager->GetInputEventHandler());
+  
+  if(!inputHandler) return ;
+    
+  // Do mixing only with MB event (or the chosen mask), if not skip
+  if( !(inputHandler->IsEventSelected( ) & GetReader()->GetMixEventTriggerMask()) ) return ;
+  
+  fhNclustersMB->Fill(nClusters);
+  
+  Int_t eventBin = GetEventMixBin();
+  
+  //Check that the bin exists, if not (bad determination of RP, centrality or vz bin) do nothing
+  if(eventBin < 0) return;
+  
+  TObjArray * mixEventCalo = new TObjArray;
+  
+  if(fUseMixStoredInReader) 
+  {
+    fListMixCaloEvents[eventBin] = GetReader()->GetListWithMixedEventsForCalo(eventBin);
+  }
+  
+  if(!fListMixCaloEvents[eventBin]) fListMixCaloEvents[eventBin] = new TList();
+  
+  TList * poolCalo = fListMixCaloEvents[eventBin];
+  
+  TLorentzVector mom;
+
+  for(Int_t ipr = 0;ipr <  nClusters ; ipr ++ )
+  {
+    AliVCluster * calo = (AliVCluster *) (pl->At(ipr)) ;
+  
+    // remove matched clusters
+    if( IsTrackMatched( calo, GetReader()->GetInputEvent() ) ) continue ;
+    
+    //Cluster momentum calculation
+    if(GetReader()->GetDataType() != AliCaloTrackReader::kMC)
+    {
+      calo->GetMomentum(mom,GetVertex(0)) ;
+    }//Assume that come from vertex in straight line
+    else
+    {
+      Double_t vertex[]={0,0,0};
+      calo->GetMomentum(mom,vertex) ;
+    }
+    
+    Float_t pt = mom.Pt();
+    //Select only clusters in pt range
+    if(pt < fMinAssocPt || pt > fMaxAssocPt) continue ;
+    
+    AliAODPWG4Particle * mixedCalo = new AliAODPWG4Particle(mom);
+    mixedCalo->SetDetector("EMCAL");
+    mixEventCalo->Add(mixedCalo);
+  }
+  
+  //Set the event number where the last event was added, to avoid double pool filling
+  GetReader()->SetLastCaloMixedEvent(GetEventNumber());
+  
+  //printf("Add event to pool with %d clusters \n ",mixEventCalo->GetEntries());
+  poolCalo->AddFirst(mixEventCalo);
+  mixEventCalo = 0;
+  
+  //printf("Pool size %d, max %d\n",poolCalo->GetSize(), GetNMaxEvMix());
+  
+  if(poolCalo->GetSize() > GetNMaxEvMix())
+  {//Remove last event
+    TClonesArray * tmp = static_cast<TClonesArray*>(poolCalo->Last()) ;
+    poolCalo->RemoveLast() ;
+    delete tmp ;
+  }  
 }
 
 //____________________________________________________________
@@ -138,9 +1038,10 @@ TObjString* AliAnaParticleHadronCorrelation::GetAnalysisCuts()
   parList+=onePar ;
   snprintf(onePar,buffersize,"Name of AOD Pi0 Branch %s ", fPi0AODBranchName.Data());
   parList+=onePar ;
-  snprintf(onePar,buffersize,"Do Decay-hadron correlation ?  %d", fPi0Trigger) ;
+  snprintf(onePar,buffersize,"Do Decay-hadron correlation ?  pi0 %d, decay %d", fPi0Trigger, fDecayTrigger) ;
   parList+=onePar ;
-  snprintf(onePar,buffersize,"Select absolute leading for cluster triggers ?  %d\n", fMakeAbsoluteLeading) ;
+  snprintf(onePar,buffersize,"Select absolute leading for cluster triggers ? %d or Near Side Leading %d \n", 
+           fMakeAbsoluteLeading, fMakeNearSideLeading) ;
   parList+=onePar ;
   snprintf(onePar,buffersize,"Associated particle pt bins  %d: ", fNAssocPtBins) ;
   parList+=onePar ;
@@ -152,9 +1053,6 @@ TObjString* AliAnaParticleHadronCorrelation::GetAnalysisCuts()
   //Get parameters set in base class.
   parList += GetBaseParametersList() ;
   
-  //Get parameters set in PID class.
-  //parList += GetCaloPID()->GetPIDParametersList() ;
-  
   //Get parameters set in FiducialCut class (not available yet)
   //parlist += GetFidCut()->GetFidCutParametersList() 
   
@@ -168,381 +1066,984 @@ TList *  AliAnaParticleHadronCorrelation::GetCreateOutputObjects()
   
   // Create histograms to be saved in output file and 
   // store them in fOutputContainer
+  
   TList * outputContainer = new TList() ; 
   outputContainer->SetName("CorrelationHistos") ; 
   
-  Int_t   nptbins = GetHistogramRanges()->GetHistoPtBins(); Int_t  nphibins = GetHistogramRanges()->GetHistoPhiBins(); Int_t   netabins = GetHistogramRanges()->GetHistoEtaBins();
-  Float_t ptmax   = GetHistogramRanges()->GetHistoPtMax();  Float_t phimax  = GetHistogramRanges()->GetHistoPhiMax();  Float_t etamax   = GetHistogramRanges()->GetHistoEtaMax();
-  Float_t ptmin   = GetHistogramRanges()->GetHistoPtMin();  Float_t phimin  = GetHistogramRanges()->GetHistoPhiMin();  Float_t etamin   = GetHistogramRanges()->GetHistoEtaMin();      
+  Int_t   nptbins = GetHistogramRanges()->GetHistoPtBins(); Int_t  nphibins = GetHistogramRanges()->GetHistoPhiBins(); Int_t   netabins = GetHistogramRanges()->GetHistoEtaBins(); Int_t  ndeltaphibins = GetHistogramRanges()->GetHistoDeltaPhiBins(); Int_t   ndeltaetabins = GetHistogramRanges()->GetHistoDeltaEtaBins();
+  Float_t ptmax   = GetHistogramRanges()->GetHistoPtMax();  Float_t phimax  = GetHistogramRanges()->GetHistoPhiMax();  Float_t etamax   = GetHistogramRanges()->GetHistoEtaMax(); Float_t deltaphimax  = GetHistogramRanges()->GetHistoDeltaPhiMax();  Float_t deltaetamax   = GetHistogramRanges()->GetHistoDeltaEtaMax();
+  Float_t ptmin   = GetHistogramRanges()->GetHistoPtMin();  Float_t phimin  = GetHistogramRanges()->GetHistoPhiMin();  Float_t etamin   = GetHistogramRanges()->GetHistoEtaMin(); Float_t deltaphimin  = GetHistogramRanges()->GetHistoDeltaPhiMin();  Float_t deltaetamin   = GetHistogramRanges()->GetHistoDeltaEtaMin();    
   
-  fhPtLeading  = new TH1F ("hPtLeading","p_T distribution of leading particles", nptbins,ptmin,ptmax); 
+  Int_t nMixBins = GetNCentrBin()*GetNZvertBin()*GetNRPBin();
+  
+  TString nameMC[]     = {"Photon","Pi0","Pi0Decay","EtaDecay","OtherDecay","Electron","Hadron"};
+  TString pileUpName[] = {"SPD","EMCAL","SPDOrEMCAL","SPDAndEMCAL","SPDAndNotEMCAL","EMCALAndNotSPD","NotSPDAndNotEMCAL"} ;
+
+  // For vz dependent histograms, if option ON
+  Int_t   nz  = 1  ;
+  if(fCorrelVzBin) nz = GetNZvertBin();
+  TString sz  = "" ;
+  TString tz  = "" ;
+  
+  fhPtInput  = new TH1F("hPtInput","p_{T} distribution of input trigger particles", nptbins,ptmin,ptmax); 
+  fhPtInput->SetXTitle("p_{T}^{trig} (GeV/c)");
+  outputContainer->Add(fhPtInput);
+
+  fhPtFidCut  = new TH1F("hPtFidCut","p_{T} distribution of input trigger particles after fiducial cut", nptbins,ptmin,ptmax); 
+  fhPtFidCut->SetXTitle("p_{T}^{trig} (GeV/c)");
+  outputContainer->Add(fhPtFidCut);
+
+  fhPtLeading  = new TH1F("hPtLeading","p_{T} distribution of leading particles", nptbins,ptmin,ptmax); 
   fhPtLeading->SetXTitle("p_{T}^{trig} (GeV/c)");
+  outputContainer->Add(fhPtLeading);
+
+  if(IsDataMC())
+  {
+    for(Int_t i=0; i < 7; i++)
+    {
+      fhPtLeadingMC[i]  = new TH1F(Form("hPtLeading_MC%s",nameMC[i].Data()),
+                                   Form("p_{T} distribution of leading particles, trigger origin is %s",nameMC[i].Data()), 
+                                   nptbins,ptmin,ptmax); 
+      fhPtLeadingMC[i]->SetXTitle("p_{T}^{trig} (GeV/c)");
+      outputContainer->Add(fhPtLeadingMC[i]);
+    }
+  }
   
+  if(fCorrelVzBin)
+  {
+    fhPtLeadingVzBin  = new TH2F("hPtLeadingVzBin","p_{T} distribution of leading particles vs vz bin", nptbins,ptmin,ptmax,GetNZvertBin(),0,GetNZvertBin()); 
+    fhPtLeadingVzBin->SetXTitle("p_{T}^{trig} (GeV/c)");
+    fhPtLeadingVzBin->SetYTitle("v_{z} bin");
+    outputContainer->Add(fhPtLeadingVzBin);
+  }
+  
+  fhPtLeadingBin  = new TH2F ("hPtLeadingBin","p_{T} distribution of leading particles", nptbins,ptmin,ptmax,nMixBins,0,nMixBins); 
+  fhPtLeadingBin->SetXTitle("p_{T}^{trig} (GeV/c)");
+  fhPtLeadingBin->SetYTitle("Bin");
+  outputContainer->Add(fhPtLeadingBin);
+
   fhPhiLeading  = new TH2F ("hPhiLeading","#phi distribution of leading Particles",nptbins,ptmin,ptmax, nphibins,phimin,phimax); 
   fhPhiLeading->SetYTitle("#phi (rad)");
-  
+  outputContainer->Add(fhPhiLeading);
+
   fhEtaLeading  = new TH2F ("hEtaLeading","#eta distribution of leading",nptbins,ptmin,ptmax, netabins,etamin,etamax); 
   fhEtaLeading->SetYTitle("#eta ");  
-  
-  outputContainer->Add(fhPtLeading);
-  outputContainer->Add(fhPhiLeading);
   outputContainer->Add(fhEtaLeading);
   
+  fhPtLeadingCentrality   = new TH2F("hPtLeadingCentrality","Leading particle p_{T} vs centrality",nptbins,ptmin,ptmax,100,0.,100) ;
+  fhPtLeadingCentrality->SetXTitle("p_{T}^{trig} (GeV/c)");
+  fhPtLeadingCentrality->SetYTitle("Centrality (%)");
+  outputContainer->Add(fhPtLeadingCentrality) ;  
+  
+  fhPtLeadingEventPlane  = new TH2F("hPtLeadingEventPlane","Leading particle p_{T} vs event plane angle",nptbins,ptmin,ptmax, 100,0.,TMath::Pi()) ;
+  fhPtLeadingEventPlane->SetXTitle("p_{T}^{trig} (GeV/c)");
+  fhPtLeadingEventPlane->SetXTitle("EP angle (rad)");
+  outputContainer->Add(fhPtLeadingEventPlane) ;
+  
+  fhLeadingEventPlaneCentrality  = new TH2F("hLeadingEventPlane","Leading particle centrality vs event plane angle",100,0.,100,100,0.,TMath::Pi()) ;
+  fhLeadingEventPlaneCentrality->SetXTitle("Centrality (%)");
+  fhLeadingEventPlaneCentrality->SetYTitle("EP angle (rad)");
+  outputContainer->Add(fhLeadingEventPlaneCentrality) ;
+  
   //Correlation with charged hadrons
   if(GetReader()->IsCTSSwitchedOn()) 
   {
     fhDeltaPhiDeltaEtaCharged  = new TH2F
-    ("DeltaPhiDeltaEtaCharged","#phi_{trigger} - #phi_{h^{#pm}} vs #eta_{trigger} - #eta_{h^{#pm}}",
-     140,-2.,5.,200,-2,2); 
-    fhDeltaPhiDeltaEtaCharged->SetXTitle("#Delta #phi");
+    ("hDeltaPhiDeltaEtaCharged","#eta_{trigger} - #eta_{h^{#pm}} vs #phi_{trigger} - #phi_{h^{#pm}}",
+    ndeltaphibins ,deltaphimin,deltaphimax,ndeltaetabins,deltaetamin,deltaetamax); 
+    fhDeltaPhiDeltaEtaCharged->SetXTitle("#Delta #phi (rad)");
     fhDeltaPhiDeltaEtaCharged->SetYTitle("#Delta #eta");    
     
+    fhDeltaPhiDeltaEtaChargedPtA3GeV  = new TH2F
+    ("hDeltaPhiDeltaEtaChargedPtA3GeV","#eta_{trigger} - #eta_{h^{#pm}} vs #phi_{trigger} - #phi_{h^{#pm}, p_{TA}>3 GeV/c}",
+     ndeltaphibins ,deltaphimin,deltaphimax,ndeltaetabins,deltaetamin,deltaetamax); 
+    fhDeltaPhiDeltaEtaChargedPtA3GeV->SetXTitle("#Delta #phi (rad)");
+    fhDeltaPhiDeltaEtaChargedPtA3GeV->SetYTitle("#Delta #eta");    
+        
     fhPhiCharged  = new TH2F
-    ("PhiCharged","#phi_{h^{#pm}}  vs p_{T #pm}",
+    ("hPhiCharged","#phi_{h^{#pm}}  vs p_{T #pm}",
      nptbins,ptmin,ptmax,nphibins,phimin,phimax); 
     fhPhiCharged->SetYTitle("#phi_{h^{#pm}} (rad)");
     fhPhiCharged->SetXTitle("p_{T #pm} (GeV/c)");
     
     fhEtaCharged  = new TH2F
-    ("EtaCharged","#eta_{h^{#pm}}  vs p_{T #pm}",
+    ("hEtaCharged","#eta_{h^{#pm}}  vs p_{T #pm}",
      nptbins,ptmin,ptmax,netabins,etamin,etamax); 
     fhEtaCharged->SetYTitle("#eta_{h^{#pm}} (rad)");
     fhEtaCharged->SetXTitle("p_{T #pm} (GeV/c)");
     
     fhDeltaPhiCharged  = new TH2F
-    ("DeltaPhiCharged","#phi_{trigger} - #phi_{h^{#pm}} vs p_{T trigger}",
-     nptbins,ptmin,ptmax,140,-2.,5.); 
-    fhDeltaPhiCharged->SetYTitle("#Delta #phi");
+    ("hDeltaPhiCharged","#phi_{trigger} - #phi_{h^{#pm}} vs p_{T trigger}",
+     nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+    fhDeltaPhiCharged->SetYTitle("#Delta #phi (rad)");
     fhDeltaPhiCharged->SetXTitle("p_{T trigger} (GeV/c)");
     
+    fhDeltaPhiChargedPtA3GeV  = new TH2F
+    ("hDeltaPhiChargedPtA3GeV","#phi_{trigger} - #phi_{h^{#pm}} vs p_{T trigger}, p_{TA}>3 GeV/c",
+     nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+    fhDeltaPhiChargedPtA3GeV->SetYTitle("#Delta #phi (rad)");
+    fhDeltaPhiChargedPtA3GeV->SetXTitle("p_{T trigger} (GeV/c)");
+    
+
     fhDeltaPhiChargedPt  = new TH2F
-    ("DeltaPhiChargedPt","#phi_{trigger} - #phi_{#h^{#pm}} vs p_{T h^{#pm}}",
-     nptbins,ptmin,ptmax,140,-2.,5.);
-    fhDeltaPhiChargedPt->SetYTitle("#Delta #phi");
+    ("hDeltaPhiChargedPt","#phi_{trigger} - #phi_{#h^{#pm}} vs p_{T h^{#pm}}",
+     nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+    fhDeltaPhiChargedPt->SetYTitle("#Delta #phi (rad)");
     fhDeltaPhiChargedPt->SetXTitle("p_{T h^{#pm}} (GeV/c)");
     
     fhDeltaPhiUeChargedPt  = new TH2F
-    ("DeltaPhiUeChargedPt","#phi_{trigger} - #phi_{#Ueh^{#pm}} vs p_{T Ueh^{#pm}}",
-     nptbins,ptmin,ptmax,140,-2.,5.);
-    fhDeltaPhiUeChargedPt->SetYTitle("#Delta #phi");
+    ("hDeltaPhiUeChargedPt","#phi_{trigger} - #phi_{#Ueh^{#pm}} vs p_{T Ueh^{#pm}}",
+     nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+    fhDeltaPhiUeChargedPt->SetYTitle("#Delta #phi (rad)");
     fhDeltaPhiUeChargedPt->SetXTitle("p_{T h^{#pm}} (GeV/c)");
     
+    fhUePart  =  new TH1F("hUePart","UE particles distribution vs pt trig",
+             nptbins,ptmin,ptmax); 
+    fhUePart->SetYTitle("dNch");
+    fhUePart->SetXTitle("p_{T trigger} (GeV/c)");
+    
+    
     fhDeltaEtaCharged  = new TH2F
-    ("DeltaEtaCharged","#eta_{trigger} - #eta_{h^{#pm}} vs p_{T trigger}",
-     nptbins,ptmin,ptmax,200,-2,2); 
+    ("hDeltaEtaCharged","#eta_{trigger} - #eta_{h^{#pm}} vs p_{T trigger}",
+     nptbins,ptmin,ptmax,ndeltaetabins,deltaetamin,deltaetamax);  
     fhDeltaEtaCharged->SetYTitle("#Delta #eta");
     fhDeltaEtaCharged->SetXTitle("p_{T trigger} (GeV/c)");
     
-    fhPtImbalanceCharged  = 
-    new TH2F("CorrelationCharged","z_{trigger h^{#pm}} = p_{T h^{#pm}} / p_{T trigger}",
+    fhDeltaEtaChargedPtA3GeV  = new TH2F
+    ("hDeltaEtaChargedPtA3GeV","#eta_{trigger} - #eta_{h^{#pm}} vs p_{T trigger}, p_{TA}>3 GeV/c",
+     nptbins,ptmin,ptmax,ndeltaetabins,deltaetamin,deltaetamax);  
+    fhDeltaEtaChargedPtA3GeV->SetYTitle("#Delta #eta");
+    fhDeltaEtaChargedPtA3GeV->SetXTitle("p_{T trigger} (GeV/c)");    
+    
+    fhXECharged  = 
+    new TH2F("hXECharged","x_{E} for charged tracks",
              nptbins,ptmin,ptmax,200,0.,2.); 
-    fhPtImbalanceCharged->SetYTitle("z_{trigger h^{#pm}}");
-    fhPtImbalanceCharged->SetXTitle("p_{T trigger}");
+    fhXECharged->SetYTitle("x_{E}");
+    fhXECharged->SetXTitle("p_{T trigger} (GeV/c)");
     
-    fhPtImbalanceUeCharged  = 
-    new TH2F("CorrelationUeCharged","z_{trigger h^{#pm}} = p_{T Ueh^{#pm}} / p_{T trigger}",
+    fhXEUeCharged  = 
+    new TH2F("hXEUeCharged","x_{E} for Underlying Event",
              nptbins,ptmin,ptmax,200,0.,2.); 
-    fhPtImbalanceUeCharged->SetYTitle("z_{trigger Ueh^{#pm}}");
-    fhPtImbalanceUeCharged->SetXTitle("p_{T trigger}");
+    fhXEUeCharged->SetYTitle("x_{E}");
+    fhXEUeCharged->SetXTitle("p_{T trigger} (GeV/c)");
     
-    fhPtImbalancePosCharged  = 
-    new TH2F("CorrelationPositiveCharged","z_{trigger h^{+}} = p_{T h^{+}} / p_{T trigger}",
+    fhXEPosCharged  = 
+    new TH2F("hXEPositiveCharged","x_{E} for positive charged tracks",
              nptbins,ptmin,ptmax,200,0.,2.); 
-    fhPtImbalancePosCharged->SetYTitle("z_{trigger h^{+}}");
-    fhPtImbalancePosCharged->SetXTitle("p_{T trigger}");
+    fhXEPosCharged->SetYTitle("x_{E}");
+    fhXEPosCharged->SetXTitle("p_{T trigger} (GeV/c)");
     
-    fhPtImbalanceNegCharged  = 
-    new TH2F("CorrelationNegativeCharged","z_{trigger h^{-}} = p_{T h^{-}} / p_{T trigger}",
+    fhXENegCharged  = 
+    new TH2F("hXENegativeCharged","x_{E} for negative charged tracks",
              nptbins,ptmin,ptmax,200,0.,2.); 
-    fhPtImbalanceNegCharged->SetYTitle("z_{trigger h^{-}}");
-    fhPtImbalanceNegCharged->SetXTitle("p_{T trigger}");
+    fhXENegCharged->SetYTitle("x_{E}");
+    fhXENegCharged->SetXTitle("p_{T trigger} (GeV/c)");
     
-    fhPtHbpCharged  = 
-    new TH2F("HbpCharged","#xi = ln(1/x_{E}) with charged hadrons",
+    fhPtHbpXECharged  = 
+    new TH2F("hHbpXECharged","#xi = ln(1/x_{E}) with charged hadrons",
              nptbins,ptmin,ptmax,200,0.,10.); 
-    fhPtHbpCharged->SetYTitle("ln(1/x_{E})");
-    fhPtHbpCharged->SetXTitle("p_{T trigger}");
+    fhPtHbpXECharged->SetYTitle("ln(1/x_{E})");
+    fhPtHbpXECharged->SetXTitle("p_{T trigger} (GeV/c)");
     
-    fhPtHbpUeCharged  = 
-    new TH2F("HbpUeCharged","#xi = ln(1/x_{E}) with charged hadrons",
+    fhPtHbpXEUeCharged  = 
+    new TH2F("hHbpXEUeCharged","#xi = ln(1/x_{E}) with charged hadrons,Underlying Event",
              nptbins,ptmin,ptmax,200,0.,10.); 
-    fhPtHbpUeCharged->SetYTitle("ln(1/x_{E})");
-    fhPtHbpUeCharged->SetXTitle("p_{T trigger}");
+    fhPtHbpXEUeCharged->SetYTitle("ln(1/x_{E})");
+    fhPtHbpXEUeCharged->SetXTitle("p_{T trigger} (GeV/c)");
+    
+    fhZTCharged  = 
+    new TH2F("hZTCharged","z_{T} for charged tracks",
+             nptbins,ptmin,ptmax,200,0.,2.); 
+    fhZTCharged->SetYTitle("z_{T}");
+    fhZTCharged->SetXTitle("p_{T trigger}");
+    
+    fhZTUeCharged  = 
+    new TH2F("hZTUeCharged","z_{T} for Underlying Event",
+             nptbins,ptmin,ptmax,200,0.,2.); 
+    fhZTUeCharged->SetYTitle("z_{T}");
+    fhZTUeCharged->SetXTitle("p_{T trigger} (GeV/c)");
+    
+    fhZTPosCharged  = 
+    new TH2F("hZTPositiveCharged","z_{T} for positive charged tracks",
+             nptbins,ptmin,ptmax,200,0.,2.); 
+    fhZTPosCharged->SetYTitle("z_{T}");
+    fhZTPosCharged->SetXTitle("p_{T trigger} (GeV/c)");
+    
+    fhZTNegCharged  = 
+    new TH2F("hZTNegativeCharged","z_{T} for negative charged tracks",
+             nptbins,ptmin,ptmax,200,0.,2.); 
+    fhZTNegCharged->SetYTitle("z_{T}");
+    fhZTNegCharged->SetXTitle("p_{T trigger} (GeV/c)");
+    
+    fhPtHbpZTCharged  = 
+    new TH2F("hHbpZTCharged","#xi = ln(1/z_{T}) with charged hadrons",
+             nptbins,ptmin,ptmax,200,0.,10.); 
+    fhPtHbpZTCharged->SetYTitle("ln(1/z_{T})");
+    fhPtHbpZTCharged->SetXTitle("p_{T trigger} (GeV/c)");
+    
+    fhPtHbpZTUeCharged  = 
+    new TH2F("hHbpZTUeCharged","#xi = ln(1/z_{T}) with charged hadrons,Underlying Event",
+             nptbins,ptmin,ptmax,200,0.,10.); 
+    fhPtHbpZTUeCharged->SetYTitle("ln(1/x_{E})");
+    fhPtHbpZTUeCharged->SetXTitle("p_{T trigger} (GeV/c)");
     
     fhPtTrigPout  = 
-    new TH2F("PtTrigPout","Pout with triggers",
+    new TH2F("hPtTrigPout","Pout with triggers",
              nptbins,ptmin,ptmax,2*nptbins,-ptmax,ptmax); 
     fhPtTrigPout->SetYTitle("p_{out} (GeV/c)");
     fhPtTrigPout->SetXTitle("p_{T trigger} (GeV/c)"); 
     
     fhPtTrigCharged  = 
-    new TH2F("PtTrigCharged","trgger and charged tracks pt distribution",
+    new TH2F("hPtTrigCharged","trigger and charged tracks pt distribution",
              nptbins,ptmin,ptmax,nptbins,ptmin,ptmax); 
     fhPtTrigCharged->SetYTitle("p_{T h^{#pm}} (GeV/c)");
     fhPtTrigCharged->SetXTitle("p_{T trigger} (GeV/c)");    
          
     outputContainer->Add(fhDeltaPhiDeltaEtaCharged);
+    outputContainer->Add(fhDeltaPhiDeltaEtaChargedPtA3GeV);
     outputContainer->Add(fhPhiCharged) ;
     outputContainer->Add(fhEtaCharged) ;
     outputContainer->Add(fhDeltaPhiCharged) ; 
+    outputContainer->Add(fhDeltaPhiChargedPtA3GeV) ; 
     outputContainer->Add(fhDeltaEtaCharged) ;
+    outputContainer->Add(fhDeltaEtaChargedPtA3GeV) ;
     outputContainer->Add(fhDeltaPhiChargedPt) ;
     outputContainer->Add(fhDeltaPhiUeChargedPt) ;
-    outputContainer->Add(fhPtImbalanceCharged) ;
-    outputContainer->Add(fhPtImbalancePosCharged) ;
-    outputContainer->Add(fhPtImbalanceNegCharged) ;
-    outputContainer->Add(fhPtImbalanceUeCharged) ;
-    outputContainer->Add(fhPtHbpCharged) ;
-    outputContainer->Add(fhPtHbpUeCharged) ;
+    outputContainer->Add(fhUePart);
+
+    outputContainer->Add(fhXECharged) ;
+  
+    if(IsDataMC())
+    {
+      for(Int_t i=0; i < 7; i++)
+      {
+        
+        fhDeltaPhiChargedMC[i]  = new TH2F(Form("hDeltaPhiCharged_MC%s",nameMC[i].Data()),
+                                     Form("#Delta #phi for charged tracks, trigger origin is %s",nameMC[i].Data()),
+                                     nptbins,ptmin,ptmax,ndeltaphibins ,deltaphimin,deltaphimax); 
+        fhDeltaPhiChargedMC[i]->SetYTitle("x_{E}");
+        fhDeltaPhiChargedMC[i]->SetXTitle("p_{T trigger} (GeV/c)");
+        outputContainer->Add(fhDeltaPhiChargedMC[i]) ;
+        
+        fhXEChargedMC[i]  = new TH2F(Form("hXECharged_MC%s",nameMC[i].Data()),
+                                     Form("x_{E} for charged tracks, trigger origin is %s",nameMC[i].Data()),
+         nptbins,ptmin,ptmax,200,0.,2.); 
+        fhXEChargedMC[i]->SetYTitle("x_{E}");
+        fhXEChargedMC[i]->SetXTitle("p_{T trigger} (GeV/c)");
+        outputContainer->Add(fhXEChargedMC[i]) ;
+      }
+    }
+  
+    outputContainer->Add(fhXEPosCharged) ;
+    outputContainer->Add(fhXENegCharged) ;
+    outputContainer->Add(fhXEUeCharged) ;
+    outputContainer->Add(fhPtHbpXECharged) ;
+    outputContainer->Add(fhPtHbpXEUeCharged) ;
+
+    outputContainer->Add(fhZTCharged) ;
+    outputContainer->Add(fhZTPosCharged) ;
+    outputContainer->Add(fhZTNegCharged) ;
+    outputContainer->Add(fhZTUeCharged) ;
+    outputContainer->Add(fhPtHbpZTCharged) ;
+    outputContainer->Add(fhPtHbpZTUeCharged) ;
+    
     outputContainer->Add(fhPtTrigPout) ;
     outputContainer->Add(fhPtTrigCharged) ;
     
+    if(fFillPileUpHistograms)
+    {
+      fhDeltaPhiChargedOtherBC  = new TH2F
+      ("hDeltaPhiChargedOtherBC","#phi_{trigger} - #phi_{h^{#pm}} vs p_{T trigger}, track BC!=0",
+       nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+      fhDeltaPhiChargedOtherBC->SetYTitle("#Delta #phi (rad)");
+      fhDeltaPhiChargedOtherBC->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      fhDeltaPhiChargedPtA3GeVOtherBC  = new TH2F
+      ("hDeltaPhiChargedPtA3GeVOtherBC","#phi_{trigger} - #phi_{h^{#pm}} vs p_{T trigger}, p_{TA}>3 GeV/c, track BC!=0",
+       nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+      fhDeltaPhiChargedPtA3GeVOtherBC->SetYTitle("#Delta #phi (rad)");
+      fhDeltaPhiChargedPtA3GeVOtherBC->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      fhPtTrigChargedOtherBC  =
+      new TH2F("hPtTrigChargedOtherBC","trigger and charged tracks pt distribution, track BC!=0",
+               nptbins,ptmin,ptmax,nptbins,ptmin,ptmax);
+      fhPtTrigChargedOtherBC->SetYTitle("p_{T h^{#pm}} (GeV/c)");
+      fhPtTrigChargedOtherBC->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      fhXEChargedOtherBC  =
+      new TH2F("hXEChargedOtherBC","x_{E} for charged tracks, track BC!=0",
+               nptbins,ptmin,ptmax,200,0.,2.);
+      fhXEChargedOtherBC->SetYTitle("x_{E}");
+      fhXEChargedOtherBC->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      fhXEUeChargedOtherBC  =
+      new TH2F("hXEUeChargedOtherBC","x_{E} for Underlying Event, track BC!=0",
+               nptbins,ptmin,ptmax,200,0.,2.);
+      fhXEUeChargedOtherBC->SetYTitle("x_{E}");
+      fhXEUeChargedOtherBC->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      fhZTChargedOtherBC  =
+      new TH2F("hZTChargedOtherBC","z_{T} for charged tracks, track BC!=0",
+               nptbins,ptmin,ptmax,200,0.,2.);
+      fhZTChargedOtherBC->SetYTitle("z_{T}");
+      fhZTChargedOtherBC->SetXTitle("p_{T trigger}");
+      
+      fhZTUeChargedOtherBC  =
+      new TH2F("hZTUeChargedOtherBC","z_{T} for Underlying Event, track BC!=0",
+               nptbins,ptmin,ptmax,200,0.,2.);
+      fhZTUeChargedOtherBC->SetYTitle("z_{T}");
+      fhZTUeChargedOtherBC->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      outputContainer->Add(fhDeltaPhiChargedOtherBC) ;
+      outputContainer->Add(fhDeltaPhiChargedPtA3GeVOtherBC) ;
+      outputContainer->Add(fhXEChargedOtherBC) ;
+      outputContainer->Add(fhXEUeChargedOtherBC) ;
+      outputContainer->Add(fhZTChargedOtherBC) ;
+      outputContainer->Add(fhZTUeChargedOtherBC) ;
+      outputContainer->Add(fhPtTrigChargedOtherBC) ;    
+
+      fhDeltaPhiChargedBC0  = new TH2F
+      ("hDeltaPhiChargedBC0","#phi_{trigger} - #phi_{h^{#pm}} vs p_{T trigger}, track BC==0",
+       nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+      fhDeltaPhiChargedBC0->SetYTitle("#Delta #phi (rad)");
+      fhDeltaPhiChargedBC0->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      fhDeltaPhiChargedPtA3GeVBC0  = new TH2F
+      ("hDeltaPhiChargedPtA3GeVBC0","#phi_{trigger} - #phi_{h^{#pm}} vs p_{T trigger}, p_{TA}>3 GeV/c, track BC==0",
+       nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+      fhDeltaPhiChargedPtA3GeVBC0->SetYTitle("#Delta #phi (rad)");
+      fhDeltaPhiChargedPtA3GeVBC0->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      fhPtTrigChargedBC0  =
+      new TH2F("hPtTrigChargedBC0","trigger and charged tracks pt distribution, track BC==0",
+               nptbins,ptmin,ptmax,nptbins,ptmin,ptmax);
+      fhPtTrigChargedBC0->SetYTitle("p_{T h^{#pm}} (GeV/c)");
+      fhPtTrigChargedBC0->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      fhXEChargedBC0  =
+      new TH2F("hXEChargedBC0","x_{E} for charged tracks, track BC==0",
+               nptbins,ptmin,ptmax,200,0.,2.);
+      fhXEChargedBC0->SetYTitle("x_{E}");
+      fhXEChargedBC0->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      fhXEUeChargedBC0  =
+      new TH2F("hXEUeChargedBC0","x_{E} for Underlying Event, track BC==0",
+               nptbins,ptmin,ptmax,200,0.,2.);
+      fhXEUeChargedBC0->SetYTitle("x_{E}");
+      fhXEUeChargedBC0->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      fhZTChargedBC0  =
+      new TH2F("hZTChargedBC0","z_{T} for charged tracks, track BC==0",
+               nptbins,ptmin,ptmax,200,0.,2.);
+      fhZTChargedBC0->SetYTitle("z_{T}");
+      fhZTChargedBC0->SetXTitle("p_{T trigger}");
+      
+      fhZTUeChargedBC0  =
+      new TH2F("hZTUeChargedBC0","z_{T} for Underlying Event, track BC==0",
+               nptbins,ptmin,ptmax,200,0.,2.);
+      fhZTUeChargedBC0->SetYTitle("z_{T}");
+      fhZTUeChargedBC0->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      outputContainer->Add(fhDeltaPhiChargedBC0) ;
+      outputContainer->Add(fhDeltaPhiChargedPtA3GeVBC0) ;
+      outputContainer->Add(fhXEChargedBC0) ;
+      outputContainer->Add(fhXEUeChargedBC0) ;
+      outputContainer->Add(fhZTChargedBC0) ;
+      outputContainer->Add(fhZTUeChargedBC0) ;
+      outputContainer->Add(fhPtTrigChargedBC0) ;
+
+      fhPtLeadingVtxBC0  = new TH1F("hPtLeadingVtxBC0","p_{T} distribution of leading particles", nptbins,ptmin,ptmax);
+      fhPtLeadingVtxBC0->SetXTitle("p_{T}^{trig} (GeV/c)");
+      
+      fhDeltaPhiChargedVtxBC0  = new TH2F
+      ("hDeltaPhiChargedVtxBC0","#phi_{trigger} - #phi_{h^{#pm}} vs p_{T trigger}, track BC==0",
+       nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+      fhDeltaPhiChargedVtxBC0->SetYTitle("#Delta #phi (rad)");
+      fhDeltaPhiChargedVtxBC0->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      fhDeltaPhiChargedPtA3GeVVtxBC0  = new TH2F
+      ("hDeltaPhiChargedPtA3GeVVtxBC0","#phi_{trigger} - #phi_{h^{#pm}} vs p_{T trigger}, p_{TA}>3 GeV/c, track BC==0",
+       nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+      fhDeltaPhiChargedPtA3GeVVtxBC0->SetYTitle("#Delta #phi (rad)");
+      fhDeltaPhiChargedPtA3GeVVtxBC0->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      fhPtTrigChargedVtxBC0  =
+      new TH2F("hPtTrigChargedVtxBC0","trigger and charged tracks pt distribution, track BC==0",
+               nptbins,ptmin,ptmax,nptbins,ptmin,ptmax);
+      fhPtTrigChargedVtxBC0->SetYTitle("p_{T h^{#pm}} (GeV/c)");
+      fhPtTrigChargedVtxBC0->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      fhXEChargedVtxBC0  =
+      new TH2F("hXEChargedVtxBC0","x_{E} for charged tracks, track BC==0",
+               nptbins,ptmin,ptmax,200,0.,2.);
+      fhXEChargedVtxBC0->SetYTitle("x_{E}");
+      fhXEChargedVtxBC0->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      fhXEUeChargedVtxBC0  =
+      new TH2F("hXEUeChargedVtxBC0","x_{E} for Underlying Event, track BC==0",
+               nptbins,ptmin,ptmax,200,0.,2.);
+      fhXEUeChargedVtxBC0->SetYTitle("x_{E}");
+      fhXEUeChargedVtxBC0->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      fhZTChargedVtxBC0  =
+      new TH2F("hZTChargedVtxBC0","z_{T} for charged tracks, track BC==0",
+               nptbins,ptmin,ptmax,200,0.,2.);
+      fhZTChargedVtxBC0->SetYTitle("z_{T}");
+      fhZTChargedVtxBC0->SetXTitle("p_{T trigger}");
+      
+      fhZTUeChargedVtxBC0  =
+      new TH2F("hZTUeChargedVtxBC0","z_{T} for Underlying Event, track BC==0",
+               nptbins,ptmin,ptmax,200,0.,2.);
+      fhZTUeChargedVtxBC0->SetYTitle("z_{T}");
+      fhZTUeChargedVtxBC0->SetXTitle("p_{T trigger} (GeV/c)");
+      
+      outputContainer->Add(fhPtLeadingVtxBC0);
+      outputContainer->Add(fhDeltaPhiChargedVtxBC0) ;
+      outputContainer->Add(fhDeltaPhiChargedPtA3GeVVtxBC0) ;
+      outputContainer->Add(fhXEChargedVtxBC0) ;
+      outputContainer->Add(fhXEUeChargedVtxBC0) ;
+      outputContainer->Add(fhZTChargedVtxBC0) ;
+      outputContainer->Add(fhZTUeChargedVtxBC0) ;
+      outputContainer->Add(fhPtTrigChargedVtxBC0) ;
+      
+      for(Int_t i = 0 ; i < 7 ; i++)
+      {
+        fhPtLeadingPileUp[i]  = new TH1F(Form("hPtLeadingPileUp%s",pileUpName[i].Data()),
+                                         Form("p_{T} distribution of leading particles, %s Pile-Up event",pileUpName[i].Data()), nptbins,ptmin,ptmax);
+        fhPtLeadingPileUp[i]->SetXTitle("p_{T}^{trig} (GeV/c)");
+        outputContainer->Add(fhPtLeadingPileUp[i]);
+        
+        fhDeltaPhiChargedPileUp[i]  = new TH2F(Form("hDeltaPhiChargedPileUp%s",pileUpName[i].Data()),
+                                                    Form("#phi_{trigger} - #phi_{h^{#pm}} vs p_{T trigger}, %s Pile-Up event",pileUpName[i].Data()),
+         nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+        fhDeltaPhiChargedPileUp[i]->SetYTitle("#Delta #phi (rad)");
+        fhDeltaPhiChargedPileUp[i]->SetXTitle("p_{T trigger} (GeV/c)");
+        outputContainer->Add(fhDeltaPhiChargedPileUp[i]) ;
+        
+        fhDeltaPhiChargedPtA3GeVPileUp[i]  = new TH2F(Form("hDeltaPhiChargedPtA3GeVPileUp%s",pileUpName[i].Data()),
+                                                           Form("#phi_{trigger} - #phi_{h^{#pm}} vs p_{T trigger}, p_{TA}>3 GeV/c, %s Pile-Up event",pileUpName[i].Data()),
+         nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+        fhDeltaPhiChargedPtA3GeVPileUp[i]->SetYTitle("#Delta #phi (rad)");
+        fhDeltaPhiChargedPtA3GeVPileUp[i]->SetXTitle("p_{T trigger} (GeV/c)");
+        outputContainer->Add(fhDeltaPhiChargedPtA3GeVPileUp[i]) ;
+        
+        fhDeltaEtaChargedPileUp[i]  = new TH2F(Form("hDeltaEtaChargedPileUp%s",pileUpName[i].Data()),
+                                                    Form("#eta_{trigger} - #eta_{h^{#pm}} vs p_{T trigger}, %s Pile-Up event",pileUpName[i].Data()),
+         nptbins,ptmin,ptmax,ndeltaetabins,deltaetamin,deltaetamax);  
+        fhDeltaEtaChargedPileUp[i]->SetYTitle("#Delta #eta");
+        fhDeltaEtaChargedPileUp[i]->SetXTitle("p_{T trigger} (GeV/c)");
+        outputContainer->Add(fhDeltaEtaChargedPileUp[i]) ;
+        
+        fhDeltaEtaChargedPtA3GeVPileUp[i]  = new TH2F(Form("hDeltaEtaChargedPtA3GeVPileUp%s",pileUpName[i].Data()),
+                                                           Form("#eta_{trigger} - #eta_{h^{#pm}} vs p_{T trigger}, p_{TA}>3 GeV/c, %s Pile-Up event",pileUpName[i].Data()),
+         nptbins,ptmin,ptmax,ndeltaetabins,deltaetamin,deltaetamax);  
+        fhDeltaEtaChargedPtA3GeVPileUp[i]->SetYTitle("#Delta #eta");
+        fhDeltaEtaChargedPtA3GeVPileUp[i]->SetXTitle("p_{T trigger} (GeV/c)");    
+        outputContainer->Add(fhDeltaEtaChargedPtA3GeVPileUp[i]) ;
+        
+        fhXEChargedPileUp[i]  = new TH2F(Form("hXEChargedPileUp%s",pileUpName[i].Data()),
+                                              Form("x_{E} for charged tracks, %s Pile-Up event",pileUpName[i].Data()),
+                 nptbins,ptmin,ptmax,200,0.,2.); 
+        fhXEChargedPileUp[i]->SetYTitle("x_{E}");
+        fhXEChargedPileUp[i]->SetXTitle("p_{T trigger} (GeV/c)");
+        outputContainer->Add(fhXEChargedPileUp[i]) ;
+        
+        fhXEUeChargedPileUp[i]  = new TH2F(Form("hXEUeChargedPileUp%s",pileUpName[i].Data()),
+                                                Form("x_{E} for Underlying Event, %s Pile-Up event",pileUpName[i].Data()),
+                 nptbins,ptmin,ptmax,200,0.,2.); 
+        fhXEUeChargedPileUp[i]->SetYTitle("x_{E}");
+        fhXEUeChargedPileUp[i]->SetXTitle("p_{T trigger} (GeV/c)");
+        outputContainer->Add(fhXEUeChargedPileUp[i]) ;
+        
+        fhZTChargedPileUp[i]  = new TH2F(Form("hZTChargedPileUp%s",pileUpName[i].Data()),
+                                              Form("z_{T} for charged tracks, %s Pile-Up event",pileUpName[i].Data()),
+                 nptbins,ptmin,ptmax,200,0.,2.); 
+        fhZTChargedPileUp[i]->SetYTitle("z_{T}");
+        fhZTChargedPileUp[i]->SetXTitle("p_{T trigger} (GeV/c)");
+        outputContainer->Add(fhZTChargedPileUp[i]) ;
+        
+        fhZTUeChargedPileUp[i]  = new TH2F(Form("hZTUeChargedPileUp%s",pileUpName[i].Data()),
+                                                Form("z_{T} for Underlying Event, %s Pile-Up event",pileUpName[i].Data()),
+                 nptbins,ptmin,ptmax,200,0.,2.); 
+        fhZTUeChargedPileUp[i]->SetYTitle("z_{T}");
+        fhZTUeChargedPileUp[i]->SetXTitle("p_{T trigger} (GeV/c)");
+        outputContainer->Add(fhZTUeChargedPileUp[i]) ;
+        
+        fhPtTrigChargedPileUp[i]  = new TH2F(Form("hPtTrigChargedPileUp%s",pileUpName[i].Data()),
+                                                  Form("trigger and charged tracks pt distribution, %s Pile-Up event",pileUpName[i].Data()),
+                 nptbins,ptmin,ptmax,nptbins,ptmin,ptmax); 
+        fhPtTrigChargedPileUp[i]->SetYTitle("p_{T h^{#pm}} (GeV/c)");
+        fhPtTrigChargedPileUp[i]->SetXTitle("p_{T trigger} (GeV/c)");    
+        outputContainer->Add(fhPtTrigChargedPileUp[i]) ;
+        
+      }
+    }
+    
     if(DoEventSelect())
     { 
       Int_t nMultiBins = GetMultiBin();
       fhTrigDeltaPhiCharged = new TH2F*[nMultiBins] ;
       fhTrigDeltaEtaCharged = new TH2F*[nMultiBins] ;
-      fhTrigCorr            = new TH2F*[nMultiBins];
-      fhTrigUeCorr          = new TH2F*[nMultiBins];
-      for(Int_t im=0; im<nMultiBins; im++){
+      fhTrigXECorr          = new TH2F*[nMultiBins] ;
+      fhTrigXEUeCorr        = new TH2F*[nMultiBins] ;
+      fhTrigZTCorr          = new TH2F*[nMultiBins] ;
+      fhTrigZTUeCorr        = new TH2F*[nMultiBins] ;
+      
+      for(Int_t im=0; im<nMultiBins; im++)
+      {
         fhTrigDeltaPhiCharged[im]  = new TH2F 
-        (Form("fhTrigDeltaPhiCharged_%d",im),Form("fhTrigDeltaPhiCharged_%d",im), nptbins,ptmin,ptmax, 140,-2.,5.); 
+        (Form("hTrigDeltaPhiCharged_%d",im),Form("hTrigDeltaPhiCharged_%d",im), nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax); 
         fhTrigDeltaPhiCharged[im]->SetXTitle("p_{T trigger} (GeV/c)");
-        fhTrigDeltaPhiCharged[im]->SetYTitle("#Delta #phi");
+        fhTrigDeltaPhiCharged[im]->SetYTitle("#Delta #phi (rad)");
+        
         fhTrigDeltaEtaCharged[im]  = new TH2F 
-        (Form("fhTrigDeltaEtaCharged_%d",im),Form("fhTrigDeltaEtaCharged_%d",im), nptbins,ptmin,ptmax, 200,-2,2); 
+        (Form("hTrigDeltaEtaCharged_%d",im),Form("hTrigDeltaEtaCharged_%d",im), nptbins,ptmin,ptmax, ndeltaetabins ,deltaetamin,deltaetamax); 
         fhTrigDeltaEtaCharged[im]->SetXTitle("p_{T trigger} (GeV/c)");
         fhTrigDeltaEtaCharged[im]->SetYTitle("#Delta #eta");
-        fhTrigCorr[im]  = new TH2F
-        (Form("fhTrigPtCorr_%d",im),Form("fhTrigPtCorr_%d",im), nptbins,ptmin,ptmax,200,0.,2.); 
-        fhTrigCorr[im]->SetYTitle("z_{trigger h^{#pm}}");
-        fhTrigCorr[im]->SetXTitle("p_{T trigger}");
-        fhTrigUeCorr[im]  = new TH2F
-        (Form("fhTrigPtUeCorr_%d",im),Form("fhTrigPtUeCorr_%d",im), nptbins,ptmin,ptmax,200,0.,2.); 
-        fhTrigUeCorr[im]->SetYTitle("z_{trigger h^{#pm}}");
-        fhTrigUeCorr[im]->SetXTitle("p_{T trigger}");       
         
-        outputContainer->Add(fhTrigDeltaPhiCharged[im]) ;
-        outputContainer->Add(fhTrigDeltaEtaCharged[im]) ;
-        outputContainer->Add(fhTrigCorr[im]);
-        outputContainer->Add(fhTrigUeCorr[im]);
+        fhTrigXECorr[im]  = new TH2F
+        (Form("hTrigXEPtCorr_%d",im),Form("hTrigXEPtCorr_%d",im), nptbins,ptmin,ptmax,200,0.,2.); 
+        fhTrigXECorr[im]->SetYTitle("x_{E trigger h^{#pm}}");
+        fhTrigXECorr[im]->SetXTitle("p_{T trigger} (GeV/c)");
+        
+        fhTrigXEUeCorr[im]  = new TH2F
+        (Form("hTrigXEPtUeCorr_%d",im),Form("hTrigXEPtUeCorr_%d",im), nptbins,ptmin,ptmax,200,0.,2.); 
+        fhTrigXEUeCorr[im]->SetYTitle("x_{E trigger h^{#pm}}");
+        fhTrigXEUeCorr[im]->SetXTitle("p_{T trigger}(GeV/c)");       
+        
+        fhTrigZTCorr[im]  = new TH2F
+        (Form("hTrigZTPtCorr_%d",im),Form("hTrigZTPtCorr_%d",im), nptbins,ptmin,ptmax,200,0.,2.); 
+        fhTrigZTCorr[im]->SetYTitle("z_{trigger h^{#pm}}");
+        fhTrigZTCorr[im]->SetXTitle("p_{T trigger} (GeV/c)");
+        
+        fhTrigZTUeCorr[im]  = new TH2F
+        (Form("hTrigZTPtUeCorr_%d",im),Form("hTrigZTPtUeCorr_%d",im), nptbins,ptmin,ptmax,200,0.,2.); 
+        fhTrigZTUeCorr[im]->SetYTitle("z_{trigger h^{#pm}}");
+        fhTrigZTUeCorr[im]->SetXTitle("p_{T trigger} (GeV/c)");               
+        
+        outputContainer->Add(fhTrigDeltaPhiCharged[im]) ;
+        outputContainer->Add(fhTrigDeltaEtaCharged[im]) ;
+        outputContainer->Add(fhTrigXECorr[im]);
+        outputContainer->Add(fhTrigXEUeCorr[im]);
+        outputContainer->Add(fhTrigZTCorr[im]);
+        outputContainer->Add(fhTrigZTUeCorr[im]);
+      }
+    }
+    
+    if(fFillBradHisto)
+    {
+      fhAssocPtBkg        = new TH2F("hAssocPtBkg", " Trigger p_{T} vs associated hadron p_{T} from background",
+                                     nptbins, ptmin, ptmax,nptbins,ptmin,ptmax);
+      fhAssocPtBkg->SetXTitle("p_{T trigger} (GeV/c)");
+      fhAssocPtBkg->SetYTitle("p_{T associated} (GeV/c)");
+      outputContainer->Add(fhAssocPtBkg) ;
+      
+      fhDeltaPhiBrad = new TH2F("hDeltaPhiBrad","atan2(sin(#Delta #phi), cos(#Delta #phi))/#pi vs p_{T trigger} ", 
+                                nptbins, ptmin, ptmax,288, -1.0/3.0, 5.0/3.0);
+      fhDeltaPhiBrad->SetXTitle("p_{T trigger} (GeV/c)");
+      fhDeltaPhiBrad->SetYTitle("atan2(sin(#Delta #phi), cos(#Delta #phi))/#pi");
+      outputContainer->Add(fhDeltaPhiBrad) ;
+    }
+
+    fhDeltaPhiDeltaEtaAssocPtBin = new TH2F*[fNAssocPtBins*nz];
+    fhDeltaPhiAssocPtBin       = new TH2F*[fNAssocPtBins*nz];
+    fhDeltaPhiAssocPtBinDEta08 = new TH2F*[fNAssocPtBins*nz];
+    fhDeltaPhiAssocPtBinDEta0  = new TH2F*[fNAssocPtBins*nz];
+    fhXEAssocPtBin             = new TH2F*[fNAssocPtBins*nz];
+    fhZTAssocPtBin             = new TH2F*[fNAssocPtBins*nz];
+    
+    if(fFillBradHisto)  
+      fhDeltaPhiBradAssocPtBin = new TH2F*[fNAssocPtBins*nz];
+    
+    if(fPi0Trigger || fDecayTrigger)
+    {
+      fhDeltaPhiAssocPtBin       = new TH2F*[fNAssocPtBins*nz];
+      fhDeltaPhiAssocPtBinDEta08 = new TH2F*[fNAssocPtBins*nz];
+      fhXEAssocPtBin             = new TH2F*[fNAssocPtBins*nz];
+      fhZTAssocPtBin             = new TH2F*[fNAssocPtBins*nz];
+      fhXEDecayChargedAssocPtBin = new TH2F*[fNAssocPtBins*nz];
+      fhZTDecayChargedAssocPtBin = new TH2F*[fNAssocPtBins*nz];
+      fhDeltaPhiDecayChargedAssocPtBin = new TH2F*[fNAssocPtBins*nz];
+    }
+
+    if(fHMPIDCorrelation)
+    {
+      fhDeltaPhiAssocPtBinHMPID   = new TH2F*[fNAssocPtBins*nz];
+      fhDeltaPhiAssocPtBinHMPIDAcc= new TH2F*[fNAssocPtBins*nz];
+    }
+    
+    for(Int_t i = 0 ; i < fNAssocPtBins ; i++)
+    {
+      for(Int_t z = 0 ; z < nz ; z++)
+      {
+        Int_t bin = i*nz+z;
+        
+        if(fCorrelVzBin)
+        {
+          sz = "_vz%d"+z;
+          tz = ", v_{z} bin "+z;
+        }
+        
+        //printf("iAssoc %d, Vz %d, bin %d - sz %s, tz %s      \n",i,z,bin,sz.Data(),tz.Data());
+        
+        fhDeltaPhiDeltaEtaAssocPtBin[bin]  = new TH2F(Form("hDeltaPhiDeltaEtaPtAssocPt%2.1f_%2.1f%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],sz.Data()), 
+                                                 Form("#Delta #phi vs #Delta #eta for associated p_{T} bin [%2.1f,%2.1f]%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],tz.Data()), 
+                                                 ndeltaphibins ,deltaphimin,deltaphimax,ndeltaetabins,deltaetamin,deltaetamax); 
+        fhDeltaPhiDeltaEtaAssocPtBin[bin]->SetXTitle("#Delta #phi (rad)");
+        fhDeltaPhiDeltaEtaAssocPtBin[bin]->SetYTitle("#Delta #eta");  
+        
+        fhDeltaPhiAssocPtBin[bin] = new TH2F(Form("hDeltaPhiPtAssocPt%2.1f_%2.1f%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],sz.Data()), 
+                                           Form("#Delta #phi vs p_{T trigger} for associated p_{T} bin [%2.1f,%2.1f]%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],tz.Data()), 
+                                           nptbins, ptmin, ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+        fhDeltaPhiAssocPtBin[bin]->SetXTitle("p_{T trigger} (GeV/c)");
+        fhDeltaPhiAssocPtBin[bin]->SetYTitle("#Delta #phi (rad)");
+        
+        fhDeltaPhiAssocPtBinDEta08[bin] = new TH2F(Form("hDeltaPhiDeltaEta0.8PtAssocPt%2.1f_%2.1f%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],sz.Data()), 
+                                                 Form("#Delta #phi vs p_{T trigger} for associated p_{T} bin [%2.1f,%2.1f]%s, for #Delta #eta > 0.8", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],tz.Data()), 
+                                                 nptbins, ptmin, ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+        fhDeltaPhiAssocPtBinDEta08[bin]->SetXTitle("p_{T trigger} (GeV/c)");
+        fhDeltaPhiAssocPtBinDEta08[bin]->SetYTitle("#Delta #phi (rad)");      
+
+        fhDeltaPhiAssocPtBinDEta0[bin] = new TH2F(Form("hDeltaPhiDeltaEta0PtAssocPt%2.1f_%2.1f%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],tz.Data()), 
+                                                   Form("#Delta #phi vs p_{T trigger} for associated p_{T} bin [%2.1f,%2.1f]%s, for #Delta #eta = 0.", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],tz.Data()), 
+                                                   nptbins, ptmin, ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+        fhDeltaPhiAssocPtBinDEta0[bin]->SetXTitle("p_{T trigger} (GeV/c)");
+        fhDeltaPhiAssocPtBinDEta0[bin]->SetYTitle("#Delta #phi (rad)");    
+        
+        fhXEAssocPtBin[bin]       = new TH2F(Form("hXEAssocPtBin%1.f_%1.f%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],sz.Data()), 
+                                           Form("x_{E} vs p_{T trigger} for associated p_{T} bin [%2.1f,%2.1f]%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],tz.Data()), 
+                                           nptbins, ptmin, ptmax,200, 0.0, 2.0);
+        fhXEAssocPtBin[bin]->SetXTitle("p_{T trigger} (GeV/c)");
+        fhXEAssocPtBin[bin]->SetYTitle("x_{E}");
+        
+        fhZTAssocPtBin[bin]       = new TH2F(Form("hZTAssocPtBin%1.f_%1.f%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],sz.Data()), 
+                                           Form("z_{T} vs p_{T trigger} for associated p_{T} bin [%2.1f,%2.1f]%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],tz.Data()), 
+                                           nptbins, ptmin, ptmax,200, 0.0, 2.0);
+        fhZTAssocPtBin[bin]->SetXTitle("p_{T trigger} (GeV/c)");
+        fhZTAssocPtBin[bin]->SetYTitle("z_{T}");
+        
+        outputContainer->Add(fhDeltaPhiDeltaEtaAssocPtBin[bin]) ;
+        outputContainer->Add(fhDeltaPhiAssocPtBin[bin]) ;
+        outputContainer->Add(fhDeltaPhiAssocPtBinDEta08[bin]) ;
+        outputContainer->Add(fhDeltaPhiAssocPtBinDEta0[bin]) ;
+        outputContainer->Add(fhXEAssocPtBin[bin]);
+        outputContainer->Add(fhZTAssocPtBin[bin]);
+
+        if(fPi0Trigger || fDecayTrigger) 
+        {
+          fhDeltaPhiDecayChargedAssocPtBin[bin] = new TH2F(Form("hDeltaPhiPtDecayChargedAssocPt%2.1f_%2.1f%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],sz.Data()), 
+                                                         Form("#Delta #phi vs p_{T trigger} tagged as decay for associated p_{T} bin [%2.1f,%2.1f]%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],tz.Data()), 
+                                                         nptbins, ptmin, ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+          fhDeltaPhiDecayChargedAssocPtBin[bin]->SetXTitle("p_{T trigger} (GeV/c)");
+          fhDeltaPhiDecayChargedAssocPtBin[bin]->SetYTitle("#Delta #phi (rad)");
+          
+          fhXEDecayChargedAssocPtBin[bin]       = new TH2F(Form("hXEDecayChargedAssocPtBin%1.f_%1.f%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],sz.Data()), 
+                                                         Form("x_{E} vs p_{T trigger} tagged as decay for associated p_{T} bin [%2.1f,%2.1f]%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],tz.Data()), 
+                                                         nptbins, ptmin, ptmax,200, 0.0, 2.0);
+          fhXEDecayChargedAssocPtBin[bin]->SetXTitle("p_{T trigger} (GeV/c)");
+          fhXEDecayChargedAssocPtBin[bin]->SetYTitle("x_{E}");
+          
+          fhZTDecayChargedAssocPtBin[bin]       = new TH2F(Form("hZTDecayChargedAssocPtBin%1.f_%1.f%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],sz.Data()), 
+                                                         Form("z_{T} vs p_{T trigger} tagged as decay for associated p_{T} bin [%2.1f,%2.1f]%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],tz.Data()), 
+                                                         nptbins, ptmin, ptmax,200, 0.0, 2.0);
+          fhZTDecayChargedAssocPtBin[bin]->SetXTitle("p_{T trigger} (GeV/c)");
+          fhZTDecayChargedAssocPtBin[bin]->SetYTitle("z_{T}");
+          
+          outputContainer->Add(fhDeltaPhiDecayChargedAssocPtBin[bin]) ;
+          outputContainer->Add(fhXEDecayChargedAssocPtBin[bin]);
+          outputContainer->Add(fhZTDecayChargedAssocPtBin[bin]);
+          
+        }
+        
+        if(fFillBradHisto) 
+        {
+          fhDeltaPhiBradAssocPtBin[bin] = new TH2F(Form("hDeltaPhiBradPtAssocPt%2.1f_%2.1f%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],sz.Data()), 
+                                                 Form("atan2(sin(#Delta #phi), cos(#Delta #phi))/#pi vs p_{T trigger} for associated p_{T} bin [%2.1f,%2.1f]%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],tz.Data()), 
+                                                 nptbins, ptmin, ptmax,288, -1.0/3.0, 5.0/3.0);
+          fhDeltaPhiBradAssocPtBin[bin]->SetXTitle("p_{T trigger} (GeV/c)");
+          fhDeltaPhiBradAssocPtBin[bin]->SetYTitle("atan2(sin(#Delta #phi), cos(#Delta #phi))/#pi");
+          outputContainer->Add(fhDeltaPhiBradAssocPtBin[bin]) ;
+        }       
         
+        if(fHMPIDCorrelation)
+        {
+          fhDeltaPhiAssocPtBinHMPID[bin] = new TH2F(Form("hDeltaPhiPtAssocPt%2.1f_%2.1f%sHMPID", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],sz.Data()), 
+                                                  Form("#Delta #phi vs p_{T trigger} for associated p_{T} bin [%2.1f,%2.1f]%s, with track having HMPID signal", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],tz.Data()), 
+                                                  nptbins, ptmin, ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+          fhDeltaPhiAssocPtBinHMPID[bin]->SetXTitle("p_{T trigger} (GeV/c)" );
+          fhDeltaPhiAssocPtBinHMPID[bin]->SetYTitle("#Delta #phi (rad)");      
+          
+          fhDeltaPhiAssocPtBinHMPIDAcc[bin] = new TH2F(Form("hDeltaPhiPtAssocPt%2.1f_%2.1f%sHMPIDAcc", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],sz.Data()), 
+                                                     Form("#Delta #phi vs p_{T trigger} for associated p_{T} bin [%2.1f,%2.1f]%s, with track within 5<phi<20 deg", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],tz.Data()), 
+                                                     nptbins, ptmin, ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+          fhDeltaPhiAssocPtBinHMPIDAcc[bin]->SetXTitle("p_{T trigger} (GeV/c)");
+          fhDeltaPhiAssocPtBinHMPIDAcc[bin]->SetYTitle("#Delta #phi (rad)"); 
+          
+          outputContainer->Add(fhDeltaPhiAssocPtBinHMPID[bin]) ;
+          outputContainer->Add(fhDeltaPhiAssocPtBinHMPIDAcc[bin]) ;
+          
+        }      
       }
     }
     
-    fhAssocPt           = new TH2F("fhAssocPt", " Trigger p_{T} vs associated hadron p_{T}",
-                                   nptbins, ptmin, ptmax,nptbins,ptmin,ptmax);
-    fhAssocPt->SetXTitle("p_{T trigger}");
-    fhAssocPt->SetYTitle("p_{T associated}");
-    outputContainer->Add(fhAssocPt) ;
-    
-    fhAssocPtBkg        = new TH2F("fhAssocPtBkg", " Trigger p_{T} vs associated hadron p_{T} from background",
-                                   nptbins, ptmin, ptmax,nptbins,ptmin,ptmax);
-    fhAssocPtBkg->SetXTitle("p_{T trigger}");
-    fhAssocPtBkg->SetYTitle("p_{T associated}");
-    outputContainer->Add(fhAssocPtBkg) ;
-    
-    fhDeltaPhiBrad = new TH2F("fhDeltaPhiBrad","atan2(sin(#Delta #phi), cos(#Delta #phi))/#pi vs p_{T trigger} ", 
-                              nptbins, ptmin, ptmax,288, -1.0/3.0, 5.0/3.0);
-    fhDeltaPhiBrad->SetXTitle("p_{T trigger}");
-    fhDeltaPhiBrad->SetYTitle("atan2(sin(#Delta #phi), cos(#Delta #phi))/#pi");
-    
-    outputContainer->Add(fhDeltaPhiBrad) ;
-
-    fhXE       = new TH2F("fhXE", "x_{E} vs p_{T trigger}", 
-                          nptbins, ptmin, ptmax,50, 0.0, 2.0);
-    fhXE->SetXTitle("p_{T trigger}");
-    fhXE->SetYTitle("x_{E}");
-    
-    outputContainer->Add(fhXE);
-    
-    
-    fhDeltaPhiAssocPtBin     = new TH2F*[fNAssocPtBins] ;
-    fhDeltaPhiAssocPtBinHMPID= new TH2F*[fNAssocPtBins] ;
-    fhDeltaPhiAssocPtBinHMPIDAcc= new TH2F*[fNAssocPtBins] ;
-    fhDeltaPhiBradAssocPtBin = new TH2F*[fNAssocPtBins] ;
-    fhXEAssocPtBin           = new TH2F*[fNAssocPtBins] ;
-    for(Int_t i = 0 ; i < fNAssocPtBins ; i++){
-      fhDeltaPhiAssocPtBin[i] = new TH2F(Form("fhDeltaPhiPtAssocPt%2.1f_%2.1f", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1]), 
-                                         Form("#Delta #phi vs p_{T trigger} for associated p_{T} bin [%2.1f,%2.1f]", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1]), 
-                                         nptbins, ptmin, ptmax,140,-2.,5.);
-      fhDeltaPhiAssocPtBin[i]->SetXTitle("p_{T trigger}");
-      fhDeltaPhiAssocPtBin[i]->SetYTitle("#Delta #phi");
-      fhDeltaPhiAssocPtBinHMPID[i] = new TH2F(Form("fhDeltaPhiPtAssocPt%2.1f_%2.1fHMPID", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1]), 
-                                         Form("#Delta #phi vs p_{T trigger} for associated p_{T} bin [%2.1f,%2.1f], with track having HMPID signal", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1]), 
-                                         nptbins, ptmin, ptmax,140,-2.,5.);
-      fhDeltaPhiAssocPtBinHMPID[i]->SetXTitle("p_{T trigger}");
-      fhDeltaPhiAssocPtBinHMPID[i]->SetYTitle("#Delta #phi");      
-      
-      fhDeltaPhiAssocPtBinHMPIDAcc[i] = new TH2F(Form("fhDeltaPhiPtAssocPt%2.1f_%2.1fHMPIDAcc", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1]), 
-                                              Form("#Delta #phi vs p_{T trigger} for associated p_{T} bin [%2.1f,%2.1f], with track within 5<phi<20 deg", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1]), 
-                                              nptbins, ptmin, ptmax,140,-2.,5.);
-      fhDeltaPhiAssocPtBinHMPIDAcc[i]->SetXTitle("p_{T trigger}");
-      fhDeltaPhiAssocPtBinHMPIDAcc[i]->SetYTitle("#Delta #phi");    
-      
-      fhDeltaPhiBradAssocPtBin[i] = new TH2F(Form("fhDeltaPhiBradPtAssocPt%2.1f_%2.1f", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1]), 
-                                             Form("atan2(sin(#Delta #phi), cos(#Delta #phi))/#pi vs p_{T trigger} for associated p_{T} bin [%2.1f,%2.1f]", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1]), 
-                                             nptbins, ptmin, ptmax,288, -1.0/3.0, 5.0/3.0);
-      fhDeltaPhiBradAssocPtBin[i]->SetXTitle("p_{T trigger}");
-      fhDeltaPhiBradAssocPtBin[i]->SetYTitle("atan2(sin(#Delta #phi), cos(#Delta #phi))/#pi");
-      
-      
-      fhXEAssocPtBin[i]       = new TH2F(Form("fhXEAssocPtBin%1.f_%1.f", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1]), 
-                                         Form("x_{E} vs p_{T trigger} for associated p_{T} bin [%2.1f,%2.1f]", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1]), 
-                                         nptbins, ptmin, ptmax,50, 0.0, 2.0);
-      fhXEAssocPtBin[i]->SetXTitle("p_{T trigger}");
-      fhXEAssocPtBin[i]->SetYTitle("x_{E}");
-      
-      outputContainer->Add(fhDeltaPhiAssocPtBin[i]) ;
-      outputContainer->Add(fhDeltaPhiAssocPtBinHMPID[i]) ;
-      outputContainer->Add(fhDeltaPhiAssocPtBinHMPIDAcc[i]) ;
-      outputContainer->Add(fhDeltaPhiBradAssocPtBin[i]) ;
-      outputContainer->Add(fhXEAssocPtBin[i]);
-    }
-    
-    if(fPi0Trigger)
+    if(fPi0Trigger || fDecayTrigger)
     {
-      fhPtPi0DecayRatio  = new TH2F
-      ("hPtPi0DecayRatio","p_T of #pi^{0} and the ratio of pt for two decay", 
-       nptbins,ptmin,ptmax, 100,0.,2.); 
-      fhPtPi0DecayRatio->SetXTitle("p_{T}^{#pi^{0}} (GeV/c)");
-      fhPtPi0DecayRatio->SetYTitle("p_{T}^{Decay}/p_{T}^{#pi^{0}}");
+      if(fPi0Trigger)
+      {
+        fhPtPi0DecayRatio  = new TH2F
+        ("hPtPi0DecayRatio","p_{T} of #pi^{0} and the ratio of pt for two decay", 
+         nptbins,ptmin,ptmax, 100,0.,2.); 
+        fhPtPi0DecayRatio->SetXTitle("p_{T}^{#pi^{0}} (GeV/c)");
+        fhPtPi0DecayRatio->SetYTitle("p_{T}^{Decay}/p_{T}^{#pi^{0}}");
+        outputContainer->Add(fhPtPi0DecayRatio) ; 
+      }
       
       fhDeltaPhiDecayCharged  = new TH2F
-      ("DeltaPhiDecayCharged","#phi_{Decay} - #phi_{h^{#pm}} vs p_{T Decay}",
-       nptbins,ptmin,ptmax,140,-2.,5.); 
-      fhDeltaPhiDecayCharged->SetYTitle("#Delta #phi");
+      ("hDeltaPhiDecayCharged","#phi_{Decay} - #phi_{h^{#pm}} vs p_{T Decay}",
+       nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax); 
+      fhDeltaPhiDecayCharged->SetYTitle("#Delta #phi (rad)");
       fhDeltaPhiDecayCharged->SetXTitle("p_{T Decay} (GeV/c)");
       
-      fhPtImbalanceDecayCharged  = 
-      new TH2F("CorrelationDecayCharged","z_{trigger h^{#pm}} = p_{T h^{#pm}} / p_{T Decay}",
+      fhXEDecayCharged  = 
+      new TH2F("hXEDecayCharged","x_{E}  Decay",
+               nptbins,ptmin,ptmax,200,0.,2.); 
+      fhXEDecayCharged->SetYTitle("x_{E}");
+      fhXEDecayCharged->SetXTitle("p_{T decay} (GeV/c)");
+      
+      fhZTDecayCharged  = 
+      new TH2F("hZTDecayCharged","z_{trigger h^{#pm}} = p_{T h^{#pm}} / p_{T Decay}",
                nptbins,ptmin,ptmax,200,0.,2.); 
-      fhPtImbalanceDecayCharged->SetYTitle("z_{decay h^{#pm}}");
-      fhPtImbalanceDecayCharged->SetXTitle("p_{T decay}");
+      fhZTDecayCharged->SetYTitle("z_{decay h^{#pm}}");
+      fhZTDecayCharged->SetXTitle("p_{T decay} (GeV/c)");      
       
-      outputContainer->Add(fhPtPi0DecayRatio) ; 
       outputContainer->Add(fhDeltaPhiDecayCharged) ; 
-      outputContainer->Add(fhPtImbalanceDecayCharged) ;
+      outputContainer->Add(fhXEDecayCharged) ;
+      outputContainer->Add(fhZTDecayCharged) ;
     }    
     
-    
     if(fMakeSeveralUE)
     { 
       fhDeltaPhiUeLeftCharged  = new TH2F
-      ("DeltaPhiUeLeftChargedPt","#phi_{trigger} - #phi_{#Ueh^{#pm}} vs p_{T Ueh^{#pm}} with UE left side range of trigger particles",
-       nptbins,ptmin,ptmax,140,-2.,5.);
-      fhDeltaPhiUeLeftCharged->SetYTitle("#Delta #phi");
+      ("hDeltaPhiUeLeftChargedPt","#phi_{trigger} - #phi_{#Ueh^{#pm}} vs p_{T Ueh^{#pm}} with UE left side range of trigger particles",
+       nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+      fhDeltaPhiUeLeftCharged->SetYTitle("#Delta #phi (rad)");
       fhDeltaPhiUeLeftCharged->SetXTitle("p_{T h^{#pm}} (GeV/c)");
       outputContainer->Add(fhDeltaPhiUeLeftCharged) ;
       
       fhDeltaPhiUeRightCharged  = new TH2F
-      ("DeltaPhiUeRightChargedPt","#phi_{trigger} - #phi_{#Ueh^{#pm}} vs p_{T Ueh^{#pm}} with UE right side range of trigger particles",
-       nptbins,ptmin,ptmax,140,-2.,5.);
-      fhDeltaPhiUeRightCharged->SetYTitle("#Delta #phi");
+      ("hDeltaPhiUeRightChargedPt","#phi_{trigger} - #phi_{#Ueh^{#pm}} vs p_{T Ueh^{#pm}} with UE right side range of trigger particles",
+       nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+      fhDeltaPhiUeRightCharged->SetYTitle("#Delta #phi (rad)");
       fhDeltaPhiUeRightCharged->SetXTitle("p_{T h^{#pm}} (GeV/c)");
       outputContainer->Add(fhDeltaPhiUeRightCharged) ;
       
-      fhPtImbalanceUeLeftCharged  = 
-      new TH2F("CorrelationUeChargedLeft","z_{trigger h^{#pm}} = p_{T Ueh^{#pm}} / p_{T trigger} with UE left side of trigger",
+      fhDeltaPhiUeLeftUpCharged  = new TH2F
+      ("hDeltaPhiUeLeftUpChargedPt","#phi_{trigger} - #phi_{#Ueh^{#pm}} vs p_{T Ueh^{#pm}} with UE left Up side range of trigger particles",
+       nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+      fhDeltaPhiUeLeftUpCharged->SetYTitle("#Delta #phi (rad)");
+      fhDeltaPhiUeLeftUpCharged->SetXTitle("p_{T h^{#pm}} (GeV/c)");
+      outputContainer->Add(fhDeltaPhiUeLeftUpCharged) ;
+      
+      fhDeltaPhiUeRightUpCharged  = new TH2F
+      ("hDeltaPhiUeRightUpChargedPt","#phi_{trigger} - #phi_{#Ueh^{#pm}} vs p_{T Ueh^{#pm}} with UE right Up side range of trigger particles",
+       nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+      fhDeltaPhiUeRightUpCharged->SetYTitle("#Delta #phi (rad)");
+      fhDeltaPhiUeRightUpCharged->SetXTitle("p_{T h^{#pm}} (GeV/c)");
+      outputContainer->Add(fhDeltaPhiUeRightUpCharged) ;
+      
+      fhDeltaPhiUeLeftDownCharged  = new TH2F
+      ("hDeltaPhiUeLeftDownChargedPt","#phi_{trigger} - #phi_{#Ueh^{#pm}} vs p_{T Ueh^{#pm}} with UE left Down side range of trigger particles",
+       nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+      fhDeltaPhiUeLeftDownCharged->SetYTitle("#Delta #phi (rad)");
+      fhDeltaPhiUeLeftDownCharged->SetXTitle("p_{T h^{#pm}} (GeV/c)");
+      outputContainer->Add(fhDeltaPhiUeLeftDownCharged) ;
+      
+      fhDeltaPhiUeRightDownCharged  = new TH2F
+      ("hDeltaPhiUeRightDownChargedPt","#phi_{trigger} - #phi_{#Ueh^{#pm}} vs p_{T Ueh^{#pm}} with UE right Down side range of trigger particles",
+       nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);
+      fhDeltaPhiUeRightDownCharged->SetYTitle("#Delta #phi (rad)");
+      fhDeltaPhiUeRightDownCharged->SetXTitle("p_{T h^{#pm}} (GeV/c)");
+      outputContainer->Add(fhDeltaPhiUeRightDownCharged) ;
+      
+      fhXEUeLeftCharged  = 
+      new TH2F("hXEUeChargedLeft","x_{E} with UE left side of trigger",
+               nptbins,ptmin,ptmax,200,0.,2.); 
+      fhXEUeLeftCharged->SetYTitle("x_{E Ueh^{#pm}}");
+      fhXEUeLeftCharged->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhXEUeLeftCharged) ;
+      
+      fhXEUeRightCharged  = 
+      new TH2F("hXEUeChargedRight","x_{E h^{#pm}} with UE right side of trigger",
                nptbins,ptmin,ptmax,200,0.,2.); 
-      fhPtImbalanceUeLeftCharged->SetYTitle("z_{trigger Ueh^{#pm}}");
-      fhPtImbalanceUeLeftCharged->SetXTitle("p_{T trigger}");
-      outputContainer->Add(fhPtImbalanceUeLeftCharged) ;
+      fhXEUeRightCharged->SetYTitle("z_{trigger Ueh^{#pm}}");
+      fhXEUeRightCharged->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhXEUeRightCharged) ;
       
-      fhPtImbalanceUeRightCharged  = 
-      new TH2F("CorrelationUeChargedRight","z_{trigger h^{#pm}} = p_{T Ueh^{#pm}} / p_{T trigger} with UE right side of trigger",
+      fhXEUeLeftUpCharged  = 
+      new TH2F("hXEUeChargedLeftUp","x_{E} with UE left Up side of trigger",
                nptbins,ptmin,ptmax,200,0.,2.); 
-      fhPtImbalanceUeRightCharged->SetYTitle("z_{trigger Ueh^{#pm}}");
-      fhPtImbalanceUeRightCharged->SetXTitle("p_{T trigger}");
-      outputContainer->Add(fhPtImbalanceUeRightCharged) ;
+      fhXEUeLeftUpCharged->SetYTitle("x_{E Ueh^{#pm}}");
+      fhXEUeLeftUpCharged->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhXEUeLeftUpCharged) ;
       
-      fhPtHbpUeLeftCharged  = 
-      new TH2F("HbpUeChargedLeft","#xi = ln(1/x_{E}) with charged UE left side of trigger",
+      fhXEUeRightUpCharged  = 
+      new TH2F("hXEUeChargedRightUp","x_{E h^{#pm}} with UE right Up side of trigger",
+               nptbins,ptmin,ptmax,200,0.,2.); 
+      fhXEUeRightUpCharged->SetYTitle("z_{trigger Ueh^{#pm}}");
+      fhXEUeRightUpCharged->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhXEUeRightUpCharged) ;
+      
+      fhXEUeLeftDownCharged  = 
+      new TH2F("hXEUeChargedLeftDown","x_{E} with UE left Down side of trigger",
+               nptbins,ptmin,ptmax,200,0.,2.); 
+      fhXEUeLeftDownCharged->SetYTitle("x_{E Ueh^{#pm}}");
+      fhXEUeLeftDownCharged->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhXEUeLeftDownCharged) ;
+      
+      fhXEUeRightDownCharged  = 
+      new TH2F("hXEUeChargedRightDown","x_{E h^{#pm}} with UE right Down side of trigger",
+               nptbins,ptmin,ptmax,200,0.,2.); 
+      fhXEUeRightDownCharged->SetYTitle("z_{trigger Ueh^{#pm}}");
+      fhXEUeRightDownCharged->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhXEUeRightDownCharged) ;
+      
+      fhPtHbpXEUeLeftCharged  = 
+      new TH2F("hHbpXEUeChargedLeft","#xi = ln(1/x_{E}) with charged UE left side of trigger",
                nptbins,ptmin,ptmax,200,0.,10.); 
-      fhPtHbpUeLeftCharged->SetYTitle("ln(1/x_{E})");
-      fhPtHbpUeLeftCharged->SetXTitle("p_{T trigger}");
-      outputContainer->Add(fhPtHbpUeLeftCharged) ;
+      fhPtHbpXEUeLeftCharged->SetYTitle("ln(1/x_{E})");
+      fhPtHbpXEUeLeftCharged->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhPtHbpXEUeLeftCharged) ;
       
-      fhPtHbpUeRightCharged  = 
-      new TH2F("HbpUeChargedRight","#xi = ln(1/x_{E}) with charged UE right side of trigger",
+      fhPtHbpXEUeRightCharged  = 
+      new TH2F("hHbpXEUeChargedRight","#xi = ln(1/x_{E}) with charged UE right side of trigger",
                nptbins,ptmin,ptmax,200,0.,10.); 
-      fhPtHbpUeRightCharged->SetYTitle("ln(1/x_{E})");
-      fhPtHbpUeRightCharged->SetXTitle("p_{T trigger}");
-      outputContainer->Add(fhPtHbpUeRightCharged) ;
+      fhPtHbpXEUeRightCharged->SetYTitle("ln(1/x_{E})");
+      fhPtHbpXEUeRightCharged->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhPtHbpXEUeRightCharged) ;
       
-    }  
+      fhZTUeLeftCharged  = 
+      new TH2F("hZTUeChargedLeft","z_{trigger h^{#pm}} = p_{T Ueh^{#pm}} / p_{T trigger} with UE left side of trigger",
+               nptbins,ptmin,ptmax,200,0.,2.); 
+      fhZTUeLeftCharged->SetYTitle("z_{trigger Ueh^{#pm}}");
+      fhZTUeLeftCharged->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhZTUeLeftCharged) ;
+      
+      fhZTUeRightCharged  = 
+      new TH2F("hZTUeChargedRight","z_{trigger h^{#pm}} = p_{T Ueh^{#pm}} / p_{T trigger} with UE right side of trigger",
+               nptbins,ptmin,ptmax,200,0.,2.); 
+      fhZTUeRightCharged->SetYTitle("z_{trigger Ueh^{#pm}}");
+      fhZTUeRightCharged->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhZTUeRightCharged) ;      
+      
+      fhPtHbpZTUeLeftCharged  = 
+      new TH2F("hHbpZTUeChargedLeft","#xi = ln(1/z_{T}) with charged UE left side of trigger",
+               nptbins,ptmin,ptmax,200,0.,10.); 
+      fhPtHbpZTUeLeftCharged->SetYTitle("ln(1/z_{T})");
+      fhPtHbpZTUeLeftCharged->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhPtHbpZTUeLeftCharged) ;
+      
+      fhPtHbpZTUeRightCharged  = 
+      new TH2F("hHbpZTUeChargedRight","#xi = ln(1/z_{T}) with charged UE right side of trigger",
+               nptbins,ptmin,ptmax,200,0.,10.); 
+      fhPtHbpZTUeRightCharged->SetYTitle("ln(1/z_{T})");
+      fhPtHbpZTUeRightCharged->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhPtHbpZTUeRightCharged) ;
+      
+    } 
   }  //Correlation with charged hadrons
-  
+
   //Correlation with neutral hadrons
   if(fNeutralCorr)
   {
     fhDeltaPhiDeltaEtaNeutral  = new TH2F
-    ("DeltaPhiDeltaEtaNeutral","#phi_{trigger} - #phi_{h^{0}} vs #eta_{trigger} - #eta_{h^{0}}",
-     140,-2.,5.,200,-2,2); 
-    fhDeltaPhiDeltaEtaNeutral->SetXTitle("#Delta #phi");
+    ("hDeltaPhiDeltaEtaNeutral","#phi_{trigger} - #phi_{h^{0}} vs #eta_{trigger} - #eta_{h^{0}}",
+     ndeltaphibins ,deltaphimin,deltaphimax, ndeltaetabins ,deltaetamin,deltaetamax); 
+    fhDeltaPhiDeltaEtaNeutral->SetXTitle("#Delta #phi (rad)");
     fhDeltaPhiDeltaEtaNeutral->SetYTitle("#Delta #eta");   
          
     fhPhiNeutral  = new TH2F
-    ("PhiNeutral","#phi_{#pi^{0}}  vs p_{T #pi^{0}}",
+    ("hPhiNeutral","#phi_{#pi^{0}}  vs p_{T #pi^{0}}",
      nptbins,ptmin,ptmax,nphibins,phimin,phimax); 
     fhPhiNeutral->SetYTitle("#phi_{#pi^{0}} (rad)");
     fhPhiNeutral->SetXTitle("p_{T #pi^{0}} (GeV/c)");
     
     fhEtaNeutral  = new TH2F
-    ("EtaNeutral","#eta_{#pi^{0}}  vs p_{T #pi^{0}}",
+    ("hEtaNeutral","#eta_{#pi^{0}}  vs p_{T #pi^{0}}",
      nptbins,ptmin,ptmax,netabins,etamin,etamax); 
     fhEtaNeutral->SetYTitle("#eta_{#pi^{0}} (rad)");
     fhEtaNeutral->SetXTitle("p_{T #pi^{0}} (GeV/c)");
     
     fhDeltaPhiNeutral  = new TH2F
-    ("DeltaPhiNeutral","#phi_{trigger} - #phi_{#pi^{0}} vs p_{T trigger}",
+    ("hDeltaPhiNeutral","#phi_{trigger} - #phi_{#pi^{0}} vs p_{T trigger}",
      nptbins,ptmin,ptmax,nphibins,phimin,phimax); 
-    fhDeltaPhiNeutral->SetYTitle("#Delta #phi");
+    fhDeltaPhiNeutral->SetYTitle("#Delta #phi (rad)");
     fhDeltaPhiNeutral->SetXTitle("p_{T trigger} (GeV/c)");
     
     fhDeltaPhiNeutralPt  = new TH2F
-    ("DeltaPhiNeutralPt","#phi_{trigger} - #phi_{#pi^{0}} vs p_{T #pi^{0}}}",
-     nptbins,ptmin,ptmax,140,-2.,5.); 
-    fhDeltaPhiNeutralPt->SetYTitle("#Delta #phi");
+    ("hDeltaPhiNeutralPt","#phi_{trigger} - #phi_{#pi^{0}} vs p_{T #pi^{0}}}",
+     nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax); 
+    fhDeltaPhiNeutralPt->SetYTitle("#Delta #phi (rad)");
     fhDeltaPhiNeutralPt->SetXTitle("p_{T h^{0}} (GeV/c)");
     
     fhDeltaPhiUeNeutralPt  = new TH2F
-    ("DeltaPhiUeNeutralPt","#phi_{trigger} - #phi_{#pi^{0}} vs p_{T #pi^{0}}}",
-     nptbins,ptmin,ptmax,140,-2.,5.); 
-    fhDeltaPhiUeNeutralPt->SetYTitle("#Delta #phi");
+    ("hDeltaPhiUeNeutralPt","#phi_{trigger} - #phi_{#pi^{0}} vs p_{T #pi^{0}}}",
+     nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax); 
+    fhDeltaPhiUeNeutralPt->SetYTitle("#Delta #phi (rad)");
     fhDeltaPhiUeNeutralPt->SetXTitle("p_{T h^{0}} (GeV/c)");
     
     fhDeltaEtaNeutral  = new TH2F
-    ("DeltaEtaNeutral","#eta_{trigger} - #eta_{#pi^{0}} vs p_{T trigger}",
-     nptbins,ptmin,ptmax,200,-2,2); 
+    ("hDeltaEtaNeutral","#eta_{trigger} - #eta_{#pi^{0}} vs p_{T trigger}",
+     nptbins,ptmin,ptmax, ndeltaetabins ,deltaetamin,deltaetamax);  
     fhDeltaEtaNeutral->SetYTitle("#Delta #eta");
     fhDeltaEtaNeutral->SetXTitle("p_{T trigger} (GeV/c)");
     
-    fhPtImbalanceNeutral  = 
-    new TH2F("CorrelationNeutral","z_{trigger #pi} = p_{T #pi^{0}} / p_{T trigger}",
+    fhXENeutral  = 
+    new TH2F("hXENeutral","x_{E} for #pi^{0} associated",
              nptbins,ptmin,ptmax,200,0.,2.); 
-    fhPtImbalanceNeutral->SetYTitle("z_{trigger #pi^{0}}");
-    fhPtImbalanceNeutral->SetXTitle("p_{T trigger}");
+    fhXENeutral->SetYTitle("x_{E}");
+    fhXENeutral->SetXTitle("p_{T trigger} (GeV/c)");
     
-    fhPtImbalanceUeNeutral  = 
-    new TH2F("CorrelationUeNeutral","z_{trigger #pi} = p_{T #pi^{0}} / p_{T trigger}",
+    fhXEUeNeutral  = 
+    new TH2F("hXEUeNeutral","x_{E} for #pi^{0} associated",
              nptbins,ptmin,ptmax,200,0.,2.); 
-    fhPtImbalanceUeNeutral->SetYTitle("z_{trigger #pi^{0}}");
-    fhPtImbalanceUeNeutral->SetXTitle("p_{T trigger}");
+    fhXEUeNeutral->SetYTitle("x_{E}");
+    fhXEUeNeutral->SetXTitle("p_{T trigger} (GeV/c)");
+    
+    fhPtHbpXENeutral  = 
+    new TH2F("hHbpXENeutral","#xi = ln(1/x_{E})for #pi^{0} associated",
+             nptbins,ptmin,ptmax,200,0.,10.); 
+    fhPtHbpXENeutral->SetYTitle("ln(1/x_{E})");
+    fhPtHbpXENeutral->SetXTitle("p_{T trigger} (GeV/c)");
     
-    fhPtHbpNeutral  = 
-    new TH2F("HbpNeutral","#xi = ln(1/x_{E}) with neutral particles",
+    fhPtHbpXEUeNeutral  = 
+    new TH2F("hHbpXEUeNeutral","#xi = ln(1/x_{E}) for #pi^{0} associated",
              nptbins,ptmin,ptmax,200,0.,10.); 
-    fhPtHbpNeutral->SetYTitle("ln(1/x_{E})");
-    fhPtHbpNeutral->SetXTitle("p_{T trigger}");
+    fhPtHbpXEUeNeutral->SetYTitle("ln(1/x_{E})");
+    fhPtHbpXEUeNeutral->SetXTitle("p_{T trigger} (GeV/c)");
+    
+    fhZTNeutral  = 
+    new TH2F("hZTNeutral","z_{trigger #pi} = p_{T #pi^{0}} / p_{T trigger} for #pi^{0} associated",
+             nptbins,ptmin,ptmax,200,0.,2.); 
+    fhZTNeutral->SetYTitle("z_{trigger #pi^{0}}");
+    fhZTNeutral->SetXTitle("p_{T trigger} (GeV/c)");
+    
+    fhZTUeNeutral  = 
+    new TH2F("hZTUeNeutral","z_{trigger #pi} = p_{T #pi^{0}} / p_{T trigger} for #pi^{0} associated",
+             nptbins,ptmin,ptmax,200,0.,2.); 
+    fhZTUeNeutral->SetYTitle("z_{trigger #pi^{0}}");
+    fhZTUeNeutral->SetXTitle("p_{T trigger} (GeV/c)");
     
-    fhPtHbpUeNeutral  = 
-    new TH2F("HbpUeNeutral","#xi = ln(1/x_{E}) with neutral particles",
+    fhPtHbpZTNeutral  = 
+    new TH2F("hHbpZTNeutral","#xi = ln(1/x_{E}) for #pi^{0} associated",
              nptbins,ptmin,ptmax,200,0.,10.); 
-    fhPtHbpUeNeutral->SetYTitle("ln(1/x_{E})");
-    fhPtHbpUeNeutral->SetXTitle("p_{T trigger}");
+    fhPtHbpZTNeutral->SetYTitle("ln(1/z_{T})");
+    fhPtHbpZTNeutral->SetXTitle("p_{T trigger}");
     
+    fhPtHbpZTUeNeutral  = 
+    new TH2F("hHbpZTUeNeutral","#xi = ln(1/x_{E}) for #pi^{0} associated",
+             nptbins,ptmin,ptmax,200,0.,10.); 
+    fhPtHbpXEUeNeutral->SetYTitle("ln(1/z_{T})");
+    fhPtHbpXEUeNeutral->SetXTitle("p_{T trigger} (GeV/c)");    
     
     outputContainer->Add(fhDeltaPhiDeltaEtaNeutral); 
     outputContainer->Add(fhPhiNeutral) ;  
@@ -551,149 +2052,228 @@ TList *  AliAnaParticleHadronCorrelation::GetCreateOutputObjects()
     outputContainer->Add(fhDeltaPhiNeutralPt) ; 
     outputContainer->Add(fhDeltaPhiUeNeutralPt) ; 
     outputContainer->Add(fhDeltaEtaNeutral) ; 
-    outputContainer->Add(fhPtImbalanceNeutral) ;
-    outputContainer->Add(fhPtImbalanceUeNeutral) ;  
-    outputContainer->Add(fhPtHbpNeutral) ;
-    outputContainer->Add(fhPtHbpUeNeutral) ;    
-    
-    if(fPi0Trigger){
+    outputContainer->Add(fhXENeutral) ;
+    outputContainer->Add(fhXEUeNeutral) ;  
+    outputContainer->Add(fhPtHbpXENeutral) ;
+    outputContainer->Add(fhPtHbpXEUeNeutral) ;    
+    outputContainer->Add(fhZTNeutral) ;
+    outputContainer->Add(fhZTUeNeutral) ;  
+    outputContainer->Add(fhPtHbpZTNeutral) ;
+    outputContainer->Add(fhPtHbpZTUeNeutral) ;    
+    
+    if(fPi0Trigger || fDecayTrigger)
+    {
       fhDeltaPhiDecayNeutral  = new TH2F
-      ("DeltaPhiDecayNeutral","#phi_{Decay} - #phi_{h^{0}} vs p_{T Decay}",
-       nptbins,ptmin,ptmax,140,-2.,5.); 
-      fhDeltaPhiDecayNeutral->SetYTitle("#Delta #phi");
+      ("hDeltaPhiDecayNeutral","#phi_{Decay} - #phi_{h^{0}} vs p_{T Decay}",
+       nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax);  
+      fhDeltaPhiDecayNeutral->SetYTitle("#Delta #phi (rad)");
       fhDeltaPhiDecayNeutral->SetXTitle("p_{T Decay} (GeV/c)");
       
-      fhPtImbalanceDecayNeutral  = 
-      new TH2F("CorrelationDecayNeutral","z_{trigger h^{0}} = p_{T h^{0}} / p_{T Decay}",
+      fhXEDecayNeutral  = 
+      new TH2F("hXEDecayNeutral","x_{E} for decay trigger",
                nptbins,ptmin,ptmax,200,0.,2.); 
-      fhPtImbalanceDecayNeutral->SetYTitle("z_{decay h^{0}}");
-      fhPtImbalanceDecayNeutral->SetXTitle("p_{T decay}");
+      fhXEDecayNeutral->SetYTitle("x_{E}");
+      fhXEDecayNeutral->SetXTitle("p_{T decay}");
+      
+      fhZTDecayNeutral  = 
+      new TH2F("hZTDecayNeutral","z_{trigger h^{0}} = p_{T h^{0}} / p_{T Decay}",
+               nptbins,ptmin,ptmax,200,0.,2.); 
+      fhZTDecayNeutral->SetYTitle("z_{h^{0}}");
+      fhZTDecayNeutral->SetXTitle("p_{T decay}");      
       
       outputContainer->Add(fhDeltaPhiDecayNeutral) ; 
-      outputContainer->Add(fhPtImbalanceDecayNeutral) ;
+      outputContainer->Add(fhXEDecayNeutral) ;      
+      outputContainer->Add(fhZTDecayNeutral) ;
+
     }
     
-    
     if(fMakeSeveralUE)
     { 
       fhDeltaPhiUeLeftNeutral  = new TH2F
-      ("DeltaPhiUeLeftNeutralPt","#phi_{trigger} - #phi_{#Ueh^{0}} vs p_{T h^{0}} with neutral UE left side range of trigger particles",
-       nptbins,ptmin,ptmax,140,-2.,5.);
-      fhDeltaPhiUeLeftNeutral->SetYTitle("#Delta #phi");
+      ("hDeltaPhiUeLeftNeutralPt","#phi_{trigger} - #phi_{#Ueh^{0}} vs p_{T h^{0}} with neutral UE left side range of trigger particles",
+       nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax); 
+      fhDeltaPhiUeLeftNeutral->SetYTitle("#Delta #phi (rad)");
       fhDeltaPhiUeLeftNeutral->SetXTitle("p_{T h^{0}} (GeV/c)");
       outputContainer->Add(fhDeltaPhiUeLeftNeutral) ;
       
       fhDeltaPhiUeRightNeutral  = new TH2F
-      ("DeltaPhiUeRightNeutralPt","#phi_{trigger} - #phi_{#Ueh^{0}} vs p_{T Ueh^{0}} with neutral UE right side range of trigger particles",
-       nptbins,ptmin,ptmax,140,-2.,5.);
-      fhDeltaPhiUeRightNeutral->SetYTitle("#Delta #phi");
+      ("hDeltaPhiUeRightNeutralPt","#phi_{trigger} - #phi_{#Ueh^{0}} vs p_{T Ueh^{0}} with neutral UE right side range of trigger particles",
+       nptbins,ptmin,ptmax, ndeltaphibins ,deltaphimin,deltaphimax); 
+      fhDeltaPhiUeRightNeutral->SetYTitle("#Delta #phi (rad)");
       fhDeltaPhiUeRightNeutral->SetXTitle("p_{T h^{0}} (GeV/c)");
       outputContainer->Add(fhDeltaPhiUeRightNeutral) ;
       
-      fhPtImbalanceUeLeftNeutral  = 
-      new TH2F("CorrelationUeNeutralLeft","z_{trigger h^{0}} = p_{T Ueh^{0}} / p_{T trigger} with neutral UE left side of trigger",
+      fhXEUeLeftNeutral  = 
+      new TH2F("hXEUeNeutralLeft","x_{E} = p_{T Ueh^{0}} / p_{T trigger} with neutral UE left side of trigger",
                nptbins,ptmin,ptmax,140,0.,2.); 
-      fhPtImbalanceUeLeftNeutral->SetYTitle("z_{trigger Ueh^{0}}");
-      fhPtImbalanceUeLeftNeutral->SetXTitle("p_{T trigger}");
-      outputContainer->Add(fhPtImbalanceUeLeftNeutral) ;
+      fhXEUeLeftNeutral->SetYTitle("z_{trigger Ueh^{0}}");
+      fhXEUeLeftNeutral->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhXEUeLeftNeutral) ;
       
-      fhPtImbalanceUeRightNeutral  = 
-      new TH2F("CorrelationUeNeutralRight","z_{trigger h^{0}} = p_{T Ueh^{0}} / p_{T trigger} with neutral UE right side of trigger",
+      fhXEUeRightNeutral  = 
+      new TH2F("hXEUeNeutralRight","x_{E} = p_{T Ueh^{0}} / p_{T trigger} with neutral UE right side of trigger",
                nptbins,ptmin,ptmax,200,0.,2.); 
-      fhPtImbalanceUeRightNeutral->SetYTitle("z_{trigger Ueh^{0}}");
-      fhPtImbalanceUeRightNeutral->SetXTitle("p_{T trigger}");
-      outputContainer->Add(fhPtImbalanceUeRightNeutral) ;
+      fhXEUeRightNeutral->SetYTitle("z_{trigger Ueh^{0}}");
+      fhXEUeRightNeutral->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhXEUeRightNeutral) ;
       
-      fhPtHbpUeLeftNeutral  = 
-      new TH2F("HbpUeNeutralLeft","#xi = ln(1/x_{E}) with neutral UE left side of trigger",
+      fhPtHbpXEUeLeftNeutral  = 
+      new TH2F("hHbpXEUeNeutralLeft","#xi = ln(1/x_{E}) with neutral UE left side of trigger",
                nptbins,ptmin,ptmax,200,0.,10.); 
-      fhPtHbpUeLeftNeutral->SetYTitle("ln(1/x_{E})");
-      fhPtHbpUeLeftNeutral->SetXTitle("p_{T trigger}");
-      outputContainer->Add(fhPtHbpUeLeftNeutral) ;
+      fhPtHbpXEUeLeftNeutral->SetYTitle("ln(1/x_{E})");
+      fhPtHbpXEUeLeftNeutral->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhPtHbpXEUeLeftNeutral) ;
       
-      fhPtHbpUeRightNeutral  = 
-      new TH2F("HbpUeNeutralRight","#xi = ln(1/x_{E}) with neutral UE right side of trigger",
+      fhPtHbpXEUeRightNeutral  = 
+      new TH2F("hHbpXEUeNeutralRight","#xi = ln(1/x_{E}) with neutral UE right side of trigger",
                nptbins,ptmin,ptmax,200,0.,10.); 
-      fhPtHbpUeRightNeutral->SetYTitle("ln(1/x_{E})");
-      fhPtHbpUeRightNeutral->SetXTitle("p_{T trigger}");
-      outputContainer->Add(fhPtHbpUeRightNeutral) ;
+      fhPtHbpXEUeRightNeutral->SetYTitle("ln(1/x_{E})");
+      fhPtHbpXEUeRightNeutral->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhPtHbpXEUeRightNeutral) ;
+      
+      fhZTUeLeftNeutral  = 
+      new TH2F("hZTUeNeutralLeft","z_{trigger h^{0}} = p_{T Ueh^{0}} / p_{T trigger} with neutral UE left side of trigger",
+               nptbins,ptmin,ptmax,140,0.,2.); 
+      fhZTUeLeftNeutral->SetYTitle("z_{trigger Ueh^{0}}");
+      fhZTUeLeftNeutral->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhZTUeLeftNeutral) ;
+      
+      fhZTUeRightNeutral  = 
+      new TH2F("hZTUeNeutralRight","z_{trigger h^{0}} = p_{T Ueh^{0}} / p_{T trigger} with neutral UE right side of trigger",
+               nptbins,ptmin,ptmax,200,0.,2.); 
+      fhZTUeRightNeutral->SetYTitle("z_{trigger Ueh^{0}}");
+      fhZTUeRightNeutral->SetXTitle("p_{T trigger} (GeV/c)");
+      outputContainer->Add(fhZTUeRightNeutral) ;
+      
+      fhPtHbpZTUeLeftNeutral  = 
+      new TH2F("hHbpZTUeNeutralLeft","#xi = ln(1/z_{T}) with neutral UE left side of trigger",
+               nptbins,ptmin,ptmax,200,0.,10.); 
+      fhPtHbpZTUeLeftNeutral->SetYTitle("ln(1/z_{T})");
+      fhPtHbpZTUeLeftNeutral->SetXTitle("p_{T trigger}");
+      outputContainer->Add(fhPtHbpZTUeLeftNeutral) ;
+      
+      fhPtHbpZTUeRightNeutral  = 
+      new TH2F("hHbpZTUeNeutralRight","#xi = ln(1/z_{T}) with neutral UE right side of trigger",
+               nptbins,ptmin,ptmax,200,0.,10.); 
+      fhPtHbpZTUeRightNeutral->SetYTitle("ln(1/z_{T})");
+      fhPtHbpZTUeRightNeutral->SetXTitle("p_{T trigger}");
+      outputContainer->Add(fhPtHbpZTUeRightNeutral) ;
       
     }  
         
   }//Correlation with neutral hadrons
   
   //if data is MC, fill more histograms
-  if(IsDataMC()){
-    
-    fh2phiLeadingParticle=new TH2F("fh2phiLeadingParticle","#phi resolustion for trigger particles",nptbins,ptmin,ptmax,100,-1,1);
+  if(IsDataMC())
+  {
+    fh2phiLeadingParticle=new TH2F("h2phiLeadingParticle","#phi resolustion for trigger particles",nptbins,ptmin,ptmax,100,-1,1);
     fh2phiLeadingParticle->GetXaxis()->SetTitle("p_{T gen Leading} (GeV/c)");
     fh2phiLeadingParticle->GetYaxis()->SetTitle("(#phi_{rec}-#phi_{gen})/#phi_{gen}");
+
+    fhMCPtLeading  = new TH1F ("hMCPtLeading","MC : p_{T} distribution of leading particles", nptbins,ptmin,ptmax); 
+    fhMCPtLeading->SetXTitle("p_{T}^{trig} (GeV/c)");
+
+    fhMCPhiLeading  = new TH2F ("hMCPhiLeading","MC : #phi distribution of leading Particles",nptbins,ptmin,ptmax, nphibins,phimin,phimax); 
+    fhMCPhiLeading->SetYTitle("#phi (rad)");
+  
+    fhMCEtaLeading  = new TH2F ("hMCEtaLeading","MC : #eta distribution of leading",nptbins,ptmin,ptmax, netabins,etamin,etamax); 
+    fhMCEtaLeading->SetYTitle("#eta "); 
     
-    fhMCLeadingCount=new TH1F("MCLeadingTriggerCount","MCLeadingTriggerCount",nptbins,ptmin,ptmax);
-    fhMCLeadingCount->SetXTitle("p_{T trig}");
     
     fhMCEtaCharged  = new TH2F
-    ("MCEtaCharged","MC #eta_{h^{#pm}}  vs p_{T #pm}",
+    ("hMCEtaCharged","MC #eta_{h^{#pm}}  vs p_{T #pm}",
      nptbins,ptmin,ptmax,netabins,etamin,etamax); 
     fhMCEtaCharged->SetYTitle("#eta_{h^{#pm}} (rad)");
     fhMCEtaCharged->SetXTitle("p_{T #pm} (GeV/c)");
     
     fhMCPhiCharged  = new TH2F
-    ("MCPhiCharged","#MC phi_{h^{#pm}}  vs p_{T #pm}",
+    ("hMCPhiCharged","#MC phi_{h^{#pm}}  vs p_{T #pm}",
      200,ptmin,ptmax,nphibins,phimin,phimax); 
     fhMCPhiCharged->SetYTitle("MC #phi_{h^{#pm}} (rad)");
     fhMCPhiCharged->SetXTitle("p_{T #pm} (GeV/c)");
     
     fhMCDeltaPhiDeltaEtaCharged  = new TH2F
-    ("MCDeltaPhiDeltaEtaCharged","#MC phi_{trigger} - #phi_{h^{#pm}} vs #eta_{trigger} - #eta_{h^{#pm}}",
+    ("hMCDeltaPhiDeltaEtaCharged","#MC phi_{trigger} - #phi_{h^{#pm}} vs #eta_{trigger} - #eta_{h^{#pm}}",
      140,-2.,5.,200,-2,2); 
-    fhMCDeltaPhiDeltaEtaCharged->SetXTitle("#Delta #phi");
+    fhMCDeltaPhiDeltaEtaCharged->SetXTitle("#Delta #phi (rad)");
     fhMCDeltaPhiDeltaEtaCharged->SetYTitle("#Delta #eta");    
     
     fhMCDeltaEtaCharged  = new TH2F
-    ("MCDeltaEtaCharged","MC #eta_{trigger} - #eta_{h^{#pm}} vs p_{T trigger} and p_{T assoc}",
+    ("hMCDeltaEtaCharged","MC #eta_{trigger} - #eta_{h^{#pm}} vs p_{T trigger} and p_{T assoc}",
      nptbins,ptmin,ptmax,200,-2,2); 
     fhMCDeltaEtaCharged->SetYTitle("#Delta #eta");
     fhMCDeltaEtaCharged->SetXTitle("p_{T trigger} (GeV/c)");
     
     fhMCDeltaPhiCharged  = new TH2F
-    ("MCDeltaPhiCharged","#phi_{trigger} - #phi_{h^{#pm}} vs p_{T trigger}",
-     nptbins,ptmin,ptmax,140,-2.,5.); 
-    fhMCDeltaPhiCharged->SetYTitle("#Delta #phi");
+    ("hMCDeltaPhiCharged","#phi_{trigger} - #phi_{h^{#pm}} vs p_{T trigger}",
+     nptbins,ptmin,ptmax,ndeltaphibins ,deltaphimin,deltaphimax); 
+    fhMCDeltaPhiCharged->SetYTitle("#Delta #phi (rad)");
     fhMCDeltaPhiCharged->SetXTitle("p_{T trigger} (GeV/c)");
     
     fhMCDeltaPhiChargedPt  = new TH2F
-    ("MCDeltaPhiChargedPt","MC #phi_{trigger} - #phi_{#h^{#pm}} vs p_{T h^{#pm}}",
-     nptbins,ptmin,ptmax,140,-2.,5.);
-    fhMCDeltaPhiChargedPt->SetYTitle("#Delta #phi");
+    ("hMCDeltaPhiChargedPt","MC #phi_{trigger} - #phi_{#h^{#pm}} vs p_{T h^{#pm}}",
+     nptbins,ptmin,ptmax,ndeltaphibins ,deltaphimin,deltaphimax); 
+    fhMCDeltaPhiChargedPt->SetYTitle("#Delta #phi (rad)");
     fhMCDeltaPhiChargedPt->SetXTitle("p_{T h^{#pm}} (GeV/c)");
     
-    fhMCPtImbalanceCharged  = 
-    new TH2F("MCCorrelationCharged","z_{trigger h^{#pm}} = p_{T h^{#pm}} / p_{T trigger}",
+    fhMCPtXECharged  = 
+    new TH2F("hMCPtXECharged","x_{E}",
+             nptbins,ptmin,ptmax,200,0.,2.); 
+    fhMCPtXECharged->SetYTitle("x_{E}");
+    fhMCPtXECharged->SetXTitle("p_{T trigger} (GeV/c)");
+
+    fhMCPtXEUeCharged  = 
+    new TH2F("hMCPtXEUeCharged","x_{E}",
+             nptbins,ptmin,ptmax,200,0.,2.); 
+    fhMCPtXEUeCharged->SetYTitle("x_{E}");
+    fhMCPtXEUeCharged->SetXTitle("p_{T trigger} (GeV/c)");
+    
+    fhMCPtHbpXECharged  = 
+    new TH2F("hMCHbpXECharged","MC #xi = ln(1/x_{E}) with charged hadrons",
+             nptbins,ptmin,ptmax,200,0.,10.); 
+    fhMCPtHbpXECharged->SetYTitle("ln(1/x_{E})");
+    fhMCPtHbpXECharged->SetXTitle("p_{T trigger}");
+
+    fhMCPtHbpXEUeCharged =
+    new TH2F("hMCPtHbpXEUeCharged","#xi = ln(1/x_{E}) with charged hadrons,Underlying Event",
+             nptbins,ptmin,ptmax,200,0.,10.); 
+    fhMCPtHbpXEUeCharged->SetYTitle("ln(1/x_{E})");
+    fhMCPtHbpXEUeCharged->SetXTitle("p_{T trigger} (GeV/c)");
+
+    fhMCUePart  = 
+    new TH1F("hMCUePart","MC UE particles distribution vs pt trig",
+             nptbins,ptmin,ptmax); 
+    fhMCUePart->SetYTitle("dNch");
+    fhMCUePart->SetXTitle("p_{T trigger} (GeV/c)");
+    
+    fhMCPtZTCharged  = 
+    new TH2F("hMCPtZTCharged","z_{T}",
              nptbins,ptmin,ptmax,200,0.,2.); 
-    fhMCPtImbalanceCharged->SetYTitle("z_{trigger h^{#pm}}");
-    fhMCPtImbalanceCharged->SetXTitle("p_{T trigger}");  
+    fhMCPtZTCharged->SetYTitle("z_{T}");
+    fhMCPtZTCharged->SetXTitle("p_{T trigger} (GeV/c)"); 
     
-    fhMCPtHbpCharged  = 
-    new TH2F("MCHbpCharged","MC #xi = ln(1/x_{E}) with charged hadrons",
+    fhMCPtHbpZTCharged  = 
+    new TH2F("hMCHbpZTCharged","MC #xi = ln(1/z_{T}) with charged hadrons",
              nptbins,ptmin,ptmax,200,0.,10.); 
-    fhMCPtHbpCharged->SetYTitle("ln(1/x_{E})");
-    fhMCPtHbpCharged->SetXTitle("p_{T trigger}");
+    fhMCPtHbpZTCharged->SetYTitle("ln(1/z_{T})");
+    fhMCPtHbpZTCharged->SetXTitle("p_{T trigger} (GeV/c)");
     
     fhMCPtTrigPout  = 
-    new TH2F("MCPtTrigPout","AOD MC Pout with triggers",
+    new TH2F("hMCPtTrigPout","AOD MC Pout with triggers",
              nptbins,ptmin,ptmax,2*nptbins,-ptmax,ptmax); 
     fhMCPtTrigPout->SetYTitle("p_{out} (GeV/c)");
     fhMCPtTrigPout->SetXTitle("p_{T trigger} (GeV/c)"); 
     
     fhMCPtAssocDeltaPhi  = 
-    new TH2F("fhMCPtAssocDeltaPhi","AOD MC delta phi with associated charged hadrons",
-             nptbins,ptmin,ptmax,140,-2.,5.); 
-    fhMCPtAssocDeltaPhi->SetYTitle("#Delta #phi");
+    new TH2F("hMCPtAssocDeltaPhi","AOD MC delta phi with associated charged hadrons",
+             nptbins,ptmin,ptmax,ndeltaphibins ,deltaphimin,deltaphimax); 
+    fhMCPtAssocDeltaPhi->SetYTitle("#Delta #phi (rad)");
     fhMCPtAssocDeltaPhi->SetXTitle("p_{T trigger} (GeV/c)"); 
         
     outputContainer->Add(fh2phiLeadingParticle);
-    outputContainer->Add(fhMCLeadingCount);
+    outputContainer->Add(fhMCPtLeading);
+    outputContainer->Add(fhMCPhiLeading);
+    outputContainer->Add(fhMCEtaLeading);
     outputContainer->Add(fhMCDeltaPhiDeltaEtaCharged);
     outputContainer->Add(fhMCPhiCharged) ;
     outputContainer->Add(fhMCEtaCharged) ;
@@ -701,23 +2281,288 @@ TList *  AliAnaParticleHadronCorrelation::GetCreateOutputObjects()
     outputContainer->Add(fhMCDeltaPhiCharged) ; 
     
     outputContainer->Add(fhMCDeltaPhiChargedPt) ;
-    outputContainer->Add(fhMCPtImbalanceCharged) ;
-    outputContainer->Add(fhMCPtHbpCharged) ;
+    outputContainer->Add(fhMCPtXECharged) ;
+    outputContainer->Add(fhMCPtXEUeCharged) ;
+    outputContainer->Add(fhMCPtZTCharged) ;
+    outputContainer->Add(fhMCPtHbpXECharged) ;
+    outputContainer->Add(fhMCPtHbpXEUeCharged);
+    outputContainer->Add(fhMCUePart);
+    outputContainer->Add(fhMCPtHbpZTCharged) ;
     outputContainer->Add(fhMCPtTrigPout) ;
     outputContainer->Add(fhMCPtAssocDeltaPhi) ;      
   } //for MC histogram
   
+  if(DoOwnMix())
+  {
+    //create event containers
+    
+    if(!fUseMixStoredInReader || (fUseMixStoredInReader && !GetReader()->ListWithMixedEventsForTracksExists())) 
+    {
+      Int_t nvz = GetNZvertBin();
+      Int_t nrp = GetNRPBin();
+      Int_t nce = GetNCentrBin();
+      
+      fListMixTrackEvents= new TList*[nvz*nrp*nce] ;
+      
+      for( Int_t ice = 0 ; ice < nce ; ice++ )
+      {
+        for( Int_t ivz = 0 ; ivz < nvz ; ivz++ )
+        {
+          for( Int_t irp = 0 ; irp < nrp ; irp++ )
+          {
+            Int_t bin = GetEventMixBin(ice,ivz,irp); //ic*nvz*nrp+iz*nrp+irp;
+            
+            //printf("GetCreateOutputObjects - Bins : cent %d, vz %d, RP %d, event %d/%d\n",
+            //       ic,iz, irp, bin);
+            
+            fListMixTrackEvents[bin] = new TList() ;
+            fListMixTrackEvents[bin]->SetOwner(kFALSE);
+          }
+        }
+      }    
+    }
+    
+    fhPtLeadingMixed  = new TH1F ("hPtLeadingMixed","p_{T} distribution of leading particles, used for mixing", nptbins,ptmin,ptmax); 
+    fhPtLeadingMixed->SetXTitle("p_{T}^{trig} (GeV/c)");
+
+    if(fCorrelVzBin)
+    {
+      fhPtLeadingMixedVzBin  = new TH2F ("hPtLeadingMixedVzBin","p_{T} distribution of leading particles, used for mixing", nptbins,ptmin,ptmax,GetNZvertBin(),0,GetNZvertBin()); 
+      fhPtLeadingMixedVzBin->SetXTitle("p_{T}^{trig} (GeV/c)");
+      fhPtLeadingMixedVzBin->SetYTitle("v_{z} bin");
+      outputContainer->Add(fhPtLeadingMixedVzBin);
+    }
+    
+    fhPtLeadingMixedBin  = new TH2F ("hPtLeadingMixedBin","p_{T} distribution of leading particles vs mixing bin", nptbins,ptmin,ptmax,nMixBins,0,nMixBins); 
+    fhPtLeadingMixedBin->SetXTitle("p_{T}^{trig} (GeV/c)");
+    fhPtLeadingMixedBin->SetYTitle("Bin");
+
+    fhPhiLeadingMixed  = new TH2F ("hPhiLeadingMixed","#phi distribution of leading Particles, used for mixing",nptbins,ptmin,ptmax, nphibins,phimin,phimax); 
+    fhPhiLeadingMixed->SetYTitle("#phi (rad)");
+    
+    fhEtaLeadingMixed  = new TH2F ("hEtaLeadingMixed","#eta distribution of leading, used for mixing",nptbins,ptmin,ptmax, netabins,etamin,etamax); 
+    fhEtaLeadingMixed->SetYTitle("#eta ");  
+    
+    outputContainer->Add(fhPtLeadingMixed);
+    outputContainer->Add(fhPtLeadingMixedBin);
+    outputContainer->Add(fhPhiLeadingMixed);
+    outputContainer->Add(fhEtaLeadingMixed);
+    
+    // Fill the cluster pool only in isolation analysis or if requested
+    if( ( OnlyIsolated()        ||  fFillNeutralEventMixPool) &&
+        (!fUseMixStoredInReader || (fUseMixStoredInReader && !GetReader()->ListWithMixedEventsForCaloExists())))
+    {
+      Int_t nvz = GetNZvertBin();
+      Int_t nrp = GetNRPBin();
+      Int_t nce = GetNCentrBin();
+      
+      fListMixCaloEvents= new TList*[nvz*nrp*nce] ;
+      
+      for( Int_t ice = 0 ; ice < nce ; ice++ )
+      {
+        for( Int_t ivz = 0 ; ivz < nvz ; ivz++ )
+        {
+          for( Int_t irp = 0 ; irp < nrp ; irp++ )
+          {
+            Int_t bin = GetEventMixBin(ice,ivz,irp); //ic*nvz*nrp+iz*nrp+irp;
+            
+            //printf("GetCreateOutputObjects - Bins : cent %d, vz %d, RP %d, event %d/%d\n",
+            //       ic,iz, irp, bin);
+            
+            fListMixCaloEvents[bin] = new TList() ;
+            fListMixCaloEvents[bin]->SetOwner(kFALSE);
+          }
+        }
+      }    
+    }
+    
+    //Init the list in the reader if not done previously
+    if(fUseMixStoredInReader)
+    {
+      if( !GetReader()->ListWithMixedEventsForTracksExists() ) 
+        GetReader()->SetListWithMixedEventsForTracks(fListMixTrackEvents);
+      
+      if( !GetReader()->ListWithMixedEventsForCaloExists()   ) 
+        GetReader()->SetListWithMixedEventsForCalo  (fListMixCaloEvents );
+    }
+    
+    fhEventBin=new TH1I("hEventBin","Number of real events per bin(cen,vz,rp)",
+                        GetNCentrBin()*GetNZvertBin()*GetNRPBin()+1,0, 
+                        GetNCentrBin()*GetNZvertBin()*GetNRPBin()+1) ;
+    fhEventBin->SetXTitle("bin");
+    outputContainer->Add(fhEventBin) ;
+    
+    fhEventMixBin=new TH1I("hEventMixBin","Number of events  per bin(cen,vz,rp)",
+                           GetNCentrBin()*GetNZvertBin()*GetNRPBin()+1,0,
+                           GetNCentrBin()*GetNZvertBin()*GetNRPBin()+1) ;
+    fhEventMixBin->SetXTitle("bin");
+    outputContainer->Add(fhEventMixBin) ;
+    
+    fhNtracksMB=new TH1F("hNtracksMBEvent","Number of tracks w/ event trigger kMB",2000,0,2000);
+    outputContainer->Add(fhNtracksMB);
+    
+    if(fFillNeutralEventMixPool || OnlyIsolated())
+    {
+      fhNclustersMB=new TH1F("hNclustersMBEvent","Number of clusters w/ event trigger kMB",2000,0,2000);
+      outputContainer->Add(fhNclustersMB);
+    }
+    
+    fhMixDeltaPhiCharged  = new TH2F
+    ("hMixDeltaPhiCharged","Mixed event : #phi_{trigger} - #phi_{h^{#pm}} vs p_{T trigger}",
+     nptbins,ptmin,ptmax,ndeltaphibins ,deltaphimin,deltaphimax); 
+    fhMixDeltaPhiCharged->SetYTitle("#Delta #phi (rad)");
+    fhMixDeltaPhiCharged->SetXTitle("p_{T trigger} (GeV/c)");
+    outputContainer->Add(fhMixDeltaPhiCharged);
+    
+    fhMixDeltaPhiDeltaEtaCharged  = new TH2F
+    ("hMixDeltaPhiDeltaEtaCharged","Mixed event : #phi_{trigger} - #phi_{h^{#pm}} vs #eta_{trigger} - #eta_{h^{#pm}}",
+     ndeltaphibins ,deltaphimin,deltaphimax,ndeltaetabins ,deltaetamin,deltaetamax); 
+    fhMixDeltaPhiDeltaEtaCharged->SetXTitle("#Delta #phi (rad)");
+    fhMixDeltaPhiDeltaEtaCharged->SetYTitle("#Delta #eta");
+    outputContainer->Add(fhMixDeltaPhiDeltaEtaCharged);
+    
+    fhMixXECharged  = 
+    new TH2F("hMixXECharged","Mixed event : x_{E} for charged tracks",
+             nptbins,ptmin,ptmax,200,0.,2.); 
+    fhMixXECharged->SetYTitle("x_{E}");
+    fhMixXECharged->SetXTitle("p_{T trigger} (GeV/c)");
+    outputContainer->Add(fhMixXECharged);
+    
+    fhMixXEUeCharged  =
+    new TH2F("hMixXEUeCharged","Mixed event : x_{E} for charged tracks in Ue region",
+             nptbins,ptmin,ptmax,200,0.,2.);
+    fhMixXEUeCharged->SetYTitle("x_{E}");
+    fhMixXEUeCharged->SetXTitle("p_{T trigger} (GeV/c)");
+    outputContainer->Add(fhMixXEUeCharged);
+
+    fhMixHbpXECharged  =
+    new TH2F("hMixHbpXECharged","mixed event : #xi = ln(1/x_{E}) with charged hadrons",
+             nptbins,ptmin,ptmax,200,0.,10.); 
+    fhMixHbpXECharged->SetYTitle("ln(1/x_{E})");
+    fhMixHbpXECharged->SetXTitle("p_{T trigger} (GeV/c)");
+    outputContainer->Add(fhMixHbpXECharged);
+
+    fhMixDeltaPhiChargedAssocPtBin         = new TH2F*[fNAssocPtBins*nz];
+    fhMixDeltaPhiChargedAssocPtBinDEta08   = new TH2F*[fNAssocPtBins*nz];
+    fhMixDeltaPhiChargedAssocPtBinDEta0    = new TH2F*[fNAssocPtBins*nz];
+    fhMixDeltaPhiDeltaEtaChargedAssocPtBin = new TH2F*[fNAssocPtBins*nz];
+    
+    for(Int_t i = 0 ; i < fNAssocPtBins ; i++)
+    {    
+      for(Int_t z = 0 ; z < nz ; z++)
+      {
+        Int_t bin = i*nz+z;
+        
+        if(fCorrelVzBin)
+        {
+          sz = "_vz%d"+z;
+          tz = ", v_{z} bin "+z;
+        }
+        
+        //printf("MIX : iAssoc %d, Vz %d, bin %d - sz %s, tz %s        \n",i,z,bin,sz.Data(),tz.Data());
+        
+        fhMixDeltaPhiChargedAssocPtBin[bin] = new TH2F(Form("hMixDeltaPhiChargedAssocPtBin%2.1f_%2.1f%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],sz.Data()), 
+                                                     Form("Mixed event #Delta #phi vs p_{T trigger} for associated p_{T} bin [%2.1f,%2.1f]%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],tz.Data()), 
+                                                     nptbins, ptmin, ptmax,  ndeltaphibins ,deltaphimin,deltaphimax);
+        fhMixDeltaPhiChargedAssocPtBin[bin]->SetXTitle("p_{T trigger} (GeV/c)");
+        fhMixDeltaPhiChargedAssocPtBin[bin]->SetYTitle("#Delta #phi (rad)");
+        
+        fhMixDeltaPhiChargedAssocPtBinDEta08[bin] = new TH2F(Form("hMixDeltaPhiDeltaEta0.8ChargedAssocPtBin%2.1f_%2.1f%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],sz.Data()), 
+                                                           Form("Mixed event #Delta #phi vs p_{T trigger} for associated p_{T} bin [%2.1f,%2.1f]%s, for #Delta #eta > 0.8", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],tz.Data()), 
+                                                           nptbins, ptmin, ptmax,  ndeltaphibins ,deltaphimin,deltaphimax);
+        fhMixDeltaPhiChargedAssocPtBinDEta08[bin]->SetXTitle("p_{T trigger} (GeV/c)");
+        fhMixDeltaPhiChargedAssocPtBinDEta08[bin]->SetYTitle("#Delta #phi (rad)");      
+        
+        fhMixDeltaPhiChargedAssocPtBinDEta0[bin] = new TH2F(Form("hMixDeltaPhiDeltaEta0ChargedAssocPtBin%2.1f_%2.1f%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],sz.Data()), 
+                                                             Form("Mixed event #Delta #phi vs p_{T trigger} for associated p_{T} bin [%2.1f,%2.1f]%s, for #Delta #eta = 0", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],tz.Data()), 
+                                                             nptbins, ptmin, ptmax,  ndeltaphibins ,deltaphimin,deltaphimax);
+        fhMixDeltaPhiChargedAssocPtBinDEta0[bin]->SetXTitle("p_{T trigger} (GeV/c)");
+        fhMixDeltaPhiChargedAssocPtBinDEta0[bin]->SetYTitle("#Delta #phi (rad)");
+        
+        fhMixDeltaPhiDeltaEtaChargedAssocPtBin[bin] = new TH2F(Form("hMixDeltaPhiDeltaEtaChargedAssocPtBin%2.1f_%2.1f%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],sz.Data()), 
+                                                             Form("Mixed event #Delta #phi vs p_{T trigger} for associated p_{T} bin [%2.1f,%2.1f]%s", fAssocPtBinLimit[i], fAssocPtBinLimit[i+1],tz.Data()), 
+                                                             ndeltaphibins ,deltaphimin,deltaphimax,ndeltaetabins ,deltaetamin,deltaetamax); 
+        fhMixDeltaPhiDeltaEtaChargedAssocPtBin[bin]->SetXTitle("#Delta #phi (rad)");
+        fhMixDeltaPhiDeltaEtaChargedAssocPtBin[bin]->SetYTitle("#Delta #eta");
+        
+        outputContainer->Add(fhMixDeltaPhiChargedAssocPtBin[bin]);
+        outputContainer->Add(fhMixDeltaPhiChargedAssocPtBinDEta08[bin]);
+        outputContainer->Add(fhMixDeltaPhiChargedAssocPtBinDEta0[bin]);
+        outputContainer->Add(fhMixDeltaPhiDeltaEtaChargedAssocPtBin[bin]);
+      }
+    }          
+  }
   
   return outputContainer;
   
 }
 
+//_________________________________________________________________________________________________
+Bool_t AliAnaParticleHadronCorrelation::GetDecayPhotonMomentum(const AliAODPWG4Particle* trigger, 
+                                                             TLorentzVector & mom1, 
+                                                             TLorentzVector & mom2)
+{
+  // Get the momentum of the pi0/eta assigned decay photons
+  // In case of pi0/eta trigger, we may want to check their decay correlation, 
+  // get their decay children
+  
+  Int_t indexPhoton1 = trigger->GetCaloLabel(0);
+  Int_t indexPhoton2 = trigger->GetCaloLabel(1);
+  Float_t ptTrig     = trigger->Pt();
+  
+  if(indexPhoton1!=-1 || indexPhoton2!=-1) return kFALSE;
+  
+  if(GetDebug() > 1) 
+    printf("AliAnaParticleHadronCorrelation::GetDecayPhotonMomentum() - indexPhoton1 = %d, indexPhoton2 = %d \n", indexPhoton1, indexPhoton2);
+  
+  TObjArray * clusters  = 0x0 ;  
+  if(trigger->GetDetector()=="EMCAL") clusters = GetEMCALClusters() ;
+  else                                clusters = GetPHOSClusters()  ;
+  
+  for(Int_t iclus = 0; iclus < clusters->GetEntriesFast(); iclus++)
+  {
+    AliVCluster * photon =  (AliVCluster*) (clusters->At(iclus));      
+    if(photon->GetID()==indexPhoton1) 
+    {
+      photon->GetMomentum(mom1,GetVertex(0)) ;
+      if(ptTrig) fhPtPi0DecayRatio->Fill(ptTrig, mom1.Pt()/ptTrig);
+    }
+    if(photon->GetID()==indexPhoton2) 
+    {
+      photon->GetMomentum(mom1,GetVertex(0)) ;
+      if(ptTrig > 0) fhPtPi0DecayRatio->Fill(ptTrig, mom2.Pt()/ptTrig);
+    } 
+    
+    if(GetDebug() > 1)printf("AliAnaParticleHadronCorrelation::GetDecayPhotonMomentum() - Photon1 = %f, Photon2 = %f \n", mom1.Pt(), mom2.Pt());
+    
+  } //cluster loop        
+  
+  return kTRUE;
+  
+} 
+
+//_____________________________________________________________
+Int_t AliAnaParticleHadronCorrelation::GetMCTagHistogramIndex(Int_t mcTag)
+{
+  // Index of MC histograms depending on MC origin
+  
+  if     ( GetMCAnalysisUtils()->CheckTagBit(mcTag,AliMCAnalysisUtils::kMCPrompt) ||        
+           GetMCAnalysisUtils()->CheckTagBit(mcTag,AliMCAnalysisUtils::kMCFragmentation)) return 0;
+  else if( GetMCAnalysisUtils()->CheckTagBit(mcTag,AliMCAnalysisUtils::kMCPi0))           return 1;    
+  else if( GetMCAnalysisUtils()->CheckTagBit(mcTag,AliMCAnalysisUtils::kMCPi0Decay))      return 2;
+  else if( GetMCAnalysisUtils()->CheckTagBit(mcTag,AliMCAnalysisUtils::kMCEtaDecay))      return 3;
+  else if( GetMCAnalysisUtils()->CheckTagBit(mcTag,AliMCAnalysisUtils::kMCOtherDecay))    return 4;
+  else if(!GetMCAnalysisUtils()->CheckTagBit(mcTag,AliMCAnalysisUtils::kMCElectron))      return 5;
+  else                                                                                    return 6;
+  
+}
+
 //____________________________________________________
 void AliAnaParticleHadronCorrelation::InitParameters()
 {
   
   //Initialize the parameters of the analysis.
-  SetInputAODName("PWG4Particle");
+  SetInputAODName("Particle");
   SetAODObjArrayName("Hadrons");  
   AddToHistogramsName("AnaHadronCorr_");
   
@@ -728,21 +2573,42 @@ void AliAnaParticleHadronCorrelation::InitParameters()
   fMakeSeveralUE        = kFALSE;
   fUeDeltaPhiMinCut     = 1. ;
   fUeDeltaPhiMaxCut     = 1.5 ;
+  
   fNeutralCorr          = kFALSE ;
   fPi0Trigger           = kFALSE ;
-  fMakeAbsoluteLeading  = kTRUE;
+  fDecayTrigger         = kFALSE ;
+  fHMPIDCorrelation     = kFALSE ;
   
-  fNAssocPtBins         = 7  ;
-  fAssocPtBinLimit[0]   = 1.5  ; 
-  fAssocPtBinLimit[1]   = 3.  ; 
-  fAssocPtBinLimit[2]   = 5.  ; 
-  fAssocPtBinLimit[3]   = 7.  ; 
-  fAssocPtBinLimit[4]   = 9. ; 
-  fAssocPtBinLimit[5]   = 12. ; 
-  fAssocPtBinLimit[6]   = 15. ;
-  fAssocPtBinLimit[7]   = 20. ;
-  fAssocPtBinLimit[8]   = 100.;
-  fAssocPtBinLimit[9]   = 200.;
+  fMakeAbsoluteLeading  = kTRUE;
+  fMakeNearSideLeading  = kFALSE;
+
+  fNAssocPtBins         = 9   ;
+  fAssocPtBinLimit[0]   = 0.2 ; 
+  fAssocPtBinLimit[1]   = 0.5 ; 
+  fAssocPtBinLimit[2]   = 1.0 ; 
+  fAssocPtBinLimit[3]   = 2.0 ; 
+  fAssocPtBinLimit[4]   = 3.0 ; 
+  fAssocPtBinLimit[5]   = 4.0 ; 
+  fAssocPtBinLimit[6]   = 5.0 ;
+  fAssocPtBinLimit[7]   = 6.0 ;
+  fAssocPtBinLimit[8]   = 7.0 ;
+  fAssocPtBinLimit[9]   = 8.0 ;
+  fAssocPtBinLimit[10]  = 9.0 ; 
+  fAssocPtBinLimit[11]  = 10.0 ; 
+  fAssocPtBinLimit[12]  = 12.0 ; 
+  fAssocPtBinLimit[13]  = 14.0 ; 
+  fAssocPtBinLimit[14]  = 16.0 ; 
+  fAssocPtBinLimit[15]  = 20.0 ; 
+  fAssocPtBinLimit[16]  = 30.0 ;
+  fAssocPtBinLimit[17]  = 40.0 ;
+  fAssocPtBinLimit[18]  = 50.0 ;
+  fAssocPtBinLimit[19]  = 200.0 ;
+  
+  
+  fUseMixStoredInReader = kTRUE;
+  
+  fM02MinCut   = -1 ;
+  fM02MaxCut   = -1 ;
   
 }
 
@@ -763,7 +2629,8 @@ void  AliAnaParticleHadronCorrelation::MakeAnalysisFillAOD()
     abort();
   }
        
-  if(GetDebug() > 1){
+  if(GetDebug() > 1)
+  {
     printf("AliAnaParticleHadronCorrelation::MakeAnalysisFillAOD() - Begin hadron correlation analysis, fill AODs \n");
     printf("AliAnaParticleHadronCorrelation::MakeAnalysisFillAOD() - In particle branch aod entries %d\n", GetInputAODBranch()->GetEntriesFast());
     printf("AliAnaParticleHadronCorrelation::MakeAnalysisFillAOD() - In CTS aod entries %d\n",   GetCTSTracks()    ->GetEntriesFast());
@@ -775,7 +2642,7 @@ void  AliAnaParticleHadronCorrelation::MakeAnalysisFillAOD()
   Double_t v[3] = {0,0,0}; //vertex ;
   GetReader()->GetVertex(v);
   if(!GetMixedEvent() && TMath::Abs(v[2]) > GetZvertexCut()) return ;   
-  
+    
   //Loop on stored AOD particles, find leading trigger
   Double_t ptTrig      = fMinTriggerPt ;
   fLeadingTriggerIndex = -1 ;
@@ -828,21 +2695,26 @@ void  AliAnaParticleHadronCorrelation::MakeAnalysisFillHistograms()
 {  
   //Particle-Hadron Correlation Analysis, fill histograms
   
-  if(!GetInputAODBranch()){
+  if(!GetInputAODBranch())
+  {
     printf("AliAnaParticleHadronCorrelation::MakeAnalysisFillHistograms() - No input particles in AOD with name branch < %s >, STOP \n",GetInputAODName().Data());
     abort();
   }
   
-  if(GetDebug() > 1){
+  if(GetDebug() > 1)
+  {
     printf("AliAnaParticleHadronCorrelation::MakeAnalysisFillHistograms() - Begin hadron correlation analysis, fill histograms \n");
     printf("AliAnaParticleHadronCorrelation::MakeAnalysisFillHistograms() - In particle branch aod entries %d\n", GetInputAODBranch()->GetEntriesFast());
   }
-  
+    
   //Get the vertex and check it is not too large in z
   Double_t v[3] = {0,0,0}; //vertex ;
   GetReader()->GetVertex(v);
   if(!GetMixedEvent() && TMath::Abs(v[2]) > GetZvertexCut()) return ;  
   
+  Float_t cen = GetEventCentrality();
+  Float_t ep  = GetEventPlaneAngle();
+  
   //Loop on stored AOD particles, find leading
   Double_t ptTrig    = fMinTriggerPt;
   if(fLeadingTriggerIndex < 0)
@@ -857,11 +2729,10 @@ void  AliAnaParticleHadronCorrelation::MakeAnalysisFillHistograms()
       Int_t check = CheckMixedEventVertex(particle->GetCaloLabel(0), particle->GetTrackLabel(0));
       if(check ==  0) continue;
       if(check == -1) return;
-      
+            
       //check if the particle is isolated or if we want to take the isolation into account
       if(OnlyIsolated() && !particle->IsIsolated()) continue;
       
-      //check if inside the vertex cut
       //find the leading particles with highest momentum
       if (particle->Pt() > ptTrig) 
       {
@@ -877,16 +2748,47 @@ void  AliAnaParticleHadronCorrelation::MakeAnalysisFillHistograms()
     
     AliAODPWG4ParticleCorrelation* particle =  (AliAODPWG4ParticleCorrelation*) (GetInputAODBranch()->At(fLeadingTriggerIndex));
 
+    // check if it was a calorimeter cluster and if the SS cut was requested, if so, apply it
+    Int_t clID1  = particle->GetCaloLabel(0) ;
+    Int_t clID2  = particle->GetCaloLabel(1) ; // for photon clusters should not be set.
+    //printf("Leading for for %s: id1 %d, id2 %d, min %f, max %f, det %s\n",
+    //       GetInputAODName().Data(),clID1,clID2,fM02MinCut,fM02MaxCut,(particle->GetDetector()).Data());
+
+    if(clID1 > 0 && clID2 < 0 && fM02MaxCut > 0 && fM02MinCut > 0)
+    {
+      Int_t iclus = -1;
+      TObjArray* clusters = 0x0;
+      if     (particle->GetDetector() == "EMCAL") clusters = GetEMCALClusters();
+      else if(particle->GetDetector() == "PHOS" ) clusters = GetPHOSClusters();
+      
+      if(clusters)
+      {
+        AliVCluster *cluster = FindCluster(clusters,clID1,iclus); 
+        Float_t m02 = cluster->GetM02();
+        //printf("\t Check m02 = %2.2f\n",m02);
+        if(m02 > fM02MaxCut || m02 < fM02MinCut) 
+        {
+          //printf("\t \t Not accepted\n");
+          return;
+        }
+      }        
+    }
+    
+    // Check if the particle is isolated or if we want to take the isolation into account
+    if(OnlyIsolated() && !particle->IsIsolated()) return;
+    
+    Float_t pt = particle->Pt();
+    fhPtInput->Fill(pt);
+    
     // Check if trigger is in fiducial region
     if(IsFiducialCutOn())
     {
       Bool_t in = GetFiducialCut()->IsInFiducialCut(*particle->Momentum(),particle->GetDetector()) ;
       if(! in ) return ;
-    }    
-    
-    // Check if the particle is isolated or if we want to take the isolation into account
-    if(OnlyIsolated() && !particle->IsIsolated()) return;
+    }
     
+    fhPtFidCut->Fill(pt);
+        
     // Make correlation with charged hadrons
     Bool_t okcharged = kTRUE;
     Bool_t okneutral = kTRUE;
@@ -910,11 +2812,41 @@ void  AliAnaParticleHadronCorrelation::MakeAnalysisFillHistograms()
     // no problem was found, like not absolute leading, or bad vertex in mixing.
     if(okcharged && okneutral)
     {
-      fhPtLeading->Fill(particle->Pt());
+      fhPtLeading->Fill(pt);
+      fhPtLeadingBin->Fill(pt,GetEventMixBin());
+      if(fCorrelVzBin) fhPtLeadingVzBin->Fill(pt,GetEventVzBin());
+      if(fFillPileUpHistograms)
+      {
+        Int_t vtxBC = GetReader()->GetVertexBC();
+        if(vtxBC == 0 || vtxBC==AliVTrack::kTOFBCNA)     fhPtLeadingVtxBC0->Fill(pt);
+
+        if(GetReader()->IsPileUpFromSPD())               fhPtLeadingPileUp[0]->Fill(pt);
+        if(GetReader()->IsPileUpFromEMCal())             fhPtLeadingPileUp[1]->Fill(pt);
+        if(GetReader()->IsPileUpFromSPDOrEMCal())        fhPtLeadingPileUp[2]->Fill(pt);
+        if(GetReader()->IsPileUpFromSPDAndEMCal())       fhPtLeadingPileUp[3]->Fill(pt);
+        if(GetReader()->IsPileUpFromSPDAndNotEMCal())    fhPtLeadingPileUp[4]->Fill(pt);
+        if(GetReader()->IsPileUpFromEMCalAndNotSPD())    fhPtLeadingPileUp[5]->Fill(pt);
+        if(GetReader()->IsPileUpFromNotSPDAndNotEMCal()) fhPtLeadingPileUp[6]->Fill(pt);
+      }
+      
       Float_t phi = particle->Phi();
       if(phi<0)phi+=TMath::TwoPi();
-      fhPhiLeading->Fill(particle->Pt(), phi);
-      fhEtaLeading->Fill(particle->Pt(), particle->Eta());
+      fhPhiLeading->Fill(pt, phi);
+      
+      fhEtaLeading->Fill(pt, particle->Eta());
+      //printf("AliAnaParticleHadronCorrelation::MakeAnalysisFillHistograms() - Leading particle : pt %f, eta %f, phi %f\n",particle->Pt(),particle->Eta(),phi);
+      
+      if(IsDataMC())
+      {
+        Int_t mcIndex = GetMCTagHistogramIndex(particle->GetTag());
+        fhPtLeadingMC[mcIndex]->Fill(pt);
+      }        
+            
+      fhPtLeadingCentrality        ->Fill(pt,cen);
+      fhPtLeadingEventPlane        ->Fill(pt,ep);
+      fhLeadingEventPlaneCentrality->Fill(cen,ep);
+      
     }//ok charged && neutral
   }//Aod branch loop
   
@@ -926,103 +2858,61 @@ void  AliAnaParticleHadronCorrelation::MakeAnalysisFillHistograms()
 
 //___________________________________________________________________________________________________________
 Bool_t  AliAnaParticleHadronCorrelation::MakeChargedCorrelation(AliAODPWG4ParticleCorrelation *aodParticle, 
-                                                                const TObjArray* pl, const Bool_t bFillHisto)
+                                                                const TObjArray* pl, Bool_t bFillHisto)
 {  
   // Charged Hadron Correlation Analysis
-  if(GetDebug() > 1)printf("AliAnaParticleHadronCorrelation::MakeChargedCorrelation() - Make trigger particle - charged hadron correlation \n");
-  
-  Int_t evtIndex11   = -1 ; //cluster trigger or pi0 trigger 
-  Int_t evtIndex12   = -1 ; // pi0 trigger
-  Int_t evtIndex13   = -1 ; // charged trigger
-  Int_t indexPhoton1 = -1 ;
-  Int_t indexPhoton2 = -1 ;  
-  
-  Double_t v[3]      = {0,0,0}; //vertex ;
-  GetReader()->GetVertex(v);
-  
-  if (GetMixedEvent()) 
-  {
-    evtIndex11 = GetMixedEvent()->EventIndexForCaloCluster(aodParticle->GetCaloLabel(0)) ;
-    evtIndex12 = GetMixedEvent()->EventIndexForCaloCluster(aodParticle->GetCaloLabel(1)) ;    
-    evtIndex13 = GetMixedEvent()->EventIndex(aodParticle->GetTrackLabel(0)) ;
-  }
-  
-  Double_t phiTrig = aodParticle->Phi();
-  Double_t etaTrig = aodParticle->Eta(); 
-  Double_t ptTrig  = aodParticle->Pt();  
-  
-  Double_t pt             = -100. ;
-  Double_t px             = -100. ;
-  Double_t py             = -100. ;
-  Double_t rat            = -100. ; 
-  Double_t xE             = -100. ; 
-  Double_t cosi           = -100. ; 
-  Double_t phi            = -100. ;
-  Double_t eta            = -100. ;
-  Double_t pout           = -100. ;
-  
-  Double_t ptDecay1       = 0. ;
-  Double_t pxDecay1       = 0. ;
-  Double_t pyDecay1       = 0. ;
-  Double_t phiDecay1      = 0. ;
-  Double_t ptDecay2       = 0. ;
-  Double_t pxDecay2       = 0. ;
-  Double_t pyDecay2       = 0. ;
-  Double_t phiDecay2      = 0. ;
-  
-  Double_t ratDecay1      = -100. ;  
-  Double_t ratDecay2      = -100. ; 
-  Double_t deltaPhi       = -100. ;
-  Double_t deltaPhiOrg    = -100. ;
-  Double_t deltaPhiDecay1 = -100. ;
-  Double_t deltaPhiDecay2 = -100. ;
+  if(GetDebug() > 1) 
+    printf("AliAnaParticleHadronCorrelation::MakeChargedCorrelation() - Make trigger particle - charged hadron correlation \n");
+    
+  Float_t phiTrig = aodParticle->Phi();
+  Float_t etaTrig = aodParticle->Eta();
+  Float_t ptTrig  = aodParticle->Pt();  
+  Bool_t   decay  = aodParticle->IsTagged();
+  Int_t    mcTag  = aodParticle->GetTag();
+  Double_t bz     = GetReader()->GetInputEvent()->GetMagneticField();
+
+  Float_t pt       = -100. ;
+  Float_t zT       = -100. ; 
+  Float_t xE       = -100. ; 
+  Float_t hbpXE    = -100. ; 
+  Float_t hbpZT    = -100. ; 
+  Float_t phi      = -100. ;
+  Float_t eta      = -100. ;
+  Float_t pout     = -100. ;
+  Float_t deltaPhi = -100. ;
   
   TVector3 p3;  
   TLorentzVector photonMom ;   
-  TObjArray * clusters  = 0x0 ;  
   TObjArray * reftracks = 0x0;
   Int_t nrefs           = 0;
   Int_t nTracks         = GetCTSTracks()->GetEntriesFast() ;
   
-  if(fPi0Trigger)
-  {
-    indexPhoton1 = aodParticle->GetCaloLabel (0);
-    indexPhoton2 = aodParticle->GetCaloLabel (1);
-    if(GetDebug() > 1)printf("indexPhoton1 = %d, indexPhoton2 = %d \n", indexPhoton1, indexPhoton2);
-    
-    if(indexPhoton1!=-1 && indexPhoton2!=-1)
-    {
-      if(aodParticle->GetDetector()=="EMCAL") clusters = GetEMCALClusters() ;
-      else                                    clusters = GetPHOSClusters()  ;
-      
-      for(Int_t iclus = 0; iclus < clusters->GetEntriesFast(); iclus++)
-      {
-        AliVCluster * photon =  (AliVCluster*) (clusters->At(iclus));  
-        photon->GetMomentum(photonMom,GetVertex(0)) ;
-        if(photon->GetID()==indexPhoton1) 
-        {
-          ptDecay1  = photonMom.Pt();
-          pxDecay1  = photonMom.Px();
-          pyDecay1  = photonMom.Py();
-          phiDecay1 = photonMom.Phi();
-          if(ptTrig && bFillHisto) fhPtPi0DecayRatio->Fill(ptTrig, ptDecay1/ptTrig);
-        }
-        if(photon->GetID()==indexPhoton2) 
-        {
-          ptDecay2  = photonMom.Pt();
-          pxDecay2  = photonMom.Px();
-          pyDecay2  = photonMom.Py();
-          phiDecay2 = photonMom.Phi();
-          if(ptTrig && bFillHisto) fhPtPi0DecayRatio->Fill(ptTrig, ptDecay2/ptTrig);
-        } 
-        
-        if(GetDebug() > 1)printf("Photon1 = %f, Photon2 = %f \n", ptDecay1, ptDecay2);
-        
-      } //cluster loop        
-    } //index of decay photons found
-  } //make decay-hadron correlation
+  // Mixed event settings
+  Int_t evtIndex11   = -1 ; // cluster trigger or pi0 trigger 
+  Int_t evtIndex12   = -1 ; // pi0 trigger
+  Int_t evtIndex13   = -1 ; // charged trigger
+  
+  Double_t v[3]      = {0,0,0}; //vertex ;
+  GetReader()->GetVertex(v);
+  
+  if (GetMixedEvent()) 
+  {
+    evtIndex11 = GetMixedEvent()->EventIndexForCaloCluster(aodParticle->GetCaloLabel(0)) ;
+    evtIndex12 = GetMixedEvent()->EventIndexForCaloCluster(aodParticle->GetCaloLabel(1)) ;    
+    evtIndex13 = GetMixedEvent()->EventIndex(aodParticle->GetTrackLabel(0)) ;
+  }
   
+  // In case of pi0/eta trigger, we may want to check their decay correlation, 
+  // get their decay children
+  TLorentzVector decayMom1;
+  TLorentzVector decayMom2;
+  Bool_t decayFound = kFALSE;
+  if(fPi0Trigger && bFillHisto) decayFound = GetDecayPhotonMomentum(aodParticle,decayMom1, decayMom2);
+
+  //-----------------------------------------------------------------------
   //Track loop, select tracks with good pt, phi and fill AODs or histograms
+  //-----------------------------------------------------------------------
+
   for(Int_t ipr = 0;ipr < pl->GetEntriesFast() ; ipr ++ )
   {
     AliVTrack * track = (AliVTrack *) (pl->At(ipr)) ;
@@ -1030,8 +2920,6 @@ Bool_t  AliAnaParticleHadronCorrelation::MakeChargedCorrelation(AliAODPWG4Partic
     Double_t mom[3] = {track->Px(),track->Py(),track->Pz()};
     p3.SetXYZ(mom[0],mom[1],mom[2]);
     pt   = p3.Pt();
-    px   = p3.Px();
-    py   = p3.Py();
     eta  = p3.Eta();
     phi  = p3.Phi() ;
     if(phi < 0) phi+=TMath::TwoPi();
@@ -1045,9 +2933,14 @@ Bool_t  AliAnaParticleHadronCorrelation::MakeChargedCorrelation(AliAODPWG4Partic
       continue ;
     
     //jump out this event if near side associated particle pt larger than trigger
-    if (fMakeAbsoluteLeading)
+    if (fMakeNearSideLeading)
+    {
+      if(pt > ptTrig && TMath::Abs(phi-phiTrig) < TMath::PiOver2())  return kFALSE;
+    }
+    //jump out this event if there is any other particle with pt larger than trigger
+    else if(fMakeAbsoluteLeading)
     {
-      if(pt > ptTrig && TMath::Abs(phi-phiTrig)<TMath::PiOver2())  return kFALSE;
+      if(pt > ptTrig)  return kFALSE;
     }
     
     //Only for mixed event
@@ -1062,177 +2955,83 @@ Bool_t  AliAnaParticleHadronCorrelation::MakeChargedCorrelation(AliAODPWG4Partic
         return kFALSE;
     }    
     
-    if(fPi0Trigger)
-    {
-      if(indexPhoton1!=-1 && indexPhoton2!=-1)
-      {
-        if(ptDecay1) ratDecay1 = pt/ptDecay1 ;
-        if(ptDecay2) ratDecay2 = pt/ptDecay2 ; 
-        deltaPhiDecay1 = phiDecay1-phi;
-        deltaPhiDecay2 = phiDecay2-phi;
-        if(deltaPhiDecay1< -TMath::PiOver2()) deltaPhiDecay1+=TMath::TwoPi();
-        if(deltaPhiDecay1>3*TMath::PiOver2()) deltaPhiDecay1-=TMath::TwoPi();
-        if(deltaPhiDecay2< -TMath::PiOver2()) deltaPhiDecay2+=TMath::TwoPi();
-        if(deltaPhiDecay2>3*TMath::PiOver2()) deltaPhiDecay2-=TMath::TwoPi();    
-      }
-    } //do decay-hadron correlation    
-    
-    //Selection within angular range
-    deltaPhi    = phiTrig-phi;
-    deltaPhiOrg = deltaPhi;
-    if(deltaPhi <= -TMath::PiOver2()) deltaPhi+=TMath::TwoPi();
-    if(deltaPhi > 3*TMath::PiOver2()) deltaPhi-=TMath::TwoPi();
-    
-    rat  = pt/ptTrig ;
-    pout = pt*TMath::Sin(deltaPhi) ;
-    xE   =-pt/ptTrig*TMath::Cos(deltaPhi); // -(px*pxTrig+py*pyTrig)/(ptTrig*ptTrig);
-    //if(xE <0.)xE =-xE;
-    cosi = -100;
-    if(xE > 0 ) cosi = TMath::Log(1./xE); 
-       
-    if(GetDebug() > 2)
-      printf("AliAnaParticleHadronCorrelation::MakeChargedCorrelation() - Charged hadron: pt %f, phi %f, phi trigger %f. Cuts:  delta phi  %2.2f < %2.2f < %2.2f, pT Trig min %2.2f \n",
-             pt,phi, phiTrig,fDeltaPhiMinCut, deltaPhi, fDeltaPhiMaxCut, fMinTriggerPt);
-    
     // Fill Histograms
-    if(bFillHisto){
-      
-      Int_t    assocBin   = -1; 
-      for(Int_t i = 0 ; i < fNAssocPtBins ; i++){
+    if(bFillHisto)
+    {      
+
+      if(GetDebug() > 2 ) 
+        printf("AliAnaParticleHadronCorrelation::MakeChargedCorrelation() - Selected charge for momentum imbalance: pt %2.2f, phi %2.2f, eta %2.2f \n",pt,phi,eta);
+            
+      // Set the pt associated bin for the defined bins
+      Int_t assocBin   = -1; 
+      for(Int_t i = 0 ; i < fNAssocPtBins ; i++)
+      {
         if(pt > fAssocPtBinLimit[i] && pt < fAssocPtBinLimit[i+1]) assocBin= i; 
+      }      
+      
+      // Assign to the histogram array a bin corresponding to a combination of pTa and vz bins
+      Int_t nz = 1;
+      Int_t vz = 0;
+      
+      if(fCorrelVzBin) 
+      {
+        nz = GetNZvertBin();
+        vz = GetEventVzBin();
       }
       
-      fhAssocPt->Fill(ptTrig,pt);
+      Int_t bin = assocBin*nz+vz;
       
-      //if(xE >= 1 ) printf("pTTrig = %f, pTHadron = %f, xE = %f\n",ptTrig,pt, xE);
-      fhXE->Fill(ptTrig, xE) ;
+      //printf("assoc Bin = %d, vZ bin  = %d, bin = %d \n", assocBin,GetEventVzBin(),bin);
+      
+      ULong_t status = track->GetStatus();
+      Bool_t okTOF = ( (status & AliVTrack::kTOFout) == AliVTrack::kTOFout ) ;
+      //Double32_t tof = track->GetTOFsignal()*1e-3;
+      Int_t trackBC = track->GetTOFBunchCrossing(bz);
 
-      if(TMath::Cos(deltaPhi) < 0 && assocBin >= 0 )//away side 
-        fhXEAssocPtBin[assocBin]->Fill(ptTrig, xE) ;
+      Int_t outTOF = -1;
+      if     (okTOF && trackBC!=0) outTOF = 1;
+      else if(okTOF && trackBC==0) outTOF = 0;
       
-      //Hardcoded values, BAD, FIXME
-      Double_t  dphiBrad = atan2(sin(deltaPhiOrg), cos(deltaPhiOrg))/TMath::Pi();//-1 to 1
-      if(TMath::Abs(dphiBrad)>0.325 && TMath::Abs(dphiBrad)<0.475)
-      {
-        fhAssocPtBkg->Fill(ptTrig, pt);
-      }
+      // Azimuthal Angle
+      // calculate deltaPhi for later, shift when needed
+      FillChargedAngularCorrelationHistograms(pt,  ptTrig,  bin, phi, phiTrig,  deltaPhi,
+                                              eta, etaTrig, decay, track->GetHMPIDsignal(),outTOF,nTracks,mcTag);
+      
+      // Imbalance zT/xE/pOut
+      zT = pt/ptTrig ;
+      if(zT > 0 ) hbpZT = TMath::Log(1./zT);
+      else        hbpZT =-100;
       
-      if(dphiBrad<-1./3) dphiBrad += 2;
-      fhDeltaPhiBrad->Fill(ptTrig, dphiBrad);
+      xE   =-pt/ptTrig*TMath::Cos(deltaPhi); // -(px*pxTrig+py*pyTrig)/(ptTrig*ptTrig);
+      //if(xE <0.)xE =-xE;
+      if(xE > 0 ) hbpXE = TMath::Log(1./xE); 
+      else        hbpXE =-100;
+    
+      pout = pt*TMath::Sin(deltaPhi) ;
       
-      if(assocBin>=0)
+      //delta phi cut for momentum imbalance correlation
+      if  ( (deltaPhi > fDeltaPhiMinCut)   && (deltaPhi < fDeltaPhiMaxCut)   )
       {
-        fhDeltaPhiBradAssocPtBin[assocBin]->Fill(ptTrig, dphiBrad);
-        fhDeltaPhiAssocPtBin    [assocBin]->Fill(ptTrig, deltaPhi);
-        if(track->GetHMPIDsignal()>0)
-        {
-          //printf("Track pt %f with HMPID signal %f \n",pt,track->GetHMPIDsignal());
-          fhDeltaPhiAssocPtBinHMPID[assocBin]->Fill(ptTrig, deltaPhi);        
-        }
         
-        if(phi > 5*TMath::DegToRad() && phi < 20*TMath::DegToRad()){
-          //printf("Track pt %f in HMPID acceptance phi %f \n ",pt,phi*TMath::RadToDeg() );
-          fhDeltaPhiAssocPtBinHMPIDAcc[assocBin]->Fill(ptTrig, deltaPhi);        
-        }
+        FillChargedMomentumImbalanceHistograms(ptTrig, pt, xE, hbpXE, zT, hbpZT, pout, 
+                                               nTracks, track->Charge(), bin, decay,outTOF,mcTag);
         
       }
       
-      fhEtaCharged     ->Fill(pt,eta);
-      fhPhiCharged     ->Fill(pt,phi);
-      fhDeltaEtaCharged->Fill(ptTrig,aodParticle->Eta()-eta);
-      fhDeltaPhiCharged->Fill(ptTrig, deltaPhi);
-      if(pt >2 ) fhDeltaPhiDeltaEtaCharged->Fill(deltaPhi,aodParticle->Eta()-eta);
-      
-      if(GetDebug() > 2 ) printf("AliAnaParticleHadronCorrelation::MakeChargedCorrelation() - Selected charge for momentum imbalance: pt %2.2f, phi %2.2f, eta %2.2f \n",pt,phi,eta);
-      //fill different multiplicity histogram
-      if(DoEventSelect()){
-        for(Int_t im=0; im<GetMultiBin(); im++){
-          if(nTracks < ( GetMaxMulti() - GetMinMulti() )/GetMultiBin()*(im+1)){
-            fhTrigDeltaPhiCharged[im]->Fill(ptTrig,deltaPhi);
-            fhTrigDeltaEtaCharged[im]->Fill(ptTrig,aodParticle->Eta()-eta);
-          }
-        }
-      }
-      
-      //delta phi cut for correlation
-      if      ( (deltaPhi > fDeltaPhiMinCut)   && (deltaPhi < fDeltaPhiMaxCut)   ) 
-      {
-        fhDeltaPhiChargedPt ->Fill(pt,deltaPhi);
-        fhPtImbalanceCharged->Fill(ptTrig,xE); 
-        fhPtHbpCharged ->Fill(ptTrig, cosi);
-        fhPtTrigPout   ->Fill(ptTrig, pout) ;
-        fhPtTrigCharged->Fill(ptTrig, pt) ;
-        if(track->Charge() > 0) fhPtImbalancePosCharged->Fill(ptTrig,xE) ;
-        else                    fhPtImbalanceNegCharged->Fill(ptTrig,xE) ;
-        //fill different multiplicity histogram
-        if(DoEventSelect()){
-          for(Int_t im=0; im<GetMultiBin(); im++){
-            if(nTracks < ( GetMaxMulti() - GetMinMulti() )/GetMultiBin()*(im+1))
-              fhTrigCorr[im]->Fill(ptTrig,xE);
-          }
-        } //multiplicity events selection
-      } //delta phi cut for correlation
-      else if ( (deltaPhi > fUeDeltaPhiMinCut) && (deltaPhi < fUeDeltaPhiMaxCut) ) 
+      if ( (deltaPhi > fUeDeltaPhiMinCut) && (deltaPhi < fUeDeltaPhiMaxCut) )
       { //UE study
-        fhDeltaPhiUeChargedPt->Fill(pt,deltaPhi);
-        Double_t randomphi = gRandom->Uniform(TMath::Pi()/2,3*TMath::Pi()/2);
-        Double_t uexE = -(pt/ptTrig)*TMath::Cos(randomphi);
-        if(uexE < 0.) uexE = -uexE;
-        if(GetDebug() > 1)printf("AliAnaParticleHadronCorrelation::MakeChargedCorrelation() - xe = %f, uexE = %f \n", xE, uexE);
-        fhPtImbalanceUeCharged->Fill(ptTrig,uexE);
-        if(uexE>0)fhPtHbpUeCharged->Fill(ptTrig,TMath::Log(1/uexE));
-        if(DoEventSelect()){
-          for(Int_t im=0; im<GetMultiBin(); im++){
-            if(nTracks < ( GetMaxMulti() - GetMinMulti() )/GetMultiBin()*(im+1))
-              fhTrigUeCorr[im]->Fill(ptTrig,xE);
-          }
-        } //multiplicity events selection
         
-      } //UE study
+        FillChargedUnderlyingEventHistograms(ptTrig, pt, deltaPhi, nTracks,outTOF);
+
+        fhUePart->Fill(ptTrig);
+        
+      }
       
-      if(fPi0Trigger)
-      {
-        if(indexPhoton1!=-1 && indexPhoton2!=-1)
-        {
-          fhDeltaPhiDecayCharged->Fill(ptDecay1, deltaPhiDecay1);
-          fhDeltaPhiDecayCharged->Fill(ptDecay2, deltaPhiDecay2);
-          
-          if(GetDebug() > 1)printf("AliAnaParticleHadronCorrelation::MakeChargedCorrelation() - deltaPhoton1 = %f, deltaPhoton2 = %f \n", deltaPhiDecay1, deltaPhiDecay2);
-          
-          if( (deltaPhiDecay1 > fDeltaPhiMinCut) && ( deltaPhiDecay1 < fDeltaPhiMaxCut) )
-            fhPtImbalanceDecayCharged->Fill(ptDecay1,ratDecay1); 
-          
-          if( (deltaPhiDecay2 > fDeltaPhiMinCut) && ( deltaPhiDecay2 < fDeltaPhiMaxCut) )
-            fhPtImbalanceDecayCharged->Fill(ptDecay2,ratDecay2);
-          
-          if(GetDebug() > 1)printf("AliAnaParticleHadronCorrelation::MakeChargedCorrelation() - ratPhoton1 = %f, ratPhoton2 = %f \n", pt/ptDecay1, pt/ptDecay2);
-          
-        } //index of decay photons found
-      } //make decay-hadron correlation          
+      if(fPi0Trigger && decayFound) 
+        FillDecayPhotonCorrelationHistograms(pt, phi, decayMom1,decayMom2, kTRUE) ;
       
       //several UE calculation 
-      if(fMakeSeveralUE)
-      {
-        if((deltaPhi<-fUeDeltaPhiMinCut) && (deltaPhi >-fUeDeltaPhiMaxCut))
-        {  
-          fhDeltaPhiUeLeftCharged->Fill(pt,deltaPhi);
-          fhPtImbalanceUeLeftCharged->Fill(ptTrig,rat);
-          fhPtHbpUeLeftCharged->Fill(ptTrig,cosi);
-        }
-        
-        if((deltaPhi>fUeDeltaPhiMinCut) && (deltaPhi <fUeDeltaPhiMaxCut))
-        {  
-          fhDeltaPhiUeRightCharged->Fill(pt,deltaPhi);
-          fhPtImbalanceUeRightCharged->Fill(ptTrig,rat);
-          fhPtHbpUeRightCharged->Fill(ptTrig,cosi);
-        }
-      } //several UE calculation
-      
-      //Fill leading particle histogram   
-      fhPtLeading->Fill(ptTrig);
-      if(phiTrig<0)phiTrig+=TMath::TwoPi();
-      fhPhiLeading->Fill(ptTrig, phiTrig);
-      fhEtaLeading->Fill(ptTrig, etaTrig);
+      if(fMakeSeveralUE) FillChargedUnderlyingEventSidesHistograms(ptTrig,pt,deltaPhi);
       
     } //Fill histogram 
     else
@@ -1243,9 +3042,11 @@ Bool_t  AliAnaParticleHadronCorrelation::MakeChargedCorrelation(AliAODPWG4Partic
         reftracks = new TObjArray(0);
         TString trackname = Form("%s+Tracks", GetAODObjArrayName().Data());
         reftracks->SetName(trackname.Data());
-        reftracks->SetOwner(kFALSE);
+        reftracks->SetOwner(kFALSE);        
       }
+      
       reftracks->Add(track);
+      
     }//aod particle loop
   }// track loop
   
@@ -1254,104 +3055,324 @@ Bool_t  AliAnaParticleHadronCorrelation::MakeChargedCorrelation(AliAODPWG4Partic
   {
     aodParticle->AddObjArray(reftracks);
   }
+
+  //Own mixed event, add event and remove previous or fill the mixed histograms
+  if(DoOwnMix() && bFillHisto)
+  {
+      MakeChargedMixCorrelation(aodParticle);
+  }
   
   return kTRUE;
   
 }  
 
-//________________________________________________________________________________________________________________
-Bool_t  AliAnaParticleHadronCorrelation::MakeNeutralCorrelation(AliAODPWG4ParticleCorrelation * const aodParticle, 
-                                                                const TObjArray* pi0list, const Bool_t bFillHisto)  
+
+//_________________________________________________________________________________________________________
+void AliAnaParticleHadronCorrelation::MakeChargedMixCorrelation(AliAODPWG4ParticleCorrelation *aodParticle) 
 {  
-  // Neutral Pion Correlation Analysis
-  if(GetDebug() > 1) printf("AliAnaParticleHadronCorrelation::MakeNeutralCorrelation() - Make trigger particle - pi0 correlation, %d pi0's \n",pi0list->GetEntriesFast());
+  // Mix current trigger with tracks in another MB event
   
-  Int_t evtIndex11 = 0 ; 
-  Int_t evtIndex12 = 0 ; 
-  if (GetMixedEvent()) 
+  if(GetDebug() > 1) printf("AliAnaParticleHadronCorrelationNew::MakeChargedMixCorrelation() - Make trigger particle - charged hadron mixed event correlation \n");
+  
+  if(GetMixedEvent()) return;  // This is not the mixed event from general mixing frame
+  
+  // Get the event with similar caracteristics
+  //printf("MakeChargedMixCorrelation for %s\n",GetInputAODName().Data());
+
+  AliAnalysisManager   * manager      = AliAnalysisManager::GetAnalysisManager();
+  
+  AliInputEventHandler * inputHandler = dynamic_cast<AliInputEventHandler*>(manager->GetInputEventHandler());
+  
+  if(!inputHandler) return;
+  
+  if(!(inputHandler->IsEventSelected( ) & GetReader()->GetEventTriggerMask())) return;
+    
+  // Get the pool, check if it exits
+  Int_t eventBin = GetEventMixBin();
+
+  fhEventBin->Fill(eventBin);
+  
+  //Check that the bin exists, if not (bad determination of RP, centrality or vz bin) do nothing
+  if(eventBin < 0) return;
+  
+  TList * pool     = 0;
+  TList * poolCalo = 0;
+  if(fUseMixStoredInReader) 
   {
-    evtIndex11 = GetMixedEvent()->EventIndexForCaloCluster(aodParticle->GetCaloLabel(0)) ;
-    evtIndex12 = GetMixedEvent()->EventIndexForCaloCluster(aodParticle->GetCaloLabel(1)) ;    
-  }  
+    pool     = GetReader()->GetListWithMixedEventsForTracks(eventBin);
+    if(OnlyIsolated() || fFillNeutralEventMixPool) poolCalo = GetReader()->GetListWithMixedEventsForCalo  (eventBin);
+  }
+  else
+  {
+    pool     = fListMixTrackEvents[eventBin];
+    if(OnlyIsolated()  || fFillNeutralEventMixPool) poolCalo = fListMixCaloEvents [eventBin];
+  }
   
-  Double_t pt   = -100. ;
-  Double_t px   = -100. ;
-  Double_t py   = -100. ;
-  Double_t rat  = -100. ; 
-  Double_t phi  = -100. ;
-  Double_t eta  = -100. ;
-  Double_t xE   = -100. ; 
-  Double_t cosi = -100. ; 
+  if(!pool) return ;
+    
+  if((OnlyIsolated()  || fFillNeutralEventMixPool ) && !poolCalo &&
+     (GetIsolationCut()->GetParticleTypeInCone()!=AliIsolationCut::AliIsolationCut::kOnlyCharged)) 
+    printf("AliAnaParticleHadronCorrelation::MakeChargedMixCorrelation() - Careful, cluster pool not available\n");
   
   Double_t ptTrig  = aodParticle->Pt();
-  Double_t phiTrig = aodParticle->Phi();
   Double_t etaTrig = aodParticle->Eta();
-  //Double_t pxTrig  = aodParticle->Px();
-  //Double_t pyTrig  = aodParticle->Py();
-  
-  Int_t indexPhoton1 =-1  ;
-  Int_t indexPhoton2 =-1  ;    
-  Double_t ptDecay1  = 0. ;
-  Double_t pxDecay1  = 0. ;
-  Double_t pyDecay1  = 0. ;
-  Double_t phiDecay1 = 0. ;
-  Double_t ptDecay2  = 0. ;
-  Double_t pxDecay2  = 0. ;
-  Double_t pyDecay2  = 0. ;
-  Double_t phiDecay2 = 0. ;
-  
-  Double_t ratDecay1      = -100. ;  
-  Double_t ratDecay2      = -100. ; 
-  Double_t deltaPhi       = -100. ;
-  Double_t deltaPhiDecay1 = -100. ;
-  Double_t deltaPhiDecay2 = -100. ;
-  
-  TObjArray * clusters = 0x0 ;  
-  TLorentzVector photonMom ;
-       
-  if(fPi0Trigger){
-    indexPhoton1 = aodParticle->GetCaloLabel (0);
-    indexPhoton2 = aodParticle->GetCaloLabel (1);
-    if(GetDebug() > 1)
-      printf("AliAnaParticleHadronCorrelation::MakeNeutralCorrelationFillHistograms() - indexPhoton1 = %d, indexPhoton2 = %d \n", indexPhoton1, indexPhoton2);
-    
-    if(indexPhoton1!=-1 && indexPhoton2!=-1)
+  Double_t phiTrig = aodParticle->Phi();
+  if(phiTrig < 0.) phiTrig+=TMath::TwoPi();
+  
+  if(GetDebug() > 1) 
+    printf("AliAnaParticleHadronCorrelationNew::MakeChargedMixCorrelation() - Pool bin %d size %d, leading trigger pt=%f, phi=%f, eta=%f\n",
+           eventBin,pool->GetSize(), ptTrig,phiTrig,etaTrig);
+  
+  Double_t ptAssoc  = -999.;
+  Double_t phiAssoc = -999.;
+  Double_t etaAssoc = -999.;
+  Double_t deltaPhi = -999.;
+  Double_t deltaEta = -999.;
+  Double_t xE = -999.;
+  Double_t hbpXE = -999.;
+      
+  //Start from first event in pool except if in this same event the pool was filled
+  Int_t ev0 = 0;
+  if(GetReader()->GetLastTracksMixedEvent() == GetEventNumber()) ev0 = 1;
+
+  for(Int_t ev=ev0; ev < pool->GetSize(); ev++)
+  {
+    TObjArray* bgTracks = static_cast<TObjArray*>(pool->At(ev));
+    TObjArray* bgCalo   = 0;
+
+    // Check if the particle is isolated in the mixed event, it not, do not fill the histograms
+    if(OnlyIsolated() || fFillNeutralEventMixPool)
     {
-      if(aodParticle->GetDetector()=="EMCAL") clusters = GetEMCALClusters() ;
-      else                                    clusters = GetPHOSClusters() ;
+      if(pool->GetSize()!=poolCalo->GetSize()) 
+        printf("AliAnaParticleHadronCorrelationNew::MakeChargedMixCorrelation() - Different size of calo and track pools\n");
+      
+      bgCalo = static_cast<TObjArray*>(poolCalo->At(ev));
+      
+      if(!bgCalo) 
+        printf("AliAnaParticleHadronCorrelationNew::MakeChargedMixCorrelation() - Event %d in calo pool not available?\n",ev);
       
-      for(Int_t iclus = 0; iclus < clusters->GetEntriesFast(); iclus++)
+      if(OnlyIsolated())
+      {
+        Int_t n=0; Int_t nfrac = 0; Bool_t isolated = kFALSE; Float_t coneptsum = 0;
+        GetIsolationCut()->MakeIsolationCut(bgTracks,bgCalo,
+                                            GetReader(), GetCaloPID(),
+                                            kFALSE, aodParticle, "", 
+                                            n,nfrac,coneptsum, isolated);
+        
+        //printf("AliAnaParticleHadronCorrelation::MakeChargedMixCorrelation() - Isolated? %d - cone %f, ptthres %f",
+        //       isolated,GetIsolationCut()->GetConeSize(),GetIsolationCut()->GetPtThreshold());
+        //if(bgTracks)printf(" - n track %d", bgTracks->GetEntriesFast());
+        //printf("\n");
+        
+        if(!isolated) continue ;
+      }
+    }
+    
+    fhEventMixBin->Fill(eventBin);
+    
+    Int_t nTracks=bgTracks->GetEntriesFast();
+    //printf("\t Read Pool event %d, nTracks %d\n",ev,nTracks);
+
+    //Check if it is leading if mixed event
+    if(fMakeNearSideLeading || fMakeAbsoluteLeading)
+    {
+      Bool_t leading = kTRUE;
+      for(Int_t jlead = 0;jlead <nTracks; jlead++ )
       {
-        AliVCluster * photon =  (AliVCluster*) (clusters->At(iclus));  
-        photon->GetMomentum(photonMom,GetVertex(0)) ;
-        if(photon->GetID()==indexPhoton1) 
+        AliAODPWG4Particle *track = (AliAODPWG4Particle*) bgTracks->At(jlead) ;
+        
+        ptAssoc  = track->Pt();
+        phiAssoc = track->Phi() ;
+        
+        if(phiAssoc < 0) phiAssoc+=TMath::TwoPi();
+        if (fMakeNearSideLeading)
         {
-          ptDecay1  = photonMom.Pt();
-          pxDecay1  = photonMom.Px();
-          pyDecay1  = photonMom.Py();
-          phiDecay1 = photonMom.Phi();
+          if(ptAssoc > ptTrig && TMath::Abs(phiAssoc-phiTrig) < TMath::PiOver2())  
+          {
+            leading = kFALSE;
+            break;
+          }
         }
-        
-        if(photon->GetID()==indexPhoton2) 
+        //jump out this event if there is any other particle with pt larger than trigger
+        else if(fMakeAbsoluteLeading)
+        {
+          if(ptAssoc > ptTrig) 
+          { 
+            leading = kFALSE;
+            break;
+          }
+        }
+      }
+      
+      if(fFillNeutralEventMixPool && bgCalo)
+      {
+        Int_t nClusters=bgCalo->GetEntriesFast();
+        TLorentzVector mom ;
+        for(Int_t jlead = 0;jlead <nClusters; jlead++ )
         {
-          ptDecay2  = photonMom.Pt();
-          pxDecay2  = photonMom.Px();
-          pyDecay2  = photonMom.Py();
-          phiDecay2 = photonMom.Phi();
-        } 
+          AliAODPWG4Particle *cluster= (AliAODPWG4Particle*) bgCalo->At(jlead) ;
+          
+          ptAssoc  = cluster->Pt();
+          phiAssoc = cluster->Phi() ;
+          
+          if(phiAssoc < 0) phiAssoc+=TMath::TwoPi();
+          if (fMakeNearSideLeading)
+          {
+            if(ptAssoc > ptTrig && TMath::Abs(phiAssoc-phiTrig) < TMath::PiOver2())
+            {
+              leading = kFALSE;
+              break;
+            }
+          }
+          //jump out this event if there is any other particle with pt larger than trigger
+          else if(fMakeAbsoluteLeading)
+          {
+            if(ptAssoc > ptTrig)
+            {
+              leading = kFALSE;
+              break;
+            }
+          }
+        }
+      }
+      
+      if(!leading) continue; // not leading, check the next event in pool
+    
+    }
+    
+    fhPtLeadingMixed   ->Fill(ptTrig);
+    fhPhiLeadingMixed  ->Fill(ptTrig, phiTrig);
+    fhEtaLeadingMixed  ->Fill(ptTrig, etaTrig);
+    fhPtLeadingMixedBin->Fill(ptTrig,eventBin);
+    if(fCorrelVzBin)fhPtLeadingMixedVzBin->Fill(ptTrig, GetEventVzBin());
+
+    for(Int_t j1 = 0;j1 <nTracks; j1++ )
+    {
+      AliAODPWG4Particle *track = (AliAODPWG4Particle*) bgTracks->At(j1) ;
+      
+      if(!track) continue;
+      
+      ptAssoc  = track->Pt();
+      etaAssoc = track->Eta();
+      phiAssoc = track->Phi() ;
+      if(phiAssoc < 0) phiAssoc+=TMath::TwoPi();
+            
+      if(IsFiducialCutOn())
+      {
+        Bool_t in = GetFiducialCut()->IsInFiducialCut(*aodParticle->Momentum(),"CTS") ;
+        if(!in) continue ;
+      }
+      
+      deltaPhi = phiTrig-phiAssoc;
+      if(deltaPhi < -TMath::PiOver2())  deltaPhi+=TMath::TwoPi();
+      if(deltaPhi > 3*TMath::PiOver2()) deltaPhi-=TMath::TwoPi();
+      deltaEta = etaTrig-etaAssoc;
+      
+      if(GetDebug()>0)
+        printf("AliAnaParticleHadronCorrelationNew::MakeChargedMixCorrelation(): deltaPhi= %f, deltaEta=%f\n",deltaPhi, deltaEta);
+      
+      // Set the pt associated bin for the defined bins
+      Int_t assocBin   = -1; 
+      for(Int_t i = 0 ; i < fNAssocPtBins ; i++)
+      {
+        if(ptAssoc > fAssocPtBinLimit[i] && ptAssoc < fAssocPtBinLimit[i+1]) assocBin= i; 
+      }      
+
+      // Assign to the histogram array a bin corresponding to a combination of pTa and vz bins
+      Int_t nz = 1;
+      Int_t vz = 0;
+      
+      if(fCorrelVzBin) 
+      {
+        nz = GetNZvertBin();
+        vz = GetEventVzBin();
+      }
+      
+      Int_t bin = assocBin*nz+vz;
+      
+      fhMixDeltaPhiCharged        ->Fill(ptTrig,  deltaPhi);
+      fhMixDeltaPhiDeltaEtaCharged->Fill(deltaPhi, deltaEta);
+
+      fhMixDeltaPhiCharged        ->Fill(ptTrig,  deltaPhi);
+      fhMixDeltaPhiDeltaEtaCharged->Fill(deltaPhi, deltaEta);
+
+      xE   =-ptAssoc/ptTrig*TMath::Cos(deltaPhi); // -(px*pxTrig+py*pyTrig)/(ptTrig*ptTrig);
+      //if(xE <0.)xE =-xE;
+      if(xE > 0 ) hbpXE = TMath::Log(1./xE); 
+      else        hbpXE =-100;
+
+      if ( (deltaPhi > fDeltaPhiMinCut)   && (deltaPhi < fDeltaPhiMaxCut)   )
+      {
+        fhMixXECharged->Fill(ptTrig,xE);
+        fhMixHbpXECharged->Fill(ptTrig,hbpXE);
+      }
+      
+      if ( (deltaPhi > fUeDeltaPhiMinCut) && (deltaPhi < fUeDeltaPhiMaxCut) )
+      {
+        //Underlying event region
+        Double_t randomphi = gRandom->Uniform(fDeltaPhiMinCut,fDeltaPhiMaxCut);
+        Double_t uexE = -(ptAssoc/ptTrig)*TMath::Cos(randomphi);
         
-        if(GetDebug() > 1)
-          printf("AliAnaParticleHadronCorrelation::MakeNeutralCorrelationFillHistograms() - Photon1 = %f, Photon2 = %f \n", ptDecay1, ptDecay2);
+        if(uexE < 0.) uexE = -uexE;
         
-      } //photonAOD loop        
-    } //index of decay photons found
-    
-    if(ptTrig && bFillHisto) fhPtPi0DecayRatio->Fill(ptTrig, ptDecay1/ptTrig, ptDecay2/ptTrig);
+        fhMixXEUeCharged->Fill(ptTrig,uexE);
+      }
+      
+      if(bin < 0) continue ; // this pt bin was not considered
+      
+      if(TMath::Abs(deltaEta) > 0.8) 
+        fhMixDeltaPhiChargedAssocPtBinDEta08  [bin]->Fill(ptTrig,   deltaPhi);
+      if(TMath::Abs(deltaEta) < 0.01) 
+        fhMixDeltaPhiChargedAssocPtBinDEta0   [bin]->Fill(ptTrig,   deltaPhi);
+      
+        fhMixDeltaPhiChargedAssocPtBin        [bin]->Fill(ptTrig,   deltaPhi);
+        fhMixDeltaPhiDeltaEtaChargedAssocPtBin[bin]->Fill(deltaPhi, deltaEta);
+      
+    } // track loop
+  } // mixed event loop
+}
+  
+
+//________________________________________________________________________________________________________________
+Bool_t  AliAnaParticleHadronCorrelation::MakeNeutralCorrelation(AliAODPWG4ParticleCorrelation * const aodParticle, 
+                                                                const TObjArray* pi0list, Bool_t bFillHisto)  
+{  
+  // Neutral Pion Correlation Analysis
+  if(GetDebug() > 1) printf("AliAnaParticleHadronCorrelation::MakeNeutralCorrelation() - Make trigger particle - pi0 correlation, %d pi0's \n",
+                            pi0list->GetEntriesFast());
+  
+  Int_t evtIndex11 = 0 ; 
+  Int_t evtIndex12 = 0 ; 
+  if (GetMixedEvent()) 
+  {
+    evtIndex11 = GetMixedEvent()->EventIndexForCaloCluster(aodParticle->GetCaloLabel(0)) ;
+    evtIndex12 = GetMixedEvent()->EventIndexForCaloCluster(aodParticle->GetCaloLabel(1)) ;    
+  }  
+  
+  Float_t pt   = -100. ;
+  Float_t zT   = -100. ; 
+  Float_t phi  = -100. ;
+  Float_t eta  = -100. ;
+  Float_t xE   = -100. ; 
+  Float_t hbpXE= -100. ; 
+  Float_t hbpZT= -100. ; 
 
-  } //make decay-hadron correlation
+  Float_t ptTrig  = aodParticle->Pt();
+  Float_t phiTrig = aodParticle->Phi();
+  Float_t etaTrig = aodParticle->Eta();
+  Float_t deltaPhi= -100. ;
+
+  TLorentzVector photonMom ;
+       
+  // In case of pi0/eta trigger, we may want to check their decay correlation, 
+  // get their decay children
+  TLorentzVector decayMom1;
+  TLorentzVector decayMom2;
+  Bool_t decayFound = kFALSE;
+  if(fPi0Trigger && bFillHisto) decayFound = GetDecayPhotonMomentum(aodParticle,decayMom1, decayMom2);  
   
-  TObjArray * refpi0    =0x0;
-  Int_t nrefs = 0;
+  TObjArray * refpi0 0x0;
+  Int_t nrefs        = 0;
   
   //Loop on stored AOD pi0
   
@@ -1374,98 +3395,60 @@ Bool_t  AliAnaParticleHadronCorrelation::MakeNeutralCorrelation(AliAODPWG4Partic
           evtIndex11 == evtIndex3 || evtIndex12 == evtIndex3) // trigger and pi0 are not from different events
         continue ; 
     }      
-    
-    //Int_t pdg = pi0->GetPdg();
-    //if(pdg != AliCaloPID::kPi0) continue;  
-    
+
     pt  = pi0->Pt();
-    px  = pi0->Px();
-    py  = pi0->Py();    
-    
+     
     if(pt < fMinAssocPt || pt > fMaxAssocPt) continue ;
     
-    //jumped out this event if near side associated particle pt larger than trigger
-    if(pt > ptTrig && TMath::Abs(phi-phiTrig)<TMath::PiOver2())  break ;
-    
-    //Selection within angular range
-    phi = pi0->Phi();
-    //Float_t deltaPhi = TMath::Abs(phiTrig-phi);
-    //if( (deltaPhi < fDeltaPhiMinCut) || ( deltaPhi > fDeltaPhiMaxCut) ) continue ;
+    //jump out this event if near side associated particle pt larger than trigger
+    if (fMakeNearSideLeading)
+    {
+      if(pt > ptTrig && TMath::Abs(phi-phiTrig) < TMath::PiOver2())  return kFALSE;
+    }
+    //jump out this event if there is any other particle with pt larger than trigger
+    else if(fMakeAbsoluteLeading)
+    {
+      if(pt > ptTrig)  return kFALSE;
+    }
     
     if(bFillHisto)
     {
-      
-      deltaPhi = phiTrig-phi;
-      if(deltaPhi<-TMath::PiOver2()) deltaPhi+=TMath::TwoPi();
-      if(deltaPhi>3*TMath::PiOver2()) deltaPhi-=TMath::TwoPi();
-      
-      rat = pt/ptTrig ;
       phi = pi0->Phi() ;
       eta = pi0->Eta() ;
-           
-      rat  = pt/ptTrig ;
-      xE   =-pt/ptTrig*TMath::Cos(deltaPhi); // -(px*pxTrig+py*pyTrig)/(ptTrig*ptTrig);
+      
+      FillNeutralAngularCorrelationHistograms(pt, ptTrig, phi, phiTrig, deltaPhi, eta, etaTrig);
+      
+      zT  = pt/ptTrig ;
+      xE  =-pt/ptTrig*TMath::Cos(deltaPhi); // -(px*pxTrig+py*pyTrig)/(ptTrig*ptTrig);
+      
       //if(xE <0.)xE =-xE;
-      cosi = -100;
-      if(xE > 0 ) cosi = TMath::Log(1./xE); 
       
-      if(fPi0Trigger)
-      {
-        if(indexPhoton1!=-1 && indexPhoton2!=-1)
-        {
-          if(ptDecay1) ratDecay1 = pt/ptDecay1 ;
-          if(ptDecay2) ratDecay2 = pt/ptDecay2 ; 
-          deltaPhiDecay1 = phiDecay1-phi;
-          deltaPhiDecay2 = phiDecay2-phi;
-          if(deltaPhiDecay1< -TMath::PiOver2()) deltaPhiDecay1+=TMath::TwoPi();
-          if(deltaPhiDecay1>3*TMath::PiOver2()) deltaPhiDecay1-=TMath::TwoPi();
-          if(deltaPhiDecay2< -TMath::PiOver2()) deltaPhiDecay2+=TMath::TwoPi();
-          if(deltaPhiDecay2>3*TMath::PiOver2()) deltaPhiDecay2-=TMath::TwoPi();   
-          fhDeltaPhiDecayNeutral->Fill(ptDecay1, deltaPhiDecay1);
-          fhDeltaPhiDecayNeutral->Fill(ptDecay2, deltaPhiDecay2);
-          if(GetDebug() > 1)printf("AliAnaParticleHadronCorrelation::MakeNeutralCorrelation() - deltaPhoton1 = %f, deltaPhoton2 = %f \n", deltaPhiDecay1, deltaPhiDecay2);
-          if( (deltaPhiDecay1 > fDeltaPhiMinCut) && ( deltaPhiDecay1 < fDeltaPhiMaxCut) )
-            fhPtImbalanceDecayNeutral->Fill(ptDecay1,ratDecay1); 
-          if( (deltaPhiDecay2 > fDeltaPhiMinCut) && ( deltaPhiDecay2 < fDeltaPhiMaxCut) )
-            fhPtImbalanceDecayNeutral->Fill(ptDecay2,ratDecay2);
-          if(GetDebug() > 1)printf("AliAnaParticleHadronCorrelation::MakeNeutralCorrelation() - ratPhoton1 = %f, ratPhoton2 = %f \n", pt/ptDecay1, pt/ptDecay2);
-        }
-      } //do decay-hadron correlation
+      hbpXE = -100;
+      hbpZT = -100;
+      
+      if(xE > 0 ) hbpXE = TMath::Log(1./xE); 
+      if(zT > 0 ) hbpZT = TMath::Log(1./zT); 
       
-      fhEtaNeutral->Fill(pt,eta);
-      fhPhiNeutral->Fill(pt,phi);
-      fhDeltaEtaNeutral->Fill(ptTrig,etaTrig-eta);
-      fhDeltaPhiNeutral->Fill(ptTrig,deltaPhi);
-      fhDeltaPhiDeltaEtaNeutral->Fill(deltaPhi,etaTrig-eta);
+      if(fPi0Trigger && decayFound)
+        FillDecayPhotonCorrelationHistograms(pt, phi, decayMom1,decayMom2,kFALSE) ;
       
       //delta phi cut for correlation
       if( (deltaPhi > fDeltaPhiMinCut) && ( deltaPhi < fDeltaPhiMaxCut) ) 
       {
         fhDeltaPhiNeutralPt->Fill(pt,deltaPhi);
-        fhPtImbalanceNeutral->Fill(ptTrig,rat); 
-        fhPtHbpNeutral->Fill(ptTrig,cosi); 
+        fhXENeutral        ->Fill(ptTrig,xE); 
+        fhPtHbpXENeutral   ->Fill(ptTrig,hbpXE); 
       }
-      else 
+      else if ( (deltaPhi > fUeDeltaPhiMinCut) && (deltaPhi < fUeDeltaPhiMaxCut) )      
       {
         fhDeltaPhiUeNeutralPt->Fill(pt,deltaPhi);
-        fhPtImbalanceUeNeutral->Fill(ptTrig,rat);
-        fhPtHbpUeNeutral->Fill(ptTrig,cosi); 
+        fhXEUeNeutral        ->Fill(ptTrig,xE);
+        fhPtHbpXEUeNeutral   ->Fill(ptTrig,hbpXE); 
       }
+      
       //several UE calculation 
-      if(fMakeSeveralUE){
-        if((deltaPhi<-fUeDeltaPhiMinCut) && (deltaPhi >-fUeDeltaPhiMaxCut))
-        {  
-          fhDeltaPhiUeLeftNeutral->Fill(pt,deltaPhi);
-          fhPtImbalanceUeLeftNeutral->Fill(ptTrig,rat);
-          fhPtHbpUeLeftNeutral->Fill(ptTrig,cosi);
-        }
-        if((deltaPhi>fUeDeltaPhiMinCut) && (deltaPhi <fUeDeltaPhiMaxCut))
-        {  
-          fhDeltaPhiUeRightNeutral->Fill(pt,deltaPhi);
-          fhPtImbalanceUeRightNeutral->Fill(ptTrig,rat);
-          fhPtHbpUeRightNeutral->Fill(ptTrig,cosi);
-        }
-      } //several UE calculation
+      if(fMakeSeveralUE) FillChargedUnderlyingEventSidesHistograms(ptTrig,pt,deltaPhi);
+
          }
     else
     {
@@ -1491,6 +3474,7 @@ Bool_t  AliAnaParticleHadronCorrelation::MakeNeutralCorrelation(AliAODPWG4Partic
 void  AliAnaParticleHadronCorrelation::MakeMCChargedCorrelation(AliAODPWG4ParticleCorrelation *aodParticle)
 {  
   // Charged Hadron Correlation Analysis with MC information
+  
   if(GetDebug()>1)
     printf("AliAnaParticleHadronCorrelation::MakeMCChargedCorrelation() - Make trigger particle - charged hadron correlation in AOD MC level\n");
   
@@ -1504,27 +3488,10 @@ void  AliAnaParticleHadronCorrelation::MakeMCChargedCorrelation(AliAODPWG4Partic
   Double_t ptprim  = 0 ;
   Double_t phiprim = 0 ;
   Double_t etaprim = 0 ;
-  Double_t pxprim  = 0 ;
-  Double_t pyprim  = 0 ;
-  Double_t pzprim  = 0 ;
   Int_t    nTracks = 0 ;  
   Int_t iParticle  = 0 ;
   Double_t charge  = 0.;
   
-  Double_t mcrat   =-100 ;
-  Double_t mcxE    =-100 ;
-  Double_t mccosi  =-100 ;
-  Double_t mcdeltaPhi = -100. ;
-
-  //Track loop, select tracks with good pt, phi and fill AODs or histograms
-  //Int_t currentIndex = -1 ; 
-  Double_t mcTrackPt  = 0 ;
-  Double_t mcTrackPhi = 0 ;
-  Double_t mcTrackEta = 0 ;
-  Double_t mcTrackPx  = 0 ;
-  Double_t mcTrackPy  = 0 ;
-  Double_t mcTrackPz  = 0 ;
-
   if(GetReader()->ReadStack())
   {
     nTracks = GetMCStack()->GetNtrack() ;
@@ -1536,15 +3503,17 @@ void  AliAnaParticleHadronCorrelation::MakeMCChargedCorrelation(AliAODPWG4Partic
   //Int_t trackIndex[nTracks];
   
   Int_t label= aodParticle->GetLabel();
-  if(label<0){
-    printf("AliAnaParticleHadronCorrelation::MakeMCChargedCorrelation *** bad label ***:  label %d \n", label);
+  if(label < 0)
+  {
+    if(GetDebug() > 0) printf("AliAnaParticleHadronCorrelation::MakeMCChargedCorrelation *** bad label ***:  label %d \n", label);
     return;
   }  
   
   if(GetReader()->ReadStack())
   {
     stack =  GetMCStack() ;
-    if(!stack) {
+    if(!stack) 
+    {
       printf(" AliAnaParticleHadronCorrelation::MakeMCChargedCorrelation- Stack not available, is the MC handler called? STOP\n");
       abort();
     }
@@ -1563,107 +3532,62 @@ void  AliAnaParticleHadronCorrelation::MakeMCChargedCorrelation(AliAODPWG4Partic
       return;
     }
     
-    eprim    = primary->Energy();
-    ptprim   = primary->Pt();
-    phiprim  = primary->Phi();
-    etaprim  = primary->Eta();
-    pxprim   = primary->Px();
-    pyprim   = primary->Py();
-    pzprim   = primary->Pz(); 
-    
     if(primary)
     {
+      eprim    = primary->Energy();
+      ptprim   = primary->Pt();
+      phiprim  = primary->Phi();
+      etaprim  = primary->Eta();
+      
+      if(ptprim < 0.01 || eprim < 0.01) return ;
+      
       for (iParticle = 0 ; iParticle <  nTracks ; iParticle++) 
       {
         TParticle * particle = stack->Particle(iParticle);
         TLorentzVector momentum;
+        
         //keep only final state particles
         if(particle->GetStatusCode()!=1) continue ;
-        Int_t pdg = particle->GetPdgCode();                                            
+        
+        Int_t pdg = particle->GetPdgCode();    
+        
         charge = TDatabasePDG::Instance()->GetParticle(pdg)->Charge();
-        particle->Momentum(momentum);
+        
+        particle->Momentum(momentum);  
         
         //---------- Charged particles ----------------------
         if(charge != 0)
         {   
           //Particles in CTS acceptance
           Bool_t inCTS =  GetFiducialCut()->IsInFiducialCut(momentum,"CTS");
+          
           if(TMath::Abs(pdg) == 11 && stack->Particle(particle->GetFirstMother())->GetPdgCode()==22) continue ;
+          
           if(inCTS)
           {            
-            mcTrackPt  = particle->Pt();
-            mcTrackPhi = particle->Phi();
-            mcTrackEta = particle->Eta();
-            mcTrackPx  = particle->Px();
-            mcTrackPy  = particle->Py();
-            mcTrackPz  = particle->Pz();              
-            if(mcTrackPhi < 0) mcTrackPhi+=TMath::TwoPi();    
-            
-            //Select only hadrons in pt range
-            if(mcTrackPt < fMinAssocPt || mcTrackPt > fMaxAssocPt) continue ;
-            
-            //remove trigger itself for correlation when use charged triggers 
-            if(label==iParticle && 
-               TMath::Abs(mcTrackPt -ptprim ) < 1e-6 && 
-               TMath::Abs(mcTrackPhi-phiprim) < 1e-6 && 
-               TMath::Abs(mcTrackEta-etaprim) < 1e-6) 
-              continue ;       
-            
-            //jumped out this event if near side associated partile pt larger than trigger
-            if( mcTrackPt > ptprim && TMath::Abs(mcTrackPhi-phiprim) < TMath::PiOver2()) 
-              return ;
-            
-            mcdeltaPhi= phiprim-mcTrackPhi; 
-            if(mcdeltaPhi <= -TMath::PiOver2()) mcdeltaPhi+=TMath::TwoPi();
-            if(mcdeltaPhi > 3*TMath::PiOver2()) mcdeltaPhi-=TMath::TwoPi();            
-            
-            mcrat     = mcTrackPt/ptprim ;
-            mcdeltaPhi= phiprim-mcTrackPhi; 
-            mcxE      =-mcTrackPt/ptprim*TMath::Cos(mcdeltaPhi);// -(mcTrackPx*pxprim+mcTrackPy*pyprim)/(ptprim*ptprim);
-            mccosi    =-100 ;
-            if(mcxE > 0 ) mccosi = TMath::Log(1./mcxE);
-            
-            // printf("rat = %f, xE = %f, cosi =%f \n", rat, xE, cosi);
-            // printf("phi = %f \n", phi);
-            
-            //Selection within angular range
-            if( mcdeltaPhi< -TMath::PiOver2())  mcdeltaPhi+=TMath::TwoPi();
-            if( mcdeltaPhi>3*TMath::PiOver2())  mcdeltaPhi-=TMath::TwoPi();              
-            Double_t mcpout = mcTrackPt*TMath::Sin(mcdeltaPhi) ;              
-            if(GetDebug()>0 )  
-              printf("AliAnaParticleHadronCorrelation::MakeMCChargedCorrelation() - Charged hadron: track Pt %f, track Phi %f, phi trigger %f. Cuts:  delta phi  %2.2f < %2.2f < %2.2f, pT min %2.2f \n",
-                     mcTrackPt,mcTrackPhi, phiprim,fDeltaPhiMinCut, mcdeltaPhi, fDeltaPhiMaxCut, GetMinPt());              
-            // Fill Histograms
-            fhMCEtaCharged->Fill(mcTrackPt,mcTrackEta);
-            fhMCPhiCharged->Fill(mcTrackPt,mcTrackPhi);
-            fhMCDeltaEtaCharged->Fill(ptprim,etaprim-mcTrackEta);
-            fhMCDeltaPhiCharged->Fill(ptprim,mcdeltaPhi);
-            fhMCPtAssocDeltaPhi->Fill(mcTrackPt, mcdeltaPhi);
-            fhMCDeltaPhiDeltaEtaCharged->Fill(mcdeltaPhi,etaprim-mcTrackEta);
-            
-            //delta phi cut for correlation
-            if( (mcdeltaPhi > fDeltaPhiMinCut) && ( mcdeltaPhi < fDeltaPhiMaxCut) ) {
-              fhMCDeltaPhiChargedPt->Fill(mcTrackPt,mcdeltaPhi);
-              fhMCPtImbalanceCharged->Fill(ptprim,mcxE); 
-              fhMCPtHbpCharged->Fill(ptprim,mccosi);
-              fhMCPtTrigPout->Fill(ptprim, mcpout) ;
-            }//delta phi cut for correlation
-          } //tracks after cuts
-        }//Charged
+            if( label!=iParticle) // avoid trigger particle
+            {
+              if(!FillChargedMCCorrelationHistograms(particle->Pt(),particle->Phi(),particle->Eta(),ptprim,phiprim,etaprim)) return;
+            }
+          }// in CTS acceptance
+        }// charged
       } //track loop
     } //when the leading particles could trace back to MC
   } //ESD MC
+  
   else if(GetReader()->ReadAODMCParticles())
   {
     //Get the list of MC particles
-    mcparticles0 = GetReader()->GetAODMCParticles(0);
+    mcparticles0 = GetReader()->GetAODMCParticles();
     if(!mcparticles0) return;
+    
     if(label >=mcparticles0->GetEntriesFast())
     {
       if(GetDebug() > 2)  
         printf("AliAnaParticleHadronCorrelation::MakeMCChargedCorrelation *** large label ***:  label %d, n tracks %d \n", label,mcparticles0->GetEntriesFast());
       return;
     }
+    
     //Get the particle
     aodprimary = (AliAODMCParticle*) mcparticles0->At(label);
     if(!aodprimary)  
@@ -1672,22 +3596,28 @@ void  AliAnaParticleHadronCorrelation::MakeMCChargedCorrelation(AliAODPWG4Partic
       return;
     }
     
-    ptprim  = aodprimary->Pt();
-    phiprim = aodprimary->Phi();
-    etaprim = aodprimary->Eta();
-    pxprim  = aodprimary->Px();
-    pyprim  = aodprimary->Py();
-    pzprim  = aodprimary->Pz();  
     if(aodprimary)
     {
+      ptprim  = aodprimary->Pt();
+      phiprim = aodprimary->Phi();
+      etaprim = aodprimary->Eta();
+      eprim   = aodprimary->E();
+      
+      Bool_t lead = kFALSE;
+      
+      if(ptprim < 0.01 || eprim < 0.01) return ;
+      
       mcparticles= GetReader()->GetAODMCParticles();
-      for (Int_t i=0; i<nTracks;i++) 
+      for (iParticle = 0; iParticle < nTracks; iParticle++) 
       {
-        AliAODMCParticle *part = (AliAODMCParticle*) mcparticles->At(i);
+        AliAODMCParticle *part = (AliAODMCParticle*) mcparticles->At(iParticle);
+        
         if (!part->IsPhysicalPrimary()) continue;        
+   
         Int_t pdg = part->GetPdgCode();        
         charge = TDatabasePDG::Instance()->GetParticle(pdg)->Charge();
-        TLorentzVector momentum(part->Px(),part->Py(),part->Pz(),part->E());        
+        TLorentzVector momentum(part->Px(),part->Py(),part->Pz(),part->E());   
+        
         if(charge != 0)
         {
           if(part->Pt()> GetReader()->GetCTSPtMin())
@@ -1695,6 +3625,7 @@ void  AliAnaParticleHadronCorrelation::MakeMCChargedCorrelation(AliAODPWG4Partic
             //Particles in CTS acceptance
             Bool_t inCTS =  GetFiducialCut()->IsInFiducialCut(momentum,"CTS");
             Int_t indexmother=part->GetMother();
+            
             if(indexmother>-1)
             {
               Int_t mPdg = ((AliAODMCParticle*) mcparticles->At(indexmother)) ->GetPdgCode();
@@ -1703,66 +3634,21 @@ void  AliAnaParticleHadronCorrelation::MakeMCChargedCorrelation(AliAODPWG4Partic
             
             if(inCTS)
             {            
-              mcTrackPt  =part->Pt();
-              mcTrackPhi =part->Phi();
-              mcTrackEta =part->Eta();
-              mcTrackPx  =part->Px();
-              mcTrackPy  =part->Py();
-              mcTrackPz  =part->Pz();              
-              if(mcTrackPhi < 0) mcTrackPhi+=TMath::TwoPi();   
-              
-              //Select only hadrons in pt range
-              if(mcTrackPt < GetMinPt() || mcTrackPt > GetMaxPt()) continue ;
-              
-              //remove trigger itself for correlation when use charged triggers 
-              if(label==i && 
-                 TMath::Abs(mcTrackPt -ptprim ) < 1e-6 && 
-                 TMath::Abs(mcTrackPhi-phiprim) < 1e-6 && 
-                 TMath::Abs(mcTrackEta-etaprim) < 1e-6) continue ;  
-              
-              //jumped out this event if near side associated partile pt larger than trigger
-              if( mcTrackPt> ptprim && TMath::Abs(mcTrackPhi-phiprim)<TMath::PiOver2()) 
-                return ;
-              
-              mcdeltaPhi= phiprim-mcTrackPhi; 
-              if(mcdeltaPhi <= -TMath::PiOver2()) mcdeltaPhi+=TMath::TwoPi();
-              if(mcdeltaPhi > 3*TMath::PiOver2()) mcdeltaPhi-=TMath::TwoPi();
-              
-              mcrat     = mcTrackPt/ptprim ;
-              mcxE      =-mcTrackPt/ptprim*TMath::Cos(mcdeltaPhi);// -(mcTrackPx*pxprim+mcTrackPy*pyprim)/(ptprim*ptprim);
-              mccosi    =-100 ;
-              if(mcxE > 0 ) mccosi = TMath::Log(1./mcxE);
-              
-              //Selection within angular range
-              if( mcdeltaPhi< -TMath::PiOver2())  mcdeltaPhi+=TMath::TwoPi();
-              if( mcdeltaPhi>3*TMath::PiOver2())  mcdeltaPhi-=TMath::TwoPi();              
-              Double_t mcpout = mcTrackPt*TMath::Sin(mcdeltaPhi) ;              
-              if(GetDebug()>0)  
-                printf("AliAnaParticleHadronCorrelation::MakeMCChargedCorrelation() - Charged hadron: track Pt %f, track Phi %f, phi trigger %f. Cuts:  delta phi  %2.2f < %2.2f < %2.2f, pT min %2.2f \n",
-                       mcTrackPt,mcTrackPhi, phiprim,fDeltaPhiMinCut, mcdeltaPhi, fDeltaPhiMaxCut, GetMinPt());              
-
-              // Fill Histograms
-
-              fhMCEtaCharged     ->Fill(mcTrackPt,mcTrackEta);
-              fhMCPhiCharged     ->Fill(mcTrackPt,mcTrackPhi);
-              fhMCDeltaEtaCharged->Fill(ptprim,etaprim-mcTrackEta);
-              fhMCDeltaPhiCharged->Fill(ptprim,mcdeltaPhi);
-              fhMCPtAssocDeltaPhi->Fill(mcTrackPt, mcdeltaPhi);
-              fhMCDeltaPhiDeltaEtaCharged->Fill(mcdeltaPhi,etaprim-mcTrackEta);
-              
-              //delta phi cut for correlation
-              if( (mcdeltaPhi > fDeltaPhiMinCut) && ( mcdeltaPhi < fDeltaPhiMaxCut) ) {
-                fhMCDeltaPhiChargedPt ->Fill(mcTrackPt,mcdeltaPhi);
-                fhMCPtImbalanceCharged->Fill(ptprim,mcxE); 
-                fhMCPtHbpCharged      ->Fill(ptprim,mccosi);
-                fhMCPtTrigPout        ->Fill(ptprim, mcpout) ;
-              }//delta phi cut for correlation
-              
-            } //tracks after cuts
-            
-          } //with minimum pt cut
+              if( label!=iParticle) // avoid trigger particle
+              {
+                if(!FillChargedMCCorrelationHistograms(part->Pt(),part->Phi(),part->Eta(),ptprim,phiprim,etaprim)) return;
+                else lead = kTRUE;
+              }
+            } // in acceptance
+          } // min pt cut
         } //only charged particles
-      }  //MC particle loop      
+      }  //MC particle loop 
+      if (lead) 
+      {
+        fhMCPtLeading->Fill(ptprim);
+        fhMCPhiLeading->Fill(ptprim,phiprim);
+        fhMCEtaLeading->Fill(ptprim,etaprim);
+      }
     } //when the leading particles could trace back to MC
   }// AOD MC
 }
@@ -1788,7 +3674,8 @@ void AliAnaParticleHadronCorrelation::Print(const Option_t * opt) const
   printf("Several UE?  %d\n"           , fMakeSeveralUE) ;
   printf("Name of AOD Pi0 Branch %s \n", fPi0AODBranchName.Data());
   printf("Do Decay-hadron correlation ?  %d\n", fPi0Trigger) ;
-  printf("Select absolute leading for cluster triggers ?  %d\n", fMakeAbsoluteLeading) ;
+  printf("Select absolute leading for cluster triggers ?  %d or Near Side %d\n", 
+         fMakeAbsoluteLeading, fMakeNearSideLeading) ;
   printf("Trigger pt bins  %d\n", fNAssocPtBins) ;
   for (Int_t ibin = 0; ibin<fNAssocPtBins; ibin++) {
     printf("\t bin %d = [%2.1f,%2.1f]\n", ibin, fAssocPtBinLimit[ibin], fAssocPtBinLimit[ibin+1]) ;
@@ -1804,14 +3691,14 @@ void AliAnaParticleHadronCorrelation::SetNAssocPtBins(Int_t n)
   fNAssocPtBins  = n ; 
   
   
-  if(n < 10 && n > 0)
+  if(n < 20 && n > 0)
   {
     fNAssocPtBins  = n ; 
   }
   else 
   {
-    printf("n = larger than 9 or too small, set to 9 \n");
-    fNAssocPtBins = 9;
+    printf("n = larger than 19 or too small, set to 19 \n");
+    fNAssocPtBins = 19;
   }
 }
 
@@ -1824,9 +3711,9 @@ void AliAnaParticleHadronCorrelation::SetAssocPtBinLimit(Int_t ibin, Float_t pt)
   {
     fAssocPtBinLimit[ibin] = pt  ;
   }
-  else {
+  else 
+  {
     printf("AliAnaParticleHadronCorrelation::SetAssocPtBinLimit() - bin  number too large %d > %d or small, nothing done\n", ibin, fNAssocPtBins) ; 
-    
   }
 }