]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG3/hfe/AliHFEspectrum.cxx
Update of the hfe package
[u/mrichter/AliRoot.git] / PWG3 / hfe / AliHFEspectrum.cxx
index c3f7ae0ecd3946f63fbc9c60f2d156738ceee660..fe6bbf3434c41af362203bc4bb7a96b76cda2ac1 100644 (file)
 #include <TGraphErrors.h>
 #include <TFile.h>
 #include <TPad.h>
+#include <TH2D.h>
+#include <TF1.h>
 
-
+#include "AliPID.h"
 #include "AliCFContainer.h"
 #include "AliCFDataGrid.h"
 #include "AliCFEffGrid.h"
@@ -50,6 +52,9 @@
 #include "AliLog.h"
 
 #include "AliHFEspectrum.h"
+#include "AliHFEcuts.h"
+#include "AliHFEcontainer.h"
+#include "AliHFEtools.h"
 
 ClassImp(AliHFEspectrum)
 
@@ -60,18 +65,47 @@ AliHFEspectrum::AliHFEspectrum(const char *name):
   fTemporaryObjects(NULL),
   fCorrelation(NULL),
   fBackground(NULL),
-  fBackgroundSource(kMCbackground),
+  fEfficiencyFunction(NULL),
+  fWeightCharm(NULL),
+  fInclusiveSpectrum(kTRUE),
   fDumpToFile(kFALSE),
-  fNEvents(0),
+  fEtaSelected(kFALSE),
+  fUnSetCorrelatedErrors(kTRUE),
+  fSetSmoothing(kFALSE),
+  fIPanaHadronBgSubtract(kFALSE),
+  fIPanaCharmBgSubtract(kFALSE),
+  fIPanaConversionBgSubtract(kFALSE),
+  fIPanaNonHFEBgSubtract(kFALSE),
+  fNonHFEbgMethod2(kFALSE),
+  fNonHFEmode(0),
+  fNbDimensions(1),
+  fNMCEvents(0),
+  fNMCbgEvents(0),
   fStepMC(-1),
   fStepTrue(-1),
   fStepData(-1),
+  fStepBeforeCutsV0(-1),
+  fStepAfterCutsV0(-1),
   fStepGuessedUnfolding(-1),
-  fNumberOfIterations(5)
+  fNumberOfIterations(5),
+  fChargeChoosen(-1),
+  fNCentralityBinAtTheEnd(0),
+  fHadronEffbyIPcut(NULL),
+  fConversionEff(NULL),
+  fNonHFEEff(NULL),
+  fBeamType(0),
+  fDebugLevel(0)
 {
   //
   // Default constructor
   //
+
+  for(Int_t k = 0; k < 20; k++){
+    fNEvents[k] = 0;
+    fLowBoundaryCentralityBinAtTheEnd[k] = 0;
+    fHighBoundaryCentralityBinAtTheEnd[k] = 0;
+  }
+  memset(fEtaRange, 0, sizeof(Double_t) * 2);
 }
 
 //____________________________________________________________
@@ -85,9 +119,220 @@ AliHFEspectrum::~AliHFEspectrum(){
     delete fTemporaryObjects;
   }
 }
+//____________________________________________________________
+Bool_t AliHFEspectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHFEcontainer *mchfecontainer, const AliHFEcontainer *v0hfecontainer, const AliHFEcontainer *bghfecontainer){
+  //
+  // Init what we need for the correction:
+  //
+  // Raw spectrum, hadron contamination
+  // MC efficiency maps, correlation matrix
+  // V0 efficiency if wanted
+  //
+  // This for a given dimension.
+  // If no inclusive spectrum, then take only efficiency map for beauty electron
+  // and the appropriate correlation matrix
+  //
+    Int_t kNdim;
+    if(fBeamType==0) kNdim=3;
+    if(fBeamType==1) kNdim=4;
+
+    Int_t dims[kNdim];
+    // Get the requested format
+    if(fBeamType==0)
+    {
+        // pp analysis
+       switch(fNbDimensions){
+       case 1:   dims[0] = 0;
+       break;
+       case 2:   for(Int_t i = 0; i < 2; i++) dims[i] = i;
+       break;
+       case 3:   for(Int_t i = 0; i < 3; i++) dims[i] = i;
+       break;
+       default:
+           AliError("Container with this number of dimensions not foreseen (yet)");
+           return kFALSE;
+       };
+    }
+
+    if(fBeamType==1)
+    {
+        // PbPb analysis; centrality as first dimension
+      Int_t nbDimensions = fNbDimensions;
+      fNbDimensions = fNbDimensions + 1;
+       switch(nbDimensions){
+       case 1:
+         dims[0] = 5;
+         dims[1] = 0;
+         break;
+       case 2:
+         dims[0] = 5;
+         for(Int_t i = 0; i < 2; i++) dims[(i+1)] = i;
+         break;
+       case 3:
+         dims[0] = 5;
+         for(Int_t i = 0; i < 3; i++) dims[(i+1)] = i;
+         break;
+       default:
+           AliError("Container with this number of dimensions not foreseen (yet)");
+           return kFALSE;
+       };
+    }
+
+
+
+  // Data container: raw spectrum + hadron contamination  
+  AliCFContainer *datacontainer = 0x0; 
+  if(fInclusiveSpectrum) {
+    datacontainer = datahfecontainer->GetCFContainer("recTrackContReco");
+  }
+  else{
+    datacontainer = datahfecontainer->MakeMergedCFContainer("sumreco","sumreco","recTrackContReco:recTrackContDEReco");
+  }
+  AliCFContainer *contaminationcontainer = datahfecontainer->GetCFContainer("hadronicBackground");
+  if((!datacontainer) || (!contaminationcontainer)) return kFALSE;
+
+  AliCFContainer *datacontainerD = GetSlicedContainer(datacontainer, fNbDimensions, dims, -1, fChargeChoosen);
+  AliCFContainer *contaminationcontainerD = GetSlicedContainer(contaminationcontainer, fNbDimensions, dims, -1, fChargeChoosen);
+  if((!datacontainerD) || (!contaminationcontainerD)) return kFALSE;
+
+  SetContainer(datacontainerD,AliHFEspectrum::kDataContainer);
+  SetContainer(contaminationcontainerD,AliHFEspectrum::kBackgroundData);
+
+  // MC container: ESD/MC efficiency maps + MC/MC efficiency maps 
+  AliCFContainer *mccontaineresd = 0x0;
+  AliCFContainer *mccontainermc = 0x0;
+  AliCFContainer *mccontainermcbg = 0x0;
+  AliCFContainer *nonHFEweightedContainer = 0x0;
+  AliCFContainer *convweightedContainer = 0x0;
+   
+  if(fInclusiveSpectrum) {
+    mccontaineresd = mchfecontainer->MakeMergedCFContainer("sumesd","sumesd","MCTrackCont:recTrackContReco");
+    mccontainermc = mchfecontainer->MakeMergedCFContainer("summc","summc","MCTrackCont:recTrackContMC");
+  }
+  else {
+    mccontaineresd = mchfecontainer->MakeMergedCFContainer("sumesd","sumesd","MCTrackCont:recTrackContReco:recTrackContDEReco");
+    mccontainermc = mchfecontainer->MakeMergedCFContainer("summc","summc","MCTrackCont:recTrackContMC:recTrackContDEMC");
+    mccontainermcbg = bghfecontainer->MakeMergedCFContainer("summcbg","summcbg","MCTrackCont:recTrackContMC:recTrackContDEMC");
+    nonHFEweightedContainer = bghfecontainer->GetCFContainer("mesonElecs");
+    convweightedContainer = bghfecontainer->GetCFContainer("conversionElecs");
+    if((!nonHFEweightedContainer) || (!convweightedContainer)) return kFALSE;
+  }
+  if((!mccontaineresd) || (!mccontainermc)) return kFALSE;  
+
+  Int_t source = -1;
+  if(!fInclusiveSpectrum) source = 1; //beauty
+  AliCFContainer *mccontaineresdD = GetSlicedContainer(mccontaineresd, fNbDimensions, dims, source, fChargeChoosen);
+  AliCFContainer *mccontainermcD = GetSlicedContainer(mccontainermc, fNbDimensions, dims, source, fChargeChoosen);
+  if((!mccontaineresdD) || (!mccontainermcD)) return kFALSE;
+  SetContainer(mccontainermcD,AliHFEspectrum::kMCContainerMC);
+  SetContainer(mccontaineresdD,AliHFEspectrum::kMCContainerESD);
+
+  // set charm, nonHFE container to estimate BG
+  if(!fInclusiveSpectrum){
+   source = 0; //charm
+   mccontainermcD = GetSlicedContainer(mccontainermcbg, fNbDimensions, dims, source, fChargeChoosen);
+   SetContainer(mccontainermcD,AliHFEspectrum::kMCContainerCharmMC);
+
+   source = 2; //conversion
+   mccontainermcD = GetSlicedContainer(mccontainermcbg, fNbDimensions, dims, source, fChargeChoosen);
+   AliCFEffGrid* efficiencyConv = new AliCFEffGrid("efficiencyConv","",*mccontainermcD);
+   efficiencyConv->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency. be careful with step #
+   fConversionEff = (TH1D*)efficiencyConv->Project(0);
+
+   source = 3; //non HFE except for the conversion
+   mccontainermcD = GetSlicedContainer(mccontainermcbg, fNbDimensions, dims, source, fChargeChoosen);
+   AliCFEffGrid* efficiencyNonhfe= new AliCFEffGrid("efficiencyNonhfe","",*mccontainermcD);
+   efficiencyNonhfe->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency. be careful with step #
+   fNonHFEEff = (TH1D*)efficiencyNonhfe->Project(0);
+
+   AliCFContainer *nonHFEweightedContainerD = GetSlicedContainer(nonHFEweightedContainer, fNbDimensions, dims, -1, fChargeChoosen);
+   SetContainer(nonHFEweightedContainerD,AliHFEspectrum::kMCWeightedContainerNonHFEESD);
+   AliCFContainer *convweightedContainerD = GetSlicedContainer(convweightedContainer, fNbDimensions, dims, -1, fChargeChoosen);
+   SetContainer(convweightedContainerD,AliHFEspectrum::kMCWeightedContainerConversionESD);
+  }
+// MC container: correlation matrix
+  THnSparseF *mccorrelation = 0x0;
+  if(fInclusiveSpectrum) {
+    if((fStepMC==(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepHFEcutsTRD + 2))) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterPID");
+    else if((fStepMC==(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepHFEcutsTRD + 1))) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterPID");
+    else if((fStepMC==(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepHFEcutsTRD))) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepbeforePID");
+    else if((fStepMC==(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepHFEcutsTRD - 1))) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepbeforePID");
+    else mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterPID");
+    
+    if(!mccorrelation) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterPID");
+  }
+  else mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterPID"); // we confirmed that we get same result by using it instead of correlationstepafterDE
+  //else mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterDE");
+  if(!mccorrelation) return kFALSE;
+  THnSparseF *mccorrelationD = GetSlicedCorrelation(mccorrelation, fNbDimensions, dims);
+  if(!mccorrelationD) {
+    printf("No correlation\n");
+    return kFALSE;
+  }
+  SetCorrelation(mccorrelationD);
+
+  // V0 container Electron, pt eta phi
+  if(v0hfecontainer) {
+    AliCFContainer *containerV0 = v0hfecontainer->GetCFContainer("taggedTrackContainerReco");
+    if(!containerV0) return kFALSE;
+    AliCFContainer *containerV0Electron = GetSlicedContainer(containerV0, fNbDimensions, dims, AliPID::kElectron+1);
+    if(!containerV0Electron) return kFALSE;
+    SetContainer(containerV0Electron,AliHFEspectrum::kDataContainerV0);
+  }
+
+  if(fDebugLevel>0){
+   
+    AliCFDataGrid *contaminationspectrum = (AliCFDataGrid *) ((AliCFDataGrid *)GetSpectrum(contaminationcontainer,1))->Clone();
+    contaminationspectrum->SetName("contaminationspectrum");
+    TCanvas * ccontaminationspectrum = new TCanvas("contaminationspectrum","contaminationspectrum",1000,700);
+    ccontaminationspectrum->Divide(3,1);
+    ccontaminationspectrum->cd(1);
+    TH2D * contaminationspectrum2dpteta = (TH2D *) contaminationspectrum->Project(1,0);
+    TH2D * contaminationspectrum2dptphi = (TH2D *) contaminationspectrum->Project(2,0);
+    TH2D * contaminationspectrum2detaphi = (TH2D *) contaminationspectrum->Project(1,2);
+    contaminationspectrum2dpteta->SetStats(0);
+    contaminationspectrum2dpteta->SetTitle("");
+    contaminationspectrum2dpteta->GetXaxis()->SetTitle("#eta");
+    contaminationspectrum2dpteta->GetYaxis()->SetTitle("p_{T} [GeV/c]");
+    contaminationspectrum2dptphi->SetStats(0);
+    contaminationspectrum2dptphi->SetTitle("");
+    contaminationspectrum2dptphi->GetXaxis()->SetTitle("#phi [rad]");
+    contaminationspectrum2dptphi->GetYaxis()->SetTitle("p_{T} [GeV/c]");
+    contaminationspectrum2detaphi->SetStats(0);
+    contaminationspectrum2detaphi->SetTitle("");
+    contaminationspectrum2detaphi->GetXaxis()->SetTitle("#eta");
+    contaminationspectrum2detaphi->GetYaxis()->SetTitle("#phi [rad]");
+    contaminationspectrum2dptphi->Draw("colz");
+    ccontaminationspectrum->cd(2);
+    contaminationspectrum2dpteta->Draw("colz");
+    ccontaminationspectrum->cd(3);
+    contaminationspectrum2detaphi->Draw("colz");
+
+    TCanvas * ccorrelation = new TCanvas("ccorrelation","ccorrelation",1000,700);
+    ccorrelation->cd(1);
+    if(mccorrelationD) {
+      if(fBeamType==0){
+       TH2D * ptcorrelation = (TH2D *) mccorrelationD->Projection(fNbDimensions,0);
+       ptcorrelation->Draw("colz");
+      }
+      if(fBeamType==1){
+       TH2D * ptcorrelation = (TH2D *) mccorrelationD->Projection(fNbDimensions+1,1);
+       ptcorrelation->Draw("colz");
+      }
+    }
+  }
+
+
+  return kTRUE;
+  
+}
+
 
 //____________________________________________________________
-void AliHFEspectrum::Correct(AliCFContainer *datacontainer,AliCFContainer *mccontainer,THnSparseF *mccorrelation){
+Bool_t AliHFEspectrum::Correct(Bool_t subtractcontamination){
   //
   // Correct the spectrum for efficiency and unfolding
   // with both method and compare
@@ -99,264 +344,762 @@ void AliHFEspectrum::Correct(AliCFContainer *datacontainer,AliCFContainer *mccon
   gStyle->SetCanvasColor(10);
   gStyle->SetPadLeftMargin(0.13);
   gStyle->SetPadRightMargin(0.13);
-  
-  //////////////////
-  // Take only pt
-  /////////////////
-  
-  AliCFDataGrid *dataspectrum = (AliCFDataGrid *)GetSpectrum(datacontainer,20);
-  
-  //
 
-  SetCorrelation(mccorrelation);
-  SetContainer(datacontainer,AliHFEspectrum::kDataContainer);
-  SetContainer(mccontainer,AliHFEspectrum::kMCContainer);
-  
-  SetMCEffStep(8);
-  SetMCTruthStep(0);
-  SetNumberOfIteration(5);
-  SetStepGuessedUnfolding(16);
-  SetNumberOfIteration(5);
-  SetStepToCorrect(20);
+  printf("Steps are: stepdata %d, stepMC %d, steptrue %d, stepV0after %d, stepV0before %d\n",fStepData,fStepMC,fStepTrue,fStepAfterCutsV0,fStepBeforeCutsV0);
+
+  ///////////////////////////
+  // Check initialization
+  ///////////////////////////
+
+  if((!GetContainer(kDataContainer)) || (!GetContainer(kMCContainerMC)) || (!GetContainer(kMCContainerESD))){
+    AliInfo("You have to init before");
+    return kFALSE;
+  }
   
-  // Unfold
+  if((fStepTrue == -1) && (fStepMC == -1) && (fStepData == -1)) {
+    AliInfo("You have to set the steps before: SetMCTruthStep, SetMCEffStep, SetStepToCorrect");
+    return kFALSE;
+  }
+  SetNumberOfIteration(10);
+  SetStepGuessedUnfolding(AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack);
+    
+  AliCFDataGrid *dataGridAfterFirstSteps = 0x0;
+  //////////////////////////////////
+  // Subtract hadron background
+  /////////////////////////////////
+  AliCFDataGrid *dataspectrumaftersubstraction = 0x0;
+  if(subtractcontamination) {
+    dataspectrumaftersubstraction = SubtractBackground(kTRUE);
+    dataGridAfterFirstSteps = dataspectrumaftersubstraction;
+  }
+
+  ////////////////////////////////////////////////
+  // Correct for TPC efficiency from V0
+  ///////////////////////////////////////////////
+  AliCFDataGrid *dataspectrumafterV0efficiencycorrection = 0x0;
+  AliCFContainer *dataContainerV0 = GetContainer(kDataContainerV0);
+  if(dataContainerV0){printf("Got the V0 container\n");
+    dataspectrumafterV0efficiencycorrection = CorrectV0Efficiency(dataspectrumaftersubstraction);
+    dataGridAfterFirstSteps = dataspectrumafterV0efficiencycorrection;  
+  }
 
-  TList *listunfolded = Unfold(1);
+  //////////////////////////////////////////////////////////////////////////////
+  // Correct for efficiency parametrized (if TPC efficiency is parametrized)
+  /////////////////////////////////////////////////////////////////////////////
+  AliCFDataGrid *dataspectrumafterefficiencyparametrizedcorrection = 0x0;
+  if(fEfficiencyFunction){
+    dataspectrumafterefficiencyparametrizedcorrection = CorrectParametrizedEfficiency(dataGridAfterFirstSteps);
+    dataGridAfterFirstSteps = dataspectrumafterefficiencyparametrizedcorrection;  
+  }
+    
+  ///////////////
+  // Unfold
+  //////////////
+  TList *listunfolded = Unfold(dataGridAfterFirstSteps);
   if(!listunfolded){
     printf("Unfolded failed\n");
-    return;
+    return kFALSE;
   }
   THnSparse *correctedspectrum = (THnSparse *) listunfolded->At(0);
   THnSparse *residualspectrum = (THnSparse *) listunfolded->At(1);
   if(!correctedspectrum){
     AliError("No corrected spectrum\n");
-    return;
+    return kFALSE;
   }
- if(!residualspectrum){
 if(!residualspectrum){
     AliError("No residul spectrum\n");
-    return;
+    return kFALSE;
   }   
-
+  
+  /////////////////////
   // Simply correct
- SetMCEffStep(20);  
- AliCFDataGrid *alltogetherCorrection = CorrectForEfficiency(1);
- //////////
+  ////////////////////
+  AliCFDataGrid *alltogetherCorrection = CorrectForEfficiency(dataGridAfterFirstSteps);
+  
+
+  //////////
   // Plot
   //////////
+  if(fDebugLevel > 0.0) {
+
+    Int_t ptpr;
+    if(fBeamType==0) ptpr=0;
+    if(fBeamType==1) ptpr=1;
+  
+    TCanvas * ccorrected = new TCanvas("corrected","corrected",1000,700);
+    ccorrected->Divide(2,1);
+    ccorrected->cd(1);
+    gPad->SetLogy();
+    TGraphErrors* correctedspectrumD = Normalize(correctedspectrum);
+    correctedspectrumD->SetTitle("");
+    correctedspectrumD->GetYaxis()->SetTitleOffset(1.5);
+    correctedspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
+    correctedspectrumD->SetMarkerStyle(26);
+    correctedspectrumD->SetMarkerColor(kBlue);
+    correctedspectrumD->SetLineColor(kBlue);
+    correctedspectrumD->Draw("AP");
+    TGraphErrors* alltogetherspectrumD = Normalize(alltogetherCorrection);
+    alltogetherspectrumD->SetTitle("");
+    alltogetherspectrumD->GetYaxis()->SetTitleOffset(1.5);
+    alltogetherspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
+    alltogetherspectrumD->SetMarkerStyle(25);
+    alltogetherspectrumD->SetMarkerColor(kBlack);
+    alltogetherspectrumD->SetLineColor(kBlack);
+    alltogetherspectrumD->Draw("P");
+    TLegend *legcorrected = new TLegend(0.4,0.6,0.89,0.89);
+    legcorrected->AddEntry(correctedspectrumD,"Corrected","p");
+    legcorrected->AddEntry(alltogetherspectrumD,"Alltogether","p");
+    legcorrected->Draw("same");
+    ccorrected->cd(2);
+    TH1D *correctedTH1D = correctedspectrum->Projection(ptpr);
+    TH1D *alltogetherTH1D = (TH1D *) alltogetherCorrection->Project(ptpr);
+    TH1D* ratiocorrected = (TH1D*)correctedTH1D->Clone();
+    ratiocorrected->SetName("ratiocorrected");
+    ratiocorrected->SetTitle("");
+    ratiocorrected->GetYaxis()->SetTitle("Unfolded/DirectCorrected");
+    ratiocorrected->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+    ratiocorrected->Divide(correctedTH1D,alltogetherTH1D,1,1);
+    ratiocorrected->SetStats(0);
+    ratiocorrected->Draw();
+
+    TH1D unfoldingspectrac[fNCentralityBinAtTheEnd];
+    TGraphErrors unfoldingspectracn[fNCentralityBinAtTheEnd];
+    TH1D correctedspectrac[fNCentralityBinAtTheEnd];
+    TGraphErrors correctedspectracn[fNCentralityBinAtTheEnd];
 
-  TCanvas * cresidual = new TCanvas("residual","residual",1000,700);
-  cresidual->Divide(2,1);
-  cresidual->cd(1);
-  gPad->SetLogy();
-  TGraphErrors* residualspectrumD = Normalize(residualspectrum);
-  if(!residualspectrumD) {
-    AliError("Number of Events not set for the normalization");
-    return;
-  }
-  residualspectrumD->SetTitle("");
-  residualspectrumD->GetYaxis()->SetTitleOffset(1.5);
-  residualspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
-  residualspectrumD->SetMarkerStyle(26);
-  residualspectrumD->SetMarkerColor(kBlue);
-  residualspectrumD->SetLineColor(kBlue);
-  residualspectrumD->Draw("AP");
-  TGraphErrors* measuredspectrumD = Normalize(dataspectrum);
-  measuredspectrumD->SetTitle("");  
-  measuredspectrumD->GetYaxis()->SetTitleOffset(1.5);
-  measuredspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
-  measuredspectrumD->SetMarkerStyle(25);
-  measuredspectrumD->SetMarkerColor(kBlack);
-  measuredspectrumD->SetLineColor(kBlack);
-  measuredspectrumD->Draw("P");
-  TLegend *legres = new TLegend(0.4,0.6,0.89,0.89);
-  legres->AddEntry(residualspectrumD,"Residual","p");
-  legres->AddEntry(measuredspectrumD,"Measured","p");
-  legres->Draw("same");
-  cresidual->cd(2);
-  TH1D *residualTH1D = residualspectrum->Projection(0);
-  TH1D *measuredTH1D = dataspectrum->Project(0);
-  TH1D* ratioresidual = (TH1D*)residualTH1D->Clone();
-  ratioresidual->SetName("ratioresidual");
-  ratioresidual->SetTitle("");
-  ratioresidual->GetYaxis()->SetTitle("Folded/Measured");
-  ratioresidual->GetXaxis()->SetTitle("p_{T} [GeV/c]");
-  ratioresidual->Divide(residualTH1D,measuredTH1D,1,1);
-  ratioresidual->SetStats(0);
-  ratioresidual->Draw();
-
-  //
-
-  
-  TCanvas * ccorrected = new TCanvas("corrected","corrected",1000,700);
-  ccorrected->Divide(2,1);
-  ccorrected->cd(1);
-  gPad->SetLogy();
-  TGraphErrors* correctedspectrumD = Normalize(correctedspectrum);
-  correctedspectrumD->SetTitle("");
-  correctedspectrumD->GetYaxis()->SetTitleOffset(1.5);
-  correctedspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
-  correctedspectrumD->SetMarkerStyle(26);
-  correctedspectrumD->SetMarkerColor(kBlue);
-  correctedspectrumD->SetLineColor(kBlue);
-  correctedspectrumD->Draw("AP");
-  TGraphErrors* alltogetherspectrumD = Normalize(alltogetherCorrection);
-  alltogetherspectrumD->SetTitle("");
-  alltogetherspectrumD->GetYaxis()->SetTitleOffset(1.5);
-  alltogetherspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
-  alltogetherspectrumD->SetMarkerStyle(25);
-  alltogetherspectrumD->SetMarkerColor(kBlack);
-  alltogetherspectrumD->SetLineColor(kBlack);
-  alltogetherspectrumD->Draw("P");
-  TLegend *legcorrected = new TLegend(0.4,0.6,0.89,0.89);
-  legcorrected->AddEntry(correctedspectrumD,"Corrected","p");
-  legcorrected->AddEntry(alltogetherspectrumD,"Alltogether","p");
-  legcorrected->Draw("same");
-  ccorrected->cd(2);
-  TH1D *correctedTH1D = correctedspectrum->Projection(0);
-  TH1D *alltogetherTH1D = alltogetherCorrection->Project(0);
-  TH1D* ratiocorrected = (TH1D*)correctedTH1D->Clone();
-  ratiocorrected->SetName("ratiocorrected");
-  ratiocorrected->SetTitle("");
-  ratiocorrected->GetYaxis()->SetTitle("Unfolded/DirectCorrected");
-  ratiocorrected->GetXaxis()->SetTitle("p_{T} [GeV/c]");
-  ratiocorrected->Divide(correctedTH1D,alltogetherTH1D,1,1);
-  ratiocorrected->SetStats(0);
-  ratiocorrected->Draw();
-  
-  // Efficiency correction
-
-  AliCFEffGrid  *efficiencymcPID = (AliCFEffGrid*)  GetEfficiency(mccontainer,8,7);
-  AliCFEffGrid  *efficiencymctrackinggeo = (AliCFEffGrid*)  GetEfficiency(mccontainer,7,0);
-  AliCFEffGrid  *efficiencymcall = (AliCFEffGrid*)  GetEfficiency(mccontainer,8,0);
-  
-  AliCFEffGrid  *efficiencyesdall = (AliCFEffGrid*)  GetEfficiency(mccontainer,20,0);
-  
-  TCanvas * cefficiency = new TCanvas("efficiency","efficiency",1000,700);
-  cefficiency->cd(1);
-  TH1D* efficiencymcPIDD = efficiencymcPID->Project(0);
-  efficiencymcPIDD->SetTitle("");
-  efficiencymcPIDD->SetStats(0);
-  efficiencymcPIDD->SetMarkerStyle(25);
-  efficiencymcPIDD->Draw();
-  TH1D* efficiencymctrackinggeoD = efficiencymctrackinggeo->Project(0);
-  efficiencymctrackinggeoD->SetTitle("");
-  efficiencymctrackinggeoD->SetStats(0);
-  efficiencymctrackinggeoD->SetMarkerStyle(26);
-  efficiencymctrackinggeoD->Draw("same");
-  TH1D* efficiencymcallD = efficiencymcall->Project(0);
-  efficiencymcallD->SetTitle("");
-  efficiencymcallD->SetStats(0);
-  efficiencymcallD->SetMarkerStyle(27);
-  efficiencymcallD->Draw("same");
-  TH1D* efficiencyesdallD = efficiencyesdall->Project(0);
-  efficiencyesdallD->SetTitle("");
-  efficiencyesdallD->SetStats(0);
-  efficiencyesdallD->SetMarkerStyle(24);
-  efficiencyesdallD->Draw("same");
-  TLegend *legeff = new TLegend(0.4,0.6,0.89,0.89);
-  legeff->AddEntry(efficiencymcPIDD,"PID efficiency","p");
-  legeff->AddEntry(efficiencymctrackinggeoD,"Tracking geometry efficiency","p");
-  legeff->AddEntry(efficiencymcallD,"Overall efficiency","p");
-  legeff->AddEntry(efficiencyesdallD,"Overall efficiency ESD","p");
-  legeff->Draw("same");
-
-  // Dump to file if needed
-
-  if(fDumpToFile) {
     
-    TFile *out = new TFile("finalSpectrum.root","recreate");
-    out->cd();
-    //
-    residualspectrumD->SetName("UnfoldingResidualSpectrum");
-    residualspectrumD->Write();
-    measuredspectrumD->SetName("MeasuredSpectrum");
-    measuredspectrumD->Write();
-    ratioresidual->SetName("RatioResidualSpectrum");
-    ratioresidual->Write();
-    //
-    correctedspectrumD->SetName("UnfoldingCorrectedSpectrum");
-    correctedspectrumD->Write();
-    alltogetherspectrumD->SetName("AlltogetherSpectrum");
-    alltogetherspectrumD->Write();
-    ratiocorrected->SetName("RatioUnfoldingAlltogetherSpectrum");
-    ratiocorrected->Write();
-    //
-    correctedspectrum->SetName("UnfoldingCorrectedNotNormalizedSpectrum");
-    correctedspectrum->Write();
-    alltogetherCorrection->SetName("AlltogetherCorrectedNotNormalizedSpectrum");
-    alltogetherCorrection->Write();
-    //
-    out->Close(); delete out;
+
+    if(fBeamType==1) {
+
+      TCanvas * ccorrectedallspectra = new TCanvas("correctedallspectra","correctedallspectra",1000,700);
+      ccorrectedallspectra->Divide(2,1);
+      TLegend *legtotal = new TLegend(0.4,0.6,0.89,0.89);
+      TLegend *legtotalg = new TLegend(0.4,0.6,0.89,0.89);
+      
+      THnSparseF* sparsesu = (THnSparseF *) correctedspectrum;
+      TAxis *cenaxisa = sparsesu->GetAxis(0);
+      THnSparseF* sparsed = (THnSparseF *) alltogetherCorrection->GetGrid();
+      TAxis *cenaxisb = sparsed->GetAxis(0);
+      Int_t nbbin = cenaxisb->GetNbins();
+      Int_t stylee[20] = {20,21,22,23,24,25,26,27,28,30,4,5,7,29,29,29,29,29,29,29};
+      Int_t colorr[20] = {2,3,4,5,6,7,8,9,46,38,29,30,31,32,33,34,35,37,38,20};
+      for(Int_t binc = 0; binc < fNCentralityBinAtTheEnd; binc++){
+       TString titlee("corrected_centrality_bin_");
+       titlee += "[";
+       titlee += fLowBoundaryCentralityBinAtTheEnd[binc];
+       titlee += "_";
+       titlee += fHighBoundaryCentralityBinAtTheEnd[binc];
+       titlee += "[";
+       TString titleec("corrected_check_projection_bin_");
+       titleec += "[";
+       titleec += fLowBoundaryCentralityBinAtTheEnd[binc];
+       titleec += "_";
+       titleec += fHighBoundaryCentralityBinAtTheEnd[binc];
+       titleec += "[";
+       TString titleenameunotnormalized("Unfolded_Notnormalized_centrality_bin_");
+       titleenameunotnormalized += "[";
+       titleenameunotnormalized += fLowBoundaryCentralityBinAtTheEnd[binc];
+       titleenameunotnormalized += "_";
+       titleenameunotnormalized += fHighBoundaryCentralityBinAtTheEnd[binc];
+       titleenameunotnormalized += "[";
+               TString titleenameunormalized("Unfolded_normalized_centrality_bin_");
+       titleenameunormalized += "[";
+       titleenameunormalized += fLowBoundaryCentralityBinAtTheEnd[binc];
+       titleenameunormalized += "_";
+       titleenameunormalized += fHighBoundaryCentralityBinAtTheEnd[binc];      
+       titleenameunormalized += "[";
+       TString titleenamednotnormalized("Dirrectcorrected_Notnormalized_centrality_bin_");
+       titleenamednotnormalized += "[";
+       titleenamednotnormalized += fLowBoundaryCentralityBinAtTheEnd[binc];
+       titleenamednotnormalized += "_";
+       titleenamednotnormalized += fHighBoundaryCentralityBinAtTheEnd[binc];
+       titleenamednotnormalized += "[";
+       TString titleenamednormalized("Dirrectedcorrected_normalized_centrality_bin_");
+       titleenamednormalized += "[";
+       titleenamednormalized += fLowBoundaryCentralityBinAtTheEnd[binc];
+       titleenamednormalized += "_";
+       titleenamednormalized += fHighBoundaryCentralityBinAtTheEnd[binc];      
+       titleenamednormalized += "[";
+       Int_t nbEvents = 0;
+       for(Int_t k = fLowBoundaryCentralityBinAtTheEnd[binc]; k < fHighBoundaryCentralityBinAtTheEnd[binc]; k++) {
+         printf("Number of events %d in the bin %d added!!!\n",fNEvents[k],k);
+         nbEvents += fNEvents[k];
+       }
+       Double_t lowedgega = cenaxisa->GetBinLowEdge(fLowBoundaryCentralityBinAtTheEnd[binc]+1);
+       Double_t upedgega = cenaxisa->GetBinUpEdge(fHighBoundaryCentralityBinAtTheEnd[binc]);
+       printf("Bin Low edge %f, up edge %f for a\n",lowedgega,upedgega);
+       Double_t lowedgegb = cenaxisb->GetBinLowEdge(fLowBoundaryCentralityBinAtTheEnd[binc]+1);
+       Double_t upedgegb = cenaxisb->GetBinUpEdge(fHighBoundaryCentralityBinAtTheEnd[binc]);
+       printf("Bin Low edge %f, up edge %f for b\n",lowedgegb,upedgegb);
+       cenaxisa->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fHighBoundaryCentralityBinAtTheEnd[binc]);
+       cenaxisb->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fHighBoundaryCentralityBinAtTheEnd[binc]);
+       TCanvas * ccorrectedcheck = new TCanvas((const char*) titleec,(const char*) titleec,1000,700);
+       ccorrectedcheck->cd(1);
+       TH1D *aftersuc = (TH1D *) sparsesu->Projection(0);
+       TH1D *aftersdc = (TH1D *) sparsed->Projection(0);
+       aftersuc->Draw();
+       aftersdc->Draw("same");
+       TCanvas * ccorrectede = new TCanvas((const char*) titlee,(const char*) titlee,1000,700);
+       ccorrectede->Divide(2,1);
+       ccorrectede->cd(1);
+       gPad->SetLogy();
+       TH1D *aftersu = (TH1D *) sparsesu->Projection(1);
+       CorrectFromTheWidth(aftersu);
+       aftersu->SetName((const char*)titleenameunotnormalized);
+       unfoldingspectrac[binc] = *aftersu;
+       ccorrectede->cd(1);
+               TGraphErrors* aftersun = NormalizeTH1N(aftersu,nbEvents);
+       aftersun->SetTitle("");
+       aftersun->GetYaxis()->SetTitleOffset(1.5);
+       aftersun->GetYaxis()->SetRangeUser(0.000000001,1.0);
+       aftersun->SetMarkerStyle(26);
+       aftersun->SetMarkerColor(kBlue);
+       aftersun->SetLineColor(kBlue);
+       aftersun->Draw("AP");
+       aftersun->SetName((const char*)titleenameunormalized);
+       unfoldingspectracn[binc] = *aftersun;
+       ccorrectede->cd(1);
+       TH1D *aftersd = (TH1D *) sparsed->Projection(1);
+       CorrectFromTheWidth(aftersd);
+       aftersd->SetName((const char*)titleenamednotnormalized);
+       correctedspectrac[binc] = *aftersd;
+       ccorrectede->cd(1);
+       TGraphErrors* aftersdn = NormalizeTH1N(aftersd,nbEvents);
+       aftersdn->SetTitle("");
+       aftersdn->GetYaxis()->SetTitleOffset(1.5);
+       aftersdn->GetYaxis()->SetRangeUser(0.000000001,1.0);
+       aftersdn->SetMarkerStyle(25);
+       aftersdn->SetMarkerColor(kBlack);
+       aftersdn->SetLineColor(kBlack);
+       aftersdn->Draw("P");
+       aftersdn->SetName((const char*)titleenamednormalized);
+       correctedspectracn[binc] = *aftersdn;
+       TLegend *legcorrectedud = new TLegend(0.4,0.6,0.89,0.89);
+       legcorrectedud->AddEntry(aftersun,"Corrected","p");
+       legcorrectedud->AddEntry(aftersdn,"Alltogether","p");
+       legcorrectedud->Draw("same");
+       ccorrectedallspectra->cd(1);
+       gPad->SetLogy();
+       TH1D *aftersunn = (TH1D *) aftersun->Clone();
+       aftersunn->SetMarkerStyle(stylee[binc]);
+       aftersunn->SetMarkerColor(colorr[binc]);
+       if(binc==0) aftersunn->Draw("AP");
+       else aftersunn->Draw("P");
+       legtotal->AddEntry(aftersunn,(const char*) titlee,"p");
+       ccorrectedallspectra->cd(2);
+       gPad->SetLogy();
+       TH1D *aftersdnn = (TH1D *) aftersdn->Clone();
+       aftersdnn->SetMarkerStyle(stylee[binc]);
+       aftersdnn->SetMarkerColor(colorr[binc]);
+       if(binc==0) aftersdnn->Draw("AP");
+       else aftersdnn->Draw("P");
+       legtotalg->AddEntry(aftersdnn,(const char*) titlee,"p");
+       ccorrectede->cd(2);
+       TH1D* ratiocorrectedbinc = (TH1D*)aftersu->Clone();
+       TString titleee("ratiocorrected_bin_");
+       titleee += binc;
+       ratiocorrectedbinc->SetName((const char*) titleee);
+       ratiocorrectedbinc->SetTitle("");
+       ratiocorrectedbinc->GetYaxis()->SetTitle("Unfolded/DirectCorrected");
+       ratiocorrectedbinc->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+       ratiocorrectedbinc->Divide(aftersu,aftersd,1,1);
+       ratiocorrectedbinc->SetStats(0);
+       ratiocorrectedbinc->Draw();
+      }
+
+      ccorrectedallspectra->cd(1);
+      legtotal->Draw("same");
+      ccorrectedallspectra->cd(2);
+      legtotalg->Draw("same");
+      
+      cenaxisa->SetRange(0,nbbin);
+      cenaxisb->SetRange(0,nbbin);
+
+    }
+
+    // Dump to file if needed
+    if(fDumpToFile) {
+      TFile *out = new TFile("finalSpectrum.root","recreate");
+      correctedspectrumD->SetName("UnfoldingCorrectedSpectrum");
+      correctedspectrumD->Write();
+      alltogetherspectrumD->SetName("AlltogetherSpectrum");
+      alltogetherspectrumD->Write();
+      ratiocorrected->SetName("RatioUnfoldingAlltogetherSpectrum");
+      ratiocorrected->Write();
+      correctedspectrum->SetName("UnfoldingCorrectedNotNormalizedSpectrum");
+      correctedspectrum->Write();
+      alltogetherCorrection->SetName("AlltogetherCorrectedNotNormalizedSpectrum");
+      alltogetherCorrection->Write();
+      for(Int_t binc = 0; binc < fNCentralityBinAtTheEnd; binc++){
+       unfoldingspectrac[binc].Write();
+       unfoldingspectracn[binc].Write();
+       correctedspectrac[binc].Write();
+       correctedspectracn[binc].Write();
+      }
+      out->Close(); delete out;
+    }
+
+  }
+
+
+  
+
+  return kTRUE;
+}
+
+//____________________________________________________________
+Bool_t AliHFEspectrum::CorrectBeauty(Bool_t subtractcontamination){
+  //
+  // Correct the spectrum for efficiency and unfolding for beauty analysis
+  // with both method and compare
+  //
+  
+  gStyle->SetPalette(1);
+  gStyle->SetOptStat(1111);
+  gStyle->SetPadBorderMode(0);
+  gStyle->SetCanvasColor(10);
+  gStyle->SetPadLeftMargin(0.13);
+  gStyle->SetPadRightMargin(0.13);
+
+  ///////////////////////////
+  // Check initialization
+  ///////////////////////////
+
+  if((!GetContainer(kDataContainer)) || (!GetContainer(kMCContainerMC)) || (!GetContainer(kMCContainerESD))){
+    AliInfo("You have to init before");
+    return kFALSE;
+  }
+  
+  if((fStepTrue == 0) && (fStepMC == 0) && (fStepData == 0)) {
+    AliInfo("You have to set the steps before: SetMCTruthStep, SetMCEffStep, SetStepToCorrect");
+    return kFALSE;
+  }
+  SetNumberOfIteration(10);
+  SetStepGuessedUnfolding(AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack);
     
+  AliCFDataGrid *dataGridAfterFirstSteps = 0x0;
+  //////////////////////////////////
+  // Subtract hadron background
+  /////////////////////////////////
+  AliCFDataGrid *dataspectrumaftersubstraction = 0x0;
+  if(subtractcontamination) {
+    dataspectrumaftersubstraction = SubtractBackground(kTRUE);
+    dataGridAfterFirstSteps = dataspectrumaftersubstraction;
+  }
+
+  /////////////////////////////////////////////////////////////////////////////////////////
+  // Correct for IP efficiency for beauty electrons after subtracting all the backgrounds
+  /////////////////////////////////////////////////////////////////////////////////////////
+
+  AliCFDataGrid *dataspectrumafterefficiencyparametrizedcorrection = 0x0;
+  AliCFDataGrid *dataspectrumafterV0efficiencycorrection = 0x0;
+  AliCFContainer *dataContainerV0 = GetContainer(kDataContainerV0);
+
+  if(fEfficiencyFunction){
+    dataspectrumafterefficiencyparametrizedcorrection = CorrectParametrizedEfficiency(dataGridAfterFirstSteps);
+    dataGridAfterFirstSteps = dataspectrumafterefficiencyparametrizedcorrection;  
+  }
+  else if(dataContainerV0){
+    dataspectrumafterV0efficiencycorrection = CorrectV0Efficiency(dataspectrumaftersubstraction);
+    dataGridAfterFirstSteps = dataspectrumafterV0efficiencycorrection;  
+  }  
+
+  ///////////////
+  // Unfold
+  //////////////
+  TList *listunfolded = Unfold(dataGridAfterFirstSteps);
+  if(!listunfolded){
+    printf("Unfolded failed\n");
+    return kFALSE;
   }
+  THnSparse *correctedspectrum = (THnSparse *) listunfolded->At(0);
+  THnSparse *residualspectrum = (THnSparse *) listunfolded->At(1);
+  if(!correctedspectrum){
+    AliError("No corrected spectrum\n");
+    return kFALSE;
+  }
+  if(!residualspectrum){
+    AliError("No residual spectrum\n");
+    return kFALSE;
+  }   
+  
+  /////////////////////
+  // Simply correct
+  ////////////////////
+  AliCFDataGrid *alltogetherCorrection = CorrectForEfficiency(dataGridAfterFirstSteps);
+  
+
+  //////////
+  // Plot
+  //////////
+  if(fDebugLevel > 0.0) {
+  
+    TCanvas * ccorrected = new TCanvas("corrected","corrected",1000,700);
+    ccorrected->Divide(2,1);
+    ccorrected->cd(1);
+    gPad->SetLogy();
+    TGraphErrors* correctedspectrumD = Normalize(correctedspectrum);
+    correctedspectrumD->SetTitle("");
+    correctedspectrumD->GetYaxis()->SetTitleOffset(1.5);
+    correctedspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
+    correctedspectrumD->SetMarkerStyle(26);
+    correctedspectrumD->SetMarkerColor(kBlue);
+    correctedspectrumD->SetLineColor(kBlue);
+    correctedspectrumD->Draw("AP");
+    TGraphErrors* alltogetherspectrumD = Normalize(alltogetherCorrection);
+    alltogetherspectrumD->SetTitle("");
+    alltogetherspectrumD->GetYaxis()->SetTitleOffset(1.5);
+    alltogetherspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
+    alltogetherspectrumD->SetMarkerStyle(25);
+    alltogetherspectrumD->SetMarkerColor(kBlack);
+    alltogetherspectrumD->SetLineColor(kBlack);
+    alltogetherspectrumD->Draw("P");
+    TLegend *legcorrected = new TLegend(0.4,0.6,0.89,0.89);
+    legcorrected->AddEntry(correctedspectrumD,"Corrected","p");
+    legcorrected->AddEntry(alltogetherspectrumD,"Alltogether","p");
+    legcorrected->Draw("same");
+    ccorrected->cd(2);
+    TH1D *correctedTH1D = correctedspectrum->Projection(0);
+    TH1D *alltogetherTH1D = (TH1D *) alltogetherCorrection->Project(0);
+    TH1D* ratiocorrected = (TH1D*)correctedTH1D->Clone();
+    ratiocorrected->SetName("ratiocorrected");
+    ratiocorrected->SetTitle("");
+    ratiocorrected->GetYaxis()->SetTitle("Unfolded/DirectCorrected");
+    ratiocorrected->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+    ratiocorrected->Divide(correctedTH1D,alltogetherTH1D,1,1);
+    ratiocorrected->SetStats(0);
+    ratiocorrected->Draw();
+
+
+    // Dump to file if needed
+
+    if(fDumpToFile) {
+      
+      TFile *out;
+      if(fNonHFEmode == 1){
+       out = new TFile("finalSpectrumLow.root","recreate");
+      }
+      else if(fNonHFEmode == 2){
+       out = new TFile("finalSpectrumUp.root","recreate");
+      }
+      else{
+       out = new TFile("finalSpectrum.root","recreate");
+      }
+      out->cd();
+      //
+      correctedspectrumD->SetName("UnfoldingCorrectedSpectrum");
+      correctedspectrumD->Write();
+      alltogetherspectrumD->SetName("AlltogetherSpectrum");
+      alltogetherspectrumD->Write();
+      ratiocorrected->SetName("RatioUnfoldingAlltogetherSpectrum");
+      ratiocorrected->Write();
+      //
+      correctedspectrum->SetName("UnfoldingCorrectedNotNormalizedSpectrum");
+      correctedspectrum->Write();
+      alltogetherCorrection->SetName("AlltogetherCorrectedNotNormalizedSpectrum");
+      alltogetherCorrection->Write();
+      //
+      out->Close(); 
+      delete out;
+    }
+  
 
+  }
 
+  return kTRUE;
 }
 
 //____________________________________________________________
-AliCFDataGrid* AliHFEspectrum::SubtractBackground(Int_t dimensions, Bool_t setBackground){
+AliCFDataGrid* AliHFEspectrum::SubtractBackground(Bool_t setBackground){
   //
   // Apply background subtraction
   //
-
+  
+  // Raw spectrum
   AliCFContainer *dataContainer = GetContainer(kDataContainer);
   if(!dataContainer){
     AliError("Data Container not available");
     return NULL;
   }
+  printf("Step data: %d\n",fStepData);
+  AliCFDataGrid *spectrumSubtracted = new AliCFDataGrid("spectrumSubtracted", "Data Grid for spectrum after Background subtraction", *dataContainer,fStepData);
+
+  AliCFDataGrid *dataspectrumbeforesubstraction = (AliCFDataGrid *) ((AliCFDataGrid *)GetSpectrum(GetContainer(kDataContainer),fStepData))->Clone();
+  dataspectrumbeforesubstraction->SetName("dataspectrumbeforesubstraction"); 
  
-  // Get the data grid in the requested format
-  Bool_t initContainer = kFALSE;
-  Int_t dims[3];
-  switch(dimensions){
-    case 1:   dims[0] = 0;
-              initContainer = kTRUE;
-              break;
-    case 3:   for(Int_t i = 0; i < 3; i++) dims[i] = i;
-              initContainer = kTRUE;
-              break;
-    default:
-              AliError("Container with this number of dimensions not foreseen (yet)");
-  };
-  if(!initContainer){
-    AliError("Creation of the sliced containers failed. Background estimation not possible");
+  // Background Estimate
+  AliCFContainer *backgroundContainer = GetContainer(kBackgroundData);
+  if(!backgroundContainer){
+    AliError("MC background container not found");
     return NULL;
   }
-  AliCFContainer *spectrumSliced = GetSlicedContainer(dataContainer, dimensions, dims);
-
-  // Make Background Estimate
-  AliCFDataGrid *backgroundGrid = NULL;
-  if(fBackgroundSource == kDataBackground)
-    backgroundGrid = MakeBackgroundEstimateFromData(dimensions);
-  else
-    backgroundGrid = MakeBackgroundEstimateFromMC(dimensions);
-  if(!backgroundGrid){
-    AliError("Background Estimate not created");
-    ClearObject(spectrumSliced);
-    return NULL;
+  Int_t stepbackground = 1; // 2 for !fInclusiveSpectrum analysis(old method)
+  AliCFDataGrid *backgroundGrid = new AliCFDataGrid("ContaminationGrid","ContaminationGrid",*backgroundContainer,stepbackground);
+
+  if(!fInclusiveSpectrum){
+    //Background subtraction for IP analysis
+    TH1D *measuredTH1Draw = (TH1D *) dataspectrumbeforesubstraction->Project(0);
+    CorrectFromTheWidth(measuredTH1Draw);
+    TCanvas *rawspectra = new TCanvas("rawspectra","rawspectra",600,500);
+    rawspectra->cd();
+    measuredTH1Draw->SetMarkerStyle(20);
+    measuredTH1Draw->Draw();
+    if(fIPanaHadronBgSubtract){
+      // Hadron background
+      printf("Hadron background for IP analysis subtracted!\n");
+      Int_t* bins=new Int_t[1];
+      TH1D* htemp  = (TH1D *) fHadronEffbyIPcut->Projection(0);
+      bins[0]=htemp->GetNbinsX();
+      AliCFDataGrid *hbgContainer = new AliCFDataGrid("hbgContainer","hadron bg after IP cut",1,bins);
+      hbgContainer->SetGrid(fHadronEffbyIPcut);
+      backgroundGrid->Multiply(hbgContainer,1);
+      // draw raw hadron bg spectra
+      TH1D *hadronbg= (TH1D *) backgroundGrid->Project(0);
+      CorrectFromTheWidth(hadronbg);
+      hadronbg->SetMarkerColor(7);
+      hadronbg->SetMarkerStyle(20);
+      rawspectra->cd();
+      hadronbg->Draw("samep");
+      // subtract hadron contamination
+      spectrumSubtracted->Add(backgroundGrid,-1.0);
+    }
+    if(fIPanaCharmBgSubtract){
+      // Charm background
+      printf("Charm background for IP analysis subtracted!\n");
+      AliCFDataGrid *charmbgContainer = (AliCFDataGrid *) GetCharmBackground();
+      // draw charm bg spectra
+      TH1D *charmbg= (TH1D *) charmbgContainer->Project(0);
+      CorrectFromTheWidth(charmbg);
+      charmbg->SetMarkerColor(3);
+      charmbg->SetMarkerStyle(20);
+      rawspectra->cd();
+      charmbg->Draw("samep");
+      // subtract charm background
+      spectrumSubtracted->Add(charmbgContainer,-1.0);
+    }
+    if(fIPanaConversionBgSubtract){
+      // Conversion background
+      AliCFDataGrid *conversionbgContainer = (AliCFDataGrid *) GetConversionBackground();
+      // draw conversion bg spectra
+      TH1D *conversionbg= (TH1D *) conversionbgContainer->Project(0);
+      CorrectFromTheWidth(conversionbg);
+      conversionbg->SetMarkerColor(4);
+      conversionbg->SetMarkerStyle(20);
+      rawspectra->cd();
+      conversionbg->Draw("samep");
+      // subtract conversion background
+      spectrumSubtracted->Add(conversionbgContainer,-1.0);
+      printf("Conversion background subtraction is preliminary!\n");
+    }
+    if(fIPanaNonHFEBgSubtract){
+      // NonHFE background
+      AliCFDataGrid *nonHFEbgContainer = (AliCFDataGrid *) GetNonHFEBackground();
+      // draw Dalitz/dielectron bg spectra
+      TH1D *nonhfebg= (TH1D *) nonHFEbgContainer->Project(0);
+      CorrectFromTheWidth(nonhfebg);
+      nonhfebg->SetMarkerColor(6);
+      nonhfebg->SetMarkerStyle(20);
+      rawspectra->cd();
+      nonhfebg->Draw("samep");
+      // subtract Dalitz/dielectron background
+      spectrumSubtracted->Add(nonHFEbgContainer,-1.0);
+      printf("Non HFE background subtraction is preliminary!\n");
+    }
+    TH1D *rawbgsubtracted = (TH1D *) spectrumSubtracted->Project(0);
+    CorrectFromTheWidth(rawbgsubtracted);
+    rawbgsubtracted->SetMarkerStyle(24);
+    rawspectra->cd();
+    rawbgsubtracted->Draw("samep");
+  }
+  else{
+    // Subtract 
+    spectrumSubtracted->Add(backgroundGrid,-1.0);
   }
 
-
-  AliCFDataGrid *spectrumSubtracted = new AliCFDataGrid("spectrumSubtracted", "Data Grid for spectrum after Background subtraction", *spectrumSliced);
-  
-  spectrumSubtracted->ApplyBGCorrection(*backgroundGrid);
   if(setBackground){
     if(fBackground) delete fBackground;
     fBackground = backgroundGrid;
   } else delete backgroundGrid;
 
+
+  if(fDebugLevel > 0) {
+
+    Int_t ptpr;
+    if(fBeamType==0) ptpr=0;
+    if(fBeamType==1) ptpr=1;
+    
+    TCanvas * cbackgroundsubtraction = new TCanvas("backgroundsubtraction","backgroundsubtraction",1000,700);
+    cbackgroundsubtraction->Divide(3,1);
+    cbackgroundsubtraction->cd(1);
+    gPad->SetLogy();
+    TH1D *measuredTH1Daftersubstraction = (TH1D *) spectrumSubtracted->Project(ptpr);
+    TH1D *measuredTH1Dbeforesubstraction = (TH1D *) dataspectrumbeforesubstraction->Project(ptpr);
+    CorrectFromTheWidth(measuredTH1Daftersubstraction);
+    CorrectFromTheWidth(measuredTH1Dbeforesubstraction);
+    measuredTH1Daftersubstraction->SetStats(0);
+    measuredTH1Daftersubstraction->SetTitle("");
+    measuredTH1Daftersubstraction->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+    measuredTH1Daftersubstraction->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+    measuredTH1Daftersubstraction->SetMarkerStyle(25);
+    measuredTH1Daftersubstraction->SetMarkerColor(kBlack);
+    measuredTH1Daftersubstraction->SetLineColor(kBlack);
+    measuredTH1Dbeforesubstraction->SetStats(0);
+    measuredTH1Dbeforesubstraction->SetTitle("");
+    measuredTH1Dbeforesubstraction->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+    measuredTH1Dbeforesubstraction->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+    measuredTH1Dbeforesubstraction->SetMarkerStyle(24);
+    measuredTH1Dbeforesubstraction->SetMarkerColor(kBlue);
+    measuredTH1Dbeforesubstraction->SetLineColor(kBlue);
+    measuredTH1Daftersubstraction->Draw();
+    measuredTH1Dbeforesubstraction->Draw("same");
+    TLegend *legsubstraction = new TLegend(0.4,0.6,0.89,0.89);
+    legsubstraction->AddEntry(measuredTH1Dbeforesubstraction,"With hadron contamination","p");
+    legsubstraction->AddEntry(measuredTH1Daftersubstraction,"Without hadron contamination ","p");
+    legsubstraction->Draw("same");
+    cbackgroundsubtraction->cd(2);
+    gPad->SetLogy();
+    TH1D* ratiomeasuredcontamination = (TH1D*)measuredTH1Dbeforesubstraction->Clone();
+    ratiomeasuredcontamination->SetName("ratiomeasuredcontamination");
+    ratiomeasuredcontamination->SetTitle("");
+    ratiomeasuredcontamination->GetYaxis()->SetTitle("(with contamination - without contamination) / with contamination");
+    ratiomeasuredcontamination->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+    ratiomeasuredcontamination->Sumw2();
+    ratiomeasuredcontamination->Add(measuredTH1Daftersubstraction,-1.0);
+    ratiomeasuredcontamination->Divide(measuredTH1Dbeforesubstraction);
+    ratiomeasuredcontamination->SetStats(0);
+    ratiomeasuredcontamination->SetMarkerStyle(26);
+    ratiomeasuredcontamination->SetMarkerColor(kBlack);
+    ratiomeasuredcontamination->SetLineColor(kBlack);
+    for(Int_t k=0; k < ratiomeasuredcontamination->GetNbinsX(); k++){
+      ratiomeasuredcontamination->SetBinError(k+1,0.0);
+    }
+    ratiomeasuredcontamination->Draw("P");
+    cbackgroundsubtraction->cd(3);
+    TH1D *measuredTH1background = (TH1D *) backgroundGrid->Project(ptpr);
+    CorrectFromTheWidth(measuredTH1background);
+    measuredTH1background->SetStats(0);
+    measuredTH1background->SetTitle("");
+    measuredTH1background->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+    measuredTH1background->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+    measuredTH1background->SetMarkerStyle(26);
+    measuredTH1background->SetMarkerColor(kBlack);
+    measuredTH1background->SetLineColor(kBlack);
+    measuredTH1background->Draw();
+
+    if(fBeamType==1) {
+
+      TCanvas * cbackgrounde = new TCanvas("BackgroundSubtraction_allspectra","BackgroundSubtraction_allspectra",1000,700);
+      cbackgrounde->Divide(2,1);
+      TLegend *legtotal = new TLegend(0.4,0.6,0.89,0.89);
+      TLegend *legtotalg = new TLegend(0.4,0.6,0.89,0.89);
+     
+      THnSparseF* sparsesubtracted = (THnSparseF *) spectrumSubtracted->GetGrid();
+      TAxis *cenaxisa = sparsesubtracted->GetAxis(0);
+      THnSparseF* sparsebefore = (THnSparseF *) dataspectrumbeforesubstraction->GetGrid();
+      TAxis *cenaxisb = sparsebefore->GetAxis(0);
+      Int_t nbbin = cenaxisb->GetNbins();
+      Int_t stylee[20] = {20,21,22,23,24,25,26,27,28,30,4,5,7,29,29,29,29,29,29,29};
+      Int_t colorr[20] = {2,3,4,5,6,7,8,9,46,38,29,30,31,32,33,34,35,37,38,20};
+      for(Int_t binc = 0; binc < nbbin; binc++){
+       TString titlee("BackgroundSubtraction_centrality_bin_");
+       titlee += binc;
+       TCanvas * cbackground = new TCanvas((const char*) titlee,(const char*) titlee,1000,700);
+       cbackground->Divide(2,1);
+       cbackground->cd(1);
+       gPad->SetLogy();
+       cenaxisa->SetRange(binc+1,binc+1);
+       cenaxisb->SetRange(binc+1,binc+1);
+       TH1D *aftersubstraction = (TH1D *) sparsesubtracted->Projection(1);
+       TH1D *beforesubstraction = (TH1D *) sparsebefore->Projection(1);
+       CorrectFromTheWidth(aftersubstraction);
+       CorrectFromTheWidth(beforesubstraction);
+       aftersubstraction->SetStats(0);
+       aftersubstraction->SetTitle((const char*)titlee);
+       aftersubstraction->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+       aftersubstraction->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+       aftersubstraction->SetMarkerStyle(25);
+       aftersubstraction->SetMarkerColor(kBlack);
+       aftersubstraction->SetLineColor(kBlack);
+       beforesubstraction->SetStats(0);
+       beforesubstraction->SetTitle((const char*)titlee);
+       beforesubstraction->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+       beforesubstraction->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+       beforesubstraction->SetMarkerStyle(24);
+       beforesubstraction->SetMarkerColor(kBlue);
+       beforesubstraction->SetLineColor(kBlue);
+       aftersubstraction->Draw();
+       beforesubstraction->Draw("same");
+       TLegend *lega = new TLegend(0.4,0.6,0.89,0.89);
+       lega->AddEntry(beforesubstraction,"With hadron contamination","p");
+       lega->AddEntry(aftersubstraction,"Without hadron contamination ","p");
+       lega->Draw("same");
+       cbackgrounde->cd(1);
+       gPad->SetLogy();
+       TH1D *aftersubtractionn = (TH1D *) aftersubstraction->Clone();
+       aftersubtractionn->SetMarkerStyle(stylee[binc]);
+       aftersubtractionn->SetMarkerColor(colorr[binc]);
+       if(binc==0) aftersubtractionn->Draw();
+       else aftersubtractionn->Draw("same");
+       legtotal->AddEntry(aftersubtractionn,(const char*) titlee,"p");
+       cbackgrounde->cd(2);
+       gPad->SetLogy();
+       TH1D *aftersubtractionng = (TH1D *) aftersubstraction->Clone();
+       aftersubtractionng->SetMarkerStyle(stylee[binc]);
+       aftersubtractionng->SetMarkerColor(colorr[binc]);
+       if(fNEvents[binc] > 0.0) aftersubtractionng->Scale(1/(Double_t)fNEvents[binc]);
+       if(binc==0) aftersubtractionng->Draw();
+       else aftersubtractionng->Draw("same");
+       legtotalg->AddEntry(aftersubtractionng,(const char*) titlee,"p");
+       cbackground->cd(2);
+       TH1D* ratiocontamination = (TH1D*)beforesubstraction->Clone();
+       ratiocontamination->SetName("ratiocontamination");
+       ratiocontamination->SetTitle((const char*)titlee);
+       ratiocontamination->GetYaxis()->SetTitle("(with contamination - without contamination) / with contamination");
+       ratiocontamination->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+       ratiocontamination->Add(aftersubstraction,-1.0);
+       ratiocontamination->Divide(beforesubstraction);
+       Int_t totalbin = ratiocontamination->GetXaxis()->GetNbins();
+       for(Int_t nbinpt = 0; nbinpt < totalbin; nbinpt++) {
+         ratiocontamination->SetBinError(nbinpt+1,0.0);
+       }
+       ratiocontamination->SetStats(0);
+       ratiocontamination->SetMarkerStyle(26);
+       ratiocontamination->SetMarkerColor(kBlack);
+       ratiocontamination->SetLineColor(kBlack);
+       ratiocontamination->Draw("P");
+       
+      }
+     
+      cbackgrounde->cd(1);
+      legtotal->Draw("same");
+      cbackgrounde->cd(2);
+      legtotalg->Draw("same");
+
+      cenaxisa->SetRange(0,nbbin);
+      cenaxisb->SetRange(0,nbbin);
+      
+    }
+   
+       
+  }
+  
   return spectrumSubtracted;
 }
 
 //____________________________________________________________
-TList *AliHFEspectrum::Unfold(Int_t dimensions,AliCFDataGrid* const bgsubpectrum){
-  
+AliCFDataGrid* AliHFEspectrum::GetCharmBackground(){
   //
-  // Unfold and eventually correct for efficiency the bgsubspectrum
+  // calculate charm background
   //
 
-  AliCFContainer *mcContainer = GetContainer(kMCContainer);
+  Double_t evtnorm=0;
+  if(fNMCbgEvents) evtnorm= double(fNEvents[0])/double(fNMCbgEvents);
+
+  AliCFContainer *mcContainer = GetContainer(kMCContainerCharmMC);
   if(!mcContainer){
     AliError("MC Container not available");
     return NULL;
@@ -367,35 +1110,476 @@ TList *AliHFEspectrum::Unfold(Int_t dimensions,AliCFDataGrid* const bgsubpectrum
     return NULL;
   }
 
-  // Get the mc grid in the requested format
-  Bool_t initContainer = kFALSE;
-  Int_t dims[3];
-  switch(dimensions){
-    case 1:   dims[0] = 0;
-              initContainer = kTRUE;
-              break;
-    case 3:   for(Int_t i = 0; i < 3; i++) dims[i] = i;
-              initContainer = kTRUE;
-              break;
-    default:
-              AliError("Container with this number of dimensions not foreseen (yet)");
-  };
-  if(!initContainer){
-    AliError("Creation of the sliced containers failed. Background estimation not possible");
+  AliCFDataGrid *charmBackgroundGrid= 0x0;
+  charmBackgroundGrid = new AliCFDataGrid("charmBackgroundGrid","charmBackgroundGrid",*mcContainer, fStepMC-1); // use MC eff. up to right before PID
+  TH1D *charmbgaftertofpid = (TH1D *) charmBackgroundGrid->Project(0);
+
+  Int_t* bins=new Int_t[1];
+  bins[0]=charmbgaftertofpid->GetNbinsX();
+  AliCFDataGrid *ipWeightedCharmContainer = new AliCFDataGrid("ipWeightedCharmContainer","ipWeightedCharmContainer",1,bins);
+  ipWeightedCharmContainer->SetGrid(GetPIDxIPEff(0)); // get charm efficiency
+  TH1D* parametrizedcharmpidipeff = (TH1D*)ipWeightedCharmContainer->Project(0);
+
+  charmBackgroundGrid->Multiply(ipWeightedCharmContainer,evtnorm);
+  TH1D* charmbgafteripcut = (TH1D*)charmBackgroundGrid->Project(0);
+
+  AliCFDataGrid *weightedCharmContainer = new AliCFDataGrid("weightedCharmContainer","weightedCharmContainer",1,bins);
+  weightedCharmContainer->SetGrid(GetCharmWeights()); // get charm weighting factors
+  TH1D* charmweightingfc = (TH1D*)weightedCharmContainer->Project(0);
+  charmBackgroundGrid->Multiply(weightedCharmContainer,1.);
+  TH1D* charmbgafterweight = (TH1D*)charmBackgroundGrid->Project(0);
+
+  // Efficiency (set efficiency to 1 for only folding) 
+  AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
+  efficiencyD->CalculateEfficiency(0,0);
+
+  // Folding 
+  Int_t nDim = 1;
+  AliCFUnfolding folding("unfolding","",nDim,fCorrelation,efficiencyD->GetGrid(),charmBackgroundGrid->GetGrid(),charmBackgroundGrid->GetGrid());
+  folding.SetMaxNumberOfIterations(1);
+  folding.Unfold();
+
+  // Results
+  THnSparse* result1= folding.GetEstMeasured(); // folded spectra
+  THnSparse* result=(THnSparse*)result1->Clone();
+  charmBackgroundGrid->SetGrid(result);
+  TH1D* charmbgafterfolding = (TH1D*)charmBackgroundGrid->Project(0);
+
+  //Charm background evaluation plots
+
+  TCanvas *cCharmBgEval = new TCanvas("cCharmBgEval","cCharmBgEval",1000,600);
+  cCharmBgEval->Divide(3,1);
+
+  cCharmBgEval->cd(1);
+  charmbgaftertofpid->Scale(evtnorm);
+  CorrectFromTheWidth(charmbgaftertofpid);
+  charmbgaftertofpid->SetMarkerStyle(25);
+  charmbgaftertofpid->Draw("p");
+  charmbgaftertofpid->GetYaxis()->SetTitle("yield normalized by # of data events");
+  charmbgaftertofpid->GetXaxis()->SetTitle("p_{T} (GeV/c)");
+  gPad->SetLogy();
+
+  CorrectFromTheWidth(charmbgafteripcut);
+  charmbgafteripcut->SetMarkerStyle(24);
+  charmbgafteripcut->Draw("samep");
+
+  CorrectFromTheWidth(charmbgafterweight);
+  charmbgafterweight->SetMarkerStyle(24);
+  charmbgafterweight->SetMarkerColor(4);
+  charmbgafterweight->Draw("samep");
+
+  CorrectFromTheWidth(charmbgafterfolding);
+  charmbgafterfolding->SetMarkerStyle(24);
+  charmbgafterfolding->SetMarkerColor(2);
+  charmbgafterfolding->Draw("samep");
+
+  cCharmBgEval->cd(2);
+  parametrizedcharmpidipeff->SetMarkerStyle(24);
+  parametrizedcharmpidipeff->Draw("p");
+  parametrizedcharmpidipeff->GetXaxis()->SetTitle("p_{T} (GeV/c)");
+
+  cCharmBgEval->cd(3);
+  charmweightingfc->SetMarkerStyle(24);
+  charmweightingfc->Draw("p");
+  charmweightingfc->GetYaxis()->SetTitle("weighting factor for charm electron");
+  charmweightingfc->GetXaxis()->SetTitle("p_{T} (GeV/c)");
+
+  cCharmBgEval->cd(1);
+  TLegend *legcharmbg = new TLegend(0.3,0.7,0.89,0.89);
+  legcharmbg->AddEntry(charmbgaftertofpid,"After TOF PID","p");
+  legcharmbg->AddEntry(charmbgafteripcut,"After IP cut","p");
+  legcharmbg->AddEntry(charmbgafterweight,"After Weighting","p");
+  legcharmbg->AddEntry(charmbgafterfolding,"After Folding","p");
+  legcharmbg->Draw("same");
+
+  cCharmBgEval->cd(2);
+  TLegend *legcharmbg2 = new TLegend(0.3,0.7,0.89,0.89);
+  legcharmbg2->AddEntry(parametrizedcharmpidipeff,"PID + IP cut eff.","p");
+  legcharmbg2->Draw("same");
+
+  CorrectStatErr(charmBackgroundGrid);
+
+  return charmBackgroundGrid;
+}
+
+//____________________________________________________________
+AliCFDataGrid* AliHFEspectrum::GetConversionBackground(){
+  //
+  // calculate conversion background
+  //
+
+  Double_t evtnorm[1];
+  if(fNMCbgEvents) evtnorm[0]= double(fNEvents[0])/double(fNMCbgEvents);
+  printf("check event!!! %lf \n",evtnorm[0]);
+
+  // Background Estimate
+  AliCFContainer *backgroundContainer = GetContainer(kMCWeightedContainerConversionESD);
+  if(!backgroundContainer){
+    AliError("MC background container not found");
+    return NULL;
+  }
+
+  Int_t stepbackground = 3;
+  AliCFDataGrid *backgroundGrid = new AliCFDataGrid("ConversionBgGrid","ConversionBgGrid",*backgroundContainer,stepbackground);
+  backgroundGrid->Scale(evtnorm);
+
+  Int_t* bins=new Int_t[1];
+  bins[0]=fConversionEff->GetNbinsX();
+  AliCFDataGrid *weightedConversionContainer = new AliCFDataGrid("weightedConversionContainer","weightedConversionContainer",1,bins);
+  weightedConversionContainer->SetGrid(GetPIDxIPEff(2));
+  backgroundGrid->Multiply(weightedConversionContainer,1.0);
+  
+  CorrectStatErr(backgroundGrid);
+  
+  return backgroundGrid;
+}
+
+
+//____________________________________________________________
+AliCFDataGrid* AliHFEspectrum::GetNonHFEBackground(){
+  //
+  // calculate non-HFE background
+  //
+
+  Double_t evtnorm[1];
+  if(fNMCbgEvents) evtnorm[0]= double(fNEvents[0])/double(fNMCbgEvents);
+  printf("check event!!! %lf \n",evtnorm[0]);
+
+  // Background Estimate
+  AliCFContainer *backgroundContainer = GetContainer(kMCWeightedContainerNonHFEESD);
+  if(!backgroundContainer){
+    AliError("MC background container not found");
     return NULL;
   }
-  AliCFContainer *mcContainerD = GetSlicedContainer(mcContainer, dimensions, dims);
-  THnSparse *correlationD = GetSlicedCorrelation(dimensions, dims);
+
+
+  Int_t stepbackground = 3;
+  AliCFDataGrid *backgroundGrid = new AliCFDataGrid("NonHFEBgGrid","NonHFEBgGrid",*backgroundContainer,stepbackground);
+  backgroundGrid->Scale(evtnorm);
+
+  Int_t* bins=new Int_t[1];
+  bins[0]=fNonHFEEff->GetNbinsX();
+  AliCFDataGrid *weightedNonHFEContainer = new AliCFDataGrid("weightedNonHFEContainer","weightedNonHFEContainer",1,bins);
+  weightedNonHFEContainer->SetGrid(GetPIDxIPEff(3));
+  backgroundGrid->Multiply(weightedNonHFEContainer,1.0);
+
+  CorrectStatErr(backgroundGrid);
+
+  return backgroundGrid;
+}
+
+//____________________________________________________________
+AliCFDataGrid *AliHFEspectrum::CorrectParametrizedEfficiency(AliCFDataGrid* const bgsubpectrum){
+  
+  //
+  // Apply TPC pid efficiency correction from parametrisation
+  //
 
   // Data in the right format
   AliCFDataGrid *dataGrid = 0x0;  
   if(bgsubpectrum) {
-    if(bgsubpectrum->GetNVar()!= dimensions) {
-      AliError("Not the expected number of dimensions for the AliCFDataGrid\n");
+    dataGrid = bgsubpectrum;
+  }
+  else {
+    
+    AliCFContainer *dataContainer = GetContainer(kDataContainer);
+    if(!dataContainer){
+      AliError("Data Container not available");
       return NULL;
     }
+
+    dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
+  } 
+
+  AliCFDataGrid *result = (AliCFDataGrid *) dataGrid->Clone();
+  result->SetName("ParametrizedEfficiencyBefore");
+  THnSparse *h = result->GetGrid();
+  Int_t nbdimensions = h->GetNdimensions();
+  //printf("CorrectParametrizedEfficiency::We have dimensions %d\n",nbdimensions);
+
+  AliCFContainer *dataContainer = GetContainer(kDataContainer);
+  if(!dataContainer){
+    AliError("Data Container not available");
+    return NULL;
+  }
+  AliCFContainer *dataContainerbis = (AliCFContainer *) dataContainer->Clone();
+  dataContainerbis->Add(dataContainerbis,-1.0);
+
+
+  Int_t* coord = new Int_t[nbdimensions];
+  memset(coord, 0, sizeof(Int_t) * nbdimensions);
+  Double_t* points = new Double_t[nbdimensions];
+
+
+  ULong64_t nEntries = h->GetNbins();
+  for (ULong64_t i = 0; i < nEntries; ++i) {
+    
+    Double_t value = h->GetBinContent(i, coord);
+    //Double_t valuecontainer = dataContainerbis->GetBinContent(coord,fStepData);
+    //printf("Value %f, and valuecontainer %f\n",value,valuecontainer);
+    
+    // Get the bin co-ordinates given an coord
+    for (Int_t j = 0; j < nbdimensions; ++j)
+      points[j] = h->GetAxis(j)->GetBinCenter(coord[j]);
+
+    if (!fEfficiencyFunction->IsInside(points))
+         continue;
+    TF1::RejectPoint(kFALSE);
+
+    // Evaulate function at points
+    Double_t valueEfficiency = fEfficiencyFunction->EvalPar(points, NULL);
+    //printf("Value efficiency is %f\n",valueEfficiency);
+
+    if(valueEfficiency > 0.0) {
+      h->SetBinContent(coord,value/valueEfficiency);
+      dataContainerbis->SetBinContent(coord,fStepData,value/valueEfficiency);
+    }
+    Double_t error = h->GetBinError(i);
+    h->SetBinError(coord,error/valueEfficiency);
+    dataContainerbis->SetBinError(coord,fStepData,error/valueEfficiency);
+
+   
+  } 
+
+  delete[] coord;
+  delete[] points;
+
+  AliCFDataGrid *resultt = new AliCFDataGrid("spectrumEfficiencyParametrized", "Data Grid for spectrum after Efficiency parametrized", *dataContainerbis,fStepData);
+
+  if(fDebugLevel > 0) {
+    
+    TCanvas * cEfficiencyParametrized = new TCanvas("EfficiencyParametrized","EfficiencyParametrized",1000,700);
+    cEfficiencyParametrized->Divide(2,1);
+    cEfficiencyParametrized->cd(1);
+    TH1D *afterE = (TH1D *) resultt->Project(0);
+    TH1D *beforeE = (TH1D *) dataGrid->Project(0);
+    CorrectFromTheWidth(afterE);
+    CorrectFromTheWidth(beforeE);
+    afterE->SetStats(0);
+    afterE->SetTitle("");
+    afterE->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+    afterE->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+    afterE->SetMarkerStyle(25);
+    afterE->SetMarkerColor(kBlack);
+    afterE->SetLineColor(kBlack);
+    beforeE->SetStats(0);
+    beforeE->SetTitle("");
+    beforeE->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+    beforeE->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+    beforeE->SetMarkerStyle(24);
+    beforeE->SetMarkerColor(kBlue);
+    beforeE->SetLineColor(kBlue);
+    gPad->SetLogy();
+    afterE->Draw();
+    beforeE->Draw("same");
+    TLegend *legefficiencyparametrized = new TLegend(0.4,0.6,0.89,0.89);
+    legefficiencyparametrized->AddEntry(beforeE,"Before Efficiency correction","p");
+    legefficiencyparametrized->AddEntry(afterE,"After Efficiency correction","p");
+    legefficiencyparametrized->Draw("same");
+    cEfficiencyParametrized->cd(2);
+    fEfficiencyFunction->Draw();
+    //cEfficiencyParametrized->cd(3);
+    //TH1D *ratioefficiency = (TH1D *) beforeE->Clone();
+    //ratioefficiency->Divide(afterE);
+    //ratioefficiency->Draw();
+
+
+  }
+
+  
+  return resultt;
+
+}
+//____________________________________________________________
+AliCFDataGrid *AliHFEspectrum::CorrectV0Efficiency(AliCFDataGrid* const bgsubpectrum){
+  
+  //
+  // Apply TPC pid efficiency correction from V0
+  //
+
+  AliCFContainer *v0Container = GetContainer(kDataContainerV0);
+  if(!v0Container){
+    AliError("V0 Container not available");
+    return NULL;
+  }
+
+  // Efficiency
+  AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*v0Container);
+  efficiencyD->CalculateEfficiency(fStepAfterCutsV0,fStepBeforeCutsV0);
+
+  // Data in the right format
+  AliCFDataGrid *dataGrid = 0x0;  
+  if(bgsubpectrum) {
     dataGrid = bgsubpectrum;
+  }
+  else {
+    
+    AliCFContainer *dataContainer = GetContainer(kDataContainer);
+    if(!dataContainer){
+      AliError("Data Container not available");
+      return NULL;
+    }
+
+    dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
+  } 
+
+  // Correct
+  AliCFDataGrid *result = (AliCFDataGrid *) dataGrid->Clone();
+  result->ApplyEffCorrection(*efficiencyD);
+
+  if(fDebugLevel > 0) {
+
+    Int_t ptpr;
+    if(fBeamType==0) ptpr=0;
+    if(fBeamType==1) ptpr=1;
     
+    TCanvas * cV0Efficiency = new TCanvas("V0Efficiency","V0Efficiency",1000,700);
+    cV0Efficiency->Divide(2,1);
+    cV0Efficiency->cd(1);
+    TH1D *afterE = (TH1D *) result->Project(ptpr);
+    TH1D *beforeE = (TH1D *) dataGrid->Project(ptpr);
+    afterE->SetStats(0);
+    afterE->SetTitle("");
+    afterE->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+    afterE->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+    afterE->SetMarkerStyle(25);
+    afterE->SetMarkerColor(kBlack);
+    afterE->SetLineColor(kBlack);
+    beforeE->SetStats(0);
+    beforeE->SetTitle("");
+    beforeE->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+    beforeE->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+    beforeE->SetMarkerStyle(24);
+    beforeE->SetMarkerColor(kBlue);
+    beforeE->SetLineColor(kBlue);
+    afterE->Draw();
+    beforeE->Draw("same");
+    TLegend *legV0efficiency = new TLegend(0.4,0.6,0.89,0.89);
+    legV0efficiency->AddEntry(beforeE,"Before Efficiency correction","p");
+    legV0efficiency->AddEntry(afterE,"After Efficiency correction","p");
+    legV0efficiency->Draw("same");
+    cV0Efficiency->cd(2);
+    TH1D* efficiencyDproj = (TH1D *) efficiencyD->Project(ptpr);
+    efficiencyDproj->SetTitle("");
+    efficiencyDproj->SetStats(0);
+    efficiencyDproj->SetMarkerStyle(25);
+    efficiencyDproj->Draw();
+
+    if(fBeamType==1) {
+
+      TCanvas * cV0Efficiencye = new TCanvas("V0Efficiency_allspectra","V0Efficiency_allspectra",1000,700);
+      cV0Efficiencye->Divide(2,1);
+      TLegend *legtotal = new TLegend(0.4,0.6,0.89,0.89);
+      TLegend *legtotalg = new TLegend(0.4,0.6,0.89,0.89);
+     
+      THnSparseF* sparseafter = (THnSparseF *) result->GetGrid();
+      TAxis *cenaxisa = sparseafter->GetAxis(0);
+      THnSparseF* sparsebefore = (THnSparseF *) dataGrid->GetGrid();
+      TAxis *cenaxisb = sparsebefore->GetAxis(0);
+      THnSparseF* efficiencya = (THnSparseF *) efficiencyD->GetGrid();
+      TAxis *cenaxisc = efficiencya->GetAxis(0);
+      Int_t nbbin = cenaxisb->GetNbins();
+      Int_t stylee[20] = {20,21,22,23,24,25,26,27,28,30,4,5,7,29,29,29,29,29,29,29};
+      Int_t colorr[20] = {2,3,4,5,6,7,8,9,46,38,29,30,31,32,33,34,35,37,38,20};
+      for(Int_t binc = 0; binc < nbbin; binc++){
+       TString titlee("V0Efficiency_centrality_bin_");
+       titlee += binc;
+       TCanvas * ccV0Efficiency = new TCanvas((const char*) titlee,(const char*) titlee,1000,700);
+       ccV0Efficiency->Divide(2,1);
+       ccV0Efficiency->cd(1);
+       gPad->SetLogy();
+       cenaxisa->SetRange(binc+1,binc+1);
+       cenaxisb->SetRange(binc+1,binc+1);
+       cenaxisc->SetRange(binc+1,binc+1);
+       TH1D *aftere = (TH1D *) sparseafter->Projection(1);
+       TH1D *beforee = (TH1D *) sparsebefore->Projection(1);
+       CorrectFromTheWidth(aftere);
+       CorrectFromTheWidth(beforee);
+       aftere->SetStats(0);
+       aftere->SetTitle((const char*)titlee);
+       aftere->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+       aftere->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+       aftere->SetMarkerStyle(25);
+       aftere->SetMarkerColor(kBlack);
+       aftere->SetLineColor(kBlack);
+       beforee->SetStats(0);
+       beforee->SetTitle((const char*)titlee);
+       beforee->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+       beforee->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+       beforee->SetMarkerStyle(24);
+       beforee->SetMarkerColor(kBlue);
+       beforee->SetLineColor(kBlue);
+       aftere->Draw();
+       beforee->Draw("same");
+       TLegend *lega = new TLegend(0.4,0.6,0.89,0.89);
+       lega->AddEntry(beforee,"Before correction","p");
+       lega->AddEntry(aftere,"After correction","p");
+       lega->Draw("same");
+       cV0Efficiencye->cd(1);
+       gPad->SetLogy();
+       TH1D *afteree = (TH1D *) aftere->Clone();
+       afteree->SetMarkerStyle(stylee[binc]);
+       afteree->SetMarkerColor(colorr[binc]);
+       if(binc==0) afteree->Draw();
+       else afteree->Draw("same");
+       legtotal->AddEntry(afteree,(const char*) titlee,"p");
+       cV0Efficiencye->cd(2);
+       gPad->SetLogy();
+       TH1D *aftereeu = (TH1D *) aftere->Clone();
+       aftereeu->SetMarkerStyle(stylee[binc]);
+       aftereeu->SetMarkerColor(colorr[binc]);
+       if(fNEvents[binc] > 0.0) aftereeu->Scale(1/(Double_t)fNEvents[binc]);
+       if(binc==0) aftereeu->Draw();
+       else aftereeu->Draw("same");
+       legtotalg->AddEntry(aftereeu,(const char*) titlee,"p");
+       ccV0Efficiency->cd(2);
+       TH1D* efficiencyDDproj = (TH1D *) efficiencya->Projection(1);
+       efficiencyDDproj->SetTitle("");
+       efficiencyDDproj->SetStats(0);
+       efficiencyDDproj->SetMarkerStyle(25);
+       efficiencyDDproj->Draw();
+               
+      }
+     
+      cV0Efficiencye->cd(1);
+      legtotal->Draw("same");
+      cV0Efficiencye->cd(2);
+      legtotalg->Draw("same");
+
+      cenaxisa->SetRange(0,nbbin);
+      cenaxisb->SetRange(0,nbbin);
+      cenaxisc->SetRange(0,nbbin);
+      
+    }
+
+  }
+
+  
+  return result;
+
+}
+//____________________________________________________________
+TList *AliHFEspectrum::Unfold(AliCFDataGrid* const bgsubpectrum){
+  
+  //
+  // Unfold and eventually correct for efficiency the bgsubspectrum
+  //
+
+  AliCFContainer *mcContainer = GetContainer(kMCContainerMC);
+  if(!mcContainer){
+    AliError("MC Container not available");
+    return NULL;
+  }
+
+  if(!fCorrelation){
+    AliError("No Correlation map available");
+    return NULL;
+  }
+
+  // Data 
+  AliCFDataGrid *dataGrid = 0x0;  
+  if(bgsubpectrum) {
+    dataGrid = bgsubpectrum;
   }
   else {
 
@@ -405,25 +1589,35 @@ TList *AliHFEspectrum::Unfold(Int_t dimensions,AliCFDataGrid* const bgsubpectrum
       return NULL;
     }
 
-    AliCFContainer *dataContainerD = GetSlicedContainer(dataContainer, dimensions, dims);
-    dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainerD, fStepData);
-    
+    dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
   } 
   
-  
   // Guessed
-  AliCFDataGrid* guessedGrid = new AliCFDataGrid("guessed","",*mcContainerD, fStepGuessedUnfolding);
+  AliCFDataGrid* guessedGrid = new AliCFDataGrid("guessed","",*mcContainer, fStepGuessedUnfolding);
   THnSparse* guessedTHnSparse = ((AliCFGridSparse*)guessedGrid->GetData())->GetGrid();
 
   // Efficiency
-  AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainerD);
+  AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
   efficiencyD->CalculateEfficiency(fStepMC,fStepTrue);
+  
+  // Consider parameterized IP cut efficiency
+  if(!fInclusiveSpectrum){
+    Int_t* bins=new Int_t[1];
+    bins[0]=44;
+
+    AliCFEffGrid *beffContainer = new AliCFEffGrid("beffContainer","beffContainer",1,bins);
+    beffContainer->SetGrid(GetBeautyIPEff());
+    efficiencyD->Multiply(beffContainer,1);  
+  }
+  
 
   // Unfold 
   
-  AliCFUnfolding unfolding("unfolding","",dimensions,correlationD,efficiencyD->GetGrid(),((AliCFGridSparse*)dataGrid->GetData())->GetGrid(),guessedTHnSparse);
+  AliCFUnfolding unfolding("unfolding","",fNbDimensions,fCorrelation,efficiencyD->GetGrid(),dataGrid->GetGrid(),guessedTHnSparse);
+  //unfolding.SetUseCorrelatedErrors();
+  if(fUnSetCorrelatedErrors) unfolding.UnsetCorrelatedErrors();
   unfolding.SetMaxNumberOfIterations(fNumberOfIterations);
-  unfolding.UseSmoothing();
+  if(fSetSmoothing) unfolding.UseSmoothing();
   unfolding.Unfold();
 
   // Results
@@ -434,89 +1628,239 @@ TList *AliHFEspectrum::Unfold(Int_t dimensions,AliCFDataGrid* const bgsubpectrum
   listofresults->AddAt((THnSparse*)result->Clone(),0);
   listofresults->AddAt((THnSparse*)residual->Clone(),1);
 
+  if(fDebugLevel > 0) {
+
+    Int_t ptpr;
+    if(fBeamType==0) ptpr=0;
+    if(fBeamType==1) ptpr=1;
+    
+    TCanvas * cresidual = new TCanvas("residual","residual",1000,700);
+    cresidual->Divide(2,1);
+    cresidual->cd(1);
+    gPad->SetLogy();
+    TGraphErrors* residualspectrumD = Normalize(residual);
+    if(!residualspectrumD) {
+      AliError("Number of Events not set for the normalization");
+      return kFALSE;
+    }
+    residualspectrumD->SetTitle("");
+    residualspectrumD->GetYaxis()->SetTitleOffset(1.5);
+    residualspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
+    residualspectrumD->SetMarkerStyle(26);
+    residualspectrumD->SetMarkerColor(kBlue);
+    residualspectrumD->SetLineColor(kBlue);
+    residualspectrumD->Draw("AP");
+    AliCFDataGrid *dataGridBis = (AliCFDataGrid *) (dataGrid->Clone());
+    dataGridBis->SetName("dataGridBis"); 
+    TGraphErrors* measuredspectrumD = Normalize(dataGridBis);
+    measuredspectrumD->SetTitle("");  
+    measuredspectrumD->GetYaxis()->SetTitleOffset(1.5);
+    measuredspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
+    measuredspectrumD->SetMarkerStyle(25);
+    measuredspectrumD->SetMarkerColor(kBlack);
+    measuredspectrumD->SetLineColor(kBlack);
+    measuredspectrumD->Draw("P");
+    TLegend *legres = new TLegend(0.4,0.6,0.89,0.89);
+    legres->AddEntry(residualspectrumD,"Residual","p");
+    legres->AddEntry(measuredspectrumD,"Measured","p");
+    legres->Draw("same");
+    cresidual->cd(2);
+    TH1D *residualTH1D = residual->Projection(ptpr);
+    TH1D *measuredTH1D = (TH1D *) dataGridBis->Project(ptpr);
+    TH1D* ratioresidual = (TH1D*)residualTH1D->Clone();
+    ratioresidual->SetName("ratioresidual");
+    ratioresidual->SetTitle("");
+    ratioresidual->GetYaxis()->SetTitle("Folded/Measured");
+    ratioresidual->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+    ratioresidual->Divide(residualTH1D,measuredTH1D,1,1);
+    ratioresidual->SetStats(0);
+    ratioresidual->Draw();
+    
+  }
+
   return listofresults;
 
 }
 
 //____________________________________________________________
-AliCFDataGrid *AliHFEspectrum::CorrectForEfficiency(Int_t dimensions,AliCFDataGrid* const bgsubpectrum){
+AliCFDataGrid *AliHFEspectrum::CorrectForEfficiency(AliCFDataGrid* const bgsubpectrum){
   
   //
   // Apply unfolding and efficiency correction together to bgsubspectrum
   //
 
-  AliCFContainer *mcContainer = GetContainer(kMCContainer);
+  AliCFContainer *mcContainer = GetContainer(kMCContainerESD);
   if(!mcContainer){
     AliError("MC Container not available");
     return NULL;
   }
 
-  // Get the data grid in the requested format
-  Bool_t initContainer = kFALSE;
-  Int_t dims[3];
-  switch(dimensions){
-    case 1:   dims[0] = 0;
-              initContainer = kTRUE;
-              break;
-    case 3:   for(Int_t i = 0; i < 3; i++) dims[i] = i;
-              initContainer = kTRUE;
-              break;
-    default:
-              AliError("Container with this number of dimensions not foreseen (yet)");
-  };
-  if(!initContainer){
-    AliError("Creation of the sliced containers failed. Background estimation not possible");
-    return NULL;
-  }
-  AliCFContainer *mcContainerD = GetSlicedContainer(mcContainer, dimensions, dims);
-
   // Efficiency
-  AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainerD);
+  AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
   efficiencyD->CalculateEfficiency(fStepMC,fStepTrue);
 
+  // Consider parameterized IP cut efficiency
+  if(!fInclusiveSpectrum){
+    Int_t* bins=new Int_t[1];
+    bins[0]=44;
+  
+    AliCFEffGrid *beffContainer = new AliCFEffGrid("beffContainer","beffContainer",1,bins);
+    beffContainer->SetGrid(GetBeautyIPEff());
+    efficiencyD->Multiply(beffContainer,1);
+  }
+
   // Data in the right format
   AliCFDataGrid *dataGrid = 0x0;  
   if(bgsubpectrum) {
-    if(bgsubpectrum->GetNVar()!= dimensions) {
-      AliError("Not the expected number of dimensions for the AliCFDataGrid\n");
-      return NULL;
-    }
     dataGrid = bgsubpectrum;
-    
   }
   else {
-
+    
     AliCFContainer *dataContainer = GetContainer(kDataContainer);
     if(!dataContainer){
       AliError("Data Container not available");
       return NULL;
     }
 
-    AliCFContainer *dataContainerD = GetSlicedContainer(dataContainer, dimensions, dims);
-    dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainerD, fStepData);
-    
+    dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
   } 
 
   // Correct
   AliCFDataGrid *result = (AliCFDataGrid *) dataGrid->Clone();
   result->ApplyEffCorrection(*efficiencyD);
-  
 
+  if(fDebugLevel > 0) {
+
+    Int_t ptpr;
+    if(fBeamType==0) ptpr=0;
+    if(fBeamType==1) ptpr=1;
+    
+    printf("Step MC: %d\n",fStepMC);
+    printf("Step tracking: %d\n",AliHFEcuts::kStepHFEcutsTRD + AliHFEcuts::kNcutStepsMCTrack);
+    printf("Step MC true: %d\n",fStepTrue);
+    AliCFEffGrid  *efficiencymcPID = (AliCFEffGrid*)  GetEfficiency(GetContainer(kMCContainerMC),fStepMC,AliHFEcuts::kStepHFEcutsTRD + AliHFEcuts::kNcutStepsMCTrack);
+    AliCFEffGrid  *efficiencymctrackinggeo = (AliCFEffGrid*)  GetEfficiency(GetContainer(kMCContainerMC),AliHFEcuts::kStepHFEcutsTRD + AliHFEcuts::kNcutStepsMCTrack,fStepTrue);
+    AliCFEffGrid  *efficiencymcall = (AliCFEffGrid*)  GetEfficiency(GetContainer(kMCContainerMC),fStepMC,fStepTrue);
+    
+    AliCFEffGrid  *efficiencyesdall = (AliCFEffGrid*)  GetEfficiency(GetContainer(kMCContainerESD),fStepMC,fStepTrue);
+    
+    TCanvas * cefficiency = new TCanvas("efficiency","efficiency",1000,700);
+    cefficiency->cd(1);
+    TH1D* efficiencymcPIDD = (TH1D *) efficiencymcPID->Project(ptpr);
+    efficiencymcPIDD->SetTitle("");
+    efficiencymcPIDD->SetStats(0);
+    efficiencymcPIDD->SetMarkerStyle(25);
+    efficiencymcPIDD->Draw();
+    TH1D* efficiencymctrackinggeoD = (TH1D *) efficiencymctrackinggeo->Project(ptpr);
+    efficiencymctrackinggeoD->SetTitle("");
+    efficiencymctrackinggeoD->SetStats(0);
+    efficiencymctrackinggeoD->SetMarkerStyle(26);
+    efficiencymctrackinggeoD->Draw("same");
+    TH1D* efficiencymcallD = (TH1D *) efficiencymcall->Project(ptpr);
+    efficiencymcallD->SetTitle("");
+    efficiencymcallD->SetStats(0);
+    efficiencymcallD->SetMarkerStyle(27);
+    efficiencymcallD->Draw("same");
+    TH1D* efficiencyesdallD = (TH1D *) efficiencyesdall->Project(ptpr);
+    efficiencyesdallD->SetTitle("");
+    efficiencyesdallD->SetStats(0);
+    efficiencyesdallD->SetMarkerStyle(24);
+    efficiencyesdallD->Draw("same");
+    TLegend *legeff = new TLegend(0.4,0.6,0.89,0.89);
+    legeff->AddEntry(efficiencymcPIDD,"PID efficiency","p");
+    legeff->AddEntry(efficiencymctrackinggeoD,"Tracking geometry efficiency","p");
+    legeff->AddEntry(efficiencymcallD,"Overall efficiency","p");
+    legeff->AddEntry(efficiencyesdallD,"Overall efficiency ESD","p");
+    legeff->Draw("same");
+
+    if(fBeamType==1) {
+
+      THnSparseF* sparseafter = (THnSparseF *) result->GetGrid();
+      TAxis *cenaxisa = sparseafter->GetAxis(0);
+      THnSparseF* sparsebefore = (THnSparseF *) dataGrid->GetGrid();
+      TAxis *cenaxisb = sparsebefore->GetAxis(0);
+      THnSparseF* efficiencya = (THnSparseF *) efficiencyD->GetGrid();
+      TAxis *cenaxisc = efficiencya->GetAxis(0);
+      //Int_t nbbin = cenaxisb->GetNbins();
+      //Int_t stylee[20] = {20,21,22,23,24,25,26,27,28,30,4,5,7,29,29,29,29,29,29,29};
+      //Int_t colorr[20] = {2,3,4,5,6,7,8,9,46,38,29,30,31,32,33,34,35,37,38,20};
+      for(Int_t binc = 0; binc < fNCentralityBinAtTheEnd; binc++){
+       TString titlee("Efficiency_centrality_bin_");
+       titlee += fLowBoundaryCentralityBinAtTheEnd[binc];
+       titlee += "_";
+       titlee += fHighBoundaryCentralityBinAtTheEnd[binc];
+       TCanvas * cefficiencye = new TCanvas((const char*) titlee,(const char*) titlee,1000,700);
+       cefficiencye->Divide(2,1);
+       cefficiencye->cd(1);
+       gPad->SetLogy();
+       cenaxisa->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fHighBoundaryCentralityBinAtTheEnd[binc]);
+       cenaxisb->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fHighBoundaryCentralityBinAtTheEnd[binc]);
+       TH1D *afterefficiency = (TH1D *) sparseafter->Projection(ptpr);
+       TH1D *beforeefficiency = (TH1D *) sparsebefore->Projection(ptpr);
+       CorrectFromTheWidth(afterefficiency);
+       CorrectFromTheWidth(beforeefficiency);
+       afterefficiency->SetStats(0);
+       afterefficiency->SetTitle((const char*)titlee);
+       afterefficiency->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+       afterefficiency->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+       afterefficiency->SetMarkerStyle(25);
+       afterefficiency->SetMarkerColor(kBlack);
+       afterefficiency->SetLineColor(kBlack);
+       beforeefficiency->SetStats(0);
+       beforeefficiency->SetTitle((const char*)titlee);
+       beforeefficiency->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+       beforeefficiency->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+       beforeefficiency->SetMarkerStyle(24);
+       beforeefficiency->SetMarkerColor(kBlue);
+       beforeefficiency->SetLineColor(kBlue);
+       afterefficiency->Draw();
+       beforeefficiency->Draw("same");
+       TLegend *lega = new TLegend(0.4,0.6,0.89,0.89);
+       lega->AddEntry(beforeefficiency,"Before efficiency correction","p");
+       lega->AddEntry(afterefficiency,"After efficiency correction","p");
+       lega->Draw("same");
+       cefficiencye->cd(2);
+       cenaxisc->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fLowBoundaryCentralityBinAtTheEnd[binc]+1);
+       TH1D* efficiencyDDproj = (TH1D *) efficiencya->Projection(ptpr);
+       efficiencyDDproj->SetTitle("");
+       efficiencyDDproj->SetStats(0);
+       efficiencyDDproj->SetMarkerStyle(25);
+       efficiencyDDproj->SetMarkerColor(2);
+       efficiencyDDproj->Draw();
+       cenaxisc->SetRange(fHighBoundaryCentralityBinAtTheEnd[binc],fHighBoundaryCentralityBinAtTheEnd[binc]);
+       TH1D* efficiencyDDproja = (TH1D *) efficiencya->Projection(ptpr);
+       efficiencyDDproja->SetTitle("");
+       efficiencyDDproja->SetStats(0);
+       efficiencyDDproja->SetMarkerStyle(26);
+       efficiencyDDproja->SetMarkerColor(4);
+       efficiencyDDproja->Draw("same");
+       
+      }
+    }
+
+
+  }
+  
   return result;
 
 }
+
 //__________________________________________________________________________________
-TGraphErrors *AliHFEspectrum::Normalize(THnSparse * const spectrum) const {
+TGraphErrors *AliHFEspectrum::Normalize(THnSparse * const spectrum,Int_t i) const {
   //
   // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
   // Give the final pt spectrum to be compared
   //
  
-  if(fNEvents > 0) {
+  if(fNEvents[i] > 0) {
+
+    Int_t ptpr;
+    if(fBeamType==0) ptpr=0;
+    if(fBeamType==1) ptpr=1;
     
-    TH1D* projection = spectrum->Projection(0);
+    TH1D* projection = spectrum->Projection(ptpr);
     CorrectFromTheWidth(projection);
-    TGraphErrors *graphError = NormalizeTH1(projection);
+    TGraphErrors *graphError = NormalizeTH1(projection,i);
     return graphError;
   
   }
@@ -526,16 +1870,20 @@ TGraphErrors *AliHFEspectrum::Normalize(THnSparse * const spectrum) const {
 
 }
 //__________________________________________________________________________________
-TGraphErrors *AliHFEspectrum::Normalize(AliCFDataGrid * const spectrum) const {
+TGraphErrors *AliHFEspectrum::Normalize(AliCFDataGrid * const spectrum,Int_t i) const {
   //
   // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
   // Give the final pt spectrum to be compared
   //
-  if(fNEvents > 0) {
+  if(fNEvents[i] > 0) {
 
-    TH1D* projection = spectrum->Project(0);
+    Int_t ptpr;
+    if(fBeamType==0) ptpr=0;
+    if(fBeamType==1) ptpr=1;
+    
+    TH1D* projection = (TH1D *) spectrum->Project(ptpr);
     CorrectFromTheWidth(projection);
-    TGraphErrors *graphError = NormalizeTH1(projection);
+    TGraphErrors *graphError = NormalizeTH1(projection,i);
     return graphError;
     
   }
@@ -545,12 +1893,17 @@ TGraphErrors *AliHFEspectrum::Normalize(AliCFDataGrid * const spectrum) const {
 
 }
 //__________________________________________________________________________________
-TGraphErrors *AliHFEspectrum::NormalizeTH1(TH1 *input) const {
+TGraphErrors *AliHFEspectrum::NormalizeTH1(TH1 *input,Int_t i) const {
   //
   // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
   // Give the final pt spectrum to be compared
   //
-  if(fNEvents > 0) {
+  Double_t chargecoefficient = 0.5;
+  if(fChargeChoosen >= 0) chargecoefficient = 1.0;
+
+  Double_t etarange = fEtaSelected ? fEtaRange[1] - fEtaRange[0] : 1.6;
+  printf("Normalizing Eta Range %f\n", etarange);
+  if(fNEvents[i] > 0) {
 
     TGraphErrors *spectrumNormalized = new TGraphErrors(input->GetNbinsX());
     Double_t p = 0, dp = 0; Int_t point = 1;
@@ -565,10 +1918,58 @@ TGraphErrors *AliHFEspectrum::NormalizeTH1(TH1 *input) const {
       dN = input->GetBinError(ibin);
 
       // New point
-      nCorr = 0.5 * 1/1.6 * 1./(Double_t)(fNEvents) * 1/(2. * TMath::Pi() * p) * n;
+      nCorr = chargecoefficient * 1./etarange * 1./(Double_t)(fNEvents[i]) * 1./(2. * TMath::Pi() * p) * n;
       errdN = 1./(2. * TMath::Pi() * p);
       errdp = 1./(2. * TMath::Pi() * p*p) * n;
-      dNcorr = 0.5 * 1/1.6 * 1./(Double_t)(fNEvents) * TMath::Sqrt(errdN * errdN * dN *dN + errdp *errdp * dp *dp);
+      dNcorr = chargecoefficient * 1./etarange * 1./(Double_t)(fNEvents[i]) * TMath::Sqrt(errdN * errdN * dN *dN + errdp *errdp * dp *dp);
+      
+      spectrumNormalized->SetPoint(point, p, nCorr);
+      spectrumNormalized->SetPointError(point, dp, dNcorr);
+    }
+    spectrumNormalized->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+    spectrumNormalized->GetYaxis()->SetTitle("#frac{1}{2 #pi p_{T}} #frac{dN}{dp_{T}} / [GeV/c]^{-2}");
+    spectrumNormalized->SetMarkerStyle(22);
+    spectrumNormalized->SetMarkerColor(kBlue);
+    spectrumNormalized->SetLineColor(kBlue);
+    
+    return spectrumNormalized;
+    
+  }
+
+  return 0x0;
+  
+
+}
+//__________________________________________________________________________________
+TGraphErrors *AliHFEspectrum::NormalizeTH1N(TH1 *input,Int_t normalization) const {
+  //
+  // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
+  // Give the final pt spectrum to be compared
+  //
+  Double_t chargecoefficient = 0.5;
+  if(fChargeChoosen >= 0) chargecoefficient = 1.0;
+
+  Double_t etarange = fEtaSelected ? fEtaRange[1] - fEtaRange[0] : 1.6;
+  printf("Normalizing Eta Range %f\n", etarange);
+  if(normalization > 0) {
+
+    TGraphErrors *spectrumNormalized = new TGraphErrors(input->GetNbinsX());
+    Double_t p = 0, dp = 0; Int_t point = 1;
+    Double_t n = 0, dN = 0;
+    Double_t nCorr = 0, dNcorr = 0;
+    Double_t errdN = 0, errdp = 0;
+    for(Int_t ibin = input->GetXaxis()->GetFirst(); ibin <= input->GetXaxis()->GetLast(); ibin++){
+      point = ibin - input->GetXaxis()->GetFirst();
+      p = input->GetXaxis()->GetBinCenter(ibin);
+      dp = input->GetXaxis()->GetBinWidth(ibin)/2.;
+      n = input->GetBinContent(ibin);
+      dN = input->GetBinError(ibin);
+
+      // New point
+      nCorr = chargecoefficient * 1./etarange * 1./(Double_t)(normalization) * 1./(2. * TMath::Pi() * p) * n;
+      errdN = 1./(2. * TMath::Pi() * p);
+      errdp = 1./(2. * TMath::Pi() * p*p) * n;
+      dNcorr = chargecoefficient * 1./etarange * 1./(Double_t)(normalization) * TMath::Sqrt(errdN * errdN * dN *dN + errdp *errdp * dp *dp);
       
       spectrumNormalized->SetPoint(point, p, nCorr);
       spectrumNormalized->SetPointError(point, dp, dNcorr);
@@ -604,106 +2005,14 @@ AliCFContainer *AliHFEspectrum::GetContainer(AliHFEspectrum::CFContainer_t type)
   if(!fCFContainers) return NULL;
   return dynamic_cast<AliCFContainer *>(fCFContainers->At(type));
 }
-
-//____________________________________________________________
-AliCFDataGrid *AliHFEspectrum::MakeBackgroundEstimateFromData(Int_t nDim){
-  // 
-  // Make Background Estimate from Data
-  // Container having background source from 
-  // Correction has to be done for background selection Efficiency
-  //
-  AliCFContainer *backgroundContainer = GetContainer(kBackgroundMC);
-  AliCFContainer *dataContainer = GetContainer(kBackgroundData);
-  if(!backgroundContainer){
-    AliError("MC background container not found");
-    return NULL;
-  }
-  if(!dataContainer){
-    AliError("Data container not found");
-    return NULL;
-  }
-  AliInfo(Form("Making background Estimate from Data in %d Dimensions", nDim));
-
-  Bool_t initContainer = kFALSE;
-  Int_t dimensions[3];
-  switch(nDim){
-    case 1:   dimensions[0] = 1;
-              initContainer = kTRUE;
-              break;
-    case 3:   for(Int_t i = 0; i < 3; i++) dimensions[i] = i;
-              initContainer = kTRUE;
-              break;
-    default:
-              AliError("Container with this number of dimensions not foreseen (yet)");
-  };
-  if(!initContainer){
-    AliError("Creation of the sliced containers failed. Background estimation not possible");
-    return NULL;
-  }
-  AliCFContainer *slicedBackground = GetSlicedContainer(backgroundContainer, nDim, dimensions);
-  AliCFContainer *slicedData = GetSlicedContainer(dataContainer, nDim, dimensions);
-  
-  // Create Efficiency Grid and data grid
-  AliCFEffGrid backgroundRatio("backgroundRatio", "BackgroundRatio", *slicedBackground);
-  backgroundRatio.CalculateEfficiency(2, 1);
-  AliCFDataGrid *backgroundEstimate = new AliCFDataGrid("backgroundEstimate", "Grid for Background Estimate", *slicedData, fStepData);
-  backgroundEstimate->ApplyEffCorrection(backgroundRatio);
-
-  return backgroundEstimate;
-}
-
 //____________________________________________________________
-AliCFDataGrid *AliHFEspectrum::MakeBackgroundEstimateFromMC(Int_t nDim){
+AliCFContainer *AliHFEspectrum::GetSlicedContainer(AliCFContainer *container, Int_t nDim, Int_t *dimensions,Int_t source,Int_t positivenegative) {
   //
-  // Make Background Estimate using MC
-  // Calculate ratio of hadronic background from MC and 
-  // apply this on data
-  //
-  AliCFContainer *backgroundContainer = GetContainer(kBackgroundMC);
-  AliCFContainer *dataContainer = GetContainer(kDataContainer);
-  if(!backgroundContainer){
-    AliError("MC background container not found");
-    return NULL;
-  }
-  if(!dataContainer){
-    AliError("Data container not found");
-    return NULL;
-  }
-  AliInfo(Form("Making background Estimate from MC in %d Dimensions", nDim));
-
-  Bool_t initContainer = kFALSE;
-  Int_t dimensions[3];
-  switch(nDim){
-    case 1:   dimensions[0] = 1;
-              initContainer = kTRUE;
-              break;
-    case 3:   for(Int_t i = 0; i < 3; i++) dimensions[i] = i;
-              initContainer = kTRUE;
-              break;
-    default:
-              AliError("Container with this number of dimensions not foreseen (yet)");
-  };
-  if(!initContainer){
-    AliError("Creation of the sliced containers failed. Background estimation not possible");
-    return NULL;
-  }
-  AliCFContainer *slicedBackground = GetSlicedContainer(backgroundContainer, nDim, dimensions);
-  AliCFContainer *slicedData = GetSlicedContainer(dataContainer, nDim, dimensions);
-  
-  // Create Efficiency Grid and data grid
-  AliCFEffGrid backgroundRatio("backgroundRatio", "BackgroundRatio", *slicedBackground);
-  backgroundRatio.CalculateEfficiency(1, 0);
-  AliCFDataGrid *backgroundEstimate = new AliCFDataGrid("backgroundEstimate", "Grid for Background Estimate", *slicedData, fStepData);
-  backgroundEstimate->ApplyEffCorrection(backgroundRatio);
-
-  return backgroundEstimate;
-}
-
-//____________________________________________________________
-AliCFContainer *AliHFEspectrum::GetSlicedContainer(AliCFContainer *container, Int_t nDim, Int_t *dimensions) {
-  //
-  // Slice Pt bin
+  // Slice bin for a given source of electron
+  // nDim is the number of dimension the corrections are done
+  // dimensions are the definition of the dimensions
+  // source is if we want to keep only one MC source (-1 means we don't cut on the MC source)
+  // positivenegative if we want to keep positive (1) or negative (0) or both (-1)
   //
   
   Double_t *varMin = new Double_t[container->GetNVar()],
@@ -716,6 +2025,30 @@ AliCFContainer *AliHFEspectrum::GetSlicedContainer(AliCFContainer *container, In
     container->GetBinLimits(ivar,binLimits);
     varMin[ivar] = binLimits[0];
     varMax[ivar] = binLimits[container->GetNBins(ivar)];
+    // source
+    if(ivar == 4){
+      if((source>= 0) && (source<container->GetNBins(ivar))) {
+       varMin[ivar] = binLimits[source];
+       varMax[ivar] = binLimits[source];
+      }     
+    }
+    // charge
+    if(ivar == 3) {
+      if((positivenegative>= 0) && (positivenegative<container->GetNBins(ivar))) {
+       varMin[ivar] = binLimits[positivenegative];
+       varMax[ivar] = binLimits[positivenegative];
+      }
+    }
+    // eta
+    if(ivar == 1){
+      for(Int_t ic = 1; ic <= container->GetAxis(1,0)->GetLast(); ic++) AliDebug(1, Form("eta bin %d, min %f, max %f\n", ic, container->GetAxis(1,0)->GetBinLowEdge(ic), container->GetAxis(1,0)->GetBinUpEdge(ic))); 
+      if(fEtaSelected){
+        varMin[ivar] = fEtaRange[0];
+        varMax[ivar] = fEtaRange[1];
+      }
+    }
+    
+
     delete[] binLimits;
   }
   
@@ -728,28 +2061,28 @@ AliCFContainer *AliHFEspectrum::GetSlicedContainer(AliCFContainer *container, In
 }
 
 //_________________________________________________________________________
-THnSparse *AliHFEspectrum::GetSlicedCorrelation(Int_t nDim, Int_t *dimensions) const {
+THnSparseF *AliHFEspectrum::GetSlicedCorrelation(THnSparseF *correlationmatrix, Int_t nDim, Int_t *dimensions) const {
   //
-  // Slice Pt correlation
+  // Slice correlation
   //
 
-  Int_t ndimensions = fCorrelation->GetNdimensions();
-  printf("Number of dimension %d correlation map\n",ndimensions);
+  Int_t ndimensions = correlationmatrix->GetNdimensions();
+  //printf("Number of dimension %d correlation map\n",ndimensions);
   if(ndimensions < (2*nDim)) {
     AliError("Problem in the dimensions");
     return NULL;
   }
   Int_t ndimensionsContainer = (Int_t) ndimensions/2;
-  printf("Number of dimension %d container\n",ndimensionsContainer);
+  //printf("Number of dimension %d container\n",ndimensionsContainer);
 
   Int_t *dim = new Int_t[nDim*2];
   for(Int_t iter=0; iter < nDim; iter++){
     dim[iter] = dimensions[iter];
     dim[iter+nDim] = ndimensionsContainer + dimensions[iter];
-    printf("For iter %d: %d and iter+nDim %d: %d\n",iter,dimensions[iter],iter+nDim,ndimensionsContainer + dimensions[iter]);
+    //printf("For iter %d: %d and iter+nDim %d: %d\n",iter,dimensions[iter],iter+nDim,ndimensionsContainer + dimensions[iter]);
   }
     
-  THnSparse *k = fCorrelation->Projection(nDim*2,dim);
+  THnSparseF *k = (THnSparseF *) correlationmatrix->Projection(nDim*2,dim);
 
   delete[] dim; 
   return k;
@@ -774,6 +2107,26 @@ void AliHFEspectrum::CorrectFromTheWidth(TH1D *h1) const {
   }
 
 }
+
+//___________________________________________________________________________
+void AliHFEspectrum::CorrectStatErr(AliCFDataGrid *backgroundGrid) const { 
+  //
+  // Correct statistical error
+  //
+
+  TH1D *h1 = (TH1D*)backgroundGrid->Project(0);
+  Int_t nbinX = h1->GetNbinsX();
+  Int_t bins[1];
+  for(Long_t i = 1; i <= nbinX; i++) {
+    bins[0] = i;
+    Float_t content = h1->GetBinContent(i);
+    if(content>0){
+      Float_t error = TMath::Sqrt(content);
+      backgroundGrid->SetElementError(bins, error);
+    }
+  }
+}
+
 //____________________________________________________________
 void AliHFEspectrum::AddTemporaryObject(TObject *o){
   // 
@@ -800,12 +2153,12 @@ void AliHFEspectrum::ClearObject(TObject *o){
   }
 }
 //_________________________________________________________________________
-TObject* AliHFEspectrum::GetSpectrum(AliCFContainer * const c, Int_t step) {
+TObject* AliHFEspectrum::GetSpectrum(const AliCFContainer * const c, Int_t step) {
   AliCFDataGrid* data = new AliCFDataGrid("data","",*c, step);
   return data;
 }
 //_________________________________________________________________________
-TObject* AliHFEspectrum::GetEfficiency(AliCFContainer * const c, Int_t step, Int_t step0) {
+TObject* AliHFEspectrum::GetEfficiency(const AliCFContainer * const c, Int_t step, Int_t step0){
   // 
   // Create efficiency grid and calculate efficiency
   // of step to step0
@@ -817,3 +2170,142 @@ TObject* AliHFEspectrum::GetEfficiency(AliCFContainer * const c, Int_t step, Int
   eff->CalculateEfficiency(step,step0);
   return eff;
 }
+
+//____________________________________________________________________________
+THnSparse* AliHFEspectrum::GetCharmWeights(){
+  
+  //
+  // Measured D->e based weighting factors
+  //
+
+  const Int_t nDim=1;
+  Int_t nBin[nDim] = {44};
+  const Double_t kPtbound[2] = {0.1, 20.};
+
+  Double_t* binEdges[nDim];
+  binEdges[0] =  AliHFEtools::MakeLogarithmicBinning(nBin[0], kPtbound[0], kPtbound[1]);
+
+  fWeightCharm = new THnSparseF("weightHisto", "weiting factor; pt[GeV/c]", nDim, nBin);
+  for(Int_t idim = 0; idim < nDim; idim++)
+     fWeightCharm->SetBinEdges(idim, binEdges[idim]);
+     Double_t weight[44]={
+1.11865,1.11444,1.13395,1.15751,1.13412,1.14446,1.15372,1.09458,1.13446,1.11707,1.1352,1.10979,1.08887,1.11164,1.10772,1.10727,1.07027,1.07016,1.04826,1.03248,1.0093,0.973534,0.932574,0.869838,0.799316,0.734015,0.643001,0.584319,0.527147,0.495661,0.470002,0.441129,0.431156,0.417242,0.39246,0.379611,0.390845,0.368857,0.34959,0.387186,0.376364,0.384437,0.349585,0.383225};
+  //points
+  Double_t pt[1];
+  for(int i=0; i<nBin[0]; i++){
+    pt[0]=(binEdges[0][i]+binEdges[0][i+1])/2.;
+    fWeightCharm->Fill(pt,weight[i]);
+  }
+  Int_t* ibins[nDim];
+  for(Int_t ivar = 0; ivar < nDim; ivar++)
+    ibins[ivar] = new Int_t[nBin[ivar] + 1];
+  fWeightCharm->SetBinError(ibins[0],0);
+
+  return fWeightCharm;
+}
+
+//____________________________________________________________________________
+THnSparse* AliHFEspectrum::GetBeautyIPEff(){
+  //
+  // Return beauty electron IP cut efficiency
+  //
+
+  const Int_t nDim=1;
+  Int_t nBin[nDim] = {44};
+  const Double_t kPtbound[2] = {0.1, 20.};
+
+  Double_t* binEdges[nDim];
+  binEdges[0] =  AliHFEtools::MakeLogarithmicBinning(nBin[0], kPtbound[0], kPtbound[1]);
+
+  THnSparseF *ipcut = new THnSparseF("beff", "b eff; pt[GeV/c]", nDim, nBin);
+  for(Int_t idim = 0; idim < nDim; idim++)
+     ipcut->SetBinEdges(idim, binEdges[idim]);
+  Double_t pt[1];
+  Double_t weight;
+  for(int i=0; i<nBin[0]; i++){
+    pt[0]=(binEdges[0][i]+binEdges[0][i+1])/2.;
+    weight=0.612*(0.385+0.111*log(pt[0])-0.00435*log(pt[0])*log(pt[0]))*tanh(5.42*pt[0]-1.22);  // for 3 sigma cut   
+    //weight=0.786*(0.493+0.0283*log(pt[0])-0.0190*log(pt[0])*log(pt[0]))*tanh(1.84*pt[0]-0.00368);  // for 2 sigma cut   
+    ipcut->Fill(pt,weight);
+  }
+  Int_t* ibins[nDim];
+  for(Int_t ivar = 0; ivar < nDim; ivar++)
+    ibins[ivar] = new Int_t[nBin[ivar] + 1];
+  ipcut->SetBinError(ibins[0],0);
+
+  return ipcut;
+}
+
+//____________________________________________________________________________
+THnSparse* AliHFEspectrum::GetCharmEff(){
+  //
+  // Return charm electron IP cut efficiency
+  //
+
+  const Int_t nDim=1;
+  Int_t nBin[nDim] = {44};
+  const Double_t kPtbound[2] = {0.1, 20.};
+
+  Double_t* binEdges[nDim];
+  binEdges[0] =  AliHFEtools::MakeLogarithmicBinning(nBin[0], kPtbound[0], kPtbound[1]);
+
+  THnSparseF *ipcut = new THnSparseF("ceff", "c eff; pt[GeV/c]", nDim, nBin);
+  for(Int_t idim = 0; idim < nDim; idim++)
+     ipcut->SetBinEdges(idim, binEdges[idim]);
+  Double_t pt[1];
+  Double_t weight;
+  for(int i=0; i<nBin[0]; i++){
+    pt[0]=(binEdges[0][i]+binEdges[0][i+1])/2.;
+    weight=0.299*(0.307+0.176*log(pt[0])+0.0176*log(pt[0])*log(pt[0]))*tanh(96.3*pt[0]-19.7); // for 3 sigma cut
+    //weight=0.477*(0.3757+0.184*log(pt[0])-0.0013*log(pt[0])*log(pt[0]))*tanh(436.013*pt[0]-96.2137); // for 2 sigma cut
+    ipcut->Fill(pt,weight);
+  }
+  Int_t* ibins[nDim];
+  for(Int_t ivar = 0; ivar < nDim; ivar++)
+    ibins[ivar] = new Int_t[nBin[ivar] + 1];
+  ipcut->SetBinError(ibins[0],0);
+
+  return ipcut;
+}
+
+//____________________________________________________________________________
+THnSparse* AliHFEspectrum::GetPIDxIPEff(Int_t source){
+  //
+  // Return PID x IP cut efficiency
+  //
+
+  const Int_t nDim=1;
+  Int_t nBin[nDim] = {44};
+  const Double_t kPtbound[2] = {0.1, 20.};
+
+  Double_t* binEdges[nDim];
+  binEdges[0] =  AliHFEtools::MakeLogarithmicBinning(nBin[0], kPtbound[0], kPtbound[1]);
+
+  THnSparseF *pideff = new THnSparseF("pideff", "PID efficiency; p_{t}(GeV/c)", nDim, nBin);
+  for(Int_t idim = 0; idim < nDim; idim++)
+     pideff->SetBinEdges(idim, binEdges[idim]);
+
+  Double_t pt[1];
+  Double_t weight = 1.0;
+  Double_t trdtpcPidEfficiency = fEfficiencyFunction->Eval(0); // assume we have constant TRD+TPC PID efficiency
+  for(int i=0; i<nBin[0]; i++){
+    pt[0]=(binEdges[0][i]+binEdges[0][i+1])/2.;
+    Double_t tofeff = 0.9885*(0.8551+0.0070*log(pt[0])-0.0014*log(pt[0])*log(pt[0]))*tanh(0.8884*pt[0]+0.6061); // parameterized TOF PID eff
+
+    if(source==0) weight = tofeff*trdtpcPidEfficiency*0.299*(0.307+0.176*log(pt[0])+0.0176*log(pt[0])*log(pt[0]))*tanh(96.3*pt[0]-19.7); // for 3 sigma cut
+    //if(source==0) weight = tofeff*trdtpcPidEfficiency*0.477*(0.3757+0.184*log(pt[0])-0.0013*log(pt[0])*log(pt[0]))*tanh(436.013*pt[0]-96.2137); // for 2 sigma cut
+    //if(source==2) weight = tofeff*trdtpcPidEfficiency*0.5575*(0.3594-0.3051*log(pt[0])+0.1597*log(pt[0])*log(pt[0]))*tanh(8.2436*pt[0]-0.8125);
+    //if(source==3) weight = tofeff*trdtpcPidEfficiency*0.0937*(0.4449-0.3769*log(pt[0])+0.5031*log(pt[0])*log(pt[0]))*tanh(6.4063*pt[0]+3.1425); // multiply ip cut eff for Dalitz/dielectrons
+    if(source==2) weight = tofeff*trdtpcPidEfficiency*fConversionEff->GetBinContent(i+1); // multiply ip cut eff for conversion electrons
+    if(source==3) weight = tofeff*trdtpcPidEfficiency*fNonHFEEff->GetBinContent(i+1); // multiply ip cut eff for Dalitz/dielectrons
+    printf("tofeff= %lf trdtpcPidEfficiency= %lf conversion= %lf nonhfe= %lf\n",tofeff,trdtpcPidEfficiency,fConversionEff->GetBinContent(i+1),fNonHFEEff->GetBinContent(i+1));
+
+    pideff->Fill(pt,weight);
+  }
+  Int_t* ibins[nDim];
+  for(Int_t ivar = 0; ivar < nDim; ivar++)
+    ibins[ivar] = new Int_t[nBin[ivar] + 1];
+  pideff->SetBinError(ibins[0],0);
+
+  return pideff;
+}