]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGHF/vertexingHF/AliAnalysisTaskSEDvsMultiplicity.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGHF / vertexingHF / AliAnalysisTaskSEDvsMultiplicity.cxx
old mode 100644 (file)
new mode 100755 (executable)
index 5b73c6e..39b4ad1
@@ -30,7 +30,7 @@
 #include <TH2F.h>     
 #include <TH3F.h>
 #include <THnSparse.h>
-#include <TProfile.h>  
+#include <TProfile.h>
 #include "AliAnalysisManager.h"
 #include "AliRDHFCuts.h"
 #include "AliRDHFCutsDplustoKpipi.h"
@@ -47,6 +47,8 @@
 #include "AliAnalysisTaskSEDvsMultiplicity.h"
 #include "AliNormalizationCounter.h"
 #include "AliVertexingHFUtils.h"
+#include "AliAODVZERO.h"
+#include "AliESDUtils.h"
 ClassImp(AliAnalysisTaskSEDvsMultiplicity)
 
 
@@ -58,8 +60,33 @@ AliAnalysisTaskSE(),
   fOutputCounters(0),
   fListProfiles(0),
   fHistNEvents(0),
-  fHistNtrEta16vsNtrEta1(0),
-  fHistNtrCorrEta1vsNtrRawEta1(0),
+  fHistNtrEta16vsNtrEta1EvSel(0),
+  fHistNtrEta05vsNtrEta1EvSel(0),
+  fHistNtrEta03vsNtrEta1EvSel(0),
+  fHistNtrEtaV0AvsNtrEta1EvSel(0),
+  fHistNtrEtaV0MvsNtrEta1EvSel(0),
+  fHistNtrEtaV0AvsV0AEqEvSel(0),
+  fHistNtrEtaV0MvsV0MEqEvSel(0),
+  fHistNtrCorrEta1vsNtrRawEta1EvSel(0),
+  fHistMultCorrvsMultRawEvSel(0),
+  fHistNtrEta16vsNtrEta1EvWithCand(0),
+  fHistNtrEta05vsNtrEta1EvWithCand(0),
+  fHistNtrEta03vsNtrEta1EvWithCand(0),
+  fHistNtrEtaV0AvsNtrEta1EvWithCand(0),
+  fHistNtrEtaV0MvsNtrEta1EvWithCand(0),
+  fHistNtrEtaV0AvsV0AEqEvWithCand(0),
+  fHistNtrEtaV0MvsV0MEqEvWithCand(0),
+  fHistNtrCorrEta1vsNtrRawEta1EvWithCand(0),
+  fHistMultCorrvsMultRawEvWithCand(0),
+  fHistNtrEta16vsNtrEta1EvWithD(0),
+  fHistNtrEta05vsNtrEta1EvWithD(0),
+  fHistNtrEta03vsNtrEta1EvWithD(0),
+  fHistNtrEtaV0AvsNtrEta1EvWithD(0),
+  fHistNtrEtaV0MvsNtrEta1EvWithD(0),
+  fHistNtrEtaV0AvsV0AEqEvWithD(0),
+  fHistNtrEtaV0MvsV0MEqEvWithD(0),
+  fHistNtrCorrEta1vsNtrRawEta1EvWithD(0),
+  fHistMultCorrvsMultRawEvWithD(0),
   fHistNtrVsZvtx(0),
   fHistNtrCorrVsZvtx(0),
   fHistNtrVsNchMC(0),
@@ -70,6 +97,17 @@ AliAnalysisTaskSE(),
   fHistNtrCorrVsNchMCPhysicalPrimary(0),
   fHistGenPrimaryParticlesInelGt0(0),
   fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary(0),
+  fHistNtrUnCorrPSSel(0),
+  fHistNtrUnCorrPSTrigSel(0),
+  fHistNtrUnCorrPSTrigPileUpSel(0),
+  fHistNtrUnCorrPSTrigPileUpVtxSel(0),
+  fHistNtrUnCorrPSTrigPileUpVtxContSel(0),
+  fHistNtrUnCorrPSTrigPileUpVtxRangeSel(0),
+  fHistNtrUnCorrPSTrigPileUpVtxRangeCentrSel(0),
+  fHistNtrUnCorrEvSel(0),
+  fHistNtrUnCorrEvWithCand(0),
+  fHistNtrUnCorrEvWithD(0),
+  fHistNtrCorrPSSel(0),
   fHistNtrCorrEvSel(0),
   fHistNtrCorrEvWithCand(0),
   fHistNtrCorrEvWithD(0),
@@ -78,6 +116,7 @@ AliAnalysisTaskSE(),
   fPtVsMassVsMultUncorr(0),
   fPtVsMassVsMultPart(0),
   fPtVsMassVsMultAntiPart(0),
+  fPtVsMassVsMultMC(0),
   fUpmasslimit(1.965),
   fLowmasslimit(1.765),
   fNMassBins(200),
@@ -90,9 +129,18 @@ AliAnalysisTaskSE(),
   fHigherImpPar(2000.),
   fReadMC(kFALSE),
   fMCOption(0),
+  fisPPbData(kFALSE),
   fUseBit(kTRUE),
-  fRefMult(9.5),
-  fPdgMeson(411)
+  fSubtractTrackletsFromDau(kFALSE),
+  fKeepCorrPlots(kFALSE),
+  fUseNchWeight(kFALSE),
+  fHistoMCNch(0),
+  fHistoMeasNch(0),
+  fRefMult(9.26),
+  fPdgMeson(411),
+  fMultiplicityEstimator(kNtrk10),
+  fMCPrimariesEstimator(kEta10),
+  fDoVZER0ParamVertexCorr(0)
 {
    // Default constructor
   for(Int_t i=0; i<5; i++) fHistMassPtImpPar[i]=0;
@@ -100,15 +148,40 @@ AliAnalysisTaskSE(),
 }
 
 //________________________________________________________________________
-AliAnalysisTaskSEDvsMultiplicity::AliAnalysisTaskSEDvsMultiplicity(const char *name, Int_t pdgMeson,AliRDHFCuts *cuts):
+AliAnalysisTaskSEDvsMultiplicity::AliAnalysisTaskSEDvsMultiplicity(const char *name, Int_t pdgMeson,AliRDHFCuts *cuts, Bool_t switchPPb):
   AliAnalysisTaskSE(name),
   fOutput(0),
   fListCuts(0),
   fOutputCounters(0),
   fListProfiles(0),
   fHistNEvents(0),
-  fHistNtrEta16vsNtrEta1(0),
-  fHistNtrCorrEta1vsNtrRawEta1(0),
+  fHistNtrEta16vsNtrEta1EvSel(0),
+  fHistNtrEta05vsNtrEta1EvSel(0),
+  fHistNtrEta03vsNtrEta1EvSel(0),
+  fHistNtrEtaV0AvsNtrEta1EvSel(0),
+  fHistNtrEtaV0MvsNtrEta1EvSel(0),
+  fHistNtrEtaV0AvsV0AEqEvSel(0),
+  fHistNtrEtaV0MvsV0MEqEvSel(0),
+  fHistNtrCorrEta1vsNtrRawEta1EvSel(0),
+  fHistMultCorrvsMultRawEvSel(0),
+  fHistNtrEta16vsNtrEta1EvWithCand(0),
+  fHistNtrEta05vsNtrEta1EvWithCand(0),
+  fHistNtrEta03vsNtrEta1EvWithCand(0),
+  fHistNtrEtaV0AvsNtrEta1EvWithCand(0),
+  fHistNtrEtaV0MvsNtrEta1EvWithCand(0),
+  fHistNtrEtaV0AvsV0AEqEvWithCand(0),
+  fHistNtrEtaV0MvsV0MEqEvWithCand(0),
+  fHistNtrCorrEta1vsNtrRawEta1EvWithCand(0),
+  fHistMultCorrvsMultRawEvWithCand(0),
+  fHistNtrEta16vsNtrEta1EvWithD(0),
+  fHistNtrEta05vsNtrEta1EvWithD(0),
+  fHistNtrEta03vsNtrEta1EvWithD(0),
+  fHistNtrEtaV0AvsNtrEta1EvWithD(0),
+  fHistNtrEtaV0MvsNtrEta1EvWithD(0),
+  fHistNtrEtaV0AvsV0AEqEvWithD(0),
+  fHistNtrEtaV0MvsV0MEqEvWithD(0),
+  fHistNtrCorrEta1vsNtrRawEta1EvWithD(0),
+  fHistMultCorrvsMultRawEvWithD(0),
   fHistNtrVsZvtx(0),
   fHistNtrCorrVsZvtx(0),
   fHistNtrVsNchMC(0),
@@ -119,6 +192,17 @@ AliAnalysisTaskSEDvsMultiplicity::AliAnalysisTaskSEDvsMultiplicity(const char *n
   fHistNtrCorrVsNchMCPhysicalPrimary(0),
   fHistGenPrimaryParticlesInelGt0(0),
   fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary(0),
+  fHistNtrUnCorrPSSel(0),
+  fHistNtrUnCorrPSTrigSel(0),
+  fHistNtrUnCorrPSTrigPileUpSel(0),
+  fHistNtrUnCorrPSTrigPileUpVtxSel(0),
+  fHistNtrUnCorrPSTrigPileUpVtxContSel(0),
+  fHistNtrUnCorrPSTrigPileUpVtxRangeSel(0),
+  fHistNtrUnCorrPSTrigPileUpVtxRangeCentrSel(0),
+  fHistNtrUnCorrEvSel(0),
+  fHistNtrUnCorrEvWithCand(0),
+  fHistNtrUnCorrEvWithD(0),
+  fHistNtrCorrPSSel(0),
   fHistNtrCorrEvSel(0),
   fHistNtrCorrEvWithCand(0),
   fHistNtrCorrEvWithD(0),
@@ -127,6 +211,7 @@ AliAnalysisTaskSEDvsMultiplicity::AliAnalysisTaskSEDvsMultiplicity(const char *n
   fPtVsMassVsMultUncorr(0),
   fPtVsMassVsMultPart(0),
   fPtVsMassVsMultAntiPart(0),
+  fPtVsMassVsMultMC(0),
   fUpmasslimit(1.965),
   fLowmasslimit(1.765),
   fNMassBins(200),
@@ -139,24 +224,34 @@ AliAnalysisTaskSEDvsMultiplicity::AliAnalysisTaskSEDvsMultiplicity(const char *n
   fHigherImpPar(2000.),
   fReadMC(kFALSE),
   fMCOption(0),
+  fisPPbData(switchPPb),
   fUseBit(kTRUE),
-  fRefMult(9.5),
-  fPdgMeson(pdgMeson)
+  fSubtractTrackletsFromDau(kFALSE),
+  fKeepCorrPlots(kFALSE),
+  fUseNchWeight(kFALSE),
+  fHistoMCNch(0),
+  fHistoMeasNch(0),
+  fRefMult(9.26),
+  fPdgMeson(pdgMeson),
+  fMultiplicityEstimator(kNtrk10),
+  fMCPrimariesEstimator(kEta10),
+  fDoVZER0ParamVertexCorr(0)
 {
   // 
   // Standard constructor
   //
   for(Int_t i=0; i<5; i++) fHistMassPtImpPar[i]=0;
   for(Int_t i=0; i<4; i++) fMultEstimatorAvg[i]=0;
   if(fPdgMeson==413){
-    fNMassBins=200; // FIXME
-    SetMassLimits(0.,0.2); // FIXME
-  }else{ 
-    fNMassBins=200; 
+    fNMassBins=200;
+    SetMassLimits(0.12,0.2);
+  }else{
+    fNMassBins=200;
     SetMassLimits(fPdgMeson,0.1);
   }
   // Default constructor
-   // Output slot #1 writes into a TList container
+   // Otput slot #1 writes into a TList container
   DefineOutput(1,TList::Class());  //My private output
   // Output slot #2 writes cut to private output
   DefineOutput(2,TList::Class());
@@ -178,11 +273,16 @@ AliAnalysisTaskSEDvsMultiplicity::~AliAnalysisTaskSEDvsMultiplicity()
   delete fRDCutsAnalysis;
   delete fCounter;
   delete fCounterU;
-  for(Int_t i=0; i<4; i++) delete fMultEstimatorAvg[i];
+  for(Int_t i=0; i<4; i++) {
+      if (fMultEstimatorAvg[i]) delete fMultEstimatorAvg[i];
+  }
+  
   for(Int_t i=0; i<5; i++){
     delete fHistMassPtImpPar[i];
   }
-}  
+  if(fHistoMCNch) delete fHistoMCNch;
+  if(fHistoMeasNch) delete fHistoMeasNch;
+}
 
 //_________________________________________________________________
 void  AliAnalysisTaskSEDvsMultiplicity::SetMassLimits(Double_t lowlimit, Double_t uplimit){
@@ -206,8 +306,14 @@ void AliAnalysisTaskSEDvsMultiplicity::Init(){
   // Initialization
   //
   printf("AnalysisTaskSEDvsMultiplicity::Init() \n");
+
+  if(fUseNchWeight && !fReadMC){ AliFatal("Nch weights can only be used in MC mode"); return; }
+  if(fUseNchWeight && !fHistoMCNch){ AliFatal("Nch weights can only be used without histogram"); return; }
   
   fListCuts=new TList();
+  fListCuts->SetOwner();
+  fListCuts->SetName("CutsList");
+
 
   if(fPdgMeson==411){
      AliRDHFCutsDplustoKpipi* copycut=new AliRDHFCutsDplustoKpipi(*(static_cast<AliRDHFCutsDplustoKpipi*>(fRDCutsAnalysis)));
@@ -226,8 +332,12 @@ void AliAnalysisTaskSEDvsMultiplicity::Init(){
   
   fListProfiles = new TList();
   fListProfiles->SetOwner();
-  TString period[4]={"LHC10b","LHC10c","LHC10d","LHC10e"};
-  for(Int_t i=0; i<4; i++){
+  TString period[4];
+  Int_t nProfiles=4;
+  if (fisPPbData) {period[0]="LHC13b"; period[1]="LHC13c"; nProfiles = 2;}
+  else {period[0]="LHC10b"; period[1]="LHC10c"; period[2]="LHC10d"; period[3]="LHC10e"; nProfiles = 4;}
+  
+  for(Int_t i=0; i<nProfiles; i++){
     if(fMultEstimatorAvg[i]){
       TProfile* hprof=new TProfile(*fMultEstimatorAvg[i]);
       hprof->SetName(Form("ProfileTrkVsZvtx%s\n",period[i].Data()));
@@ -251,36 +361,148 @@ void AliAnalysisTaskSEDvsMultiplicity::UserCreateOutputObjects()
   fOutput->SetOwner();
   fOutput->SetName("OutputHistos");
 
-  fHistNtrCorrEvSel = new TH1F("hNtrCorrEvSel","Tracklets multiplicity for selected events; Tracklets ; Entries",200,0.,200.);
-  fHistNtrCorrEvWithCand = new TH1F("hNtrCorrEvWithCand", "Tracklets multiplicity for events with D candidates; Tracklets ; Entries",200,0.,200.);// Total multiplicity
-  fHistNtrCorrEvWithD = new TH1F("hNtrCorrEvWithD", "Tracklets multiplicity for events with D in mass region ; Tracklets ; Entries",200,0.,200.); // 
-  fHistNtrEta16vsNtrEta1 = new TH2F("hNtrEta16vsNtrEta1","Uncorrected Eta1.6 vs Eta1.0; Ntracklets #eta<1.0; Ntracklets #eta<1.6",200,-0.5,199.5,200,-0.5,199.5); //eta 1.6 vs eta 1.0 histogram 
-  fHistNtrCorrEta1vsNtrRawEta1 = new TH2F("hNtrCorrEta1vsNtrRawEta1","Corrected Eta1 vs Eta1.0; Ntracklets #eta<1.0 corrected; Ntracklets #eta<1",200,-0.,200.,200,-0.5,199.5); //eta 1.6 vs eta 1.0 histogram 
-  fHistNtrVsZvtx = new TH2F("hNtrVsZvtx","Ntracklet vs VtxZ; VtxZ;N_{tracklet};",300,-15,15,200,0,200.); // 
-  fHistNtrCorrVsZvtx = new TH2F("hNtrCorrVsZvtx","Ntracklet vs VtxZ; VtxZ;N_{tracklet};",300,-15,15,200,0,200.); // 
+  Int_t nMultBins = 200;
+  Float_t firstMultBin = -0.5;
+  Float_t lastMultBin = 199.5;
+  Int_t nMultBinsNtrk = nMultBins;
+  Float_t lastMultBinNtrk = lastMultBin;
+  Int_t nMultBinsV0 = 400;
+  Float_t lastMultBinV0 = 799.5;
+  const char *estimatorName="tracklets";
+  if(fisPPbData) {
+    nMultBinsNtrk = 375;
+    lastMultBinNtrk = 374.5;
+    nMultBins = nMultBinsNtrk;
+    lastMultBin = lastMultBinNtrk;
+  }
+  if(fMultiplicityEstimator==kVZERO || fMultiplicityEstimator==kVZEROA || fMultiplicityEstimator==kVZEROEq || fMultiplicityEstimator==kVZEROAEq) {
+    nMultBins = nMultBinsV0;
+    lastMultBin = lastMultBinV0;
+    estimatorName = "vzero";
+  }
 
-  fHistNtrVsNchMC = new TH2F("hNtrVsNchMC","Ntracklet vs NchMC; Nch;N_{tracklet};",200,0,200,200,0,200.); // 
-  fHistNtrCorrVsNchMC = new TH2F("hNtrCorrVsNchMC","Ntracklet vs Nch; Nch;N_{tracklet};",200,0,200,200,0,200.); // 
-  
-  fHistNtrVsNchMCPrimary = new TH2F("hNtrVsNchMCPrimary","Ntracklet vs Nch (Primary); Nch (Primary);N_{tracklet};",200,0,200,200,0,200.); // 
-  fHistNtrCorrVsNchMCPrimary = new TH2F("hNtrCorrVsNchMCPrimary","Ntracklet vs Nch (Primary); Nch(Primary) ;N_{tracklet};",200,0,200,200,0,200.); // 
+  fHistNtrUnCorrPSSel = new TH1F("hNtrUnCorrPSSel",Form("Uncorrected %s multiplicity for PS selected events; %s ; Entries",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin);
+  fHistNtrUnCorrPSTrigSel = new TH1F("hNtrUnCorrPSTrigSel",Form("Uncorrected %s multiplicity for PS + trigger name selected events; %s ; Entries",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin);
+  fHistNtrUnCorrPSTrigPileUpSel = new TH1F("hNtrUnCorrPSTrigPileUpSel",Form("Uncorrected %s multiplicity for PS + trigger name + pileup selected events; %s ; Entries",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin);
+  fHistNtrUnCorrPSTrigPileUpVtxSel = new TH1F("hNtrUnCorrPSTrigPileUpVtxSel",Form("Uncorrected %s multiplicity for PS + trigger name + pileup + with-vertex selected events; %s ; Entries",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin);
+  fHistNtrUnCorrPSTrigPileUpVtxContSel = new TH1F("hNtrUnCorrPSTrigPileUpVtxContSel",Form("Uncorrected %s multiplicity for PS + trigger name + pileup + with-vertex-contrib selected events; %s ; Entries",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin);
+  fHistNtrUnCorrPSTrigPileUpVtxRangeSel = new TH1F("hNtrUnCorrPSTrigPileUpVtxRangeSel",Form("Uncorrected %s multiplicity for PS + trigger name + pileup + with-vertex-contrib-range selected events; %s ; Entries",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin);
+  fHistNtrUnCorrPSTrigPileUpVtxRangeCentrSel = new TH1F("hNtrUnCorrPSTrigPileUpVtxRangeCentrSel",Form("Uncorrected %s multiplicity for PS + trigger name + pileup + with-vertex-contrib-range + centrality selected events; %s ; Entries",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin);
+  fHistNtrUnCorrEvSel = new TH1F("hNtrUnCorrEvSel",Form("Uncorrected %s multiplicity for selected events; %s ; Entries",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin);
+  fHistNtrUnCorrEvWithCand = new TH1F("hNtrUnCorrEvWithCand",Form("Uncorrected %s multiplicity for events with D candidates; %s ; Entries",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin);// Total multiplicity
+  fHistNtrUnCorrEvWithD = new TH1F("hNtrUnCorrEvWithD",Form("Uncorrected %s multiplicity for events with D in mass region ; %s ; Entries",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin); //
+  fHistNtrCorrPSSel = new TH1F("hNtrCorrPSSel",Form("Corrected %s multiplicity for PS selected events; %s ; Entries",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin);
+  fHistNtrCorrEvSel = new TH1F("hNtrCorrEvSel",Form("Corrected %s multiplicity for selected events; %s ; Entries",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin);
+  fHistNtrCorrEvWithCand = new TH1F("hNtrCorrEvWithCand", Form("%s multiplicity for events with D candidates; %s ; Entries",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin);// Total multiplicity
+  fHistNtrCorrEvWithD = new TH1F("hNtrCorrEvWithD", Form("%s multiplicity for events with D in mass region ; %s ; Entries",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin); //
+
+  if(fKeepCorrPlots){
+    fHistNtrEta16vsNtrEta1EvSel = new TH2F("hNtrEta16vsNtrEta1EvSel","Uncorrected Eta1.6 vs Eta1.0 (events selected); Ntracklets #eta<1.0; Ntracklets #eta<1.6",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsNtrk,firstMultBin,lastMultBinNtrk); //eta 1.6 vs eta 1.0 histogram 
+    fHistNtrEta05vsNtrEta1EvSel = new TH2F("hNtrEta05vsNtrEta1EvSel","Uncorrected Eta0.5 vs Eta1.0 (events selected); Ntracklets #eta<1.0; Ntracklets #eta<0.5",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsNtrk,firstMultBin,lastMultBinNtrk); //eta 0.5 vs eta 1.0 histogram 
+    fHistNtrEta03vsNtrEta1EvSel = new TH2F("hNtrEta03vsNtrEta1EvSel","Uncorrected Eta0.3 vs Eta1.0 (events selected); Ntracklets #eta<1.0; Ntracklets #eta<0.3",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsNtrk,firstMultBin,lastMultBinNtrk); //eta 0.3 vs eta 1.0 histogram 
+    fHistNtrEtaV0AvsNtrEta1EvSel = new TH2F("hNtrEtaV0AvsNtrEta1EvSel","Uncorrected Eta-V0A vs Eta1.0 (events selected); Ntracklets #eta<1.0; Multiplicity V0A",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsV0,firstMultBin,lastMultBinV0); //eta V0A vs eta 1.0 histogram 
+    fHistNtrEtaV0MvsNtrEta1EvSel = new TH2F("hNtrEtaV0MvsNtrEta1EvSel","Uncorrected Eta-V0M vs Eta1.0 (events selected); Ntracklets #eta<1.0; Multiplicity V0A+V0C",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsV0,firstMultBin,lastMultBinV0); //eta V0M vs eta 1.0 histogram
+    fHistNtrEtaV0AvsV0AEqEvSel = new TH2F("hNtrEtaV0AvsV0AEqEvSel","Corrected V0A vs corrected V0A-Equalized (events selected); Vzero-A; Vzero-A Equalized",nMultBinsV0,firstMultBin,lastMultBinV0,nMultBinsV0,firstMultBin,lastMultBinV0); // comparison V0A - V0Aeq
+    fHistNtrEtaV0MvsV0MEqEvSel = new TH2F("hNtrEtaV0MvsV0MEqEvSel","Corrected V0M vs corrected V0M-Equalized (events selected); Vzero-M; Vzero-M Equalized",nMultBinsV0,firstMultBin,lastMultBinV0,nMultBinsV0,firstMultBin,lastMultBinV0); // comparison V0M - V0Meq
+    fHistNtrCorrEta1vsNtrRawEta1EvSel = new TH2F("hNtrCorrEta1vsNtrRawEta1EvSel","Corrected Eta1 vs Eta1.0 (events selected); Ntracklets #eta<1.0 corrected; Ntracklets #eta<1",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsNtrk,firstMultBin,lastMultBinNtrk); //eta 1.6 vs eta 1.0 histogram
+    fHistMultCorrvsMultRawEvSel = new TH2F("hMultCorrvsMultRawEvSel",Form("Corrected multiplicity vs uncorrected multiplicity (events selected); %s corrected; %s",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); // corrected vs uncorrected multiplicity
+
+    fHistNtrEta16vsNtrEta1EvWithCand = new TH2F("hNtrEta16vsNtrEta1EvWithCand","Uncorrected Eta1.6 vs Eta1.0 (events selected with a D candidate); Ntracklets #eta<1.0; Ntracklets #eta<1.6",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsNtrk,firstMultBin,lastMultBinNtrk); //eta 1.6 vs eta 1.0 histogram 
+    fHistNtrEta05vsNtrEta1EvWithCand = new TH2F("hNtrEta05vsNtrEta1EvWithCand","Uncorrected Eta0.5 vs Eta1.0 (events selected with a D candidate); Ntracklets #eta<1.0; Ntracklets #eta<0.5",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsNtrk,firstMultBin,lastMultBinNtrk); //eta 0.5 vs eta 1.0 histogram 
+    fHistNtrEta03vsNtrEta1EvWithCand = new TH2F("hNtrEta03vsNtrEta1EvWithCand","Uncorrected Eta0.3 vs Eta1.0 (events selected with a D candidate); Ntracklets #eta<1.0; Ntracklets #eta<0.3",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsNtrk,firstMultBin,lastMultBinNtrk); //eta 0.3 vs eta 1.0 histogram 
+    fHistNtrEtaV0AvsNtrEta1EvWithCand = new TH2F("hNtrEtaV0AvsNtrEta1EvWithCand","Uncorrected Eta-V0A vs Eta1.0 (events selected with a D candidate); Ntracklets #eta<1.0; Multiplicity V0A",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsV0,firstMultBin,lastMultBinV0); //eta V0A vs eta 1.0 histogram 
+    fHistNtrEtaV0MvsNtrEta1EvWithCand = new TH2F("hNtrEtaV0MvsNtrEta1EvWithCand","Uncorrected Eta-V0M vs Eta1.0 (events selected with a D candidate); Ntracklets #eta<1.0; Multiplicity V0A+V0C",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsV0,firstMultBin,lastMultBinV0); //eta V0M vs eta 1.0 histogram 
+    fHistNtrEtaV0AvsV0AEqEvWithCand = new TH2F("hNtrEtaV0AvsV0AEqEvWithCand","Corrected V0A vs corrected V0A-Equalized (events selected with a D candidate); Vzero-A; Vzero-A Equalized",nMultBinsV0,firstMultBin,lastMultBinV0,nMultBinsV0,firstMultBin,lastMultBinV0); // comparison V0A - V0Aeq
+    fHistNtrEtaV0MvsV0MEqEvWithCand = new TH2F("hNtrEtaV0MvsV0MEqEvWithCand","Corrected V0M vs corrected V0M-Equalized (events selected with a D candidate); Vzero-M; Vzero-M Equalized",nMultBinsV0,firstMultBin,lastMultBinV0,nMultBinsV0,firstMultBin,lastMultBinV0); // comparison V0M - V0Meq
+    fHistNtrCorrEta1vsNtrRawEta1EvWithCand = new TH2F("hNtrCorrEta1vsNtrRawEta1EvWithCand","Corrected Eta1 vs Eta1.0 (events selected with a D candidate); Ntracklets #eta<1.0 corrected; Ntracklets #eta<1",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsNtrk,firstMultBin,lastMultBinNtrk); //eta 1.6 vs eta 1.0 histogram
+    fHistMultCorrvsMultRawEvWithCand = new TH2F("hMultCorrvsMultRawEvWithCand",Form("Corrected multiplicity vs uncorrected multiplicity (events selected) with a D candidate; %s corrected; %s",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); // corrected vs uncorrected multiplicity
+
+
+    fHistNtrEta16vsNtrEta1EvWithD = new TH2F("hNtrEta16vsNtrEta1EvWithD","Uncorrected Eta1.6 vs Eta1.0 (events selected with D in mass range); Ntracklets #eta<1.0; Ntracklets #eta<1.6",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsNtrk,firstMultBin,lastMultBinNtrk); //eta 1.6 vs eta 1.0 histogram 
+    fHistNtrEta05vsNtrEta1EvWithD = new TH2F("hNtrEta05vsNtrEta1EvWithD","Uncorrected Eta0.5 vs Eta1.0 (events selected with D in mass range); Ntracklets #eta<1.0; Ntracklets #eta<0.5",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsNtrk,firstMultBin,lastMultBinNtrk); //eta 0.5 vs eta 1.0 histogram 
+    fHistNtrEta03vsNtrEta1EvWithD = new TH2F("hNtrEta03vsNtrEta1EvWithD","Uncorrected Eta0.3 vs Eta1.0 (events selected with D in mass range); Ntracklets #eta<1.0; Ntracklets #eta<0.3",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsNtrk,firstMultBin,lastMultBinNtrk); //eta 0.3 vs eta 1.0 histogram 
+    fHistNtrEtaV0AvsNtrEta1EvWithD = new TH2F("hNtrEtaV0AvsNtrEta1EvWithD","Uncorrected Eta-V0A vs Eta1.0 (events selected with D in mass range); Ntracklets #eta<1.0; Multiplicity V0A",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsV0,firstMultBin,lastMultBinV0); //eta V0A vs eta 1.0 histogram 
+    fHistNtrEtaV0MvsNtrEta1EvWithD = new TH2F("hNtrEtaV0MvsNtrEta1EvWithD","Uncorrected Eta-V0M vs Eta1.0 (events selected with D in mass range); Ntracklets #eta<1.0; Multiplicity V0A+V0C",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsV0,firstMultBin,lastMultBinV0); //eta V0M vs eta 1.0 histogram 
+    fHistNtrEtaV0AvsV0AEqEvWithD = new TH2F("hNtrEtaV0AvsV0AEqEvWithD","Corrected V0A vs corrected V0A-Equalized (events selected with D in mass range); Vzero-A; Vzero-A Equalized",nMultBinsV0,firstMultBin,lastMultBinV0,nMultBinsV0,firstMultBin,lastMultBinV0); // comparison V0A - V0Aeq
+    fHistNtrEtaV0MvsV0MEqEvWithD = new TH2F("hNtrEtaV0MvsV0MEqEvWithD","Corrected V0M vs corrected V0M-Equalized (events selected with D in mass range); Vzero-M; Vzero-M Equalized",nMultBinsV0,firstMultBin,lastMultBinV0,nMultBinsV0,firstMultBin,lastMultBinV0); // comparison V0M - V0Meq
+    fHistNtrCorrEta1vsNtrRawEta1EvWithD = new TH2F("hNtrCorrEta1vsNtrRawEta1EvWithD","Corrected Eta1 vs Eta1.0 (events selected with D in mass range); Ntracklets #eta<1.0 corrected; Ntracklets #eta<1",nMultBinsNtrk,firstMultBin,lastMultBinNtrk,nMultBinsNtrk,firstMultBin,lastMultBinNtrk); //eta 1.6 vs eta 1.0 histogram
+    fHistMultCorrvsMultRawEvWithD = new TH2F("hMultCorrvsMultRawEvWithD",Form("Corrected multiplicity vs uncorrected multiplicity (events selected with D in mass range); %s corrected; %s",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); // corrected vs uncorrected multiplicity
 
-  fHistNtrVsNchMCPhysicalPrimary = new TH2F("hNtrVsNchMCPhysicalPrimary","Ntracklet vs Nch (Physical Primary); Nch (Physical Primary);N_{tracklet};",200,0,200,200,0,200.); // 
-  fHistNtrCorrVsNchMCPhysicalPrimary = new TH2F("hNtrCorrVsMCPhysicalPrimary","Ntracklet vs Nch (Physical Primary); Nch (Physical Primary);N_{tracklet};",200,0,200,200,0,200.); // 
-  
-  fHistGenPrimaryParticlesInelGt0 = new TH1F("hGenPrimaryParticlesInelGt0","Multiplcity of generated charged particles ; Nparticles ; Entries",200,-0.5,199.5);
+  }
+  fHistNtrVsZvtx = new TH2F("hNtrVsZvtx",Form("N%s vs VtxZ; VtxZ;N_{%s};",estimatorName,estimatorName),300,-15,15,nMultBins,firstMultBin,lastMultBin); //
+  fHistNtrCorrVsZvtx = new TH2F("hNtrCorrVsZvtx",Form("N%s vs VtxZ; VtxZ;N_{%s};",estimatorName,estimatorName),300,-15,15,nMultBins,firstMultBin,lastMultBin); //
 
-  fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary = new TH3F("fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary", "MC: Nch (Physical Primary) vs Nch (Primary) vs Nch (Generated); Nch (Generated); Nch (Primary); Nch (Physical Primary)",200,0.,200.,200,0.,200.,200,0.,200.);
+  fHistNtrVsNchMC = new TH2F("hNtrVsNchMC",Form("N%s vs NchMC; Nch;N_{%s};",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
+  fHistNtrCorrVsNchMC = new TH2F("hNtrCorrVsNchMC",Form("N%s vs Nch; Nch;N_{%s};",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
+  
+  fHistNtrVsNchMCPrimary = new TH2F("hNtrVsNchMCPrimary",Form("N%s vs Nch (Primary); Nch (Primary);N_{%s};",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
+  fHistNtrCorrVsNchMCPrimary = new TH2F("hNtrCorrVsNchMCPrimary",Form("N%s vs Nch (Primary); Nch(Primary) ;N_{%s};",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
 
+  fHistNtrVsNchMCPhysicalPrimary = new TH2F("hNtrVsNchMCPhysicalPrimary",Form("N%s vs Nch (Physical Primary); Nch (Physical Primary);N_{%s};",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
+  fHistNtrCorrVsNchMCPhysicalPrimary = new TH2F("hNtrCorrVsMCPhysicalPrimary",Form("N%s vs Nch (Physical Primary); Nch (Physical Primary);N_{%s};",estimatorName,estimatorName),nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
+  
+  fHistGenPrimaryParticlesInelGt0 = new TH1F("hGenPrimaryParticlesInelGt0","Multiplcity of generated charged particles ; Nparticles ; Entries",nMultBins,firstMultBin,lastMultBin);
+
+  fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary = new TH3F("fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary", "MC: Nch (Physical Primary) vs Nch (Primary) vs Nch (Generated); Nch (Generated); Nch (Primary); Nch (Physical Primary)",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin);
+
+  fHistNtrUnCorrPSSel->Sumw2();
+  fHistNtrUnCorrPSTrigSel->Sumw2();
+  fHistNtrUnCorrPSTrigPileUpSel->Sumw2();
+  fHistNtrUnCorrPSTrigPileUpVtxSel->Sumw2();
+  fHistNtrUnCorrPSTrigPileUpVtxContSel->Sumw2();
+  fHistNtrUnCorrPSTrigPileUpVtxRangeSel->Sumw2();
+  fHistNtrUnCorrPSTrigPileUpVtxRangeCentrSel->Sumw2();
+  fHistNtrUnCorrEvSel->Sumw2();
+  fHistNtrUnCorrEvWithCand->Sumw2();
+  fHistNtrUnCorrEvWithD->Sumw2();
+  fHistNtrCorrPSSel->Sumw2();
   fHistNtrCorrEvSel->Sumw2();
   fHistNtrCorrEvWithCand->Sumw2();
   fHistNtrCorrEvWithD->Sumw2();
   fHistGenPrimaryParticlesInelGt0->Sumw2();
+  fOutput->Add(fHistNtrUnCorrPSSel);
+  fOutput->Add(fHistNtrUnCorrPSTrigSel);
+  fOutput->Add(fHistNtrUnCorrPSTrigPileUpSel);
+  fOutput->Add(fHistNtrUnCorrPSTrigPileUpVtxSel);
+  fOutput->Add(fHistNtrUnCorrPSTrigPileUpVtxContSel);
+  fOutput->Add(fHistNtrUnCorrPSTrigPileUpVtxRangeSel);
+  fOutput->Add(fHistNtrUnCorrPSTrigPileUpVtxRangeCentrSel);
+  fOutput->Add(fHistNtrUnCorrEvSel);
+  fOutput->Add(fHistNtrUnCorrEvWithCand);
+  fOutput->Add(fHistNtrUnCorrEvWithD);
+  fOutput->Add(fHistNtrCorrPSSel);
   fOutput->Add(fHistNtrCorrEvSel);
   fOutput->Add(fHistNtrCorrEvWithCand);
   fOutput->Add(fHistNtrCorrEvWithD);
-  fOutput->Add(fHistNtrEta16vsNtrEta1);
-  fOutput->Add(fHistNtrCorrEta1vsNtrRawEta1);
+  if(fKeepCorrPlots){
+    fOutput->Add(fHistNtrEta16vsNtrEta1EvSel);
+    fOutput->Add(fHistNtrEta05vsNtrEta1EvSel);
+    fOutput->Add(fHistNtrEta03vsNtrEta1EvSel);
+    fOutput->Add(fHistNtrEtaV0AvsNtrEta1EvSel);
+    fOutput->Add(fHistNtrEtaV0MvsNtrEta1EvSel);
+    fOutput->Add(fHistNtrEtaV0AvsV0AEqEvSel);
+    fOutput->Add(fHistNtrEtaV0MvsV0MEqEvSel);
+    fOutput->Add(fHistNtrCorrEta1vsNtrRawEta1EvSel);
+    fOutput->Add(fHistMultCorrvsMultRawEvSel);
+    fOutput->Add(fHistNtrEta16vsNtrEta1EvWithCand);
+    fOutput->Add(fHistNtrEta05vsNtrEta1EvWithCand);
+    fOutput->Add(fHistNtrEta03vsNtrEta1EvWithCand);
+    fOutput->Add(fHistNtrEtaV0AvsNtrEta1EvWithCand);
+    fOutput->Add(fHistNtrEtaV0MvsNtrEta1EvWithCand);
+    fOutput->Add(fHistNtrEtaV0AvsV0AEqEvWithCand);
+    fOutput->Add(fHistNtrEtaV0MvsV0MEqEvWithCand);
+    fOutput->Add(fHistNtrCorrEta1vsNtrRawEta1EvWithCand);
+    fOutput->Add(fHistMultCorrvsMultRawEvWithCand);
+    fOutput->Add(fHistNtrEta16vsNtrEta1EvWithD);
+    fOutput->Add(fHistNtrEta05vsNtrEta1EvWithD);
+    fOutput->Add(fHistNtrEta03vsNtrEta1EvWithD);
+    fOutput->Add(fHistNtrEtaV0AvsNtrEta1EvWithD);
+    fOutput->Add(fHistNtrEtaV0MvsNtrEta1EvWithD);
+    fOutput->Add(fHistNtrEtaV0AvsV0AEqEvWithD);
+    fOutput->Add(fHistNtrEtaV0MvsV0MEqEvWithD);
+    fOutput->Add(fHistNtrCorrEta1vsNtrRawEta1EvWithD);
+    fOutput->Add(fHistMultCorrvsMultRawEvWithD);
+  }
   fOutput->Add(fHistNtrVsZvtx);
   fOutput->Add(fHistNtrCorrVsZvtx);
 
@@ -311,21 +533,24 @@ void AliAnalysisTaskSEDvsMultiplicity::UserCreateOutputObjects()
   fHistNEvents->SetMinimum(0);
   fOutput->Add(fHistNEvents);
 
-  fPtVsMassVsMult=new TH3F("hPtVsMassvsMult", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",200,0.,200.,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
+  fPtVsMassVsMult=new TH3F("hPtVsMassvsMult", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",nMultBins,firstMultBin,lastMultBin,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
  
-  fPtVsMassVsMultNoPid=new TH3F("hPtVsMassvsMultNoPid", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",200,0.,200.,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.); 
+  fPtVsMassVsMultNoPid=new TH3F("hPtVsMassvsMultNoPid", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",nMultBins,firstMultBin,lastMultBin,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.); 
+
+  fPtVsMassVsMultUncorr=new TH3F("hPtVsMassvsMultUncorr", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",nMultBins,firstMultBin,lastMultBin,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
 
-  fPtVsMassVsMultUncorr=new TH3F("hPtVsMassvsMultUncorr", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",200,-0.5,199.5,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
+  fPtVsMassVsMultPart=new TH3F("hPtVsMassvsMultPart", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",nMultBins,firstMultBin,lastMultBin,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
 
-  fPtVsMassVsMultPart=new TH3F("hPtVsMassvsMultPart", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",200,0.,200.,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
+  fPtVsMassVsMultAntiPart=new TH3F("hPtVsMassvsMultAntiPart", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",nMultBins,firstMultBin,lastMultBin,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
 
-  fPtVsMassVsMultAntiPart=new TH3F("hPtVsMassvsMultAntiPart", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",200,0.,200.,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
+  fPtVsMassVsMultMC=new TH3F("hPtVsMassvsMultMC", "D true candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",nMultBins,firstMultBin,lastMultBin,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
 
   fOutput->Add(fPtVsMassVsMult);
   fOutput->Add(fPtVsMassVsMultUncorr);
   fOutput->Add(fPtVsMassVsMultNoPid);
   fOutput->Add(fPtVsMassVsMultPart);
   fOutput->Add(fPtVsMassVsMultAntiPart);
+  fOutput->Add(fPtVsMassVsMultMC);
 
   if(fDoImpPar) CreateImpactParameterHistos();
 
@@ -348,7 +573,7 @@ void AliAnalysisTaskSEDvsMultiplicity::UserCreateOutputObjects()
   PostData(3,fOutputCounters);
   PostData(4,fListProfiles);
 
-  
+  if(fUseNchWeight) CreateMeasuredNchHisto();
 
   return;
 }
@@ -384,8 +609,8 @@ void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
     selbit=AliRDHFCuts::kD0toKpiCuts;
   }else if(fPdgMeson==413){
     arrayName="Dstar";
-    pdgDau[0]=321; pdgDau[1]=211; pdgDau[2]=211; 
-    nDau=3;
+    pdgDau[0]=321; pdgDau[1]=211; pdgDau[2]=0; // Quoting here D0 daughters (D* ones on another variable later)
+    nDau=2;
     selbit=AliRDHFCuts::kDstarCuts;
   }
 
@@ -411,51 +636,173 @@ void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
     return;
   }
 
+  if(fisPPbData && fReadMC){
+    Int_t runnumber = aod->GetRunNumber();
+    if(aod->GetTriggerMask()==0 && 
+       (runnumber>=195344 && runnumber<=195677)){
+      AliDebug(3,"Event rejected because of null trigger mask");
+      return;
+    }
+  }
 
 
   // fix for temporary bug in ESDfilter 
   // the AODs with null vertex pointer didn't pass the PhysSel
   if(!aod->GetPrimaryVertex()||TMath::Abs(aod->GetMagneticField())<0.001) return;
 
-  Int_t countTreta1=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.,1.);
-  Int_t countTr=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.6,1.6);
+  // Int_t countTreta1=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.,1.);
+  // Int_t countTreta03=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-0.3,0.3);
+  // Int_t countTreta05=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-0.5,0.5);
+  // Int_t countTreta16=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.6,1.6);
+  Int_t countTreta1=0, countTreta03=0, countTreta05=0, countTreta16=0;
+  AliAODTracklets* tracklets=aod->GetTracklets();
+  Int_t nTr=tracklets->GetNumberOfTracklets();
+  for(Int_t iTr=0; iTr<nTr; iTr++){
+    Double_t theta=tracklets->GetTheta(iTr);
+    Double_t eta=-TMath::Log(TMath::Tan(theta/2.));
+    if(eta>-0.3 && eta<0.3) countTreta03++;
+    if(eta>-0.5 && eta<0.5) countTreta05++;
+    if(eta>-1.0 && eta<1.0) countTreta1++;
+    if(eta>-1.6 && eta<1.6) countTreta16++;
+  }
+  
 
-  fCounterU->StoreEvent(aod,fRDCutsAnalysis,fReadMC,countTreta1);
+  Int_t vzeroMult=0, vzeroMultA=0, vzeroMultC=0;
+  Int_t vzeroMultEq=0, vzeroMultAEq=0, vzeroMultCEq=0;
+  AliAODVZERO *vzeroAOD = (AliAODVZERO*)aod->GetVZEROData();
+  if(vzeroAOD) {
+    vzeroMultA = static_cast<Int_t>(vzeroAOD->GetMTotV0A());
+    vzeroMultC = static_cast<Int_t>(vzeroAOD->GetMTotV0C());
+    vzeroMult = vzeroMultA + vzeroMultC;
+    vzeroMultAEq = static_cast<Int_t>(AliVertexingHFUtils::GetVZEROAEqualizedMultiplicity(aod));
+    vzeroMultCEq = static_cast<Int_t>(AliVertexingHFUtils::GetVZEROCEqualizedMultiplicity(aod));
+    vzeroMultEq = vzeroMultAEq + vzeroMultCEq;
+  }
+
+  Int_t countMult = countTreta1;
+  if(fMultiplicityEstimator==kNtrk03) { countMult = countTreta03; }
+  else if(fMultiplicityEstimator==kNtrk05) { countMult = countTreta05; }
+  else if(fMultiplicityEstimator==kNtrk10to16) { countMult = countTreta16 - countTreta1; }
+  else if(fMultiplicityEstimator==kVZERO) { countMult = vzeroMult; }
+  else if(fMultiplicityEstimator==kVZEROA) { countMult = vzeroMultA; }
+  else if(fMultiplicityEstimator==kVZEROEq) { countMult = vzeroMultEq; }
+  else if(fMultiplicityEstimator==kVZEROAEq) { countMult = vzeroMultAEq; }
+
+
+  fCounterU->StoreEvent(aod,fRDCutsAnalysis,fReadMC,countMult);
   fHistNEvents->Fill(0); // count event
 
   Double_t countTreta1corr=countTreta1;
+  Double_t countCorr=countMult;
   AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
+  // In case of VZERO multiplicity, consider the zvtx correction flag
+  //  fDoVZER0ParamVertexCorr: 0= none, 1= usual d2h, 2=AliESDUtils
+  Bool_t isDataDrivenZvtxCorr=kTRUE;
+  Bool_t isVtxOk=kFALSE;
+  Int_t vzeroMultACorr=vzeroMultA, vzeroMultCCorr=vzeroMultC, vzeroMultCorr=vzeroMult;
+  Int_t vzeroMultAEqCorr=vzeroMultAEq, vzeroMultCEqCorr=vzeroMultCEq, vzeroMultEqCorr=vzeroMultEq;
   if(vtx1){
-    if(vtx1->GetNContributors()>0){    
-      fHistNEvents->Fill(1); 
-      TProfile* estimatorAvg = GetEstimatorHistogram(aod);
-      if(estimatorAvg){
-       countTreta1corr=AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,countTreta1,vtx1->GetZ(),fRefMult); 
+    if(vtx1->GetNContributors()>0){
+      fHistNEvents->Fill(1);
+      isVtxOk=kTRUE;
+    }
+  }
+  if(isVtxOk){
+    if( (fMultiplicityEstimator==kVZERO) || (fMultiplicityEstimator==kVZEROA) ||
+       (fMultiplicityEstimator==kVZEROEq) || (fMultiplicityEstimator==kVZEROAEq) ){
+      if(fDoVZER0ParamVertexCorr==0){
+       // do not correct
+       isDataDrivenZvtxCorr=kFALSE;
+      } else if (fDoVZER0ParamVertexCorr==2){
+       // use AliESDUtils correction
+       Float_t zvtx = vtx1->GetZ();
+       isDataDrivenZvtxCorr=kFALSE;
+       vzeroMultACorr = static_cast<Int_t>(AliESDUtils::GetCorrV0A(vzeroMultA,zvtx));
+       vzeroMultCCorr = static_cast<Int_t>(AliESDUtils::GetCorrV0C(vzeroMultC,zvtx));
+       vzeroMultCorr = vzeroMultACorr + vzeroMultCCorr;
+       vzeroMultAEqCorr = static_cast<Int_t>(AliESDUtils::GetCorrV0A(vzeroMultAEq,zvtx));
+       vzeroMultCEqCorr =static_cast<Int_t>( AliESDUtils::GetCorrV0C(vzeroMultCEq,zvtx));
+       vzeroMultEqCorr = vzeroMultAEqCorr + vzeroMultCEqCorr;
+       if(fMultiplicityEstimator==kVZERO) { countCorr = vzeroMultCorr; }
+       else if(fMultiplicityEstimator==kVZEROA) { countCorr = vzeroMultACorr; }
+       else if(fMultiplicityEstimator==kVZEROEq) { countCorr = vzeroMultEqCorr; }
+       else if(fMultiplicityEstimator==kVZEROAEq) { countCorr = vzeroMultAEqCorr; }
       }
     }
   }
-   
-  fCounter->StoreEvent(aod,fRDCutsAnalysis,fReadMC,(Int_t)countTreta1corr);
+  // Data driven multiplicity z-vertex correction
+  if(isVtxOk && isDataDrivenZvtxCorr){
+    TProfile* estimatorAvg = GetEstimatorHistogram(aod);
+    if(estimatorAvg){
+      countTreta1corr=static_cast<Int_t>(AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,countTreta1,vtx1->GetZ(),fRefMult));
+      // vzeroMultACorr=static_cast<Int_t>(AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,vzeroMultA,vtx1->GetZ(),fRefMult));
+      // vzeroMultCorr= vzeroMultACorr + static_cast<Int_t>(AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,vzeroMultC,vtx1->GetZ(),fRefMult));
+      // vzeroMultAEqCorr=static_cast<Int_t>(AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,vzeroMultAEq,vtx1->GetZ(),fRefMult));
+      // vzeroMultEqCorr= vzeroMultAEqCorr + static_cast<Int_t>(AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,vzeroMultCEq,vtx1->GetZ(),fRefMult));
+      countCorr=static_cast<Int_t>(AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,countMult,vtx1->GetZ(),fRefMult));
+    }
+  }
+
 
   Bool_t isEvSel=fRDCutsAnalysis->IsEventSelected(aod);
 
   if(fRDCutsAnalysis->GetWhyRejection()==5) fHistNEvents->Fill(3);
-  if(fRDCutsAnalysis->GetWhyRejection()==7) fHistNEvents->Fill(4); 
+  if(fRDCutsAnalysis->GetWhyRejection()==7) fHistNEvents->Fill(4);
   if(fRDCutsAnalysis->GetWhyRejection()==6) fHistNEvents->Fill(5);
   if(fRDCutsAnalysis->GetWhyRejection()==1) fHistNEvents->Fill(6);
-  
+
+  Bool_t isEvPSRejected = fRDCutsAnalysis->IsEventRejectedDuePhysicsSelection();
+  Bool_t isEvTrigNameRejected = fRDCutsAnalysis->IsEventRejectedDueToTrigger();
+  Bool_t isEvPileUpRejected = fRDCutsAnalysis->IsEventRejectedDueToPileup();
+  Bool_t isEvNoVtxRejected = fRDCutsAnalysis->IsEventRejectedDueToNotRecoVertex();
+  Bool_t isEvVtxContribRejected = fRDCutsAnalysis->IsEventRejectedDueToVertexContributors();
+  Bool_t isEvVtxRangeRejected= fRDCutsAnalysis->IsEventRejectedDueToZVertexOutsideFiducialRegion();
+  Bool_t isEvCentralityRejected = fRDCutsAnalysis->IsEventRejectedDueToCentrality();
+  if(!isEvPSRejected){
+    fHistNtrUnCorrPSSel->Fill(countMult);
+    fHistNtrCorrPSSel->Fill(countCorr);
+    if(!isEvTrigNameRejected){
+      fHistNtrUnCorrPSTrigSel->Fill(countMult);
+      if(!isEvPileUpRejected){
+       fHistNtrUnCorrPSTrigPileUpSel->Fill(countMult);
+       if(!isEvNoVtxRejected){
+         fHistNtrUnCorrPSTrigPileUpVtxSel->Fill(countMult);
+         if(!isEvVtxContribRejected){
+           fHistNtrUnCorrPSTrigPileUpVtxContSel->Fill(countMult);
+           if(!isEvVtxRangeRejected){
+             fHistNtrUnCorrPSTrigPileUpVtxRangeSel->Fill(countMult);
+             if(!isEvCentralityRejected){
+               fHistNtrUnCorrPSTrigPileUpVtxRangeCentrSel->Fill(countMult);
+             }
+           }
+         }
+       }
+      }
+    }
+  }
   
   if(!isEvSel)return;
-  fHistNtrEta16vsNtrEta1->Fill(countTreta1,countTr);
-  fHistNtrCorrEta1vsNtrRawEta1->Fill(countTreta1,countTreta1corr);
+  if(fKeepCorrPlots){
+    fHistNtrEta16vsNtrEta1EvSel->Fill(countTreta1,countTreta16);
+    fHistNtrEta05vsNtrEta1EvSel->Fill(countTreta1,countTreta05);
+    fHistNtrEta03vsNtrEta1EvSel->Fill(countTreta1,countTreta03);
+    fHistNtrEtaV0AvsNtrEta1EvSel->Fill(countTreta1,vzeroMultA);
+    fHistNtrEtaV0MvsNtrEta1EvSel->Fill(countTreta1,vzeroMult);
+    fHistNtrEtaV0AvsV0AEqEvSel->Fill(vzeroMultA,vzeroMultAEq);
+    fHistNtrEtaV0MvsV0MEqEvSel->Fill(vzeroMult,vzeroMultEq);
+    fHistNtrCorrEta1vsNtrRawEta1EvSel->Fill(countTreta1,countTreta1corr);
+    fHistMultCorrvsMultRawEvSel->Fill(countMult,countCorr);
+  }
   if(vtx1){
-    fHistNtrVsZvtx->Fill(vtx1->GetZ(),countTreta1);
-    fHistNtrCorrVsZvtx->Fill(vtx1->GetZ(),countTreta1corr);
+    fHistNtrVsZvtx->Fill(vtx1->GetZ(),countMult);
+    fHistNtrCorrVsZvtx->Fill(vtx1->GetZ(),countCorr);
   }
 
   TClonesArray *arrayMC=0;
   AliAODMCHeader *mcHeader=0;
 
+  Double_t nchWeight=1.0;
+
   // load MC particles
   if(fReadMC){
      
@@ -472,22 +819,127 @@ void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
      }
   
 
-    Int_t nChargedMC=AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,-1.0,1.0);
-    Int_t nChargedMCPrimary=AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,-1.0,1.0);
-    Int_t nChargedMCPhysicalPrimary=AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,-1.0,1.0);
+    // Int_t nChargedMC=AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,-1.0,1.0);
+    // Int_t nChargedMCPrimary=AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,-1.0,1.0);
+    // Int_t nChargedMCPhysicalPrimary=AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,-1.0,1.0);
+    //
+    Int_t nChargedMCEta10=0, nChargedMCEta03=0, nChargedMCEta05=0, nChargedMCEta16=0, nChargedMCEtam37tm17=0, nChargedMCEta28t51=0;
+    Int_t nChargedMCPrimaryEta10=0, nChargedMCPrimaryEta03=0, nChargedMCPrimaryEta05=0, nChargedMCPrimaryEta16=0, nChargedMCPrimaryEtam37tm17=0, nChargedMCPrimaryEta28t51=0;
+    Int_t nChargedMCPhysicalPrimaryEta10=0, nChargedMCPhysicalPrimaryEta03=0, nChargedMCPhysicalPrimaryEta05=0, nChargedMCPhysicalPrimaryEta16=0, nChargedMCPhysicalPrimaryEtam37tm17=0, nChargedMCPhysicalPrimaryEta28t51=0;
+    for(Int_t i=0; i<arrayMC->GetEntriesFast(); i++){
+      AliAODMCParticle *part=(AliAODMCParticle*)arrayMC->UncheckedAt(i);
+      Int_t charge = part->Charge();
+      Double_t eta = part->Eta();
+      Bool_t isPrim = part->IsPrimary();
+      Bool_t isPhysPrim = part->IsPhysicalPrimary();
+      if(charge!=0) {
+       if(eta>-0.3 && eta< 0.3) { 
+         nChargedMCEta03++;
+         if(isPrim) nChargedMCPrimaryEta03++;
+         if(isPhysPrim) nChargedMCPhysicalPrimaryEta03++;
+       }
+       if(eta>-0.5 && eta< 0.5) { 
+         nChargedMCEta05++;
+         if(isPrim) nChargedMCPrimaryEta05++;
+         if(isPhysPrim) nChargedMCPhysicalPrimaryEta05++;
+       }
+       if(eta>-1.0 && eta< 1.0) { 
+         nChargedMCEta10++;
+         if(isPrim) nChargedMCPrimaryEta10++;
+         if(isPhysPrim) nChargedMCPhysicalPrimaryEta10++;
+       }
+       if(eta>-1.6 && eta< 1.6) { 
+         nChargedMCEta16++;
+         if(isPrim) nChargedMCPrimaryEta16++;
+         if(isPhysPrim) nChargedMCPhysicalPrimaryEta16++;
+       }
+       if(eta>-3.7 && eta<-1.7) { 
+         nChargedMCEtam37tm17++;
+         if(isPrim) nChargedMCPrimaryEtam37tm17++;
+         if(isPhysPrim) nChargedMCPhysicalPrimaryEtam37tm17++;
+       }
+       if(eta> 2.8 && eta< 5.1) { 
+         nChargedMCEta28t51++;
+         if(isPrim) nChargedMCPrimaryEta28t51++;
+         if(isPhysPrim) nChargedMCPhysicalPrimaryEta28t51++;
+       }
+      }
+    }
+    Int_t nChargedMC=nChargedMCEta10;
+    Int_t nChargedMCPrimary=nChargedMCPrimaryEta10;
+    Int_t nChargedMCPhysicalPrimary=nChargedMCPhysicalPrimaryEta10;
+
+
+    // Compute the Nch weights (reference is Ntracklets within |eta|<1.0)
+    if(fUseNchWeight){
+      Double_t tmpweight = 1.0;
+      if(nChargedMCPhysicalPrimary<=0) tmpweight = 0.0;
+      else{
+       Double_t pMeas = fHistoMeasNch->GetBinContent(fHistoMeasNch->FindBin(nChargedMCPhysicalPrimary));
+       //      printf(" pMeas=%2.2f  and histo MCNch %s \n",pMeas,fHistoMCNch);
+       Double_t pMC = fHistoMCNch->GetBinContent(fHistoMCNch->FindBin(nChargedMCPhysicalPrimary));
+       tmpweight = pMC>0 ? pMeas/pMC : 0.;
+      }
+      nchWeight *= tmpweight;
+      AliDebug(2,Form("Using Nch weights, Mult=%d Weight=%f\n",nChargedMCPhysicalPrimary,nchWeight));
+    }
+
+    // Now recompute the variables in case another MC estimator is considered
+    // Int_t nChargedMCEta10 = nChargedMC;
+    // Int_t nChargedMCEta16 = AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,-1.6,1.6);
+    // Int_t nChargedMCEta05 = AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,-0.5,0.5);
+    // Int_t nChargedMCEta03 = AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,-0.3,0.3);
+    // Int_t nChargedMCEtam37tm17 = AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,-3.7,-1.7);
+    // Int_t nChargedMCEta28t51 = AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,2.8,5.1);
+    // Int_t nChargedMCPrimaryEta10 = nChargedMCPrimary;
+    // Int_t nChargedMCPrimaryEta16 = AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,-1.6,1.6);
+    // Int_t nChargedMCPrimaryEta05 = AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,-0.5,0.5);
+    // Int_t nChargedMCPrimaryEta03 = AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,-0.3,0.3);
+    // Int_t nChargedMCPrimaryEtam37tm17 = AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,-3.7,-1.7);
+    // Int_t nChargedMCPrimaryEta28t51 = AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,2.8,5.1);
+    // Int_t nChargedMCPhysicalPrimaryEta10 = nChargedMCPhysicalPrimary;
+    // Int_t nChargedMCPhysicalPrimaryEta16 = AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,-1.6,1.6);
+    // Int_t nChargedMCPhysicalPrimaryEta05 = AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,-0.5,0.5);
+    // Int_t nChargedMCPhysicalPrimaryEta03 = AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,-0.3,0.3);
+    // Int_t nChargedMCPhysicalPrimaryEtam37tm17 = AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,-3.7,-1.7);
+    // Int_t nChargedMCPhysicalPrimaryEta28t51 = AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,2.8,5.1);
+    if(fMCPrimariesEstimator==kEta10to16){
+      nChargedMC = nChargedMCEta16 - nChargedMCEta10;
+      nChargedMCPrimary = nChargedMCPrimaryEta16 - nChargedMCPrimaryEta10;
+      nChargedMCPhysicalPrimary = nChargedMCPhysicalPrimaryEta16 - nChargedMCPhysicalPrimaryEta10;
+    } else if(fMCPrimariesEstimator==kEta05){
+      nChargedMC = nChargedMCEta05;
+      nChargedMCPrimary = nChargedMCPrimaryEta05;
+      nChargedMCPhysicalPrimary = nChargedMCPhysicalPrimaryEta05;
+    } else if(fMCPrimariesEstimator==kEta03){
+      nChargedMC = nChargedMCEta03;
+      nChargedMCPrimary = nChargedMCPrimaryEta03;
+      nChargedMCPhysicalPrimary = nChargedMCPhysicalPrimaryEta03;
+    } else if(fMCPrimariesEstimator==kEtaVZERO){
+      nChargedMC = nChargedMCEtam37tm17 + nChargedMCEta28t51;
+      nChargedMCPrimary = nChargedMCPrimaryEtam37tm17 + nChargedMCPrimaryEta28t51;
+      nChargedMCPhysicalPrimary = nChargedMCPhysicalPrimaryEtam37tm17 + nChargedMCPhysicalPrimaryEta28t51;
+    } else if(fMCPrimariesEstimator==kEtaVZEROA){
+      nChargedMC = nChargedMCEta28t51;
+      nChargedMCPrimary = nChargedMCPrimaryEta28t51;
+      nChargedMCPhysicalPrimary = nChargedMCPhysicalPrimaryEta28t51;
+    }
+
+    // Here fill the MC correlation plots
     if(nChargedMCPhysicalPrimary>0){ // INEL>0 for |eta|<1
-      fHistGenPrimaryParticlesInelGt0->Fill(nChargedMCPhysicalPrimary);
+      fHistGenPrimaryParticlesInelGt0->Fill(nChargedMCPhysicalPrimary,nchWeight);
     }
-    fHistNtrVsNchMC->Fill(nChargedMC,countTreta1);
-    fHistNtrCorrVsNchMC->Fill(nChargedMC,countTreta1corr);
 
-    fHistNtrVsNchMCPrimary->Fill(nChargedMCPrimary,countTreta1);
-    fHistNtrCorrVsNchMCPrimary->Fill(nChargedMCPrimary,countTreta1corr);
+    fHistNtrVsNchMC->Fill(nChargedMC,countMult,nchWeight);
+    fHistNtrCorrVsNchMC->Fill(nChargedMC,countCorr,nchWeight);
 
-    fHistNtrVsNchMCPhysicalPrimary->Fill(nChargedMCPhysicalPrimary,countTreta1);
-    fHistNtrCorrVsNchMCPhysicalPrimary->Fill(nChargedMCPhysicalPrimary,countTreta1corr);
+    fHistNtrVsNchMCPrimary->Fill(nChargedMCPrimary,countMult,nchWeight);
+    fHistNtrCorrVsNchMCPrimary->Fill(nChargedMCPrimary,countCorr,nchWeight);
 
-    fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary->Fill(nChargedMC,nChargedMCPrimary,nChargedMCPhysicalPrimary);
+    fHistNtrVsNchMCPhysicalPrimary->Fill(nChargedMCPhysicalPrimary,countMult,nchWeight);
+    fHistNtrCorrVsNchMCPhysicalPrimary->Fill(nChargedMCPhysicalPrimary,countCorr,nchWeight);
+
+    fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary->Fill(nChargedMC,nChargedMCPrimary,nChargedMCPhysicalPrimary,nchWeight);
   }
   
   Int_t nCand = arrayCand->GetEntriesFast(); 
@@ -496,8 +948,16 @@ void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
   Double_t mDplusPDG = TDatabasePDG::Instance()->GetParticle(411)->Mass();
   Double_t mDstarPDG = TDatabasePDG::Instance()->GetParticle(413)->Mass();
 
+  // pdg of daughters needed for D* too
+  UInt_t pdgDgDStartoD0pi[2]={421,211};
+
+  Double_t aveMult=0.;
+  Double_t nSelCand=0.;
   for (Int_t iCand = 0; iCand < nCand; iCand++) {
     AliAODRecoDecayHF *d = (AliAODRecoDecayHF*)arrayCand->UncheckedAt(iCand);
+    AliAODRecoCascadeHF *dCascade = NULL;
+    if(fPdgMeson==413) dCascade = (AliAODRecoCascadeHF*)d;
+
     fHistNEvents->Fill(7);
     if(fUseBit && !d->HasSelectionBit(selbit)){
       fHistNEvents->Fill(8);
@@ -508,6 +968,17 @@ void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
     Double_t rapid=d->Y(fPdgMeson);
     Bool_t isFidAcc=fRDCutsAnalysis->IsInFiducialAcceptance(ptCand,rapid);
     if(!isFidAcc) continue;
+   
+    Int_t labD=-1;
+    if(fReadMC) {
+      if(fPdgMeson==413){
+       labD = dCascade->MatchToMC(fPdgMeson,421,(Int_t*)pdgDgDStartoD0pi,(Int_t*)pdgDau,arrayMC);
+      } else {
+       labD = d->MatchToMC(fPdgMeson,arrayMC,nDau,(Int_t*)pdgDau);
+      }
+      FillMCMassHistos(arrayMC,labD, countMult,nchWeight);
+    }
+
     Int_t passAllCuts=fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kAll,aod);
     Int_t passTopolCuts=fRDCutsAnalysis->GetIsSelectedCuts();
     if(passTopolCuts==0) continue;
@@ -517,8 +988,24 @@ void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
       nSelectedPID++;
       fHistNEvents->Fill(10);
     }
+    Double_t multForCand = countCorr;
+
+    if(fSubtractTrackletsFromDau){
+      // For the D* case, subtract only the D0 daughter tracks <=== FIXME !!
+      AliAODRecoDecayHF2Prong* d0fromDstar = NULL;
+      if(fPdgMeson==413) d0fromDstar = (AliAODRecoDecayHF2Prong*)dCascade->Get2Prong();
+
+      for(Int_t iDau=0; iDau<nDau; iDau++){
+       AliAODTrack *t = NULL;
+       if(fPdgMeson==413){ t = (AliAODTrack*)d0fromDstar->GetDaughter(iDau); }
+       else{ t = (AliAODTrack*)d->GetDaughter(iDau); }
+       if(!t) continue;
+       if(t->HasPointOnITSLayer(0) && t->HasPointOnITSLayer(1)){
+         if(multForCand>0) multForCand-=1;
+       }
+      }
+    }
     Bool_t isPrimary=kTRUE;
-    Int_t labD=-1;
     Double_t trueImpParXY=9999.;
     Double_t impparXY=d->ImpParXY()*10000.;
     Double_t dlen=0.1; //FIXME
@@ -535,19 +1022,23 @@ void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
       if(TMath::Abs(mass[0]-mD0PDG)<0.02 || TMath::Abs(mass[1]-mD0PDG)<0.02 ) nSelectedInMassPeak++; //20 MeV for now... FIXME
     }else if(fPdgMeson==413){
       // FIXME
-      AliAODRecoCascadeHF* temp = (AliAODRecoCascadeHF*)d;
-      mass[0]=temp->DeltaInvMass();
+      mass[0]=dCascade->DeltaInvMass();
       mass[1]=-1.;
-      if(TMath::Abs(mass[0]-(mDstarPDG-mD0PDG))<0.001) nSelectedInMassPeak++; //1 MeV for now... FIXME
+      if(TMath::Abs(mass[0]-(mDstarPDG-mD0PDG))<0.0015) nSelectedInMassPeak++; //1 MeV for now... FIXME
     }
     for(Int_t iHyp=0; iHyp<2; iHyp++){
       if(mass[iHyp]<0.) continue; // for D+ and D* we have 1 mass hypothesis
       Double_t invMass=mass[iHyp];
-      Double_t arrayForSparse[5]={invMass,ptCand,impparXY,dlen,countTreta1corr};
+      Double_t arrayForSparse[5]={invMass,ptCand,impparXY,dlen,multForCand};
 
       if(fReadMC){
        
-       labD = d->MatchToMC(fPdgMeson,arrayMC,nDau,(Int_t*)pdgDau);
+       if(fPdgMeson==413){
+         labD = dCascade->MatchToMC(fPdgMeson,421,(Int_t*)pdgDgDStartoD0pi,(Int_t*)pdgDau,arrayMC);
+       } else {
+         labD = d->MatchToMC(fPdgMeson,arrayMC,nDau,(Int_t*)pdgDau);
+       }
+
        Bool_t fillHisto=fDoImpPar;
        if(labD>=0){
          AliAODMCParticle *partD = (AliAODMCParticle*)arrayMC->At(labD);
@@ -563,7 +1054,7 @@ void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
            }else if(fPdgMeson==413){
              trueImpParXY=0.; /// FIXME
            }
-           Double_t arrayForSparseTrue[5]={invMass,ptCand,trueImpParXY,dlen,countTreta1corr};
+           Double_t arrayForSparseTrue[5]={invMass,ptCand,trueImpParXY,dlen,multForCand};
            if(fillHisto && passAllCuts){
              fHistMassPtImpPar[2]->Fill(arrayForSparse);
              fHistMassPtImpPar[3]->Fill(arrayForSparseTrue);
@@ -574,10 +1065,10 @@ void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
        }else{
          if(fillHisto && passAllCuts)fHistMassPtImpPar[4]->Fill(arrayForSparse);
        }
-       if(fPdgMeson==421){
-         if(TMath::Abs(labD)==fPdgMeson && fMCOption==2) continue;
-         if(TMath::Abs(labD)!=fPdgMeson && fMCOption==1) continue;      
-       }
+
+       if(TMath::Abs(labD)==fPdgMeson && fMCOption==2) continue;
+       if(TMath::Abs(labD)!=fPdgMeson && fMCOption==1) continue;      
+
       }
       
       if(fPdgMeson==421){
@@ -585,19 +1076,27 @@ void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
        if(iHyp==1 && !(passTopolCuts&2)) continue; // candidate not passing as D0bar
       }
 
-      fPtVsMassVsMultNoPid->Fill(countTreta1corr,invMass,ptCand);
+      fPtVsMassVsMultNoPid->Fill(multForCand,invMass,ptCand);
+
+      if(fPdgMeson==421){
+       if(iHyp==0 && !(passAllCuts&1)) continue; // candidate not passing as D0
+       if(iHyp==1 && !(passAllCuts&2)) continue; // candidate not passing as D0bar
+      }
       if(passAllCuts){
-       fPtVsMassVsMult->Fill(countTreta1corr,invMass,ptCand);                
-       fPtVsMassVsMultUncorr->Fill(countTreta1,invMass,ptCand);
+       aveMult+=multForCand;
+       nSelCand+=1.;
+       fPtVsMassVsMult->Fill(multForCand,invMass,ptCand,nchWeight);
+       fPtVsMassVsMultUncorr->Fill(countTreta1,invMass,ptCand,nchWeight);
        // Add separation between part antipart
        if(fPdgMeson==411){
-         if(d->GetCharge()>0) fPtVsMassVsMultPart->Fill(countTreta1corr,invMass,ptCand);
-         else fPtVsMassVsMultAntiPart->Fill(countTreta1corr,invMass,ptCand);
+         if(d->GetCharge()>0) fPtVsMassVsMultPart->Fill(multForCand,invMass,ptCand,nchWeight);
+         else fPtVsMassVsMultAntiPart->Fill(multForCand,invMass,ptCand,nchWeight);
        }else if(fPdgMeson==421){
-         if(passTopolCuts&1) fPtVsMassVsMultPart->Fill(countTreta1corr,invMass,ptCand);
-         if(passTopolCuts&2) fPtVsMassVsMultAntiPart->Fill(countTreta1corr,invMass,ptCand);
+         if(passAllCuts&1) fPtVsMassVsMultPart->Fill(multForCand,invMass,ptCand,nchWeight);
+         if(passAllCuts&2) fPtVsMassVsMultAntiPart->Fill(multForCand,invMass,ptCand,nchWeight);
        }else if(fPdgMeson==413){
-         // FIXME ADD Dstar!!!!!!!!
+         if(d->GetCharge()>0) fPtVsMassVsMultPart->Fill(multForCand,invMass,ptCand,nchWeight);
+         else fPtVsMassVsMultAntiPart->Fill(multForCand,invMass,ptCand,nchWeight);
        }
        
        if(fDoImpPar){
@@ -608,11 +1107,48 @@ void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
 
     }
   }
+  if(fSubtractTrackletsFromDau && nSelCand>0){
+    aveMult/=nSelCand;
+    fCounter->StoreEvent(aod,fRDCutsAnalysis,fReadMC,(Int_t)(aveMult+0.5001));
+  }else{
+    fCounter->StoreEvent(aod,fRDCutsAnalysis,fReadMC,(Int_t)countCorr);
+  }
+
+
   fCounter->StoreCandidates(aod,nSelectedNoPID,kTRUE);
   fCounter->StoreCandidates(aod,nSelectedPID,kFALSE);
-  fHistNtrCorrEvSel->Fill(countTreta1corr);
-  if(nSelectedPID>0) fHistNtrCorrEvWithCand->Fill(countTreta1corr);
-  if(nSelectedInMassPeak>0) fHistNtrCorrEvWithD->Fill(countTreta1corr);
+  fHistNtrUnCorrEvSel->Fill(countMult,nchWeight);
+  fHistNtrCorrEvSel->Fill(countCorr,nchWeight);
+  if(nSelectedPID>0) {
+    fHistNtrUnCorrEvWithCand->Fill(countMult,nchWeight);
+    fHistNtrCorrEvWithCand->Fill(countCorr,nchWeight);
+    if(fKeepCorrPlots){
+      fHistNtrEta16vsNtrEta1EvWithCand->Fill(countTreta1,countTreta16);
+      fHistNtrEta05vsNtrEta1EvWithCand->Fill(countTreta1,countTreta05);
+      fHistNtrEta03vsNtrEta1EvWithCand->Fill(countTreta1,countTreta03);
+      fHistNtrEtaV0AvsNtrEta1EvWithCand->Fill(countTreta1,vzeroMultA);
+      fHistNtrEtaV0MvsNtrEta1EvWithCand->Fill(countTreta1,vzeroMult);
+      fHistNtrEtaV0AvsV0AEqEvWithCand->Fill(vzeroMultA,vzeroMultAEq);
+      fHistNtrEtaV0MvsV0MEqEvWithCand->Fill(vzeroMult,vzeroMultEq);
+      fHistNtrCorrEta1vsNtrRawEta1EvWithCand->Fill(countTreta1,countTreta1corr);
+      fHistMultCorrvsMultRawEvWithCand->Fill(countMult,countCorr);
+    }
+  }
+  if(nSelectedInMassPeak>0) {
+    fHistNtrUnCorrEvWithD->Fill(countMult,nchWeight);
+    fHistNtrCorrEvWithD->Fill(countCorr,nchWeight);
+    if(fKeepCorrPlots){
+      fHistNtrEta16vsNtrEta1EvWithD->Fill(countTreta1,countTreta16);
+      fHistNtrEta05vsNtrEta1EvWithD->Fill(countTreta1,countTreta05);
+      fHistNtrEta03vsNtrEta1EvWithD->Fill(countTreta1,countTreta03);
+      fHistNtrEtaV0AvsNtrEta1EvWithD->Fill(countTreta1,vzeroMultA);
+      fHistNtrEtaV0MvsNtrEta1EvWithD->Fill(countTreta1,vzeroMult);
+      fHistNtrEtaV0AvsV0AEqEvWithD->Fill(vzeroMultA,vzeroMultAEq);
+      fHistNtrEtaV0MvsV0MEqEvWithD->Fill(vzeroMult,vzeroMultEq);
+      fHistNtrCorrEta1vsNtrRawEta1EvWithD->Fill(countTreta1,countTreta1corr);
+      fHistMultCorrvsMultRawEvWithD->Fill(countMult,countCorr);
+    }
+  }
 
   PostData(1,fOutput); 
   PostData(2,fListCuts);
@@ -620,6 +1156,7 @@ void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
     
   return;
 }
+
 //________________________________________________________________________
 void AliAnalysisTaskSEDvsMultiplicity::CreateImpactParameterHistos(){
   // Histos for impact paramter study
@@ -683,7 +1220,7 @@ Int_t AliAnalysisTaskSEDvsMultiplicity::CheckOrigin(TClonesArray* arrayMC, AliAO
   Int_t istep = 0;
   Int_t abspdgGranma =0;
   Bool_t isFromB=kFALSE;
-  Bool_t isQuarkFound=kFALSE;
+  //  Bool_t isQuarkFound=kFALSE;
   while (mother >0 ){
     istep++;
     AliAODMCParticle* mcGranma = dynamic_cast<AliAODMCParticle*>(arrayMC->At(mother));
@@ -693,7 +1230,7 @@ Int_t AliAnalysisTaskSEDvsMultiplicity::CheckOrigin(TClonesArray* arrayMC, AliAO
       if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)){
        isFromB=kTRUE;
       }
-      if(abspdgGranma==4 || abspdgGranma==5) isQuarkFound=kTRUE;
+      //      if(abspdgGranma==4 || abspdgGranma==5) isQuarkFound=kTRUE;
       mother = mcGranma->GetMother();
     }else{
       AliError("Failed casting the mother particle!");
@@ -715,12 +1252,72 @@ TProfile* AliAnalysisTaskSEDvsMultiplicity::GetEstimatorHistogram(const AliVEven
   //
 
   Int_t runNo  = event->GetRunNumber();
-  Int_t period = -1;   // 0-LHC10b, 1-LHC10c, 2-LHC10d, 3-LHC10e
-  if(runNo>114930 && runNo<117223) period = 0;
-  if(runNo>119158 && runNo<120830) period = 1;
-  if(runNo>122373 && runNo<126438) period = 2;
-  if(runNo>127711 && runNo<130841) period = 3;
-  if(period<0 || period>3) return 0;
+  Int_t period = -1;   // pp: 0-LHC10b, 1-LHC10c, 2-LHC10d, 3-LHC10e
+                       // pPb: 0-LHC13b, 1-LHC13c
+  if (fisPPbData) {
+      if (runNo>195343 && runNo<195484) period = 0;
+      if (runNo>195528 && runNo<195678) period = 1;
+      if (period < 0 || period > 1) return 0;
+  } 
+   else {
+      if(runNo>114930 && runNo<117223) period = 0;
+      if(runNo>119158 && runNo<120830) period = 1;
+      if(runNo>122373 && runNo<126438) period = 2;
+      if(runNo>127711 && runNo<130841) period = 3;
+      if(period<0 || period>3) return 0;
+     
+} 
 
   return fMultEstimatorAvg[period];
 }
+
+//__________________________________________________________________________________________________
+void AliAnalysisTaskSEDvsMultiplicity::CreateMeasuredNchHisto(){
+  // creates historgam with measured multiplcity distribution in pp 7 TeV collisions (from Eur. Phys. J. C (2010) 68: 345–354)
+  //
+  // for Nch  > 70 the points were obtainedwith a double NBD distribution
+  // TF1 *fit1 = new TF1("fit1","[0]*(TMath::Gamma(x+[1])/(TMath::Gamma(x+1)*TMath::Gamma([1])))*(TMath::Power(([2]/[1]),x))*(TMath::Power((1+([2]/[1])),-x-[1]))"); fit1->SetParameter(0,1.);// normalization constant
+  // fit1->SetParameter(1,1.63); // k parameter
+  // fit1->SetParameter(2,12.8); // mean multiplicity
+  Double_t nchbins[82]={0.50,1.50,2.50,3.50,4.50,5.50,6.50,7.50,8.50,9.50,
+                       10.50,11.50,12.50,13.50,14.50,15.50,16.50,17.50,18.50,19.50,
+                       20.50,21.50,22.50,23.50,24.50,25.50,26.50,27.50,28.50,29.50,
+                       30.50,31.50,32.50,33.50,34.50,35.50,36.50,37.50,38.50,39.50,
+                       40.50,41.50,42.50,43.50,44.50,45.50,46.50,47.50,48.50,49.50,
+                       50.50,51.50,52.50,53.50,54.50,55.50,56.50,57.50,58.50,59.50,
+                       60.50,62.50,64.50,66.50,68.50,70.50,72.50,74.50,76.50,78.50,
+                       80.50,82.50,84.50,86.50,88.50,90.50,92.50,94.50,96.50,98.50, 
+                       100.50,102.50};
+  Double_t pch[81]={0.062011,0.072943,0.070771,0.067245,0.062834,0.057383,0.051499,0.04591,0.041109,0.036954,
+                   0.03359,0.030729,0.028539,0.026575,0.024653,0.0229,0.021325,0.019768,0.018561,0.017187,
+                   0.01604,0.014836,0.013726,0.012576,0.011481,0.010393,0.009502,0.008776,0.008024,0.007452,
+                   0.006851,0.006428,0.00594,0.005515,0.005102,0.00469,0.004162,0.003811,0.003389,0.003071,
+                   0.002708,0.002422,0.002184,0.001968,0.00186,0.00165,0.001577,0.001387,0.001254,0.001118,
+                   0.001037,0.000942,0.000823,0.000736,0.000654,0.000579,0.000512,0.00049,0.00045,0.000355,
+                   0.000296,0.000265,0.000193,0.00016,0.000126,0.0000851, 0.0000676,0.0000537,0.0000426, 0.0000338,
+                   0.0000268,0.0000213,0.0000166,0.0000133,0.0000106,0.00000837,0.00000662, 0.00000524,0.00000414, 0.00000327,
+                   0.00000258};
+
+  if(fHistoMeasNch) delete fHistoMeasNch;
+  fHistoMeasNch=new TH1F("hMeaseNch","",81,nchbins);
+  for(Int_t i=0; i<81; i++){
+    fHistoMeasNch->SetBinContent(i+1,pch[i]);
+    fHistoMeasNch->SetBinError(i+1,0.);
+  }
+}
+
+//__________________________________________________________________________________________________
+void AliAnalysisTaskSEDvsMultiplicity::FillMCMassHistos(TClonesArray *arrayMC, Int_t labD, Int_t countMult,Double_t nchWeight) 
+{
+  //
+  // Function to fill the true MC signal
+  //
+  
+  if(labD>=0){
+    AliAODMCParticle *partD = (AliAODMCParticle*)arrayMC->At(labD);
+    Double_t mass = partD->M();
+    Double_t pt = partD->Pt();
+    fPtVsMassVsMultMC->Fill(countMult,mass,pt,nchWeight);
+  }
+
+}