]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Several updates (F. Colamaria)
authorarossi <arossi@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 18 Apr 2013 16:06:49 +0000 (16:06 +0000)
committerarossi <arossi@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 18 Apr 2013 16:06:49 +0000 (16:06 +0000)
PWGHF/correlationHF/AliAnalysisTaskSED0Correlations.cxx
PWGHF/correlationHF/AliAnalysisTaskSED0Correlations.h

index 972909843f67f401d0b3eb45b4c5579ba5748abb..0e89c9562d7e6c10593ba8a346a11f056f238d62 100644 (file)
@@ -78,6 +78,9 @@ AliAnalysisTaskSE(),
   fCorrelatorKc(0),
   fCorrelatorK0(0),
   fReadMC(0),
+  fRecoTr(kTRUE),
+  fRecoD0(kTRUE),
+  fSelEvType(kFALSE),
   fMixing(kFALSE),
   fCounter(0),
   fNPtBins(1),
@@ -111,6 +114,9 @@ AliAnalysisTaskSED0Correlations::AliAnalysisTaskSED0Correlations(const char *nam
   fCorrelatorKc(0),
   fCorrelatorK0(0),
   fReadMC(0),
+  fRecoTr(kTRUE),
+  fRecoD0(kTRUE),
+  fSelEvType(kFALSE),
   fMixing(kFALSE),
   fCounter(0),
   fNPtBins(1),
@@ -162,6 +168,9 @@ AliAnalysisTaskSED0Correlations::AliAnalysisTaskSED0Correlations(const AliAnalys
   fCorrelatorKc(source.fCorrelatorKc),
   fCorrelatorK0(source.fCorrelatorK0),
   fReadMC(source.fReadMC),
+  fRecoTr(source.fRecoTr),
+  fRecoD0(source.fRecoD0),
+  fSelEvType(source.fSelEvType),
   fMixing(source.fMixing),
   fCounter(source.fCounter),
   fNPtBins(source.fNPtBins),
@@ -239,6 +248,9 @@ AliAnalysisTaskSED0Correlations& AliAnalysisTaskSED0Correlations::operator=(cons
   fCorrelatorKc = orig.fCorrelatorKc;
   fCorrelatorK0 = orig.fCorrelatorK0;
   fReadMC = orig.fReadMC;
+  fRecoTr = orig.fRecoTr;
+  fRecoD0 = orig.fRecoD0;
+  fSelEvType = orig.fSelEvType;
   fMixing = orig.fMixing;
   fCounter = orig.fCounter;
   fNPtBins = orig.fNPtBins;
@@ -284,9 +296,9 @@ void AliAnalysisTaskSED0Correlations::UserCreateOutputObjects()
   fCorrelatorTr = new AliHFCorrelator("CorrelatorTr",fCutsTracks,fSys);
   fCorrelatorKc = new AliHFCorrelator("CorrelatorKc",fCutsTracks,fSys);
   fCorrelatorK0 = new AliHFCorrelator("CorrelatorK0",fCutsTracks,fSys);
-  fCorrelatorTr->SetDeltaPhiInterval(-1.57,4.71);// set the Delta Phi Interval you want (in this case -0.5Pi to 1.5 Pi)
-  fCorrelatorKc->SetDeltaPhiInterval(-1.57,4.71);
-  fCorrelatorK0->SetDeltaPhiInterval(-1.57,4.71);
+  fCorrelatorTr->SetDeltaPhiInterval(-TMath::Pi()/2,3*TMath::Pi()/2);// set the Delta Phi Interval you want (in this case -0.5Pi to 1.5 Pi)
+  fCorrelatorKc->SetDeltaPhiInterval(-TMath::Pi()/2,3*TMath::Pi()/2);
+  fCorrelatorK0->SetDeltaPhiInterval(-TMath::Pi()/2,3*TMath::Pi()/2);
   fCorrelatorTr->SetEventMixing(fMixing);// sets the analysis on a single event (kFALSE) or mixed events (kTRUE)
   fCorrelatorKc->SetEventMixing(fMixing);
   fCorrelatorK0->SetEventMixing(fMixing);
@@ -299,6 +311,9 @@ void AliAnalysisTaskSED0Correlations::UserCreateOutputObjects()
   fCorrelatorTr->SetUseMC(fReadMC);// sets Montecarlo flag
   fCorrelatorKc->SetUseMC(fReadMC);
   fCorrelatorK0->SetUseMC(fReadMC);
+  fCorrelatorTr->SetUseReco(fRecoTr);// sets (if MC analysis) wheter to analyze Reco or Kinem tracks
+  fCorrelatorKc->SetUseReco(fRecoTr);
+  fCorrelatorK0->SetUseReco(fRecoTr);
   fCorrelatorKc->SetPIDmode(2); //switch for K+/- PID option
   Bool_t pooldefTr = fCorrelatorTr->DefineEventPool();// method that defines the properties ot the event mixing (zVtx and Multipl. bins)
   Bool_t pooldefKc = fCorrelatorKc->DefineEventPool();// method that defines the properties ot the event mixing (zVtx and Multipl. bins)
@@ -358,7 +373,7 @@ void AliAnalysisTaskSED0Correlations::UserCreateOutputObjects()
 
   const char* nameoutput=GetOutputSlot(2)->GetContainer()->GetName();
 
-  fNentries=new TH1F(nameoutput, "Integral(1,2) = number of AODs *** Integral(2,3) = number of candidates selected with cuts *** Integral(3,4) = number of D0 selected with cuts *** Integral(4,5) = events with good vertex ***  Integral(5,6) = pt out of bounds", 18,-0.5,17.5);
+  fNentries=new TH1F(nameoutput, "Integral(1,2) = number of AODs *** Integral(2,3) = number of candidates selected with cuts *** Integral(3,4) = number of D0 selected with cuts *** Integral(4,5) = events with good vertex ***  Integral(5,6) = pt out of bounds", 20,-0.5,19.5);
 
   fNentries->GetXaxis()->SetBinLabel(1,"nEventsAnal");
   fNentries->GetXaxis()->SetBinLabel(2,"nCandSel(Cuts)");
@@ -376,6 +391,8 @@ void AliAnalysisTaskSED0Correlations::UserCreateOutputObjects()
   if(fSys==1) fNentries->GetXaxis()->SetBinLabel(16,"Nev in centr");
   if(fIsRejectSDDClusters) fNentries->GetXaxis()->SetBinLabel(17,"SDD-Cls Rej");
   fNentries->GetXaxis()->SetBinLabel(18,"Phys.Sel.Rej");
+  fNentries->GetXaxis()->SetBinLabel(19,"nEventsSelected");
+  if(fReadMC) fNentries->GetXaxis()->SetBinLabel(20,"nEvsWithProdMech");
   fNentries->GetXaxis()->SetNdivisions(1,kFALSE);
 
   fCounter = new AliNormalizationCounter(Form("%s",GetOutputSlot(4)->GetContainer()->GetName()));
@@ -412,7 +429,6 @@ void AliAnalysisTaskSED0Correlations::UserExec(Option_t */*option*/)
   //     printf("    d0d0  [cm^2] < %f\n",fD0toKpiCuts[7]);
   //     printf("    cosThetaPoint    > %f\n",fD0toKpiCuts[8]);
   
-
   AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
   fEvents++;
 
@@ -482,11 +498,37 @@ void AliAnalysisTaskSED0Correlations::UserExec(Option_t */*option*/)
     return;
   }
 
+  fNentries->Fill(18); //event selected after selection
+
   //Setting PIDResponse for associated tracks
   fCorrelatorTr->SetPidAssociated();
   fCorrelatorKc->SetPidAssociated();
   fCorrelatorK0->SetPidAssociated();
 
+  //Selection on production type (MC)
+  if(fReadMC && fSelEvType){ 
+
+    Bool_t isMCeventgood = kFALSE;
+            
+    Int_t eventType = mcHeader->GetEventType();
+    Int_t NMCevents = fCutsTracks->GetNofMCEventType();
+               
+    for(Int_t k=0; k<NMCevents; k++){
+      Int_t * MCEventType = fCutsTracks->GetMCEventType();
+          
+      if(eventType == MCEventType[k]) isMCeventgood= kTRUE;
+      ((TH1D*)fOutputStudy->FindObject("EventTypeMC"))->Fill(eventType);
+    }
+                
+    if(NMCevents && !isMCeventgood){
+      std::cout << "The MC event " << eventType << " not interesting for this analysis: skipping" << std::endl;
+      return; 
+    }
+    fNentries->Fill(19); //event with particular production type                
+  
+  } //end of selection
+
+
   // Check the Nb of SDD clusters
   if (fIsRejectSDDClusters) { 
     Bool_t skipEvent = kFALSE;
@@ -523,12 +565,10 @@ void AliAnalysisTaskSED0Correlations::UserExec(Option_t */*option*/)
 
   // AOD primary vertex
   AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
-  Bool_t isGoodVtx=kFALSE;
 
   //vtx1->Print();
   TString primTitle = vtx1->GetTitle();
   if(primTitle.Contains("VertexerTracks") && vtx1->GetNContributors()>0) {
-    isGoodVtx=kTRUE;
     fNentries->Fill(3);
   }
 
@@ -548,7 +588,7 @@ void AliAnalysisTaskSED0Correlations::UserExec(Option_t */*option*/)
       for(int j=0; j<2; j++) {idArrayV0[iV0][j]=-2;}
       AliAODv0 *v0 = (AliAODv0*)v0array->UncheckedAt(iV0);
       if(SelectV0(v0,vtx1,2,idArrayV0)) { //option 2 = for mass inv plots only
-        if(fReadMC && (v0->MatchToMC(310,mcArray,2,pdgCodes)<0)) continue; //310 = K0s, 311 = K0 generico!!
+        if(fReadMC && fRecoTr && (v0->MatchToMC(310,mcArray,2,pdgCodes)<0)) continue; //310 = K0s, 311 = K0 generico!!
         ((TH2F*)fOutputStudy->FindObject("hK0MassInv"))->Fill(v0->MassK0Short(),v0->Pt()); //invariant mass plot
         ((TH1F*)fOutputStudy->FindObject("hist_Pt_K0_AllEv"))->Fill(v0->Pt()); //pT distribution (in all events), K0 case
       }
@@ -568,51 +608,107 @@ void AliAnalysisTaskSED0Correlations::UserExec(Option_t */*option*/)
   } //end of loops for global plot fill
 
   Int_t nSelectedloose=0,nSelectedtight=0;  
-  for (Int_t iD0toKpi = 0; iD0toKpi < nInD0toKpi; iD0toKpi++) {
-    AliAODRecoDecayHF2Prong *d = (AliAODRecoDecayHF2Prong*)inputArray->UncheckedAt(iD0toKpi);
+  
+  //RecoD0 case ************************************************
+  if(fRecoD0) {
+
+    for (Int_t iD0toKpi = 0; iD0toKpi < nInD0toKpi; iD0toKpi++) {
+      AliAODRecoDecayHF2Prong *d = (AliAODRecoDecayHF2Prong*)inputArray->UncheckedAt(iD0toKpi);
  
-    if(d->GetSelectionMap()) if(!d->HasSelectionBit(AliRDHFCuts::kD0toKpiCuts)){
-       fNentries->Fill(2);
-       continue; //skip the D0 from Dstar
+      if(d->GetSelectionMap()) if(!d->HasSelectionBit(AliRDHFCuts::kD0toKpiCuts)){
+       fNentries->Fill(2);
+       continue; //skip the D0 from Dstar  
       }
     
-    if (fCutsD0->IsInFiducialAcceptance(d->Pt(),d->Y(421)) ) {
-      nSelectedloose++;
-      nSelectedtight++;      
-      if(fSys==0){
-       if(fCutsD0->IsSelected(d,AliRDHFCuts::kTracks,aod))fNentries->Fill(6);       
+      if (fCutsD0->IsInFiducialAcceptance(d->Pt(),d->Y(421)) ) {
+        nSelectedloose++;
+        nSelectedtight++;      
+        if(fSys==0){
+         if(fCutsD0->IsSelected(d,AliRDHFCuts::kTracks,aod))fNentries->Fill(6);       
+        }  
+        Int_t ptbin=fCutsD0->PtBin(d->Pt());
+        if(ptbin==-1) {fNentries->Fill(4); continue;} //out of bounds
+
+        fIsSelectedCandidate=fCutsD0->IsSelected(d,AliRDHFCuts::kAll,aod); //D0 selected
+        if(!fIsSelectedCandidate) continue;
+
+        //D0 infos
+        Double_t phiD0 = fCorrelatorTr->SetCorrectPhiRange(d->Phi());
+                 phiD0 = fCorrelatorKc->SetCorrectPhiRange(d->Phi());  //bad usage, but returns a Double_t...
+                 phiD0 = fCorrelatorK0->SetCorrectPhiRange(d->Phi());
+        fCorrelatorTr->SetTriggerParticleProperties(d->Pt(),phiD0,d->Eta()); // sets the parameters of the trigger particles that are needed
+        fCorrelatorKc->SetTriggerParticleProperties(d->Pt(),phiD0,d->Eta());
+        fCorrelatorK0->SetTriggerParticleProperties(d->Pt(),phiD0,d->Eta());
+        fCorrelatorTr->SetD0Properties(d,fIsSelectedCandidate); //sets special properties for D0
+        fCorrelatorKc->SetD0Properties(d,fIsSelectedCandidate);
+        fCorrelatorK0->SetD0Properties(d,fIsSelectedCandidate);
+
+        if(!fReadMC) {
+          if (TMath::Abs(d->Eta())<fEtaForCorrel) CalculateCorrelations(d); //correlations on real data
+        } else { //correlations on MC -> association of selected D0 to MCinfo with MCtruth
+          if (TMath::Abs(d->Eta())<fEtaForCorrel) {
+            Int_t pdgDgD0toKpi[2]={321,211};
+           Int_t labD0 = d->MatchToMC(421,mcArray,2,pdgDgD0toKpi); //return MC particle label if the array corresponds to a D0, -1 if not
+            if (labD0>-1) CalculateCorrelations(d,labD0,mcArray);
+          }
+        }
+
+        FillMassHists(d,mcArray,fCutsD0,fOutputMass);
       }
-      Int_t ptbin=fCutsD0->PtBin(d->Pt());
-      if(ptbin==-1) {fNentries->Fill(4); continue;} //out of bounds
-
-      fIsSelectedCandidate=fCutsD0->IsSelected(d,AliRDHFCuts::kAll,aod); //D0 selected
-      if(!fIsSelectedCandidate) continue;
-
-      //D0 infos
-      Double_t phiD0 = fCorrelatorTr->SetCorrectPhiRange(d->Phi());
-               phiD0 = fCorrelatorKc->SetCorrectPhiRange(d->Phi());  //bad usage, but returns a Double_t...
-               phiD0 = fCorrelatorK0->SetCorrectPhiRange(d->Phi());
-      fCorrelatorTr->SetTriggerParticleProperties(d->Pt(),phiD0,d->Eta()); // sets the parameters of the trigger particles that are needed
-      fCorrelatorKc->SetTriggerParticleProperties(d->Pt(),phiD0,d->Eta());
-      fCorrelatorK0->SetTriggerParticleProperties(d->Pt(),phiD0,d->Eta());
-      fCorrelatorTr->SetD0Properties(d,fIsSelectedCandidate); //sets special properties for D0
-      fCorrelatorKc->SetD0Properties(d,fIsSelectedCandidate);
-      fCorrelatorK0->SetD0Properties(d,fIsSelectedCandidate);
-
-      if(!fReadMC) {
-        if (TMath::Abs(d->Eta())<fEtaForCorrel) CalculateCorrelations(d); //correlations on real data
-      } else { //correlations on MC -> association of selected D0 to MCinfo with MCtruth
-        if (TMath::Abs(d->Eta())<fEtaForCorrel) {
-          Int_t pdgDgD0toKpi[2]={321,211};
-         Int_t labD0 = d->MatchToMC(421,mcArray,2,pdgDgD0toKpi); //return MC particle label if the array corresponds to a D0, -1 if not
-          if (labD0>-1) CalculateCorrelations(d,labD0,mcArray);
+    }
+  }
+  //End RecoD0 case ************************************************
+  
+  //MCKineD0 case ************************************************
+  if(fReadMC && !fRecoD0) {
+
+    for (Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) { //Loop over all the tracks of MCArray
+      AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(mcArray->At(iPart));
+      if (!mcPart) {
+        AliWarning("Particle not found in tree, skipping"); 
+        continue;
+      } 
+  
+      if(TMath::Abs(mcPart->GetPdgCode()) == 421){  // THIS IS A D0
+        if (fCutsD0->IsInFiducialAcceptance(mcPart->Pt(),mcPart->Y()) ) {
+          nSelectedloose++;
+          nSelectedtight++;      
+          if(fSys==0) fNentries->Fill(6);
+          Int_t ptbin=fCutsD0->PtBin(mcPart->Pt());
+          if(ptbin==-1) {fNentries->Fill(4); continue;} //out of bounds  
+  
+          //D0 infos
+          Double_t phiD0 = fCorrelatorTr->SetCorrectPhiRange(mcPart->Phi());
+                   phiD0 = fCorrelatorKc->SetCorrectPhiRange(mcPart->Phi());  //bad usage, but returns a Double_t...
+                   phiD0 = fCorrelatorK0->SetCorrectPhiRange(mcPart->Phi());
+          fCorrelatorTr->SetTriggerParticleProperties(mcPart->Pt(),phiD0,mcPart->Eta()); // sets the parameters of the trigger particles that are needed
+          fCorrelatorKc->SetTriggerParticleProperties(mcPart->Pt(),phiD0,mcPart->Eta());
+          fCorrelatorK0->SetTriggerParticleProperties(mcPart->Pt(),phiD0,mcPart->Eta());
+          //fCorrelatorTr->SetD0Properties(mcPart,fIsSelectedCandidate); //needed for D* soft pions rejection, useless in MCKine
+          //fCorrelatorKc->SetD0Properties(mcPart,fIsSelectedCandidate);
+          //fCorrelatorK0->SetD0Properties(mcPart,fIsSelectedCandidate);
+  
+          if (TMath::Abs(mcPart->Eta())<fEtaForCorrel) {
+  
+            //Removal of D0 from D* feeddown! This solves also the problem of soft pions, now excluded
+         /*   Int_t mother = mcPart->GetMother();
+           AliAODMCParticle* mcMoth = dynamic_cast<AliAODMCParticle*>(mcArray->At(mother));
+            if(!mcMoth) continue;
+           if(TMath::Abs(mcMoth->GetPdgCode())==413) continue;
+       */
+            if (mcPart->GetPdgCode()==421) fIsSelectedCandidate = 1;
+           else fIsSelectedCandidate = 2;
+
+           TString fillthis="histSgn_"; fillthis+=ptbin;
+           ((TH1F*)(fOutputMass->FindObject(fillthis)))->Fill(1.864);
+         
+            CalculateCorrelationsMCKine(mcPart,mcArray);
+          }
         }
       }
-      
-      FillMassHists(d,mcArray,fCutsD0,fOutputMass);
     }
-
-  } //end for prongs
+  }
+  //End MCKineD0 case ************************************************
 
   if(fMixing /* && fAlreadyFilled*/) { // update the pool for Event Mixing, if: enabled,  event is ok, at least a SelD0 found! (fAlreadyFilled's role!)
     Bool_t updatedTr = fCorrelatorTr->PoolUpdate();
@@ -779,15 +875,15 @@ Int_t AliAnalysisTaskSED0Correlations::CheckD0Origin(TClonesArray* arrayMC, AliA
   Bool_t isQuarkFound=kFALSE;
 
   while (mother > 0){
-    AliAODMCParticle* mcGranma = dynamic_cast<AliAODMCParticle*>(arrayMC->At(mother));
-    if (mcGranma){
-      pdgGranma = mcGranma->GetPdgCode();
+    AliAODMCParticle* mcMoth = dynamic_cast<AliAODMCParticle*>(arrayMC->At(mother));
+    if (mcMoth){
+      pdgGranma = mcMoth->GetPdgCode();
       abspdgGranma = TMath::Abs(pdgGranma);
       if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)){
        isFromB=kTRUE;
       }
       if(abspdgGranma==4 || abspdgGranma==5) isQuarkFound=kTRUE;
-      mother = mcGranma->GetMother();
+      mother = mcMoth->GetMother();
     }else{
       AliError("Failed casting the mother particle!");
       break;
@@ -810,13 +906,13 @@ void AliAnalysisTaskSED0Correlations::CreateCorrelationsObjs() {
   //These for limits in THnSparse (one per bin, same limits). 
   //Vars: DeltaPhi, InvMass, PtTrack, Displacement, DeltaEta
   Int_t nBinsPhi[5] = {32,150,6,3,16};
-  Double_t binMinPhi[5] = {-1.6,1.6,0.,0.,-1.6};  //is the minimum for all the bins
-  Double_t binMaxPhi[5] = {4.8,2.2,3.0,3.,1.6};  //is the maximum for all the bins
+  Double_t binMinPhi[5] = {-TMath::Pi()/2,1.6,0.,0.,-1.6};  //is the minimum for all the bins
+  Double_t binMaxPhi[5] = {3*TMath::Pi()/2,2.2,3.0,3.,1.6};  //is the maximum for all the bins
 
   //Vars: DeltaPhi, InvMass, DeltaEta
   Int_t nBinsMix[3] = {32,150,16};
-  Double_t binMinMix[3] = {-1.6,1.6,-1.6};  //is the minimum for all the bins
-  Double_t binMaxMix[3] = {4.8,2.2,1.6};  //is the maximum for all the bins
+  Double_t binMinMix[3] = {-TMath::Pi()/2,1.6,-1.6};  //is the minimum for all the bins
+  Double_t binMaxMix[3] = {3*TMath::Pi()/2,2.2,1.6};  //is the maximum for all the bins
 
   for(Int_t i=0;i<fNPtBinsCorr;i++){
 
@@ -825,21 +921,21 @@ void AliAnalysisTaskSED0Correlations::CreateCorrelationsObjs() {
       namePlot="hPhi_K0_Bin";
       namePlot+=i;
 
-      THnSparseI *hPhiK = new THnSparseI(namePlot.Data(), "Azimuthal correlation; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+      THnSparseF *hPhiK = new THnSparseF(namePlot.Data(), "Azimuthal correlation; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
       hPhiK->Sumw2();
       fOutputCorr->Add(hPhiK);
 
       namePlot="hPhi_Kcharg_Bin";
       namePlot+=i;
 
-      THnSparseI *hPhiH = new THnSparseI(namePlot.Data(), "Azimuthal correlation; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+      THnSparseF *hPhiH = new THnSparseF(namePlot.Data(), "Azimuthal correlation; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
       hPhiH->Sumw2();
       fOutputCorr->Add(hPhiH);
 
       namePlot="hPhi_Charg_Bin";
       namePlot+=i;
 
-      THnSparseI *hPhiC = new THnSparseI(namePlot.Data(), "Azimuthal correlation; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+      THnSparseF *hPhiC = new THnSparseF(namePlot.Data(), "Azimuthal correlation; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
       hPhiC->Sumw2();
       fOutputCorr->Add(hPhiC);
   
@@ -850,42 +946,42 @@ void AliAnalysisTaskSED0Correlations::CreateCorrelationsObjs() {
         namePlot="hPhi_K0_From_c_Bin";
         namePlot+=i;
 
-        THnSparseI *hPhiK_c = new THnSparseI(namePlot.Data(), "Azimuthal correlation - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+        THnSparseF *hPhiK_c = new THnSparseF(namePlot.Data(), "Azimuthal correlation - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
         hPhiK_c->Sumw2();
         fOutputCorr->Add(hPhiK_c);
 
         namePlot="hPhi_Kcharg_From_c_Bin";
         namePlot+=i;
 
-        THnSparseI *hPhiH_c = new THnSparseI(namePlot.Data(), "Azimuthal correlation - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+        THnSparseF *hPhiH_c = new THnSparseF(namePlot.Data(), "Azimuthal correlation - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
         hPhiH_c->Sumw2();
         fOutputCorr->Add(hPhiH_c);
 
         namePlot="hPhi_Charg_From_c_Bin";
         namePlot+=i;
 
-        THnSparseI *hPhiC_c = new THnSparseI(namePlot.Data(), "Azimuthal correlation - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+        THnSparseF *hPhiC_c = new THnSparseF(namePlot.Data(), "Azimuthal correlation - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
         hPhiC_c->Sumw2();
         fOutputCorr->Add(hPhiC_c);
   
         namePlot="hPhi_K0_From_b_Bin";
         namePlot+=i;
 
-        THnSparseI *hPhiK_b = new THnSparseI(namePlot.Data(), "Azimuthal correlation - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+        THnSparseF *hPhiK_b = new THnSparseF(namePlot.Data(), "Azimuthal correlation - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
         hPhiK_b->Sumw2();
         fOutputCorr->Add(hPhiK_b);
 
         namePlot="hPhi_Kcharg_From_b_Bin";
         namePlot+=i;
 
-        THnSparseI *hPhiH_b = new THnSparseI(namePlot.Data(), "Azimuthal correlation - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+        THnSparseF *hPhiH_b = new THnSparseF(namePlot.Data(), "Azimuthal correlation - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
         hPhiH_b->Sumw2();
         fOutputCorr->Add(hPhiH_b);
 
         namePlot="hPhi_Charg_From_b_Bin";
         namePlot+=i;
 
-        THnSparseI *hPhiC_b = new THnSparseI(namePlot.Data(), "Azimuthal correlation - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+        THnSparseF *hPhiC_b = new THnSparseF(namePlot.Data(), "Azimuthal correlation - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
         hPhiC_b->Sumw2();
         fOutputCorr->Add(hPhiC_b);
 
@@ -893,51 +989,72 @@ void AliAnalysisTaskSED0Correlations::CreateCorrelationsObjs() {
         namePlot="hPhi_K0_HF_From_c_Bin";
         namePlot+=i;
 
-        THnSparseI *hPhiK_HF_c = new THnSparseI(namePlot.Data(), "Azimuthal correlation HF - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+        THnSparseF *hPhiK_HF_c = new THnSparseF(namePlot.Data(), "Azimuthal correlation HF - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
         hPhiK_HF_c->Sumw2();
         fOutputCorr->Add(hPhiK_HF_c);
 
         namePlot="hPhi_Kcharg_HF_From_c_Bin";
         namePlot+=i;
 
-        THnSparseI *hPhiH_HF_c = new THnSparseI(namePlot.Data(), "Azimuthal correlation HF - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+        THnSparseF *hPhiH_HF_c = new THnSparseF(namePlot.Data(), "Azimuthal correlation HF - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
         hPhiH_HF_c->Sumw2();
         fOutputCorr->Add(hPhiH_HF_c);
 
         namePlot="hPhi_Charg_HF_From_c_Bin";
         namePlot+=i;
 
-        THnSparseI *hPhiC_HF_c = new THnSparseI(namePlot.Data(), "Azimuthal correlation HF - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+        THnSparseF *hPhiC_HF_c = new THnSparseF(namePlot.Data(), "Azimuthal correlation HF - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
         hPhiC_HF_c->Sumw2();
         fOutputCorr->Add(hPhiC_HF_c);
 
         namePlot="hPhi_K0_HF_From_b_Bin";
         namePlot+=i;
 
-        THnSparseI *hPhiK_HF_b = new THnSparseI(namePlot.Data(), "Azimuthal correlation HF - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+        THnSparseF *hPhiK_HF_b = new THnSparseF(namePlot.Data(), "Azimuthal correlation HF - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
         hPhiK_HF_b->Sumw2();
         fOutputCorr->Add(hPhiK_HF_b);
 
         namePlot="hPhi_Kcharg_HF_From_b_Bin";
         namePlot+=i;
 
-        THnSparseI *hPhiH_HF_b = new THnSparseI(namePlot.Data(), "Azimuthal correlation HF - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+        THnSparseF *hPhiH_HF_b = new THnSparseF(namePlot.Data(), "Azimuthal correlation HF - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
         hPhiH_HF_b->Sumw2();
         fOutputCorr->Add(hPhiH_HF_b);
 
         namePlot="hPhi_Charg_HF_From_b_Bin";
         namePlot+=i;
 
-        THnSparseI *hPhiC_HF_b = new THnSparseI(namePlot.Data(), "Azimuthal correlation HF - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+        THnSparseF *hPhiC_HF_b = new THnSparseF(namePlot.Data(), "Azimuthal correlation HF - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
         hPhiC_HF_b->Sumw2();
         fOutputCorr->Add(hPhiC_HF_b);
+
+        namePlot="hPhi_K0_NonHF_Bin";
+        namePlot+=i;
+
+        THnSparseF *hPhiK_Non = new THnSparseF(namePlot.Data(), "Azimuthal correlation - Non HF; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+        hPhiK_Non->Sumw2();
+        fOutputCorr->Add(hPhiK_Non);
+
+        namePlot="hPhi_Kcharg_NonHF_Bin";
+        namePlot+=i;
+
+        THnSparseF *hPhiH_Non = new THnSparseF(namePlot.Data(), "Azimuthal correlation - Non HF; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+        hPhiH_Non->Sumw2();
+        fOutputCorr->Add(hPhiH_Non);
+
+        namePlot="hPhi_Charg_NonHF_Bin";
+        namePlot+=i;
+
+        THnSparseF *hPhiC_Non = new THnSparseF(namePlot.Data(), "Azimuthal correlation - Non HF; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
+        hPhiC_Non->Sumw2();
+        fOutputCorr->Add(hPhiC_Non);
       }
 
       //leading hadron correlations
       namePlot="hPhi_Lead_Bin";
       namePlot+=i;
 
-      TH2F *hCorrLead = new TH2F(namePlot.Data(), "Leading particle correlation; #Delta#phi",32,-1.6,4.8,300,1.6,2.2);
+      THnSparseF *hCorrLead = new THnSparseF(namePlot.Data(), "Leading particle correlations; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
       hCorrLead->Sumw2();
       fOutputCorr->Add(hCorrLead);
 
@@ -945,63 +1062,76 @@ void AliAnalysisTaskSED0Correlations::CreateCorrelationsObjs() {
         namePlot="hPhi_Lead_From_c_Bin";
         namePlot+=i;
 
-        TH2F *hCorrLead_c = new TH2F(namePlot.Data(), "Leading particle correlation - c origin; #Delta#phi",32,-1.6,4.8,300,1.6,2.2);
+        THnSparseF *hCorrLead_c = new THnSparseF(namePlot.Data(), "Leading particle correlations - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
         hCorrLead_c->Sumw2();
         fOutputCorr->Add(hCorrLead_c);
   
         namePlot="hPhi_Lead_From_b_Bin";
         namePlot+=i;
   
-        TH2F *hCorrLead_b = new TH2F(namePlot.Data(), "Leading particle correlation - b origin; #Delta#phi",32,-1.6,4.8,300,1.6,2.2);
+        THnSparseF *hCorrLead_b = new THnSparseF(namePlot.Data(), "Leading particle correlations - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
         hCorrLead_b->Sumw2();
         fOutputCorr->Add(hCorrLead_b);
   
         namePlot="hPhi_Lead_HF_From_c_Bin";
         namePlot+=i;
   
-        TH2F *hCorrLead_HF_c = new TH2F(namePlot.Data(), "Leading particle correlation HF - c origin; #Delta#phi",32,-1.6,4.8,300,1.6,2.2);
+        THnSparseF *hCorrLead_HF_c = new THnSparseF(namePlot.Data(), "Leading particle correlations HF - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
         hCorrLead_HF_c->Sumw2();
         fOutputCorr->Add(hCorrLead_HF_c);
   
         namePlot="hPhi_Lead_HF_From_b_Bin";
         namePlot+=i;
   
-        TH2F *hCorrLead_HF_b = new TH2F(namePlot.Data(), "Leading particle correlation HF - b origin; #Delta#phi",32,-1.6,4.8,300,1.6,2.2);
+        THnSparseF *hCorrLead_HF_b = new THnSparseF(namePlot.Data(), "Leading particle correlations HF - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
         hCorrLead_HF_b->Sumw2();
         fOutputCorr->Add(hCorrLead_HF_b);
+
+        namePlot="hPhi_Lead_NonHF_Bin";
+        namePlot+=i;
+  
+        THnSparseF *hCorrLead_Non = new THnSparseF(namePlot.Data(), "Leading particle correlations - Non HF; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
+        hCorrLead_Non->Sumw2();
+        fOutputCorr->Add(hCorrLead_Non);
       }
       
       //pT weighted correlations
       namePlot="hPhi_Weig_Bin";
       namePlot+=i;
   
-      TH2F *hCorrWeig = new TH2F(namePlot.Data(), "Charged particle correlation (pT weighted); #Delta#phi",32,-1.6,4.8,300,1.6,2.2);
+      THnSparseF *hCorrWeig = new THnSparseF(namePlot.Data(), "Charged particle correlations (pT weighted); #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
       fOutputCorr->Add(hCorrWeig);
   
       if (fReadMC) {
         namePlot="hPhi_Weig_From_c_Bin";
         namePlot+=i;
   
-        TH2F *hCorrWeig_c = new TH2F(namePlot.Data(), "Charged particle correlation (pT weighted) - c origin; #Delta#phi",32,-1.6,4.8,300,1.6,2.2);
+        THnSparseF *hCorrWeig_c = new THnSparseF(namePlot.Data(), "Charged particle correlations (pT weighted) - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
         fOutputCorr->Add(hCorrWeig_c);
   
         namePlot="hPhi_Weig_From_b_Bin";
         namePlot+=i;
   
-        TH2F *hCorrWeig_b = new TH2F(namePlot.Data(), "Charged particle correlation (pT weighted) - b origin; #Delta#phi",32,-1.6,4.8,300,1.6,2.2);
+        THnSparseF *hCorrWeig_b = new THnSparseF(namePlot.Data(), "Charged particle correlations (pT weighted) - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
         fOutputCorr->Add(hCorrWeig_b);
   
         namePlot="hPhi_Weig_HF_From_c_Bin";
         namePlot+=i;
   
-        TH2F *hCorrWeig_HF_c = new TH2F(namePlot.Data(), "Charged particle correlation (pT weighted) HF - c origin; #Delta#phi",32,-1.6,4.8,300,1.6,2.2);
+        THnSparseF *hCorrWeig_HF_c = new THnSparseF(namePlot.Data(), "Charged particle correlations (pT weighted) HF - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
         fOutputCorr->Add(hCorrWeig_HF_c);
   
         namePlot="hPhi_Weig_HF_From_b_Bin";
         namePlot+=i;
   
-        TH2F *hCorrWeig_HF_b = new TH2F(namePlot.Data(), "Charged particle correlation (pT weighted) HF - b origin; #Delta#phi",32,-1.6,4.8,300,1.6,2.2);
+        THnSparseF *hCorrWeig_HF_b = new THnSparseF(namePlot.Data(), "Charged particle correlations (pT weighted) HF - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
         fOutputCorr->Add(hCorrWeig_HF_b);
+
+        namePlot="hPhi_Weig_NonHF_Bin";
+        namePlot+=i;
+  
+        THnSparseF *hCorrWeig_Non = new THnSparseF(namePlot.Data(), "Charged particle correlations (pT weighted) - Non HF; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
+        fOutputCorr->Add(hCorrWeig_Non);
       }
 
     //pT distribution histos
@@ -1022,7 +1152,7 @@ void AliAnalysisTaskSED0Correlations::CreateCorrelationsObjs() {
 
     //D* feeddown pions rejection histos
     namePlot = "hDstarPions_Bin"; namePlot+=i;
-    TH2F *hDstarPions = new TH2F(namePlot.Data(), "Tracks rejected for D* inv.mass cut; # Tracks",2,0.,2.,300,1.6,2.2);
+    TH2F *hDstarPions = new TH2F(namePlot.Data(), "Tracks rejected for D* inv.mass cut; # Tracks",2,0.,2.,150,1.6,2.2);
     hDstarPions->GetXaxis()->SetBinLabel(1,"Not rejected");
     hDstarPions->GetXaxis()->SetBinLabel(2,"Rejected");
     hDstarPions->SetMinimum(0);
@@ -1035,21 +1165,21 @@ void AliAnalysisTaskSED0Correlations::CreateCorrelationsObjs() {
       namePlot="hPhi_K0_Bin";
       namePlot+=i;namePlot+="_EvMix";
 
-      THnSparseI *hPhiK_EvMix = new THnSparseI(namePlot.Data(), "Az. corr. EvMix; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
+      THnSparseF *hPhiK_EvMix = new THnSparseF(namePlot.Data(), "Az. corr. EvMix; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
       hPhiK_EvMix->Sumw2();
       fOutputCorr->Add(hPhiK_EvMix);
 
       namePlot="hPhi_Kcharg_Bin";
       namePlot+=i;namePlot+="_EvMix";
   
-      THnSparseI *hPhiH_EvMix = new THnSparseI(namePlot.Data(), "Az. corr. EvMix; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
+      THnSparseF *hPhiH_EvMix = new THnSparseF(namePlot.Data(), "Az. corr. EvMix; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
       hPhiH_EvMix->Sumw2();
       fOutputCorr->Add(hPhiH_EvMix);
 
       namePlot="hPhi_Charg_Bin";
       namePlot+=i;namePlot+="_EvMix";
 
-      THnSparseI *hPhiC_EvMix = new THnSparseI(namePlot.Data(), "Az. corr. EvMix; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
+      THnSparseF *hPhiC_EvMix = new THnSparseF(namePlot.Data(), "Az. corr. EvMix; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",3,nBinsMix,binMinMix,binMaxMix);
       hPhiC_EvMix->Sumw2();
       fOutputCorr->Add(hPhiC_EvMix);
     }
@@ -1070,6 +1200,11 @@ void AliAnalysisTaskSED0Correlations::CreateCorrelationsObjs() {
     fOutputStudy->Add(hCountK);
   }
 
+  if (fReadMC) {
+    TH1D *hEventTypeMC = new TH1D("EventTypeMC","EventTypeMC",100,-0.5,99.5);
+    fOutputStudy->Add(hEventTypeMC); 
+  }
+
   if (fFillGlobal) { //all-events plots
     //pt distributions
     TH1F *hPtCAll = new TH1F("hist_Pt_Charg_AllEv", "Charged track pT (All); p_{T} (GeV/c)",240,0.,12.);
@@ -1213,11 +1348,11 @@ void AliAnalysisTaskSED0Correlations::CreateCorrelationsObjs() {
       hOrigin_Charm->GetXaxis()->SetBinLabel(1,"Not HF");
       hOrigin_Charm->GetXaxis()->SetBinLabel(2,"D->#");
       hOrigin_Charm->GetXaxis()->SetBinLabel(3,"D->X->#");
-      hOrigin_Charm->GetXaxis()->SetBinLabel(4,"B->#");
-      hOrigin_Charm->GetXaxis()->SetBinLabel(5,"B->X-># (X!=D)");
-      hOrigin_Charm->GetXaxis()->SetBinLabel(6,"B->D->#");
-      hOrigin_Charm->GetXaxis()->SetBinLabel(7,"B->D->X->#");
-      hOrigin_Charm->GetXaxis()->SetBinLabel(8,"c hadr.");
+      hOrigin_Charm->GetXaxis()->SetBinLabel(4,"c hadr.");
+      hOrigin_Charm->GetXaxis()->SetBinLabel(5,"B->#");
+      hOrigin_Charm->GetXaxis()->SetBinLabel(6,"B->X-># (X!=D)");
+      hOrigin_Charm->GetXaxis()->SetBinLabel(7,"B->D->#");
+      hOrigin_Charm->GetXaxis()->SetBinLabel(8,"B->D->X->#");
       hOrigin_Charm->GetXaxis()->SetBinLabel(9,"b hadr.");
       fOutputStudy->Add(hOrigin_Charm);
 
@@ -1227,11 +1362,11 @@ void AliAnalysisTaskSED0Correlations::CreateCorrelationsObjs() {
       hOrigin_Kcharg->GetXaxis()->SetBinLabel(1,"Not HF");
       hOrigin_Kcharg->GetXaxis()->SetBinLabel(2,"D->#");
       hOrigin_Kcharg->GetXaxis()->SetBinLabel(3,"D->X->#");
-      hOrigin_Kcharg->GetXaxis()->SetBinLabel(4,"B->#");
-      hOrigin_Kcharg->GetXaxis()->SetBinLabel(5,"B->X-># (X!=D)");
-      hOrigin_Kcharg->GetXaxis()->SetBinLabel(6,"B->D->#");
-      hOrigin_Kcharg->GetXaxis()->SetBinLabel(7,"B->D->X->#");
-      hOrigin_Kcharg->GetXaxis()->SetBinLabel(8,"c hadr.");
+      hOrigin_Kcharg->GetXaxis()->SetBinLabel(4,"c hadr.");
+      hOrigin_Kcharg->GetXaxis()->SetBinLabel(5,"B->#");
+      hOrigin_Kcharg->GetXaxis()->SetBinLabel(6,"B->X-># (X!=D)");
+      hOrigin_Kcharg->GetXaxis()->SetBinLabel(7,"B->D->#");
+      hOrigin_Kcharg->GetXaxis()->SetBinLabel(8,"B->D->X->#");
       hOrigin_Kcharg->GetXaxis()->SetBinLabel(9,"b hadr.");
       fOutputStudy->Add(hOrigin_Kcharg);
 
@@ -1241,11 +1376,11 @@ void AliAnalysisTaskSED0Correlations::CreateCorrelationsObjs() {
       hOrigin_K->GetXaxis()->SetBinLabel(1,"Not HF");
       hOrigin_K->GetXaxis()->SetBinLabel(2,"D->#");
       hOrigin_K->GetXaxis()->SetBinLabel(3,"D->X->#");
-      hOrigin_K->GetXaxis()->SetBinLabel(4,"B->#");
-      hOrigin_K->GetXaxis()->SetBinLabel(5,"B->X-># (X!=D)");
-      hOrigin_K->GetXaxis()->SetBinLabel(6,"B->D->#");
-      hOrigin_K->GetXaxis()->SetBinLabel(7,"B->D->X->#");
-      hOrigin_K->GetXaxis()->SetBinLabel(8,"c hadr.");
+      hOrigin_K->GetXaxis()->SetBinLabel(4,"c hadr.");
+      hOrigin_K->GetXaxis()->SetBinLabel(5,"B->#");
+      hOrigin_K->GetXaxis()->SetBinLabel(6,"B->X-># (X!=D)");
+      hOrigin_K->GetXaxis()->SetBinLabel(7,"B->D->#");
+      hOrigin_K->GetXaxis()->SetBinLabel(8,"B->D->X->#");
       hOrigin_K->GetXaxis()->SetBinLabel(9,"b hadr.");
       fOutputStudy->Add(hOrigin_K);
     }
@@ -1269,13 +1404,15 @@ void AliAnalysisTaskSED0Correlations::CalculateCorrelations(AliAODRecoDecayHF2Pr
 //
   Int_t N_Charg = 0, N_KCharg = 0, N_Kaons = 0;
   Double_t mD0, mD0bar;
-  Int_t origD0 = 0, PDGD0 = 0;
+  Int_t origD0 = 0, PDGD0 = 0, ptbin = 0;
   d->InvMassD0(mD0,mD0bar);
-  Int_t ptbin = PtBinCorr(d->Pt());
+  Double_t mInv[2] = {mD0, mD0bar};
+  ptbin = PtBinCorr(d->Pt());
+
   if(ptbin < 0) return;
 
   //Fill of D0 phi distribution
-  if (!fMixing) ((TH1F*)fOutputStudy->FindObject("hist_PhiDistr_D0"))->Fill(d->Phi());
+  if (!fMixing) ((TH1F*)fOutputStudy->FindObject("hist_PhiDistr_D0"))->Fill(d->Phi());  
 
   //Origin of D0
   TString orig="";
@@ -1296,7 +1433,7 @@ void AliAnalysisTaskSED0Correlations::CalculateCorrelations(AliAODRecoDecayHF2Pr
     }
   }
 
-  Double_t highPt = 0; Double_t lead[3] = {0,0,0};  //infos for leading particle (pt,deltaphi)
+  Double_t highPt = 0; Double_t lead[4] = {0,0,0,1};  //infos for leading particle (pt,deltaphi)
 
   //loop over the tracks in the pool 
   Bool_t execPoolTr = fCorrelatorTr->ProcessEventPool(); //pool is ready? (only in ME, in SE returns kFALSE)
@@ -1328,20 +1465,22 @@ void AliAnalysisTaskSED0Correlations::CalculateCorrelations(AliAODRecoDecayHF2Pr
       AliReducedParticle* track = fCorrelatorTr->GetAssociatedParticle();
 
       if(!fMixing) {      
-       if(!track->CheckSoftPi()) { //removal of soft pions
+       /*if(!track->CheckSoftPi()) { //removal of soft pions
           if (fIsSelectedCandidate == 1 || fIsSelectedCandidate == 3) ((TH2F*)fOutputStudy->FindObject(Form("hDstarPions_Bin%d",ptbin)))->Fill(1.,mD0);
           if (fIsSelectedCandidate >= 2) ((TH2F*)fOutputStudy->FindObject(Form("hDstarPions_Bin%d",ptbin)))->Fill(1.,mD0bar);
           continue;
         } else { //not a soft pion
           if (fIsSelectedCandidate == 1 || fIsSelectedCandidate == 3) ((TH2F*)fOutputStudy->FindObject(Form("hDstarPions_Bin%d",ptbin)))->Fill(0.,mD0);
           if (fIsSelectedCandidate >= 2) ((TH2F*)fOutputStudy->FindObject(Form("hDstarPions_Bin%d",ptbin)))->Fill(0.,mD0bar);
-        }
-      Int_t idDaughs[2] = {((AliVTrack*)d->GetDaughter(0))->GetID(),((AliVTrack*)d->GetDaughter(1))->GetID()}; //IDs of daughters to be skipped
-      if(track->GetID() == idDaughs[0] || track->GetID() == idDaughs[1]) continue; //discards daughters of candidate
+        }*/
+        Int_t idDaughs[2] = {((AliVTrack*)d->GetDaughter(0))->GetID(),((AliVTrack*)d->GetDaughter(1))->GetID()}; //IDs of daughters to be skipped
+        if(track->GetID() == idDaughs[0] || track->GetID() == idDaughs[1]) continue; //discards daughters of candidate
       }
       if(track->Pt() < fPtThreshLow.at(ptbin) || track->Pt() > fPtThreshUp.at(ptbin)) continue; //discard tracks outside pt range for hadrons/K
-   
-      FillSparsePlots(mcArray,d,origD0,PDGD0,track,kTrack); //fills for charged tracks
+
+      Double_t eff = track->GetWeight(); //extract track efficiency
+
+      FillSparsePlots(mcArray,mInv,origD0,PDGD0,track,ptbin,kTrack,1./eff); //fills for charged tracks, weight = 1./eff
 
       if(!fMixing) N_Charg++;
 
@@ -1352,6 +1491,7 @@ void AliAnalysisTaskSED0Correlations::CalculateCorrelations(AliAODRecoDecayHF2Pr
         lead[0] = fCorrelatorTr->GetDeltaPhi();
         lead[1] = fCorrelatorTr->GetDeltaEta();
         lead[2] = fReadMC ? CheckTrackOrigin(mcArray,(AliAODMCParticle*)mcArray->At(track->GetLabel())) : 0;
+       lead[3] = 1./track->GetWeight(); //weight is 1./efficiency
         highPt = track->Pt();
       }
 
@@ -1367,7 +1507,7 @@ void AliAnalysisTaskSED0Correlations::CalculateCorrelations(AliAODRecoDecayHF2Pr
   }
 
   //Charged Kaons loop
-  for (Int_t jMix =0; jMix < NofEventsinPool; jMix++) {// loop on events in the pool; if it is SE analysis, stops at one (index not needed there)
+  for (Int_t jMix = 0; jMix < NofEventsinPool; jMix++) {// loop on events in the pool; if it is SE analysis, stops at one (index not needed there)
     Bool_t analyzetracksKc = fCorrelatorKc->ProcessAssociatedTracks(jMix);
     if(!analyzetracksKc) {
       AliInfo("AliHFCorrelator::Cannot process the K+/- array");
@@ -1390,12 +1530,12 @@ void AliAnalysisTaskSED0Correlations::CalculateCorrelations(AliAODRecoDecayHF2Pr
           if (fIsSelectedCandidate == 1 || fIsSelectedCandidate == 3) ((TH2F*)fOutputStudy->FindObject(Form("hDstarPions_Bin%d",ptbin)))->Fill(0.,mD0);
           if (fIsSelectedCandidate >= 2) ((TH2F*)fOutputStudy->FindObject(Form("hDstarPions_Bin%d",ptbin)))->Fill(0.,mD0bar);
         }
-      Int_t idDaughs[2] = {((AliVTrack*)d->GetDaughter(0))->GetID(),((AliVTrack*)d->GetDaughter(1))->GetID()}; //IDs of daughters to be skipped
-      if(kCharg->GetID() == idDaughs[0] || kCharg->GetID() == idDaughs[1]) continue; //discards daughters of candidate
+        Int_t idDaughs[2] = {((AliVTrack*)d->GetDaughter(0))->GetID(),((AliVTrack*)d->GetDaughter(1))->GetID()}; //IDs of daughters to be skipped
+        if(kCharg->GetID() == idDaughs[0] || kCharg->GetID() == idDaughs[1]) continue; //discards daughters of candidate
       }
       if(kCharg->Pt() < fPtThreshLow.at(ptbin) || kCharg->Pt() > fPtThreshUp.at(ptbin)) continue; //discard tracks outside pt range for hadrons/K
-      FillSparsePlots(mcArray,d,origD0,PDGD0,kCharg,kKCharg); //fills for charged tracks
+
+      FillSparsePlots(mcArray,mInv,origD0,PDGD0,kCharg,ptbin,kKCharg); //fills for charged tracks
 
       if(!fMixing) N_KCharg++;
 
@@ -1426,32 +1566,37 @@ void AliAnalysisTaskSED0Correlations::CalculateCorrelations(AliAODRecoDecayHF2Pr
       AliReducedParticle* k0 = fCorrelatorK0->GetAssociatedParticle();
 
       if(k0->Pt() < fPtThreshLow.at(ptbin) || k0->Pt() > fPtThreshUp.at(ptbin)) continue; //discard tracks outside pt range for hadrons/K
-   
-      FillSparsePlots(mcArray,d,origD0,PDGD0,k0,kK0); //fills for charged tracks
+  
+      FillSparsePlots(mcArray,mInv,origD0,PDGD0,k0,ptbin,kK0); //fills for charged tracks
 
       if(!fMixing) N_Kaons++;
 
     } // end of charged kaons loop
   } //end of event loop for fCorrelatorK0
 
+  Double_t fillSpLeadD0[3] = {lead[0],mD0,lead[1]};
+  Double_t fillSpLeadD0bar[3] = {lead[0],mD0bar,lead[1]};
+
   //leading track correlations fill
   if(!fMixing) {
     if(fReadMC) {
       if(((AliAODMCParticle*)mcArray->At(labD0))->GetPdgCode()==421) { //D0
-        ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Lead_Bin%d",ptbin)))->Fill(lead[1],mD0); //c and b D0
-        ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Lead%s_Bin%d",orig.Data(),ptbin)))->Fill(lead[0],mD0); //c or b D0
-        if(origD0==4&&(int)lead[2]>=1&&(int)lead[2]<=2) ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(lead[0],mD0);  
-        if(origD0==5&&(int)lead[2]>=3&&(int)lead[2]<=6) ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(lead[0],mD0);  
+        ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_Bin%d",ptbin)))->Fill(fillSpLeadD0,lead[3]); //c and b D0
+        ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadD0,lead[3]); //c or b D0
+        if(origD0==4&&(int)lead[2]>=1&&(int)lead[2]<=3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadD0,lead[3]);  
+        if(origD0==5&&(int)lead[2]>=4&&(int)lead[2]<=8) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadD0,lead[3]);  
+        if((int)lead[2]==0) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_NonHF_Bin%d",ptbin)))->Fill(fillSpLeadD0,lead[3]);  //non HF  
       }
       if(((AliAODMCParticle*)mcArray->At(labD0))->GetPdgCode()==-421) { //D0bar
-        ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Lead_Bin%d",ptbin)))->Fill(lead[1],mD0bar);
-        ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Lead%s_Bin%d",orig.Data(),ptbin)))->Fill(lead[0],mD0bar); //c or b D0
-        if(origD0==4&&(int)lead[2]>=1&&(int)lead[2]<=2) ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(lead[0],mD0bar);  
-        if(origD0==5&&(int)lead[2]>=3&&(int)lead[2]<=6) ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(lead[0],mD0bar); 
+        ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_Bin%d",ptbin)))->Fill(fillSpLeadD0bar,lead[3]);
+        ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadD0bar,lead[3]); //c or b D0
+        if(origD0==4&&(int)lead[2]>=1&&(int)lead[2]<=3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadD0bar,lead[3]);  
+        if(origD0==5&&(int)lead[2]>=4&&(int)lead[2]<=8) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadD0bar,lead[3]); 
+        if((int)lead[2]==0) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_NonHF_Bin%d",ptbin)))->Fill(fillSpLeadD0bar,lead[3]);  //non HF  
       }
     } else {
-        if(fIsSelectedCandidate == 1 || fIsSelectedCandidate == 3) ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Lead_Bin%d",ptbin)))->Fill(lead[0],mD0); //c and b D0
-        if(fIsSelectedCandidate == 2 || fIsSelectedCandidate == 3) ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Lead_Bin%d",ptbin)))->Fill(lead[0],mD0bar);
+        if(fIsSelectedCandidate == 1 || fIsSelectedCandidate == 3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_Bin%d",ptbin)))->Fill(fillSpLeadD0,lead[3]); 
+        if(fIsSelectedCandidate == 2 || fIsSelectedCandidate == 3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_Bin%d",ptbin)))->Fill(fillSpLeadD0bar,lead[3]);
     }
 
     //Fill of count histograms
@@ -1467,16 +1612,206 @@ void AliAnalysisTaskSED0Correlations::CalculateCorrelations(AliAODRecoDecayHF2Pr
 }
 
 //________________________________________________________________________
-void AliAnalysisTaskSED0Correlations::FillSparsePlots(TClonesArray* mcArray, AliAODRecoDecayHF2Prong *d, Int_t origD0, Int_t PdgD0, AliReducedParticle* track, Int_t type) {
+void AliAnalysisTaskSED0Correlations::CalculateCorrelationsMCKine(AliAODMCParticle* d, TClonesArray* mcArray) {
+//
+// Method for correlations D0-hadrons study
+//
+  Int_t N_Charg = 0, N_KCharg = 0, N_Kaons = 0;
+  Double_t mD0 = 1.864, mD0bar = 1.864;
+  Double_t mInv[2] = {mD0, mD0bar};
+  Int_t origD0 = 0, PDGD0 = 0;
+  Int_t ptbin = PtBinCorr(d->Pt());
+
+  if(ptbin < 0) return;
+
+  //Fill of D0 phi distribution
+  if (!fMixing) ((TH1F*)fOutputStudy->FindObject("hist_PhiDistr_D0"))->Fill(d->Phi()); 
+  
+  //Origin of D0
+  TString orig="";
+  origD0=CheckD0Origin(mcArray,d);
+  PDGD0 = d->GetPdgCode();
+  switch (CheckD0Origin(mcArray,d)) {
+    case 4:
+      orig = "_From_c";
+      ((TH1F*)fOutputStudy->FindObject(Form("histOrig_D0_Bin%d",ptbin)))->Fill(0.);
+      break;
+    case 5:
+      orig = "_From_b";
+      ((TH1F*)fOutputStudy->FindObject(Form("histOrig_D0_Bin%d",ptbin)))->Fill(1.);
+      break;
+    default:
+      return;
+  }
+
+  Double_t highPt = 0; Double_t lead[3] = {0,0,0};  //infos for leading particle (pt,deltaphi)
+
+  //loop over the tracks in the pool 
+  Bool_t execPoolTr = fCorrelatorTr->ProcessEventPool(); //pool is ready? (only in ME, in SE returns kFALSE)
+  Bool_t execPoolKc = fCorrelatorKc->ProcessEventPool(); //pool is ready? (only in ME, in SE returns kFALSE)
+  Bool_t execPoolK0 = fCorrelatorK0->ProcessEventPool(); //pool is ready? (only in ME, in SE returns kFALSE)
+               
+  Int_t NofEventsinPool = 1;
+  if(fMixing) {
+    NofEventsinPool = fCorrelatorTr->GetNofEventsInPool(); 
+    if(!execPoolTr) {
+      AliInfo("Mixed event analysis: track pool is not ready");
+      NofEventsinPool = 0;
+    }
+  }
+
+  //Charged tracks
+  for (Int_t jMix =0; jMix < NofEventsinPool; jMix++) {// loop on events in the pool; if it is SE analysis, stops at one (index not needed there)
+
+    Bool_t analyzetracksTr = fCorrelatorTr->ProcessAssociatedTracks(jMix);// process all the tracks in the aodEvent, by applying the selection cuts
+    if(!analyzetracksTr) {
+      AliInfo("AliHFCorrelator::Cannot process the track array");
+      continue;
+    }
+       
+    for(Int_t iTrack = 0; iTrack<fCorrelatorTr->GetNofTracks(); iTrack++){ // looping on track candidates
+
+      Bool_t runcorrelation = fCorrelatorTr->Correlate(iTrack);
+      if(!runcorrelation) continue;
+      
+      AliReducedParticle* track = fCorrelatorTr->GetAssociatedParticle();
+      if(track->GetLabel()<0) continue;
+      if(track->Pt() < fPtThreshLow.at(ptbin) || track->Pt() > fPtThreshUp.at(ptbin)) continue; //discard tracks outside pt range for hadrons/K
+      if(track->Pt() < 0.3 || TMath::Abs(track->Eta())>0.8) continue; //discard tracks outside barrel (since it's kinematic MC and produces tracks all over rapidity region
+      if(!fMixing) N_Charg++;
+
+      AliAODMCParticle *trkMC = (AliAODMCParticle*)mcArray->At(track->GetLabel());
+      if(!trkMC) continue;
+
+      if (!trkMC->IsPhysicalPrimary()) continue; //reject material budget, or other fake tracks
+      if (IsDDaughter(d,trkMC,mcArray)) continue;
+      FillSparsePlots(mcArray,mInv,origD0,PDGD0,track,ptbin,kTrack); //fills for charged tracks
+
+      //retrieving leading info...
+      if(track->Pt() > highPt) {
+        lead[0] = fCorrelatorTr->GetDeltaPhi();
+        lead[1] = fCorrelatorTr->GetDeltaEta();
+        lead[2] = fReadMC ? CheckTrackOrigin(mcArray,trkMC) : 0;
+        highPt = track->Pt();
+      }
+
+    } // end of tracks loop
+  } //end of event loop for fCorrelatorTr
+
+  if(fMixing) {
+    NofEventsinPool = fCorrelatorKc->GetNofEventsInPool(); 
+    if(!execPoolKc) {
+      AliInfo("Mixed event analysis: K+/- pool is not ready");
+      NofEventsinPool = 0;
+    }
+  }
+
+  //Charged Kaons loop
+  for (Int_t jMix =0; jMix < NofEventsinPool; jMix++) {// loop on events in the pool; if it is SE analysis, stops at one (index not needed there)
+    Bool_t analyzetracksKc = fCorrelatorKc->ProcessAssociatedTracks(jMix);
+    if(!analyzetracksKc) {
+      AliInfo("AliHFCorrelator::Cannot process the K+/- array");
+      continue;
+    }  
+
+    for(Int_t iTrack = 0; iTrack<fCorrelatorKc->GetNofTracks(); iTrack++){ // looping on charged kaons candidates
+
+      Bool_t runcorrelation = fCorrelatorKc->Correlate(iTrack);
+      if(!runcorrelation) continue;
+      
+      AliReducedParticle* kCharg = fCorrelatorKc->GetAssociatedParticle();
+      if(kCharg->GetLabel()<1) continue;
+      if(kCharg->Pt() < fPtThreshLow.at(ptbin) || kCharg->Pt() > fPtThreshUp.at(ptbin)) continue; //discard tracks outside pt range for hadrons/K
+      if(TMath::Abs(kCharg->Eta())>0.8) continue; //discard tracks outside barrel (since it's kinematic MC and produces tracks all over rapidity region
+      if(!fMixing) N_KCharg++;
+
+      AliAODMCParticle *kChargMC = (AliAODMCParticle*)mcArray->At(kCharg->GetLabel());
+      if(!kChargMC) continue;
+
+      if (IsDDaughter(d,kChargMC,mcArray)) continue;
+      FillSparsePlots(mcArray,mInv,origD0,PDGD0,kCharg,ptbin,kKCharg); //fills for charged tracks
+
+    } // end of charged kaons loop
+  } //end of event loop for fCorrelatorKc
+
+  if(fMixing) {
+    NofEventsinPool = fCorrelatorK0->GetNofEventsInPool(); 
+    if(!execPoolK0) {
+      AliInfo("Mixed event analysis: K0 pool is not ready");
+      NofEventsinPool = 0;
+    }
+  }
+
+  //K0 loop
+  for (Int_t jMix =0; jMix < NofEventsinPool; jMix++) {// loop on events in the pool; if it is SE analysis, stops at one (index not needed there)
+    Bool_t analyzetracksK0 = fCorrelatorK0->ProcessAssociatedTracks(jMix);
+    if(!analyzetracksK0) {
+      AliInfo("AliHFCorrelator::Cannot process the K0 array");
+      continue;
+    }  
+
+    for(Int_t iTrack = 0; iTrack<fCorrelatorK0->GetNofTracks(); iTrack++){ // looping on k0 candidates
+
+      Bool_t runcorrelation = fCorrelatorK0->Correlate(iTrack);
+      if(!runcorrelation) continue;
+      
+      AliReducedParticle* k0 = fCorrelatorK0->GetAssociatedParticle();
+      if(k0->GetLabel()<1) continue;
+      if(k0->Pt() < fPtThreshLow.at(ptbin) || k0->Pt() > fPtThreshUp.at(ptbin)) continue; //discard tracks outside pt range for hadrons/K
+      if(TMath::Abs(k0->Eta())>0.8) continue; //discard tracks outside barrel (since it's kinematic MC and produces tracks all over rapidity region
+  
+      AliAODMCParticle *k0MC = (AliAODMCParticle*)mcArray->At(k0->GetLabel());
+      if(!k0MC) continue;
+
+      if (IsDDaughter(d,k0MC,mcArray)) continue;
+      FillSparsePlots(mcArray,mInv,origD0,PDGD0,k0,ptbin,kK0); //fills for charged tracks
+
+      if(!fMixing) N_Kaons++;
+
+    } // end of charged kaons loop
+  } //end of event loop for fCorrelatorK0
+
+  Double_t fillSpLeadMC[3] = {lead[0],mD0,lead[1]}; //mD0 = mD0bar = 1.864
+
+  //leading track correlations fill
+  if(!fMixing) {
+    if(d->GetPdgCode()==421) { //D0
+      ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_Bin%d",ptbin)))->Fill(fillSpLeadMC); //c and b D0
+      ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadMC); //c or b D0
+      if(origD0==4&&(int)lead[2]>=1&&(int)lead[2]<=3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadMC);  
+      if(origD0==5&&(int)lead[2]>=4&&(int)lead[2]<=8) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadMC);  
+      if((int)lead[2]==0) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_NonHF_Bin%d",ptbin)))->Fill(fillSpLeadMC);  //non HF
+    }
+    if(d->GetPdgCode()==-421) { //D0bar
+      ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_Bin%d",ptbin)))->Fill(fillSpLeadMC);
+      ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadMC); //c or b D0
+      if(origD0==4&&(int)lead[2]>=1&&(int)lead[2]<=3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadMC);  
+      if(origD0==5&&(int)lead[2]>=4&&(int)lead[2]<=8) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadMC); 
+      if((int)lead[2]==0) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_NonHF_Bin%d",ptbin)))->Fill(fillSpLeadMC);  //non HF
+    }
+
+    //Fill of count histograms
+    if (!fAlreadyFilled) { 
+      ((TH1F*)fOutputStudy->FindObject("hist_Count_Charg"))->Fill(N_Charg);
+      ((TH1F*)fOutputStudy->FindObject("hist_Count_Kcharg"))->Fill(N_KCharg);
+      ((TH1F*)fOutputStudy->FindObject("hist_Count_K0"))->Fill(N_Kaons);
+    }
+
+    fAlreadyFilled=kTRUE; //at least a D0 analyzed in the event; distribution plots already filled
+  }
+
+}
+
+//________________________________________________________________________
+void AliAnalysisTaskSED0Correlations::FillSparsePlots(TClonesArray* mcArray, Double_t mInv[], Int_t origD0, Int_t PdgD0, AliReducedParticle* track, Int_t ptbin, Int_t type, Double_t wg) {
   //
   //fills the THnSparse for correlations, calculating the variables
   //
 
   //Initialization of variables
-  Int_t ptbin = PtBinCorr(d->Pt());
-  if(ptbin < 0) return;
   Double_t mD0, mD0bar, deltaphi = 0., deltaeta = 0.;
-  d->InvMassD0(mD0,mD0bar);
+  mD0 = mInv[0];
+  mD0bar = mInv[1];
 
   if (fReadMC && track->GetLabel()<1) return;
   if (fReadMC && !(AliAODMCParticle*)mcArray->At(track->GetLabel())) return;
@@ -1513,9 +1848,9 @@ void AliAnalysisTaskSED0Correlations::FillSparsePlots(TClonesArray* mcArray, Ali
     //Fixes limits; needed to include overflow into THnSparse projections!
     Double_t pTorig = track->Pt();
     Double_t d0orig = track->GetImpPar();
-    Double_t ptLim_Sparse = ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_Charg_Bin%d",ptbin)))->GetAxis(2)->GetXmax(); //all plots have same axes...
-    Double_t displLim_Sparse = ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_Charg_Bin%d",ptbin)))->GetAxis(3)->GetXmax();
-    Double_t EtaLim_Sparse = ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_Charg_Bin%d",ptbin)))->GetAxis(4)->GetXmax();
+    Double_t ptLim_Sparse = ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Charg_Bin%d",ptbin)))->GetAxis(2)->GetXmax(); //all plots have same axes...
+    Double_t displLim_Sparse = ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Charg_Bin%d",ptbin)))->GetAxis(3)->GetXmax();
+    Double_t EtaLim_Sparse = ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Charg_Bin%d",ptbin)))->GetAxis(4)->GetXmax();
     if(ptTrack > ptLim_Sparse) ptTrack = ptLim_Sparse-0.01;
     if(d0Track > displLim_Sparse) d0Track = (displLim_Sparse-0.001);
     if(deltaeta > EtaLim_Sparse) deltaeta = EtaLim_Sparse-0.01;
@@ -1524,16 +1859,18 @@ void AliAnalysisTaskSED0Correlations::FillSparsePlots(TClonesArray* mcArray, Ali
     //variables for filling histos
     Double_t fillSpPhiD0[5] = {deltaphi,mD0,ptTrack,d0Track,deltaeta};
     Double_t fillSpPhiD0bar[5] = {deltaphi,mD0bar,ptTrack,d0Track,deltaeta};
+    Double_t fillSpWeigD0[3] = {deltaphi,mD0,deltaeta};
+    Double_t fillSpWeigD0bar[3] = {deltaphi,mD0bar,deltaeta};
 
     if(fReadMC == 0) {
       //sparse fill for data (tracks, K+-, K0) + weighted
       if(fIsSelectedCandidate == 1 || fIsSelectedCandidate == 3) { //D0
-        ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d",part.Data(),ptbin)))->Fill(fillSpPhiD0);
-        ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Weig_Bin%d",ptbin)))->Fill(deltaphi,mD0,pTorig);
+        ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d",part.Data(),ptbin)))->Fill(fillSpPhiD0,wg);
+        ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_Bin%d",ptbin)))->Fill(fillSpWeigD0,pTorig*wg);
       }
       if(fIsSelectedCandidate == 2 || fIsSelectedCandidate == 3) { //D0bar
-        ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d",part.Data(),ptbin)))->Fill(fillSpPhiD0bar);
-        ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Weig_Bin%d",ptbin)))->Fill(deltaphi,mD0bar,pTorig);
+        ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d",part.Data(),ptbin)))->Fill(fillSpPhiD0bar,wg);
+        ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_Bin%d",ptbin)))->Fill(fillSpWeigD0bar,pTorig*wg);
       }
       if(!fAlreadyFilled) {
        ((TH1F*)fOutputStudy->FindObject(Form("hist_Pt_%s_Bin%d",part.Data(),ptbin)))->Fill(pTorig);
@@ -1547,29 +1884,33 @@ void AliAnalysisTaskSED0Correlations::FillSparsePlots(TClonesArray* mcArray, Ali
 
       //sparse fill for data (tracks, K+-, K0) + weighted
       if(PdgD0==421) { //D0 (from MCTruth)
-         ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d",part.Data(),ptbin)))->Fill(fillSpPhiD0);
-         ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_%s%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0);
-         if(origD0==4&&origTr>=1&&origTr<=2) ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_%s_HF%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0);
-         if(origD0==5&&origTr>=3&&origTr<=6) ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_%s_HF%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0);
-         ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Weig_Bin%d",ptbin)))->Fill(deltaphi,mD0,pTorig);
-         ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Weig%s_Bin%d",orig.Data(),ptbin)))->Fill(deltaphi,mD0,pTorig);
-         if(origD0==4&&origTr>=1&&origTr<=2) ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Weig_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(deltaphi,mD0,pTorig);
-         if(origD0==5&&origTr>=3&&origTr<=6) ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Weig_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(deltaphi,mD0,pTorig);
+         ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d",part.Data(),ptbin)))->Fill(fillSpPhiD0,wg);
+         ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0,wg);
+         if(origD0==4&&origTr>=1&&origTr<=3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_HF%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0,wg);
+         if(origD0==5&&origTr>=4&&origTr<=8) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_HF%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0,wg);
+         if(origTr==0) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_NonHF_Bin%d",part.Data(),ptbin)))->Fill(fillSpPhiD0,wg);
+         ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_Bin%d",ptbin)))->Fill(fillSpWeigD0,pTorig*wg);
+         ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpWeigD0,pTorig*wg);
+         if(origD0==4&&origTr>=1&&origTr<=3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpWeigD0,pTorig*wg);
+         if(origD0==5&&origTr>=4&&origTr<=8) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpWeigD0,pTorig*wg);
+         if(origTr==0) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_NonHF_Bin%d",ptbin)))->Fill(fillSpWeigD0,pTorig*wg);
       }
       if(PdgD0==-421) { //D0bar
-         ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d",part.Data(),ptbin)))->Fill(fillSpPhiD0bar);
-         ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_%s%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0bar);
-         if(origD0==4&&origTr>=1&&origTr<=2) ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_%s_HF%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0bar);
-         if(origD0==5&&origTr>=3&&origTr<=6) ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_%s_HF%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0bar); 
-         ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Weig_Bin%d",ptbin)))->Fill(deltaphi,mD0bar,pTorig);
-         ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Weig%s_Bin%d",orig.Data(),ptbin)))->Fill(deltaphi,mD0bar,pTorig);
-         if(origD0==4&&origTr>=1&&origTr<=2) ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Weig_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(deltaphi,mD0bar,pTorig);
-         if(origD0==5&&origTr>=3&&origTr<=6) ((TH2F*)fOutputCorr->FindObject(Form("hPhi_Weig_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(deltaphi,mD0bar,pTorig);
+         ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d",part.Data(),ptbin)))->Fill(fillSpPhiD0bar,wg);
+         ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0bar,wg);
+         if(origD0==4&&origTr>=1&&origTr<=3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_HF%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0bar,wg);
+         if(origD0==5&&origTr>=4&&origTr<=8) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_HF%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0bar,wg); 
+         if(origTr==0) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_NonHF_Bin%d",part.Data(),ptbin)))->Fill(fillSpPhiD0bar,wg);
+         ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_Bin%d",ptbin)))->Fill(fillSpWeigD0bar,pTorig*wg);
+         ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpWeigD0bar,pTorig*wg);
+         if(origD0==4&&origTr>=1&&origTr<=3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpWeigD0bar,pTorig*wg);
+         if(origD0==5&&origTr>=4&&origTr<=8) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpWeigD0bar,pTorig*wg);
+         if(origTr==0) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_NonHF_Bin%d",ptbin)))->Fill(fillSpWeigD0bar,pTorig*wg);
       } 
       if(!fAlreadyFilled) {
        ((TH1F*)fOutputStudy->FindObject(Form("histDispl_%s_Bin%d",part.Data(),ptbin)))->Fill(d0orig); //Fills displacement histos
-        if (origTr>=1&&origTr<=6) ((TH1F*)fOutputStudy->FindObject(Form("histDispl_%s_HF_Bin%d",part.Data(),ptbin)))->Fill(d0orig);
-        if (origTr>=1&&origTr<=6) ((TH1F*)fOutputStudy->FindObject(Form("histDispl_%s_HF%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(d0orig);
+        if (origTr>=1&&origTr<=8) ((TH1F*)fOutputStudy->FindObject(Form("histDispl_%s_HF_Bin%d",part.Data(),ptbin)))->Fill(d0orig);
+        if (origTr>=1&&origTr<=8) ((TH1F*)fOutputStudy->FindObject(Form("histDispl_%s_HF%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(d0orig);
        ((TH1F*)fOutputStudy->FindObject(Form("histDispl_%s%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(d0orig); //Fills displacement histos
         ((TH1F*)fOutputStudy->FindObject(Form("hist_Pt_%s_Bin%d",part.Data(),ptbin)))->Fill(pTorig);
         ((TH1F*)fOutputStudy->FindObject(Form("histOrig_%s_Bin%d",part.Data(),ptbin)))->Fill(origTr);
@@ -1582,7 +1923,7 @@ void AliAnalysisTaskSED0Correlations::FillSparsePlots(TClonesArray* mcArray, Ali
   if(fMixing == kME) {
 
     //Fixes limits; needed to include overflow into THnSparse projections!
-    Double_t EtaLim_Sparse = ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_Charg_Bin%d_EvMix",ptbin)))->GetAxis(2)->GetXmax();
+    Double_t EtaLim_Sparse = ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Charg_Bin%d_EvMix",ptbin)))->GetAxis(2)->GetXmax();
     if(deltaeta > EtaLim_Sparse) deltaeta = EtaLim_Sparse-0.01;
     if(deltaeta < -EtaLim_Sparse) deltaeta = -EtaLim_Sparse+0.01;
 
@@ -1592,13 +1933,13 @@ void AliAnalysisTaskSED0Correlations::FillSparsePlots(TClonesArray* mcArray, Ali
 
     if(fReadMC == 0) {
       //sparse fill for data (tracks, K+-, K0)
-      if(fIsSelectedCandidate == 1||fIsSelectedCandidate == 3) ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d_EvMix",part.Data(),ptbin)))->Fill(fillSpPhiD0);
-      if(fIsSelectedCandidate == 2||fIsSelectedCandidate == 3) ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d_EvMix",part.Data(),ptbin)))->Fill(fillSpPhiD0bar);
+      if(fIsSelectedCandidate == 1||fIsSelectedCandidate == 3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d_EvMix",part.Data(),ptbin)))->Fill(fillSpPhiD0,wg);
+      if(fIsSelectedCandidate == 2||fIsSelectedCandidate == 3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d_EvMix",part.Data(),ptbin)))->Fill(fillSpPhiD0bar,wg);
     }
     if(fReadMC == 1) {
       //sparse fill for data (tracks, K+-, K0)
-      if(PdgD0==421)  ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d_EvMix",part.Data(),ptbin)))->Fill(fillSpPhiD0);
-      if(PdgD0==-421) ((THnSparseI*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d_EvMix",part.Data(),ptbin)))->Fill(fillSpPhiD0bar);
+      if(PdgD0==421)  ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d_EvMix",part.Data(),ptbin)))->Fill(fillSpPhiD0,wg);
+      if(PdgD0==-421) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d_EvMix",part.Data(),ptbin)))->Fill(fillSpPhiD0bar,wg);
     }//end MC case
 
   } //end of ME fill
@@ -1613,11 +1954,11 @@ Int_t AliAnalysisTaskSED0Correlations::CheckTrackOrigin(TClonesArray* arrayMC, A
   // 0) Not HF
   // 1) D->#
   // 2) D->X->#
-  // 3) B->#
-  // 4) B->X-># (X!=D)
-  // 5) B->D->#
-  // 6) B->D->X->#
-  // 7) c hadronization
+  // 3) c hadronization
+  // 4) B->#
+  // 5) B->X-># (X!=D)
+  // 6) B->D->#
+  // 7) B->D->X->#
   // 8) b hadronization
   //
   if(fDebug>2) printf("AliAnalysisTaskSED0Correlations::CheckTrkOrigin() \n");
@@ -1634,11 +1975,12 @@ Int_t AliAnalysisTaskSED0Correlations::CheckTrackOrigin(TClonesArray* arrayMC, A
   Bool_t isBchaindaugh=kFALSE;
   Bool_t isQuarkFound=kFALSE;
 
-  while (mother > 0){
+  if (mother<0) return -1;
+  while (mother >= 0){
     istep++;
-    AliAODMCParticle* mcGranma = dynamic_cast<AliAODMCParticle*>(arrayMC->At(mother));
-    if (mcGranma){
-      pdgGranma = mcGranma->GetPdgCode();
+    AliAODMCParticle* mcMoth = dynamic_cast<AliAODMCParticle*>(arrayMC->At(mother));
+    if (mcMoth){
+      pdgGranma = mcMoth->GetPdgCode();
       abspdgGranma = TMath::Abs(pdgGranma);
       if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)){
        isBchaindaugh=kTRUE;
@@ -1649,10 +1991,10 @@ Int_t AliAnalysisTaskSED0Correlations::CheckTrackOrigin(TClonesArray* arrayMC, A
         if(istep==1) isDdaugh=kTRUE;
       }
       if(abspdgGranma==4 || abspdgGranma==5) {isQuarkFound=kTRUE; if(abspdgGranma==5) isFromB = kTRUE;}
-      mother = mcGranma->GetMother();
+      mother = mcMoth->GetMother();
     }else{
       AliError("Failed casting the mother particle!");
-      break;
+      return -1;
     }
   }
 
@@ -1661,21 +2003,48 @@ Int_t AliAnalysisTaskSED0Correlations::CheckTrackOrigin(TClonesArray* arrayMC, A
     if(!isFromB) {  //charm
       if(isDdaugh) return 1; //charm immediate
       else if(isDchaindaugh) return 2; //charm chain
-      else return 7; //charm hadronization
+      else return 3; //charm hadronization
     }
     else { //beauty
-      if(isBdaugh) return 3; //b immediate
+      if(isBdaugh) return 4; //b immediate
       else if(isBchaindaugh) { //b chain
         if(isDchaindaugh) {
-          if(isDdaugh) return 5; //d immediate
-          return 6; //d chain
+          if(isDdaugh) return 6; //d immediate
+          return 7; //d chain
           }
-        else return 4; //b, not d
+        else return 5; //b, not d
       }
       else return 8; //b hadronization
     }
   }
-  else return 0; //no HF quark
+  else if(!isDdaugh && !isDchaindaugh && !isBdaugh && !isBchaindaugh) return 0; //no HF decay 
+     //in this case, it's !isQuarkFound, but not in 100% cases it's a non HF particle!
+     //rarely you can find a D/B meson which comes from a -1! It isn't a Non-HF, in that case! And I'll return -1...
+
+  return -1; //some problem spotted
+}
+//________________________________________________________________________
+Bool_t AliAnalysisTaskSED0Correlations::IsDDaughter(AliAODMCParticle* d, AliAODMCParticle* track, TClonesArray* mcArray) const {
+
+  //Daughter removal in MCKine case
+  Bool_t isDaughter = kFALSE;
+  Int_t labelD0 = d->GetLabel();
+
+  Int_t mother = track->GetMother();
+
+  //Loop on the mothers to find the D0 label (it must be the trigger D0, not a generic D0!)
+  while (mother > 0){
+    AliAODMCParticle* mcMoth = dynamic_cast<AliAODMCParticle*>(mcArray->At(mother)); //it's the mother of the track!
+    if (mcMoth){
+      if (mcMoth->GetLabel() == labelD0) isDaughter = kTRUE;
+      mother = mcMoth->GetMother(); //goes back by one
+    } else{
+      AliError("Failed casting the mother particle!");
+      break;
+    }
+  }
+
+  return isDaughter;
 }
 
 //________________________________________________________________________
@@ -1743,7 +2112,9 @@ void AliAnalysisTaskSED0Correlations::PrintBinsAndLimits() {
   cout << "\n--------------------------\n";
   cout << "D0 Eta cut for Correl = "<<fEtaForCorrel<<"\n";
   cout << "--------------------------\n";
-  cout << "MC Truth = "<<fReadMC<<"\n";
+  cout << "MC Truth = "<<fReadMC<<" - MC Reco: Trk = "<<fRecoTr<<", D0 = "<<fRecoD0<<"\n";
+  cout << "--------------------------\n";
+  cout << "Sel of Event tpye (PP,GS,FE,...)= "<<fSelEvType<<"\n";
   cout << "--------------------------\n";
   cout << "Ev Mixing = "<<fMixing<<"\n";
   cout << "--------------------------\n";
index 897eaf3fa568e8abca00452f2dac15e135645de2..5e90d708440615207063082641ff083927d450ec 100644 (file)
@@ -47,12 +47,18 @@ class AliAnalysisTaskSED0Correlations : public AliAnalysisTaskSE
   virtual void Terminate(Option_t *option);
 
   void SetReadMC(Bool_t readMC=kFALSE){fReadMC=readMC;}
+  void SetMCReconstructedTracks(Bool_t recoTrMC=kTRUE){fRecoTr=recoTrMC;}
+  void SetMCReconstructedD0(Bool_t recoD0MC=kTRUE){fRecoD0=recoD0MC;}
+  void SetMCSelEventType(Bool_t sel=kFALSE){fSelEvType=sel;}
   void SetFillOnlyD0D0bar(Int_t flagfill){fFillOnlyD0D0bar=flagfill;}
   void SetSystem(Int_t sys){fSys=sys;}
   void SetRejectSDDClusters(Bool_t flag) {fIsRejectSDDClusters=flag; }
   void SetFillGlobalPlots(Bool_t fill=kTRUE){fFillGlobal=fill;}
 
   Int_t  GetReadMC() const {return fReadMC;}
+  Int_t  GetMCReconstructedTracks() const {return fRecoTr;}
+  Int_t  GetMCReconstructedD0() const {return fRecoD0;}
+  Int_t  GetMCSelEventType() const {return fSelEvType;}
   Int_t  GetFillOnlyD0D0bar() const {return fFillOnlyD0D0bar;}
   Int_t  GetSystem() const {return fSys;}
   Bool_t GetRejectSDDClusters() const {return fIsRejectSDDClusters;}
@@ -82,8 +88,10 @@ class AliAnalysisTaskSED0Correlations : public AliAnalysisTaskSE
   //correlation methods
   void CreateCorrelationsObjs();
   void CalculateCorrelations(AliAODRecoDecayHF2Prong* d, Int_t labD0=-1, TClonesArray* mcArray=0x0);
-  void FillSparsePlots(TClonesArray* arrayMC, AliAODRecoDecayHF2Prong *d, Int_t origD0, Int_t PdgD0, AliReducedParticle* track, Int_t type);
+  void CalculateCorrelationsMCKine(AliAODMCParticle* d, TClonesArray* mcArray=0x0);
+  void FillSparsePlots(TClonesArray* arrayMC, Double_t mInv[], Int_t origD0, Int_t PdgD0, AliReducedParticle* track, Int_t ptbin, Int_t type, Double_t wg=1.);
   Int_t CheckTrackOrigin(TClonesArray* arrayMC, AliAODMCParticle *mcPartCandidate) const;
+  Bool_t IsDDaughter(AliAODMCParticle* d, AliAODMCParticle* track, TClonesArray* mcArray) const;
   Bool_t SelectV0(AliAODv0* v0, AliAODVertex *vtx, Int_t option, Int_t idArrayV0[][2]) const;
 
   Int_t             fNPtBinsCorr;        // number of pt bins per correlations
@@ -103,6 +111,9 @@ class AliAnalysisTaskSED0Correlations : public AliAnalysisTaskSE
   AliHFCorrelator* fCorrelatorKc;      // Correlator for charged K
   AliHFCorrelator* fCorrelatorK0;      // Correlator for K0
   Bool_t    fReadMC;                   // flag for MC array: kTRUE = read it, kFALSE = do not read it
+  Bool_t    fRecoTr;                           // flag for using MC reconstructed (kTRUE) or pure kinematic MC (kFALSE) - Associated tracks
+  Bool_t    fRecoD0;                           // flag for using MC reconstructed (kTRUE) or pure kinematic MC (kFALSE) - D0
+  Bool_t    fSelEvType;                        // flag for enabling selection of event tpye (PP, GS, FE, ...) on MC analysis
   Bool_t    fMixing;                   // flag to enable also event mixing
   AliNormalizationCounter *fCounter;   //!AliNormalizationCounter on output slot 4
   Int_t     fNPtBins;                  // Number of pt bins