]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGHF/vertexingHF/macros/AddTaskCFVertexingHFCascade.C
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGHF / vertexingHF / macros / AddTaskCFVertexingHFCascade.C
index c09d747170eed4aa755d1691a5ad10d74557c8a4..20fb794933beb12677ba60b546f9245937256a18 100644 (file)
@@ -1,4 +1,3 @@
-//DEFINITION OF A FEW CONSTANTS
 const Double_t ymin  = -1.2 ;
 const Double_t ymax  =  1.2 ;
 const Double_t cosminTS = -1.05;
@@ -33,7 +32,7 @@ const Float_t centmin_60_100 = 60.;
 const Float_t centmax_60_100 = 100.;
 const Float_t centmax = 100.;
 const Float_t fakemin = -0.5;
-const Float_t fakemax = 2.5;
+const Float_t fakemax = 2.5.;
 const Float_t cosminXY = 0.95;
 const Float_t cosmaxXY = 1.0;
 const Float_t normDecLXYmin = 0;
@@ -42,12 +41,17 @@ const Float_t multmin_0_20 = 0;
 const Float_t multmax_0_20 = 20;
 const Float_t multmin_20_50 = 20;
 const Float_t multmax_20_50 = 50;
-const Float_t multmin_50_102 = 50;
-const Float_t multmax_50_102 = 102;
+const Float_t multmin_50_80 = 50;
+const Float_t multmax_50_80 = 80;
+const Float_t multmin_80_100 = 80;
+const Float_t multmax_80_100 = 100;
+const Float_t multmin_100_400 = 100;
+const Float_t multmax_100_400 = 400;
+
 
 //----------------------------------------------------
 
-AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStartoKpipiCuts.root",Int_t configuration = AliCFTaskVertexingHF::kSnail, Bool_t isKeepDfromB=kFALSE, Bool_t isKeepDfromBOnly=kFALSE, Int_t pdgCode = 413, Char_t isSign = 2, TString usercomment = "username")
+AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "DStartoKpipiCuts010.root", TString cutObjectName="DStartoKpipiCuts", TString suffix="suf", Int_t configuration = AliCFTaskVertexingHF::kCheetah, Bool_t isKeepDfromB=kFALSE, Bool_t isKeepDfromBOnly=kFALSE, Int_t pdgCode = 413, Char_t isSign = 2, Bool_t useWeight=kTRUE, Bool_t useFlatPtWeight=kFALSE, Bool_t useZWeight=kFALSE, Bool_t useNchWeight=kFALSE, Bool_t useNtrkWeight=kFALSE, TString estimatorFilename="", Int_t multiplicityEstimator = AliCFTaskVertexingHF::kNtrk10, Bool_t isPPData=kFALSE, Bool_t isPPbData=kFALSE, Double_t refMult=9.26, Bool_t isFineNtrkBin=kFALSE)
 {
        printf("Adding CF task using cuts from file %s\n",cutFile);
        if (configuration == AliCFTaskVertexingHF::kSnail){
@@ -63,17 +67,17 @@ AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStar
               
        gSystem->Sleep(2000);
 
-       // isSign = 0 --> D0 only
-       // isSign = 1 --> D0bar only
-       // isSign = 2 --> D0 + D0bar
+       // isSign = 0 --> D* only
+       // isSign = 1 --> D*bar only
+       // isSign = 2 --> D* + D*bar
 
        TString expected;
        if (isSign == 0 && pdgCode < 0){
-               AliError(Form("Error setting PDG code (%d) and sign (0 --> D0 only): they are not compatible, returning"));
+               AliError(Form("Error setting PDG code (%d) and sign (0 --> D* only): they are not compatible, returning"));
                return 0x0;
        }
        else if (isSign == 1 && pdgCode > 0){
-               AliError(Form("Error setting PDG code (%d) and sign (1 --> D0bar only): they are not compatible, returning"));
+               AliError(Form("Error setting PDG code (%d) and sign (1 --> D*bar only): they are not compatible, returning"));
                return 0x0;
        }
        else if (isSign > 2 || isSign < 0){
@@ -81,8 +85,13 @@ AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStar
                return 0x0;
        }
 
-       TFile* fileCuts = new TFile(cutFile);
-       AliRDHFCutsDStartoKpipi *cutsD0toKpi = (AliRDHFCutsDStartoKpipi*)fileCuts->Get("DStartoKpipiCuts");
+       TFile* fileCuts = TFile::Open(cutFile);
+       if(!fileCuts || (fileCuts && !fileCuts->IsOpen())){ 
+         AliError("Wrong cut file");
+         return 0x0;
+       }
+
+       AliRDHFCutsDStartoKpipi *cutsDStartoKpi = (AliRDHFCutsDStartoKpipi*)fileCuts->Get(cutObjectName.Data());
        
        // check that the fKeepD0fromB flag is set to true when the fKeepD0fromBOnly flag is true
        //  for now the binning is the same than for all D's
@@ -106,31 +115,36 @@ AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStar
        ptmin_16_24 =  16.0 ;
        ptmax_16_24 =  24.0 ;
 
+
        //CONTAINER DEFINITION
        Info("AliCFTaskVertexingHF","SETUP CONTAINER");
        const Double_t phimax = 2*TMath::Pi();
        UInt_t nstep = 10; //number of selection steps: MC with limited acceptance, MC, Acceptance, Vertex, Refit, Reco (no cuts), RecoAcceptance, RecoITSClusters (RecoAcceptance included), RecoPPR (RecoAcceptance+RecoITSCluster included), RecoPID 
 
        //const UInt_t ipT, iy, icosThetaStar, ipTpi, ipTk, icT, idca, id0xd0, ipointing, iphi, izvtx, icent, ifake, ipointingXY, iNormDecayLXY, imult;
-       const Int_t nbiny  = 24 ; //bins in y
-       const Int_t nbincosThetaStar  = 42 ; //bins in cosThetaStar 
-       const Int_t nbincT  = 15 ; //bins in cT
-       const Int_t nbindca  = 20 ; //bins in dca
-       const Int_t nbind0xd0  = 90 ; //bins in d0xd0
-       const Int_t nbinpointing  = 50 ; //bins in cosPointingAngle
-       const Int_t nbinphi  = 18 ; //bins in Phi
-       const Int_t nbinzvtx  = 30 ; //bins in z vertex
-       const Int_t nbincent = 18; //bins in centrality
-       const Int_t nbincent_0_10 = 4;  //bins in centrality between 0 and 10
-       const Int_t nbincent_10_60 = 10;  //bins in centrality between 10 and 60
-       const Int_t nbincent_60_100 = 4;  //bins in centrality between 60 and 100
-       const Int_t nbinfake = 3;  //bins in fake
-       const Int_t nbinpointingXY = 50;  //bins in cosPointingAngleXY
-       const Int_t nbinnormDecayLXY = 20;  //bins in NormDecayLengthXY
-       const Int_t nbinmult = 48;  //bins in multiplicity (total number)
-       const Int_t nbinmult_0_20 = 20; //bins in multiplicity between 0 and 20
-       const Int_t nbinmult_20_50 = 15; //bins in multiplicity between 20 and 50
-       const Int_t nbinmult_50_102 = 13; //bins in multiplicity between 50 and 102
+        const Int_t nbiny  = 24 ; //bins in y
+        const Int_t nbincosThetaStar  = 42 ; //bins in cosThetaStar 
+        const Int_t nbincT  = 15 ; //bins in cT
+        const Int_t nbindca  = 20 ; //bins in dca
+        const Int_t nbind0xd0  = 90 ; //bins in d0xd0
+        const Int_t nbinpointing  = 50 ; //bins in cosPointingAngle
+        const Int_t nbinphi  = 18 ; //bins in Phi
+        const Int_t nbinzvtx  = 30 ; //bins in z vertex
+        const Int_t nbincent = 28;  //bins in centrality
+        const Int_t nbincent_0_10 = 4;  //bins in centrality between 0 and 10
+        const Int_t nbincent_10_60 = 20;  //bins in centrality between 10 and 60
+        const Int_t nbincent_60_100 = 4;  //bins in centrality between 60 and 100
+        const Int_t nbinfake = 3;  //bins in fake
+        const Int_t nbinpointingXY = 50;  //bins in cosPointingAngleXY
+        const Int_t nbinnormDecayLXY = 20;  //bins in NormDecayLengthXY
+       const Int_t nbinmult = 49;  //bins in multiplicity (total number)
+        const Int_t nbinmult_0_20 = 20; //bins in multiplicity between 0 and 20
+        const Int_t nbinmult_20_50 = 15; //bins in multiplicity between 20 and 50
+        const Int_t nbinmult_50_80 = 10; //bins in multiplicity between 50 and 80
+        const Int_t nbinmult_80_100 = 4; //bins in multiplicity between 80 and 100
+        const Int_t nbinmult_100_400 = 3; //bins in multiplicity between 100 and 400
+       if(isPPbData) nbinmult += nbinmult_100_400;
+
 
        //the sensitive variables, their indices
 
@@ -158,78 +172,8 @@ AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStar
        
        //arrays for the number of bins in each dimension
        Int_t iBin[nvarTot];
-       
-       //OPTION 1: defining the pt, ptPi, ptK bins by hand...          
-       /*
-         const Int_t nbinpt_0_6  = 6 ; //bins in pt from 0 to 6 GeV
-         const Int_t nbinpt_6_8  = 1 ; //bins in pt from 6 to 8 GeV
-         const Int_t nbinpt_8_16  = 2 ; //bins in pt from 8 to 16 GeV
-         const Int_t nbinpt_16_24  = 1 ; //bins in pt from 16 to 24 GeV
-         const Int_t nbinpTpi_0_6  = 6 ; //bins in ptPi from 0 to 6 GeV
-         const Int_t nbinpTpi_6_8  = 1 ; //bins in ptPi from 6 to 8 GeV
-         const Int_t nbinpTpi_8_16  = 2 ; //bins in ptPi from 8 to 16 GeV
-         const Int_t nbinpTpi_16_24  = 1 ; //bins in ptPi from 16 to 24 GeV
-         const Int_t nbinpTk_0_6  = 6 ; //bins in ptK from 0 to 6 GeV
-         const Int_t nbinpTk_6_8  = 1 ; //bins in ptK from 6 to 8 GeV
-         const Int_t nbinpTk_8_16  = 2 ; //bins in ptK from 8 to 16 GeV
-         const Int_t nbinpTk_16_24  = 1 ; //bins in ptK from 16 to 24 GeV
-         iBin[ipT]=nbinpt_0_6+nbinpt_6_8+nbinpt_8_16+nbinpt_16_24;
-         iBin[ipTpi]=nbinpTpi_0_6+nbinpTpi_6_8+nbinpTpi_8_16+nbinpTpi_16_24;
-         iBin[ipTk]=nbinpTk_0_6+nbinpTk_6_8+nbinpTk_8_16+nbinpTk_16_24;
-         Double_t *binLimpT=new Double_t[iBin[0]+1];
-         Double_t *binLimpTpi=new Double_t[iBin[3]+1];
-         Double_t *binLimpTk=new Double_t[iBin[4]+1];
-         
-         // values for bin lower bounds
-         // pt
-         for(Int_t i=0; i<=nbinpt_0_6; i++) binLimpT[i]=(Double_t)ptmin_0_6 + (ptmax_0_6-ptmin_0_6)/nbinpt_0_6*(Double_t)i ; 
-         if (binLimpT[nbinpt_0_6] != ptmin_6_8)  {
-         Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 1st range - differs from expected!\n");
-         }
-         for(Int_t i=0; i<=nbinpt_6_8; i++) binLimpT[i+nbinpt_0_6]=(Double_t)ptmin_6_8 + (ptmax_6_8-ptmin_6_8)/nbinpt_6_8*(Double_t)i ; 
-         if (binLimpT[nbinpt_0_6+nbinpt_6_8] != ptmin_8_16)  {
-         Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 2nd range - differs from expected!\n");
-         }
-         for(Int_t i=0; i<=nbinpt_8_16; i++) binLimpT[i+nbinpt_0_6+nbinpt_6_8]=(Double_t)ptmin_8_16 + (ptmax_8_16-ptmin_8_16)/nbinpt_8_16*(Double_t)i ; 
-         if (binLimpT[nbinpt_0_6+nbinpt_6_8+nbinpt_8_16] != ptmin_16_24)  {
-         Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 2nd range - differs from expected!\n");
-         }
-         for(Int_t i=0; i<=nbinpt_16_24; i++) binLimpT[i+nbinpt_0_6+nbinpt_6_8+nbinpt_8_16]=(Double_t)ptmin_16_24 + (ptmax_16_24-ptmin_16_24)/nbinpt_16_24*(Double_t)i ; 
-         
-         // ptPi
-         for(Int_t i=0; i<=nbinpTpi_0_6; i++) binLimpTpi[i]=(Double_t)ptmin_0_6 + (ptmax_0_6-ptmin_0_6)/nbinpTpi_0_6*(Double_t)i ; 
-         if (binLimpTpi[nbinpTpi_0_6] != ptmin_6_8)  {
-         Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 1st range - differs from expected!\n");
-         }
-         for(Int_t i=0; i<=nbinpTpi_6_8; i++) binLimpTpi[i+nbinpTpi_0_6]=(Double_t)ptmin_6_8 + (ptmax_6_8-ptmin_6_8)/nbinpTpi_6_8*(Double_t)i ; 
-         if (binLimpTpi[nbinpTpi_0_6+nbinpTpi_6_8] != ptmin_8_16)  {
-         Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 2nd range - differs from expected!\n");
-         }
-         for(Int_t i=0; i<=nbinpTpi_8_16; i++) binLimpTpi[i+nbinpTpi_0_6+nbinpt_6_8]=(Double_t)ptmin_8_16 + (ptmax_8_16-ptmin_8_16)/nbinpTpi_8_16*(Double_t)i ; 
-         if (binLimpTpi[nbinpTpi_0_6+nbinpTpi_6_8+nbinpTpi_8_16] != ptmin_16_24)  {
-         Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 2nd range - differs from expected!\n");
-         }
-         for(Int_t i=0; i<=nbinpTpi_16_24; i++) binLimpTpi[i+nbinpTpi_0_6+nbinpTpi_6_8+nbinpTpi_8_16]=(Double_t)ptmin_16_24 + (ptmax_16_24-ptmin_16_24)/nbinpTpi_16_24*(Double_t)i ; 
-         
-         // ptKa
-         for(Int_t i=0; i<=nbinpTk_0_6; i++) binLimpTk[i]=(Double_t)ptmin_0_6 + (ptmax_0_6-ptmin_0_6)/nbinpTk_0_6*(Double_t)i ; 
-         if (binLimpTk[nbinpTk_0_6] != ptmin_6_8)  {
-         Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 1st range - differs from expected!\n");
-         }
-         for(Int_t i=0; i<=nbinpTk_6_8; i++) binLimpTk[i+nbinpTk_0_6]=(Double_t)ptmin_6_8 + (ptmax_6_8-ptmin_6_8)/nbinpTk_6_8*(Double_t)i ; 
-         if (binLimpTk[nbinpTk_0_6+nbinpTk_6_8] != ptmin_8_16)  {
-         Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 2nd range - differs from expected!\n");
-         }
-         for(Int_t i=0; i<=nbinpTk_8_16; i++) binLimpTk[i+nbinpTk_0_6+nbinpt_6_8]=(Double_t)ptmin_8_16 + (ptmax_8_16-ptmin_8_16)/nbinpTk_8_16*(Double_t)i ; 
-         if (binLimpTk[nbinpTk_0_6+nbinpTk_6_8+nbinpTk_8_16] != ptmin_16_24)  {
-         Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 2nd range - differs from expected!\n");
-         }
-         for(Int_t i=0; i<=nbinpTk_16_24; i++) binLimpTk[i+nbinpTk_0_6+nbinpTk_6_8+nbinpTk_8_16]=(Double_t)ptmin_16_24 + (ptmax_16_24-ptmin_16_24)/nbinpTk_16_24*(Double_t)i ; 
-       */
-       
-       //OPTION 2: ...or from the cuts file
-       
-       const Int_t nbinpt = cutsD0toKpi->GetNPtBins(); // bins in pT
+               
+       const Int_t nbinpt = cutsDStartoKpi->GetNPtBins(); // bins in pT
        iBin[ipT]=nbinpt;
        iBin[ipTpi]=nbinpt;
        iBin[ipTk]=nbinpt;
@@ -237,7 +181,7 @@ AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStar
        Double_t *binLimpTpi=new Double_t[iBin[ipTpi]+1];
        Double_t *binLimpTk=new Double_t[iBin[ipTk]+1];
        // values for bin lower bounds
-       Float_t* floatbinLimpT = cutsD0toKpi->GetPtBinLimits();
+       Float_t* floatbinLimpT = cutsDStartoKpi->GetPtBinLimits();
        for (Int_t ibin0 = 0 ; ibin0<iBin[ipT]+1; ibin0++){
                binLimpT[ibin0] = (Double_t)floatbinLimpT[ibin0];
                binLimpTpi[ibin0] = (Double_t)floatbinLimpT[ibin0];
@@ -246,9 +190,33 @@ AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStar
        for(Int_t i=0; i<=nbinpt; i++) printf("binLimpT[%d]=%f\n",i,binLimpT[i]);  
        
        printf("pT: nbin (from cuts file) = %d\n",nbinpt);
+
+
        
+
+
+
+
+
+       // Fine Ntrk binning setting
+       Double_t *binLimmultFine;
+       Int_t nbinmultTmp=nbinmult;
+       if (isFineNtrkBin) {
+               Int_t nbinLimmultFine = 100;
+               if (isPPbData) nbinLimmultFine = 200;
+               const UInt_t nbinMultFine = nbinLimmultFine;
+               binLimmultFine = new Double_t[nbinMultFine+1];
+               for (Int_t ibin0 = 0; ibin0 < nbinMultFine+1; ibin0++) {
+                       binLimmultFine[ibin0] = ibin0;
+               }
+               nbinmultTmp = nbinLimmultFine;
+       }
+       const Int_t nbinmultTot = nbinmultTmp;
+
        // defining now the binning for the other variables:
        
+       AliLog::SetClassDebugLevel("AliCFManager",AliLog::kInfo);
+
        iBin[iy]=nbiny;
        iBin[icosThetaStar]=nbincosThetaStar;
        iBin[icT]=nbincT;
@@ -261,7 +229,7 @@ AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStar
        iBin[ifake]=nbinfake;
        iBin[ipointingXY]=nbinpointingXY;
        iBin[inormDecayLXY]=nbinnormDecayLXY;
-       iBin[imult]=nbinmult;
+       iBin[imult]=nbinmultTot;
        
        //arrays for lower bounds :
        Double_t *binLimy=new Double_t[iBin[iy]+1];
@@ -278,77 +246,89 @@ AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStar
        Double_t *binLimnormDecayLXY=new Double_t[iBin[inormDecayLXY]+1];
        Double_t *binLimmult=new Double_t[iBin[imult]+1];
 
+
        // y
-       for(Int_t i=0; i<=nbiny; i++) binLimy[i]=(Double_t)ymin  + (ymax-ymin)  /nbiny*(Double_t)i ;
+        for(Int_t i=0; i<=nbiny; i++) binLimy[i]=(Double_t)ymin  + (ymax-ymin)  /nbiny*(Double_t)i ;
 
-       // cosThetaStar
-       for(Int_t i=0; i<=nbincosThetaStar; i++) binLimcosThetaStar[i]=(Double_t)cosminTS  + (cosmaxTS-cosminTS)  /nbincosThetaStar*(Double_t)i ;
-       
-       // cT
-       for(Int_t i=0; i<=nbincT; i++) binLimcT[i]=(Double_t)cTmin  + (cTmax-cTmin)  /nbincT*(Double_t)i ;
+        // cosThetaStar
+        for(Int_t i=0; i<=nbincosThetaStar; i++) binLimcosThetaStar[i]=(Double_t)cosminTS  + (cosmaxTS-cosminTS)  /nbincosThetaStar*(Double_t)i ;
+        
+        // cT
+        for(Int_t i=0; i<=nbincT; i++) binLimcT[i]=(Double_t)cTmin  + (cTmax-cTmin)  /nbincT*(Double_t)i ;
 
-       // dca
-       for(Int_t i=0; i<=nbindca; i++) binLimdca[i]=(Double_t)dcamin  + (dcamax-dcamin)  /nbindca*(Double_t)i ;
+        // dca
+        for(Int_t i=0; i<=nbindca; i++) binLimdca[i]=(Double_t)dcamin  + (dcamax-dcamin)  /nbindca*(Double_t)i ;
 
-       // d0xd0
-       for(Int_t i=0; i<=nbind0xd0; i++) binLimd0xd0[i]=(Double_t)d0xd0min  + (d0xd0max-d0xd0min)  /nbind0xd0*(Double_t)i ;
+        // d0xd0
+        for(Int_t i=0; i<=nbind0xd0; i++) binLimd0xd0[i]=(Double_t)d0xd0min  + (d0xd0max-d0xd0min)  /nbind0xd0*(Double_t)i ;
 
-       // cosPointingAngle
-       for(Int_t i=0; i<=nbinpointing; i++) binLimpointing[i]=(Double_t)cosmin  + (cosmax-cosmin)  /nbinpointing*(Double_t)i ;
+        // cosPointingAngle
+        for(Int_t i=0; i<=nbinpointing; i++) binLimpointing[i]=(Double_t)cosmin  + (cosmax-cosmin)  /nbinpointing*(Double_t)i ;
 
-       // Phi
-       for(Int_t i=0; i<=nbinphi; i++) binLimphi[i]=(Double_t)phimin  + (phimax-phimin)  /nbinphi*(Double_t)i ;
+        // Phi
+        for(Int_t i=0; i<=nbinphi; i++) binLimphi[i]=(Double_t)phimin  + (phimax-phimin)  /nbinphi*(Double_t)i ;
 
-       // z Primary Vertex
-       for(Int_t i=0; i<=nbinzvtx; i++) {
-               binLimzvtx[i]=(Double_t)zmin  + (zmax-zmin)  /nbinzvtx*(Double_t)i ;
-       }
+        // z Primary Vertex
+        for(Int_t i=0; i<=nbinzvtx; i++) {
+                binLimzvtx[i]=(Double_t)zmin  + (zmax-zmin)  /nbinzvtx*(Double_t)i ;
+        }
 
-       // centrality
-       for(Int_t i=0; i<=nbincent_0_10; i++) binLimcent[i]=(Double_t)centmin_0_10 + (centmax_0_10-centmin_0_10)/nbincent_0_10*(Double_t)i ; 
-       if (binLimcent[nbincent_0_10] != centmin_10_60)  {
-         Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for cent - 1st range - differs from expected!\n");
-       }
-       for(Int_t i=0; i<=nbincent_10_60; i++) binLimcent[i+nbincent_0_10]=(Double_t)centmin_10_60 + (centmax_10_60-centmin_10_60)/nbincent_10_60*(Double_t)i ;
-       if (binLimcent[nbincent_0_10+nbincent_10_60] != centmin_60_100)  {
-         Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for cent - 2st range - differs from expected!\n");
-       }
-       for(Int_t i=0; i<=nbincent_60_100; i++) binLimcent[i+nbincent_0_10+nbincent_10_60]=(Double_t)centmin_60_100 + (centmax_60_100-centmin_60_100)/nbincent_60_100*(Double_t)i ;
-        
-       // fake
-       for(Int_t i=0; i<=nbinfake; i++) {
-         binLimfake[i]=(Double_t)fakemin  + (fakemax-fakemin)/nbinfake * (Double_t)i;
-       }
+        // centrality
+        for(Int_t i=0; i<=nbincent_0_10; i++) binLimcent[i]=(Double_t)centmin_0_10 + (centmax_0_10-centmin_0_10)/nbincent_0_10*(Double_t)i ; 
+        if (binLimcent[nbincent_0_10] != centmin_10_60)  {
+                Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for cent - 1st range - differs from expected!\n");
+        }
+        for(Int_t i=0; i<=nbincent_10_60; i++) binLimcent[i+nbincent_0_10]=(Double_t)centmin_10_60 + (centmax_10_60-centmin_10_60)/nbincent_10_60*(Double_t)i ;
+        if (binLimcent[nbincent_0_10+nbincent_10_60] != centmin_60_100)  {
+                Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for cent - 2st range - differs from expected!\n");
+        }
+        for(Int_t i=0; i<=nbincent_60_100; i++) binLimcent[i+nbincent_0_10+nbincent_10_60]=(Double_t)centmin_60_100 + (centmax_60_100-centmin_60_100)/nbincent_60_100*(Double_t)i ;
+
+        // fake
+        for(Int_t i=0; i<=nbinfake; i++) {
+          binLimfake[i]=(Double_t)fakemin  + (fakemax-fakemin)/nbinfake * (Double_t)i;
+        }
+
+        // cosPointingAngleXY
+        for(Int_t i=0; i<=nbinpointingXY; i++) binLimpointingXY[i]=(Double_t)cosminXY  + (cosmaxXY-cosminXY)  /nbinpointingXY*(Double_t)i ;
 
-       // cosPointingAngleXY
-       for(Int_t i=0; i<=nbinpointingXY; i++) binLimpointingXY[i]=(Double_t)cosminXY  + (cosmaxXY-cosminXY)  /nbinpointingXY*(Double_t)i ;
+        // normDecayLXY
+        for(Int_t i=0; i<=nbinnormDecayLXY; i++) binLimnormDecayLXY[i]=(Double_t)normDecLXYmin  + (normDecLXYmax-normDecLXYmin)  /nbinnormDecayLXY*(Double_t)i ;
 
-       // normDecayLXY
-       for(Int_t i=0; i<=nbinnormDecayLXY; i++) binLimnormDecayLXY[i]=(Double_t)normDecLXYmin  + (normDecLXYmax-normDecLXYmin)  /nbinnormDecayLXY*(Double_t)i ;
 
        // multiplicity
-       for(Int_t i=0; i<=nbinmult_0_20; i++) binLimmult[i]=(Double_t)multmin_0_20 + (multmax_0_20-multmin_0_20)/nbinmult_0_20*(Double_t)i ; 
-       if (binLimmult[nbinmult_0_20] != multmin_20_50)  {
-               Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for mult - 1st range - differs from expected!\n");
+        for(Int_t i=0; i<=nbinmult_0_20; i++) binLimmult[i]=(Double_t)multmin_0_20 + (multmax_0_20-multmin_0_20)/nbinmult_0_20*(Double_t)i ; 
+        if (binLimmult[nbinmult_0_20] != multmin_20_50)  {
+                Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for mult - 1st range - differs from expected!\n");
+        }
+        for(Int_t i=0; i<=nbinmult_20_50; i++) binLimmult[i+nbinmult_0_20]=(Double_t)multmin_20_50 + (multmax_20_50-multmin_20_50)/nbinmult_20_50*(Double_t)i ; 
+        if (binLimmult[nbinmult_0_20+nbinmult_20_50] != multmin_50_80)  {
+                Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for mult - 2nd range - differs from expected!\n");
+        }
+        for(Int_t i=0; i<=nbinmult_50_80; i++) binLimmult[i+nbinmult_0_20+nbinmult_20_50]=(Double_t)multmin_50_80 + (multmax_50_80-multmin_50_80)/nbinmult_50_80*(Double_t)i ; 
+        if (binLimmult[nbinmult_0_20+nbinmult_20_50+nbinmult_50_80] != multmin_80_100)  {
+                Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for mult - 3rd range - differs from expected!\n");
+        }
+        for(Int_t i=0; i<=nbinmult_80_100; i++) binLimmult[i+nbinmult_0_20+nbinmult_20_50+nbinmult_50_80]=(Double_t)multmin_80_100 + (multmax_80_100-multmin_80_100)/nbinmult_80_100*(Double_t)i ; 
+        if (binLimmult[nbinmult_0_20+nbinmult_20_50+nbinmult_50_80+nbinmult_80_100] != multmin_100_400) {
+                Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for mult - 4th range - differs from expected!\n");
+        }
+       if(isPPbData){
+         for (Int_t i = 0; i<=nbinmult_100_400; i++) binLimmult[i+nbinmult_0_20+nbinmult_20_50+nbinmult_50_80+nbinmult_80_100]= (Double_t)multmin_100_400 + (multmax_100_400-multmin_100_400)/nbinmult_100_400*(Double_t)i ;
        }
-       for(Int_t i=0; i<=nbinmult_20_50; i++) binLimmult[i+nbinmult_0_20]=(Double_t)multmin_20_50 + (multmax_20_50-multmin_20_50)/nbinmult_20_50*(Double_t)i ; 
-       if (binLimmult[nbinmult_0_20+nbinmult_20_50] != multmin_50_102)  {
-               Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for mult - 2nd range - differs from expected!\n");
-       }
-       for(Int_t i=0; i<=nbinmult_50_102; i++) binLimmult[i+nbinmult_0_20+nbinmult_20_50]=(Double_t)multmin_50_102 + (multmax_50_102-multmin_50_102)/nbinmult_50_102*(Double_t)i ; 
 
        //one "container" for MC
        TString nameContainer="";
        if(!isKeepDfromB) {
-               nameContainer="CFHFccontainer0_CommonFramework_"+usercomment;
+               nameContainer="CFHFccontainer0";
        }
        else  if(isKeepDfromBOnly){
-               nameContainer="CFHFccontainer0DfromB_CommonFramework_"+usercomment;
+               nameContainer="CFHFccontainer0DfromB";
        }
        else  {
-               nameContainer="CFHFccontainer0allD_CommonFramework_"+usercomment;         
+               nameContainer="CFHFccontainer0allD";      
        }
-
+       nameContainer += suffix;
        //Setting up the container grid... 
 
        AliCFContainer* container;
@@ -387,7 +367,9 @@ AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStar
                printf("normDecayLXY\n");
                container -> SetBinLimits(inormDecayLXY,binLimnormDecayLXY);
                printf("multiplicity\n");
-               container -> SetBinLimits(imult,binLimmult);
+               
+               if (isFineNtrkBin) container->SetBinLimits(imult,binLimmultFine);
+               else               container -> SetBinLimits(imult,binLimmult);
 
                container -> SetVarTitle(ipT,"pt");
                container -> SetVarTitle(iy,"y");
@@ -445,7 +427,8 @@ AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStar
                printf("fake\n");
                container -> SetBinLimits(ifakeFast,binLimfake);
                printf("multiplicity\n");
-               container -> SetBinLimits(imultFast,binLimmult);
+               if(isFineNtrkBin) container -> SetBinLimits(imultFast,binLimmultFine);
+               else              container -> SetBinLimits(imultFast,binLimmult);
 
                container -> SetVarTitle(ipTFast,"pt");
                container -> SetVarTitle(iyFast,"y");
@@ -540,17 +523,21 @@ AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStar
        printf("CREATE TASK\n");
 
        // create the task
-       AliCFTaskVertexingHF *task = new AliCFTaskVertexingHF("AliCFTaskVertexingHF",cutsD0toKpi);
+       AliCFTaskVertexingHF *task = new AliCFTaskVertexingHF("AliCFTaskVertexingHF",cutsDStartoKpi);
        task->SetConfiguration(configuration);
        task->SetFillFromGenerated(kFALSE);
        task->SetCFManager(man); //here is set the CF manager
        task->SetDecayChannel(21);
-       task->SetUseWeight(kFALSE);
+       task->SetUseFlatPtWeight(useFlatPtWeight); 
+       task->SetUseWeight(useWeight);
+       task->SetUseZWeight(useZWeight);
        task->SetSign(isSign);
        task->SetCentralitySelection(kFALSE);
        task->SetFakeSelection(0);
        task->SetRejectCandidateIfNotFromQuark(kTRUE); // put to false if you want to keep HIJING D0!!
        task->SetUseMCVertex(kFALSE); // put to true if you want to do studies on pp
+       //task->SetPtWeightsFromDataPbPb276overLHC12a17a();
+
 
        if (isKeepDfromB && !isKeepDfromBOnly) task->SetDselection(2);
        if (isKeepDfromB && isKeepDfromBOnly) task->SetDselection(1);   
@@ -564,28 +551,90 @@ AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStar
                else {
                        task->SetWeightFunction(funcWeight);
                        Printf("User-defined Weights will be used. The function being:");
-                       task->GetWeightFunction(funcWeight)->Print();
+                       task->GetWeightFunction()->Print();
                }
        }
 
-       Printf("***************** CONTAINER SETTINGS *****************");       
-       Printf("decay channel = %d",(Int_t)task->GetDecayChannel());
-       Printf("FillFromGenerated = %d",(Int_t)task->GetFillFromGenerated());
-       Printf("Dselection = %d",(Int_t)task->GetDselection());
-       Printf("UseWeight = %d",(Int_t)task->GetUseWeight());
-       if (task->GetUseWeight()) {
-               Printf("User-defined Weight function:");
-               task->GetWeightFunction(funcWeight)->Print();
-       }
-       else{
-               Printf("FONLL will be used for the weights");
+       if(useNchWeight || useNtrkWeight){
+          TH1F *hNchPrimaries;
+         TH1F *hNchMeasured;           
+         if (isPPbData) hNchPrimaries = (TH1F*)fileCuts->Get("hNtrUnCorrEvWithCandWeight");
+         else hNchPrimaries = (TH1F*)fileCuts->Get("hGenPrimaryParticlesInelGt0");
+         hNchMeasured = (TH1F*)fileCuts->Get("hNchMeasured");
+          if(hNchPrimaries) {
+            task->SetUseNchWeight(kTRUE);
+            task->SetMCNchHisto(hNchPrimaries);
+           if(isPPbData) task->SetUseNchTrackletsWeight();
+          } else {
+            AliFatal("Histogram for multiplicity weights not found");
+            return 0x0;
+          }
+         if(hNchMeasured) task->SetMeasuredNchHisto(hNchMeasured);
+         if(useNtrkWeight) task->SetUseNchTrackletsWeight();
+        }
+
+       task->SetMultiplicityEstimator(multiplicityEstimator);
+       if(estimatorFilename.EqualTo("") ) {
+         printf("Estimator file not provided, multiplicity corrected histograms will not be filled\n");
+         task->SetUseZvtxCorrectedNtrkEstimator(kFALSE);
+       } else{
+         TFile* fileEstimator=TFile::Open(estimatorFilename.Data());
+         if(!fileEstimator)  {
+           AliFatal("File with multiplicity estimator not found"); 
+           return;
+         }      
+         task->SetUseZvtxCorrectedNtrkEstimator(kTRUE);
+         task->SetReferenceMultiplcity(refMult);
+         
+         if (isPPbData) {  //load multiplicity estimators for pPb
+           task->SetIsPPbData(kTRUE);
+           const Char_t* periodNames[2] = {"LHC13b", "LHC13c"};
+           TProfile *multEstimatorAvg[2];
+           for (Int_t ip=0; ip < 2; ip++) {
+             multEstimatorAvg[ip] = (TProfile*)(fileEstimator->Get(Form("SPDmult10_%s",periodNames[ip]))->Clone(Form("SPDmult10_%s_clone",periodNames[ip])));    
+             if (!multEstimatorAvg[ip]) {
+               AliFatal(Form("Multiplicity estimator for %s not found! Please check your estimator file",periodNames[ip]));
+               return;               
+             }
+           }
+           task->SetMultiplVsZProfileLHC13b(multEstimatorAvg[0]);
+           task->SetMultiplVsZProfileLHC13c(multEstimatorAvg[1]);
+           
+         } else {    //load multiplicity estimators for pp
+           const Char_t* periodNames[4] = {"LHC10b", "LHC10c", "LHC10d", "LHC10e"};
+           TProfile* multEstimatorAvg[4];                       
+           
+           for(Int_t ip=0; ip<4; ip++) {
+             multEstimatorAvg[ip] = (TProfile*)(fileEstimator->Get(Form("SPDmult10_%s",periodNames[ip]))->Clone(Form("SPDmult10_%s_clone",periodNames[ip])));  
+             if (!multEstimatorAvg[ip]) {
+               AliFatal(Form("Multiplicity estimator for %s not found! Please check your estimator file",periodNames[ip]));
+               return;               
+             }  
+           }
+           task->SetMultiplVsZProfileLHC10b(multEstimatorAvg[0]);
+           task->SetMultiplVsZProfileLHC10c(multEstimatorAvg[1]);
+           task->SetMultiplVsZProfileLHC10d(multEstimatorAvg[2]);
+           task->SetMultiplVsZProfileLHC10e(multEstimatorAvg[3]);
+         }
        }
-       Printf("Sign = %d",(Int_t)task->GetSign());
-       Printf("Centrality selection = %d",(Int_t)task->GetCentralitySelection());
-       Printf("Fake selection = %d",(Int_t)task->GetFakeSelection());
-       Printf("RejectCandidateIfNotFromQuark selection = %d",(Int_t)task->GetRejectCandidateIfNotFromQuark());
-       Printf("UseMCVertex selection = %d",(Int_t)task->GetUseMCVertex());
-       Printf("***************END CONTAINER SETTINGS *****************\n");
+       Printf("***************** CONTAINER SETTINGS *****************");       
+        Printf("decay channel = %d",(Int_t)task->GetDecayChannel());
+        Printf("FillFromGenerated = %d",(Int_t)task->GetFillFromGenerated());
+        Printf("Dselection = %d",(Int_t)task->GetDselection());
+        Printf("UseWeight = %d",(Int_t)task->GetUseWeight());
+        if (task->GetUseWeight()) {
+          if(funcWeight) Printf("User-defined Weight function");
+          else Printf("FONLL will be used for the weights");
+        }
+
+        Printf("Use Nch weight = %d",(Int_t)task->GetUseNchWeight());
+        Printf("Sign = %d",(Int_t)task->GetSign());
+        Printf("Centrality selection = %d",(Int_t)task->GetCentralitySelection());
+        Printf("Fake selection = %d",(Int_t)task->GetFakeSelection());
+        Printf("RejectCandidateIfNotFromQuark selection = %d",(Int_t)task->GetRejectCandidateIfNotFromQuark());
+        Printf("UseMCVertex selection = %d",(Int_t)task->GetUseMCVertex());
+        Printf("***************END CONTAINER SETTINGS *****************\n");
+
 
         //-----------------------------------------------------------//
         //   create correlation matrix for unfolding - only eta-pt   //
@@ -605,15 +654,16 @@ AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStar
 
        TString nameCorr="";
        if(!isKeepDfromB) {
-               nameCorr="CFHFcorr0_CommonFramework_"+usercomment;
+               nameCorr="CFHFcorr0";
        }
        else  if(isKeepDfromBOnly){
-               nameCorr= "CFHFcorr0KeepDfromBOnly_CommonFramework_"+usercomment;
+               nameCorr= "CFHFcorr0KeepDfromBOnly";
        }
        else  {
-               nameCorr="CFHFcorr0allD_CommonFramework_"+usercomment;
+               nameCorr="CFHFcorr0allD";
 
        }
+       nameCorr += suffix;
 
         THnSparseD* correlation = new THnSparseD(nameCorr,"THnSparse with correlations",4,thnDim);
         Double_t** binEdges = new Double_t[2];
@@ -644,25 +694,37 @@ AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStar
        // ----- output data -----
        
        TString outputfile = AliAnalysisManager::GetCommonFileName();
-       TString output1name="", output2name="", output3name="",output4name="";
+       TString output1name="", output2name="", output3name="",output4name="", output5name="";
        output2name=nameContainer;
        output3name=nameCorr;
+       output4name= "Cuts";
+       output5name= "coutProfDst";
        if(!isKeepDfromB) {
-               outputfile += ":PWG3_D2H_CFtaskD0toKpi_CommonFramework_"+usercomment;
-               output1name="CFHFchist0_CommonFramework_"+usercomment;
-               output4name= "Cuts_CommonFramework_"+usercomment;
+               outputfile += ":PWG3_D2H_CFtaskDstartoKpipi";
+               output1name="CFHFchist0";
+               output3name+="_cOnly";
+               output4name+="_cOnly";
+               output5name+="_cOnly";
        }
        else  if(isKeepDfromBOnly){
-               outputfile += ":PWG3_D2H_CFtaskD0toKpiKeepDfromBOnly_CommonFramework_"+usercomment;
-               output1name="CFHFchist0DfromB_CommonFramework_"+usercomment;
-               output4name= "Cuts_CommonFramework_DfromB_"+usercomment;
+               outputfile += ":PWG3_D2H_CFtaskDstartoKpiKeepDfromBOnly";
+               output1name="CFHFchist0DfromB";
+               output3name+="_bOnly";
+               output4name+="_bOnly";
+               output5name+="_bOnly";
        }
        else{
-               outputfile += ":PWG3_D2H_CFtaskD0toKpiKeepDfromB_CommonFramework_"+usercomment;
-               output1name="CFHFchist0allD_CommonFramework_"+usercomment;
-               output4name= "Cuts_CommonFramework_allD_"+usercomment;
+               outputfile += ":PWG3_D2H_CFtaskDstartoKpiKeepDfromB";
+               output1name="CFHFchist0allD";
+               output3name+="_all";
+               output4name+="_all";
+               output5name+="_all";
        }
-       
+
+       outputfile += suffix;
+       output1name += suffix;
+       output4name += suffix;
+       output5name += suffix;
 
        //now comes user's output objects :
        // output TH1I for event counting
@@ -673,6 +735,8 @@ AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStar
         AliAnalysisDataContainer *coutput3 = mgr->CreateContainer(output3name, THnSparseD::Class(),AliAnalysisManager::kOutputContainer,outputfile.Data());
        // cuts
        AliAnalysisDataContainer *coutput4 = mgr->CreateContainer(output4name, AliRDHFCuts::Class(),AliAnalysisManager::kOutputContainer, outputfile.Data());
+       // estimators list
+       AliAnalysisDataContainer *coutput5 = mgr->CreateContainer(output5name, TList::Class(),AliAnalysisManager::kOutputContainer, outputfile.Data());
 
        mgr->AddTask(task);
        
@@ -681,8 +745,7 @@ AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStar
        mgr->ConnectOutput(task,2,coutput2);
         mgr->ConnectOutput(task,3,coutput3);
        mgr->ConnectOutput(task,4,coutput4);
+       mgr->ConnectOutput(task,5,coutput5);
        return task;
        
 }
-
-