]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGHF/correlationHF/AliAnalysisTaskDStarCorrelations.cxx
New class for steering D-hadron correlation analysis (Sandro)
[u/mrichter/AliRoot.git] / PWGHF / correlationHF / AliAnalysisTaskDStarCorrelations.cxx
index e9bc77ec2f650e21035b0458d6603f2e9a1ec5a2..a9886a251ecc466292bf5daae0047f7bfc83cb98 100644 (file)
@@ -27,7 +27,7 @@
 
 /* $Id$ */
 
-#include <TDatabasePDG.h>
+//#include <TDatabasePDG.h>
 #include <TParticle.h>
 #include <TVector3.h>
 #include <TChain.h>
@@ -40,7 +40,7 @@
 #include "AliAODRecoCascadeHF.h"
 #include "AliAODRecoDecayHF2Prong.h"
 #include "AliAODPidHF.h"
-#include "AliEventPoolManager.h"
+//#include "AliEventPoolManager.h"
 #include "AliVParticle.h"
 #include "AliAnalysisManager.h"
 #include "AliAODInputHandler.h"
 #include "AliAODMCParticle.h"
 #include "AliNormalizationCounter.h"
 #include "AliReducedParticle.h"
+#include "AliHFCorrelator.h"
 
 
 
-using std::cout;
-using std::endl;
 
 ClassImp(AliAnalysisTaskDStarCorrelations)
 
@@ -62,14 +61,17 @@ ClassImp(AliAnalysisTaskDStarCorrelations)
 AliAnalysisTaskDStarCorrelations::AliAnalysisTaskDStarCorrelations() :
 AliAnalysisTaskSE(),
 fhandler(0x0),
-fPoolMgr(0x0),      
+//fPoolMgr(0x0),      
 fmcArray(0x0),
 fCounter(0x0),
+fCorrelator(0x0),
 fselect(0),
 fmontecarlo(kFALSE),
 fmixing(kFALSE),
+fSystem(kFALSE),
 fEvents(0),
 fDebug(0),
+fDisplacement(0),
 
 fOutput(0x0),            
 fCuts(0),
@@ -83,14 +85,17 @@ AliAnalysisTaskDStarCorrelations::AliAnalysisTaskDStarCorrelations(const Char_t*
 AliAnalysisTaskSE(name),
 
 fhandler(0x0),
-fPoolMgr(0x0),   
+//fPoolMgr(0x0),   
 fmcArray(0x0),
 fCounter(0x0),
+fCorrelator(0x0),
 fselect(0),
 fmontecarlo(kFALSE),
 fmixing(kFALSE),
+fSystem(kFALSE),
 fEvents(0),
 fDebug(0),
+fDisplacement(0),
 
 fOutput(0x0),                
 fCuts(0),
@@ -115,9 +120,10 @@ AliAnalysisTaskDStarCorrelations::~AliAnalysisTaskDStarCorrelations() {
        Info("AliAnalysisTaskDStarCorrelations","Calling Destructor");  
        
        if(fhandler) {delete fhandler; fhandler = 0;}
-       if(fPoolMgr) {delete fPoolMgr; fPoolMgr = 0;}    
+       //if(fPoolMgr) {delete fPoolMgr; fPoolMgr = 0;}    
        if(fmcArray) {delete fmcArray; fmcArray = 0;}
        if(fCounter) {delete fCounter; fCounter = 0;}
+       if(fCorrelator) {delete fCorrelator; fCorrelator = 0;}
        if(fOutput) {delete fOutput; fOutput = 0;}
        if(fCuts) {delete fCuts; fCuts = 0;}
        if(fCuts2) {delete fCuts2; fCuts2=0;}
@@ -132,6 +138,10 @@ void AliAnalysisTaskDStarCorrelations::Init(){
        if(fDebug > 1) printf("AliAnalysisTaskDStarCorrelations::Init() \n");
        
        AliRDHFCutsDStartoKpipi* copyfCuts=new AliRDHFCutsDStartoKpipi(*fCuts);
+       
+       
+       
+       
        // Post the D* cuts
        PostData(2,copyfCuts);
        
@@ -153,39 +163,43 @@ void AliAnalysisTaskDStarCorrelations::UserCreateOutputObjects(){
        
        // define histograms
        DefineHistoForAnalysis();
-       
        fCounter = new AliNormalizationCounter(Form("%s",GetOutputSlot(3)->GetContainer()->GetName()));
        fCounter->Init();
        
-   
-       // definition of the Pool Manager for Event Mixing
+    Double_t Pi = TMath::Pi();
+       fCorrelator = new AliHFCorrelator("Correlator",fCuts2,fSystem); // fCuts2 is the hadron cut object, fSystem to switch between pp or PbPb
+       fCorrelator->SetDeltaPhiInterval((-0.5-1./32)*Pi,(1.5-1./32)*Pi); // set correct phi interval
+       //fCorrelator->SetDeltaPhiInterval(-1.57,4.71);
+       fCorrelator->SetEventMixing(fmixing); //set kFALSE/kTRUE for mixing Off/On
+       fCorrelator->SetAssociatedParticleType(fselect); // set 1/2/3 for hadron/kaons/kzeros
+       fCorrelator->SetApplyDisplacementCut(fDisplacement); //set kFALSE/kTRUE for using the displacement cut
+       fCorrelator->SetUseMC(fmontecarlo);
+       Bool_t pooldef = fCorrelator->DefineEventPool();
        
-       Int_t MaxNofEvents = 200;
-       Int_t MinNofTracks = 1000;
-       
-       Int_t NofMultiplicityBins = 5;
-       Double_t MBins[]={0,20,40,60,80,500};
-       Double_t * MultiplicityBins = MBins;
-       
-       Int_t NofZVrtxBins = 5;
-       Double_t ZBins[]={-10,-5,-2.5,2.5,5,10};
-       Double_t *ZVrtxBins = ZBins;
-       
-       
-       fPoolMgr = new AliEventPoolManager(MaxNofEvents, MinNofTracks, NofMultiplicityBins, MultiplicityBins, NofZVrtxBins, ZVrtxBins);
+       if(!pooldef) AliInfo("Warning:: Event pool not defined properly");
+
        
        
 }
 //_________________________________________________
 void AliAnalysisTaskDStarCorrelations::UserExec(Option_t *){
 
-       cout << " " << endl;
-       cout << "=================================================================================" << endl;
+       cout << "USER EXEC CHECKPOINT 1" << endl;
        
-       if(fselect==1) cout << "TASK::Correlation with hadrons "<< endl;
-       if(fselect==2) cout << "TASK::Correlation with kaons "<< endl;
-       if(fselect==3) cout << "TASK::Correlation with kzeros "<< endl;
+       //Double_t pi = TMath::Pi();
        
+       cout << " " << endl;
+       cout << "=================================================================================" << endl;
+       if(!fmixing){
+       if(fselect==1) cout << "TASK::Correlation with hadrons on SE "<< endl;
+       if(fselect==2) cout << "TASK::Correlation with kaons on SE "<< endl;
+       if(fselect==3) cout << "TASK::Correlation with kzeros on SE "<< endl;
+       }
+       if(fmixing){
+               if(fselect==1) cout << "TASK::Correlation with hadrons on ME "<< endl;
+               if(fselect==2) cout << "TASK::Correlation with kaons on ME "<< endl;
+               if(fselect==3) cout << "TASK::Correlation with kzeros on ME "<< endl;
+       }
        if (!fInputEvent) {
                Error("UserExec","NO EVENT FOUND!");
                return;
@@ -196,35 +210,30 @@ void AliAnalysisTaskDStarCorrelations::UserExec(Option_t *){
          AliError("AOD event not found!");
          return;
        }
-       Double_t pi = TMath::Pi();
+       
+       fCorrelator->SetAODEvent(aodEvent); // set the event to be processed
        
        fEvents++; // event counter
        ((TH1D*)fOutput->FindObject("NofEvents"))->Fill(0);
        fmcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
+       
        if(fmontecarlo && !fmcArray){
          AliError("Array of MC particles not found");
          return;
        }
-       
-       // initialize the pool for event mixing
-       Int_t multiplicity = aodEvent->GetNTracks();
-       AliAODVertex *vtx = aodEvent->GetPrimaryVertex();
-       Double_t zvertex = vtx->GetZ();
-       Double_t multip = multiplicity;
-       
-       if(TMath::Abs(zvertex)>=10 || multip>500 || multip == 0) {
-               AliInfo(Form("Event with Zvertex = %.2f cm and multiplicity = %.0f out of pool bounds, SKIPPING",zvertex,multip));
+       Bool_t isEvSel=fCuts->IsEventSelected(aodEvent);
+       if(!isEvSel) return;
+       ((TH1D*)fOutput->FindObject("NofEvents"))->Fill(1);
+       //
+       Bool_t correlatorON = fCorrelator->Initialize(); //define the pool for mixing
+       if(!correlatorON) {
+               AliInfo("AliHFCorrelator didn't initialize the pool correctly or processed a bad event");
                return;
        }
        
-       
-       AliEventPool* pool = fPoolMgr->GetEventPool(multip, zvertex);
-       if (!pool) AliFatal(Form("No pool found for multiplicity = %f, zVtx = %f cm", multip, zvertex));
-       
-       
-
+       if(fmontecarlo) fCorrelator->SetMCArray(fmcArray);
        // D* reconstruction
-       
+       cout << "USER EXEC CHECKPOINT 2" << endl;
        TClonesArray *arrayDStartoD0pi=0;
 
        
@@ -257,20 +266,21 @@ void AliAnalysisTaskDStarCorrelations::UserExec(Option_t *){
        Double_t deltainvMDStar;
 
        
-       Double_t mPDGD0=TDatabasePDG::Instance()->GetParticle(421)->Mass();
-       Double_t mPDGDstar=TDatabasePDG::Instance()->GetParticle(413)->Mass();
+       Double_t mPDGD0=1.8648;//TDatabasePDG::Instance()->GetParticle(421)->Mass();
+       Double_t mPDGDstar=2.01022;//TDatabasePDG::Instance()->GetParticle(413)->Mass();
        
+       cout << "USER EXEC CHECKPOINT 3" << endl;
        
-       
-       if(fselect ==3){// check the K0 invariant mass
-       TObjArray * fillkzerospectra = AcceptAndReduceKZero(aodEvent, 0,0);
-       delete fillkzerospectra;
-       }
+       //if(fselect ==3){// check the K0 invariant mass
+       //TObjArray * fillkzerospectra = AcceptAndReduceKZero(aodEvent, 0,0);
+       //delete fillkzerospectra;
+       //}
        
        //MC tagging for DStar
        //D* and D0 prongs needed to MatchToMC method
        Int_t pdgDgDStartoD0pi[2]={421,211};
        Int_t pdgDgD0toKpi[2]={321,211};
+
        
        //loop on D* candidates
        for (Int_t iDStartoD0pi = 0; iDStartoD0pi<arrayDStartoD0pi->GetEntriesFast(); iDStartoD0pi++) {
@@ -283,26 +293,24 @@ void AliAnalysisTaskDStarCorrelations::UserExec(Option_t *){
                invMassDZero = - 999;
                deltainvMDStar = -998;
                
-       
-
                AliAODRecoCascadeHF* dstarD0pi = (AliAODRecoCascadeHF*)arrayDStartoD0pi->At(iDStartoD0pi);
                if(!dstarD0pi->GetSecondaryVtx()) continue;
                AliAODRecoDecayHF2Prong* theD0particle = (AliAODRecoDecayHF2Prong*)dstarD0pi->Get2Prong();
                if (!theD0particle) continue;
+
                
                // track quality cuts
                Int_t isTkSelected = fCuts->IsSelected(dstarD0pi,AliRDHFCuts::kTracks); // quality cuts on tracks
                // region of interest + topological cuts + PID
                Int_t isSelected=fCuts->IsSelected(dstarD0pi,AliRDHFCuts::kCandidate); //selected
-               
                //apply selections
                if(!isTkSelected) continue;
                if(!isSelected) continue;
                if(!fCuts->IsInFiducialAcceptance(dstarD0pi->Pt(),dstarD0pi->YDstar())) continue;    
-
+               Int_t mcLabelDStar = -999;
                if(fmontecarlo){
                        // find associated MC particle for D* ->D0toKpi
-                       Int_t mcLabelDStar = dstarD0pi->MatchToMC(413,421,pdgDgDStartoD0pi,pdgDgD0toKpi,fmcArray);
+                       mcLabelDStar = dstarD0pi->MatchToMC(413,421,pdgDgDStartoD0pi,pdgDgD0toKpi,fmcArray,kFALSE);
                        if(mcLabelDStar>=0) isDStarMCtag = kTRUE;
                }
                
@@ -310,31 +318,45 @@ void AliAnalysisTaskDStarCorrelations::UserExec(Option_t *){
                phiDStar = dstarD0pi->Phi(); 
                etaDStar = dstarD0pi->Eta();
                
+               phiDStar = fCorrelator->SetCorrectPhiRange(phiDStar); // set the phi of the D meson in the correct range
+               
                Int_t ptbin=fCuts->PtBin(dstarD0pi->Pt());
                
                Double_t dmDStarWindow =0.0019;// 0.0019 = 3 sigma
                Double_t mD0Window=0.074;
                
-               if (ptbin==1)  mD0Window = 0.026; //0.5-1
-               if (ptbin==2)  mD0Window = 0.022; //1-2
-               if (ptbin==3)  mD0Window = 0.024; //2-3
-               if (ptbin==4)  mD0Window = 0.032;
-               if (ptbin==5)  mD0Window = 0.032;
-               if (ptbin==6)  mD0Window = 0.036;
-               if (ptbin==7)  mD0Window = 0.036;
-               if (ptbin==8)  mD0Window = 0.036;
-               if (ptbin==9)  mD0Window = 0.058;
-               if (ptbin==10) mD0Window = 0.058;
-               if (ptbin>10)  mD0Window = 0.074;
-
+               if (!fSystem){ // pp
+                       if (ptbin==1)  mD0Window = 0.026; //0.5-1
+                       if (ptbin==2)  mD0Window = 0.022; //1-2
+                       if (ptbin==3)  mD0Window = 0.024; //2-3
+                       if (ptbin==4)  mD0Window = 0.032;
+                       if (ptbin==5)  mD0Window = 0.032;
+                       if (ptbin==6)  mD0Window = 0.036;
+                       if (ptbin==7)  mD0Window = 0.036;
+                       if (ptbin==8)  mD0Window = 0.036;
+                       if (ptbin==9)  mD0Window = 0.058;
+                       if (ptbin==10) mD0Window = 0.058;
+                       if (ptbin>10)  mD0Window = 0.074;
+               }
+               if(fSystem){// PbPb
+                       if (ptbin==0)  mD0Window = 0.032; //1-1
+                       if (ptbin==1)  mD0Window = 0.032; //2-3
+                       if (ptbin==2)  mD0Window = 0.032; //3-4
+                       if (ptbin==3)  mD0Window = 0.032; //4-5
+                       if (ptbin==4)  mD0Window = 0.036; //5-6
+                       if (ptbin==5)  mD0Window = 0.036; //6-8
+                       if (ptbin==6)  mD0Window = 0.055; //8-12
+                       if (ptbin==7)  mD0Window = 0.074; //12-16
+                       if (ptbin==8)  mD0Window = 0.074; //16-24
+                       if (ptbin==9)  mD0Window = 0.074; //24-35 
+                }
                
                invMassDZero = dstarD0pi->InvMassD0();
                ((TH2F*)fOutput->FindObject("D0InvMass"))->Fill(ptDStar,invMassDZero);
                
                deltainvMDStar = dstarD0pi->DeltaInvMass();
                
-               
-               
+       
                //good candidates
                if (TMath::Abs(invMassDZero-mPDGD0)<mD0Window){
                        
@@ -343,6 +365,7 @@ void AliAnalysisTaskDStarCorrelations::UserExec(Option_t *){
                                
                                ((TH1F*)fOutput->FindObject("RecoPtDStar"))->Fill(ptDStar);
                                isInPeak = kTRUE;
+                               ((TH2F*)fOutput->FindObject("PhiEtaTrigger"))->Fill(phiDStar,etaDStar);
                        }
                }// end if good candidates
                
@@ -354,155 +377,113 @@ void AliAnalysisTaskDStarCorrelations::UserExec(Option_t *){
                        if(TMath::Abs(deltainvMDStar-(mPDGDstar-mPDGD0))<dmDStarWindow){ // is in DStar peak region?
                                ((TH1F*)fOutput->FindObject("RecoPtBkg"))->Fill(ptDStar);
                                isInSideBand = kTRUE;
+                               ((TH2F*)fOutput->FindObject("PhiEtaSideBand"))->Fill(phiDStar,etaDStar);
                        }
                        
                }//end if sidebands
-        
+               // getting the number of triggers in the MCtag D* case 
+               
 
+        if(fmontecarlo && isDStarMCtag) ((TH1F*)fOutput->FindObject("MCtagPtDStar"))->Fill(ptDStar);
+               
                
                if(!isInPeak && !isInSideBand) continue; // skip if it is not side band or peak event - SAVE CPU TIME
                
-       
+               
+           fCorrelator->SetTriggerParticleProperties(ptDStar,phiDStar,etaDStar); // pass to the object the necessary trigger part parameters
+                               
+               
+               
                Int_t trackiddaugh0 = ((AliAODTrack*)theD0particle->GetDaughter(0))->GetID();
                Int_t trackiddaugh1 = ((AliAODTrack*)theD0particle->GetDaughter(1))->GetID();
                Int_t trackidsoftPi = ((AliAODTrack*)dstarD0pi->GetBachelor())->GetID();
                
-               ptDStar = dstarD0pi->Pt();
-               phiDStar = dstarD0pi->Phi(); 
-               etaDStar = dstarD0pi->Eta();
+               Bool_t execPool = fCorrelator->ProcessEventPool();
+               if(fmixing && !execPool) {
+                       AliInfo("Mixed event analysis: pool is not ready");
+                       continue;
+               }
+               
+               Int_t NofEventsinPool = 1;
+               if(fmixing) NofEventsinPool = fCorrelator->GetNofEventsInPool();
                                
-               if(!fmixing){ // analysis on Single Event
-                                               
-                       TObjArray* selectedtracks = new TObjArray();
-                       if(fselect==1 || fselect ==2)   selectedtracks = AcceptAndReduceTracks(aodEvent);
-                       if(fselect==3) {selectedtracks = AcceptAndReduceKZero(aodEvent,iDStartoD0pi,1);}        
-                       Int_t noftracks = selectedtracks->GetEntriesFast(); 
-                       Int_t counterPeak =0;
-                       Int_t counterSB = 0;
-
-                       for(Int_t i =0; i<noftracks; i++){ // loop on tracks/k0 candidates in aod event
-
-                               AliReducedParticle *redpart = (AliReducedParticle*)selectedtracks->At(i);
-                               Double_t phiHad=redpart->Phi();
-
-                               Double_t ptHad=redpart->Pt();
-                               Double_t etaHad=redpart->Eta();
-
-                               Int_t label = redpart->GetLabel();
-
-                               Int_t trackid = redpart->GetID();
-
-
-                               // check that the track is not a D* daughter
-                               if(trackid == trackiddaugh0) continue;
-                               if(trackid == trackiddaugh1) continue;
-                               if(trackid == trackidsoftPi) continue;
+               for (Int_t jMix =0; jMix < NofEventsinPool; jMix++){// loop on events in the pool; if it is SE analysis, stops at one
+               
+                       Bool_t analyzetracks = fCorrelator->ProcessAssociatedTracks(jMix);
+                       
+                       if(!analyzetracks) {
+                               AliInfo("AliHFCorrelator::Cannot process the track array");
+                               continue;
+                       }
+               
+               
+                       Int_t NofTracks = fCorrelator->GetNofTracks();
+               
+                       for(Int_t iTrack = 0; iTrack<NofTracks; iTrack++){ // looping on track candidates
+                       
+                               Bool_t runcorrelation = fCorrelator->Correlate(iTrack);
+                               if(!runcorrelation) continue;
+                       
+                               Double_t DeltaPhi = fCorrelator->GetDeltaPhi();
+                               Double_t DeltaEta = fCorrelator->GetDeltaEta();
+                       
+                               AliReducedParticle * hadron = fCorrelator->GetAssociatedParticle();
+                               
+                               Double_t ptHad = hadron->Pt();
+                               Double_t phiHad = hadron->Phi();
+                               Double_t etaHad = hadron->Eta(); 
+                               Double_t label = hadron->GetLabel(); 
+                               Double_t trackid = hadron->GetID();
+                               
+                               phiHad = fCorrelator->SetCorrectPhiRange(phiHad);
+                               
+                               if(!fmixing){ // skip D* Daughetrs
+                                       if(trackid == trackiddaugh0) continue;
+                                       if(trackid == trackiddaugh1) continue;
+                                       if(trackid == trackidsoftPi) continue;
+                               }
+                       
+                               // from here on it is up to the user to decide what object to fill
                                
                                if(fmontecarlo && isDStarMCtag){ // check correlations of MC tagged DStars in MonteCarlo
-                                       
+                               
                                        Int_t PartSource = fCuts2->IsMCpartFromHF(label,fmcArray); // check source of associated particle (hadron/kaon/K0)
-
-                                       FillMCTagCorrelations(ptDStar,phiDStar,etaDStar,ptHad,phiHad,etaHad,PartSource);
+                               
+                                       FillMCTagCorrelations(ptDStar,DeltaPhi,DeltaEta,ptHad,PartSource);
+                               
                                }
+                       
                                if(isInPeak)  {
-                                       FillCorrelations(ptDStar,phiDStar,etaDStar,phiHad,etaHad);// function for correlations
-                                       counterPeak++;
-                                       if (phiDStar > 1.5*pi) phiDStar = phiDStar - 2*pi;
-                                       if (phiDStar < -0.5*pi) phiDStar = phiDStar + 2*pi;
-
-                                       ((TH1F*)fOutput->FindObject("PhiTrigger"))->Fill(phiDStar);
-
-                                       
-                                               
-                                               if (phiHad > 1.5*pi) phiHad = phiHad - 2*pi;
-                                               if (phiHad < -0.5*pi) phiHad = phiHad + 2*pi;
-                                               ((TH1F*)fOutput->FindObject("PhiPart"))->Fill(phiHad);
-                                       
-                               }
                                
-                               if(isInSideBand) {
-
-                                       FillSideBandCorrelations(ptDStar,phiDStar,etaDStar,phiHad,etaHad); // function for sidebands
-                                       if (phiDStar > 1.5*pi) phiDStar = phiDStar - 2*pi;
-                                       if (phiDStar < -0.5*pi) phiDStar = phiDStar + 2*pi;
-                                       ((TH1F*)fOutput->FindObject("PhiSideBand"))->Fill(phiDStar);
-
-                                       counterSB++;
-                               }
+                                       if(fselect==1) ((TH3D*)fOutput->FindObject("DPhiDStarHadron"))->Fill(DeltaPhi,ptDStar,DeltaEta);
+                                       if(fselect==2) ((TH3D*)fOutput->FindObject("DPhiDStarKaon"))->Fill(DeltaPhi,ptDStar,DeltaEta);
+                                       if(fselect==3) ((TH3D*)fOutput->FindObject("DPhiDStarKZero"))->Fill(DeltaPhi,ptDStar,DeltaEta);
+                                   ((TH2F*)fOutput->FindObject("PhiEtaPart"))->Fill(phiHad,etaHad);
+                                       //counterPeak++; // count tracks per peak per event
                                
-                       } // end loop on tracks 
-                       
-                       if(counterPeak) ((TH1D*)fOutput->FindObject("NofTracksInPeak"))->Fill(counterPeak);
-                       if(counterSB) ((TH1D*)fOutput->FindObject("NofTracksInSB"))->Fill(counterSB);
-                       
-                       
-                       
+                               }
                        
-               } // end if SE Analysis
-               
-               if(fmixing) { // analysis on Mixed Events
-                       if (pool->IsReady()|| pool->GetCurrentNEvents()>=5){ // check if the pool is ready
-               
-                               pool->PrintInfo();
-       
-                               Int_t multbinflag = pool->MultBinIndex();
-                               Int_t zvtxflag = pool->ZvtxBinIndex();
-                               if(isInPeak) ((TH2I*)fOutput->FindObject("EventMixingCheck"))->Fill(multbinflag,zvtxflag); 
+                               if(isInSideBand) {
+                               
+                                       if(fselect==1) ((TH3D*)fOutput->FindObject("bkgDPhiDStarHadron"))->Fill(DeltaPhi,ptDStar,DeltaEta);
+                                       if(fselect==2) ((TH3D*)fOutput->FindObject("bkgDPhiDStarKaon"))->Fill(DeltaPhi,ptDStar,DeltaEta);
+                                       if(fselect==3) ((TH3D*)fOutput->FindObject("bkgDPhiDStarKZero"))->Fill(DeltaPhi,ptDStar,DeltaEta);
+                               
                                        
-
-                               TObjArray* mixedtracks = 0x0;
                                
-                               for (Int_t jMix=0; jMix<pool->GetCurrentNEvents(); jMix++) {//loop over the events in the pool
-                                       mixedtracks = pool->GetEvent(jMix);
-                                       if(!mixedtracks) cout << "No Mixed tracks " << endl;
-                                       Int_t jMax = mixedtracks->GetEntriesFast();
-
-                                       for(Int_t iMix =0; iMix<jMax; iMix++){ //loop on the tracks of the event
-                                               AliVParticle *redpart = (AliVParticle*)mixedtracks->At(iMix);
-                                               Double_t phiHad=redpart->Phi();
-                                               Double_t etaHad=redpart->Eta();
-                                               Double_t ptHad=redpart->Pt();
-                                               Int_t label = redpart->GetLabel();
-                                               
-                                               
-                                               if(fmontecarlo && isDStarMCtag){ // check correlations of MC tagged DStars in MonteCarlo
-                                                       
-                                                       Int_t PartSource = fCuts2->IsMCpartFromHF(label,fmcArray); // check source of associated particle (hadron/kaon/K0)
-                                                       
-                                                       FillMCTagCorrelations(ptDStar,phiDStar,etaDStar,ptHad,phiHad,etaHad,PartSource);
-                                               }
-
-                                               if(isInPeak) {
-                                                       FillCorrelations(ptDStar,phiDStar,etaDStar,phiHad,etaHad);// function for correlations
-
-                                                               if (phiDStar > 1.5*pi) phiDStar = phiDStar - 2*pi;
-                                                               if (phiDStar < -0.5*pi) phiDStar = phiDStar + 2*pi;
-                                                               
-                                                               ((TH1F*)fOutput->FindObject("PhiTrigger"))->Fill(phiDStar);
-                                                               if (phiHad > 1.5*pi) phiHad = phiHad - 2*pi;
-                                                               if (phiHad < -0.5*pi) phiHad = phiHad + 2*pi;
-                                                               ((TH1F*)fOutput->FindObject("PhiPart"))->Fill(phiHad);
-                                                       
-
-                                                       
-                                               }
-                                               
-                                               if(isInSideBand) FillSideBandCorrelations(ptDStar,phiDStar,etaDStar,phiHad,etaHad); // function for sidebands
-
-                                               } // end loop on tracks
-                               }// end loop on events in pool
-                       } // end if pool is ready
+                                       //counterSB++;
+                               }
                        
-               } // end ME analysis
-               
+                       
+                       } // end loop on track candidates
+               } // end loop on events in the pool
+                               
        }// end loop on D* candidates           
+       cout << "USER EXEC CHECKPOINT 4" << endl;
+       Bool_t updated = fCorrelator->PoolUpdate();
+       if(!updated) AliInfo("Pool was not updated");
        
-       if(fmixing) { // update the pool for Event Mixing
-               if(fselect==1 || fselect==2)pool->UpdatePool(AcceptAndReduceTracks(aodEvent)); // updating the pool for hadrons
-               if(fselect==3) pool->UpdatePool(AcceptAndReduceKZero(aodEvent,0,0)); // updating the pool for K0s
-       }
-       //cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> END OF THE EVENT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<" << endl;
+               //cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> END OF THE EVENT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<" << endl;
        
        PostData(1,fOutput); // set the outputs
        PostData(3,fCounter); // set the outputs
@@ -528,93 +509,6 @@ void AliAnalysisTaskDStarCorrelations::Terminate(Option_t*)
 }
 
 
-//_____________________________________________________
-TObjArray*  AliAnalysisTaskDStarCorrelations::AcceptAndReduceTracks(AliAODEvent* inputEvent){
-       
-       Int_t nTracks = inputEvent->GetNTracks();
-       AliAODVertex * vtx = inputEvent->GetPrimaryVertex();
-       Double_t Bz = inputEvent->GetMagneticField();
-
-       
-       TObjArray* tracksClone = new TObjArray;
-       tracksClone->SetOwner(kTRUE);
-       for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
-               AliAODTrack* track = inputEvent->GetTrack(iTrack);
-               if (! track) continue;
-
-               if(!fCuts2->IsHadronSelected(track,vtx,Bz)) continue; // apply selection of hadrons
-                       
-               
-               if(fselect ==2){        
-                       if(!fCuts2->CheckKaonCompatibility(track,fmontecarlo,fmcArray)) continue; // check if it is a Kaon - data and MC
-                       }
-      
-               AliVParticle * part = (AliVParticle*)track;
-               tracksClone->Add(new AliReducedParticle(part->Eta(), part->Phi(), part->Pt(),track->GetLabel(),track->GetID()));
-               
-       }
-       return tracksClone;
-}
-
-//_____________________________________________________
-TObjArray*  AliAnalysisTaskDStarCorrelations::AcceptAndReduceKZero(AliAODEvent* inputEvent, Int_t loopindex, Int_t plotassociation){
-       
-       Int_t nOfVZeros = inputEvent->GetNumberOfV0s();
-       TObjArray* KZeroClone = new TObjArray;
-       AliAODVertex *vertex1 = (AliAODVertex*)inputEvent->GetPrimaryVertex();
-       Int_t v0label = -1;
-       Int_t pdgDgK0toPipi[2] = {211,211};
-       Double_t mPDGK0=TDatabasePDG::Instance()->GetParticle(310)->Mass();
-       const Int_t size = inputEvent->GetNumberOfV0s();
-       Int_t prevnegID[size];
-       Int_t prevposID[size];
-       for(Int_t iv0 =0; iv0< nOfVZeros; iv0++){// loop on all v0 candidates
-               AliAODv0 *v0 = (static_cast<AliAODEvent*> (inputEvent))->GetV0(iv0);
-               if(!v0) {cout << "is not a v0 at step " << iv0 << endl; continue;}
-               
-               if(!fCuts2->IsKZeroSelected(v0,vertex1)) continue; // check if it is a k0
-           
-               // checks to avoid double counting
-               Int_t negID = -999;
-               Int_t posID = -998;
-               //Int_t a = 0;
-               prevnegID[iv0] = -997;
-               prevposID[iv0]= -996;
-               negID = v0->GetNegID();
-               posID = v0->GetPosID();
-               Bool_t DoubleCounting = kFALSE;
-               
-               for(Int_t k=0; k<iv0; k++){
-                       if(((negID==prevnegID[k])&&(posID==prevposID[k]))||((negID==prevposID[k])&&(posID==prevnegID[k]))){
-                               DoubleCounting = kTRUE;
-                               //a=k;
-                               break;
-                       }//end if
-               } // end for
-               
-               if(DoubleCounting) {cout << "SKIPPING DOUBLE COUNTING" << endl;continue;}
-               else{ prevposID[iv0] = posID; prevnegID[iv0] = negID;}
-               
-               if(fmontecarlo) v0label = v0->MatchToMC(310,fmcArray, 0, pdgDgK0toPipi); //match a K0 short
-               Double_t k0pt = v0->Pt();
-               Double_t k0eta = v0->Eta();
-               Double_t k0Phi = v0->Phi();
-               Double_t k0InvMass = v0->MassK0Short(); 
-
-               if (loopindex == 0) {
-                       if(!plotassociation) ((TH2F*)fOutput->FindObject("KZeroSpectra"))->Fill(k0InvMass,k0pt); // spectra for all k0
-                       if(plotassociation) ((TH2F*)fOutput->FindObject("KZeroSpectraifHF"))->Fill(k0InvMass,k0pt); // spectra for k0 in association with a D*
-               }
-               // if there are more D* candidates per event, loopindex == 0 makes sure you fill the mass spectra only once!
-               
-               if(TMath::Abs(k0InvMass-mPDGK0)>3*0.004) continue; // select candidates within 3 sigma
-               KZeroClone->Add(new AliReducedParticle(k0eta , k0Phi, k0pt,v0label,0));
-               
-       }
-       
-       return KZeroClone;
-}
-
 //_____________________________________________________
 void AliAnalysisTaskDStarCorrelations::DefineHistoForAnalysis(){
        
@@ -647,6 +541,9 @@ void AliAnalysisTaskDStarCorrelations::DefineHistoForAnalysis(){
        TH1F *RecoPtBkg = new TH1F("RecoPtBkg","RECO pt distribution side bands",30,0,30);
        fOutput->Add(RecoPtBkg);
        
+       TH1F *MCtagPtDStar = new TH1F("MCtagPtDStar","RECO pt of MCtagged DStars side bands",30,0,30);
+       fOutput->Add(MCtagPtDStar);
+       
        TH2F *KZeroSpectra = new TH2F("KZeroSpectra","Spectra of K0s",500,0.3,0.8,250,0,25);
        if(fselect==3) fOutput->Add(KZeroSpectra);
        
@@ -672,14 +569,14 @@ void AliAnalysisTaskDStarCorrelations::DefineHistoForAnalysis(){
        MCSources->GetXaxis()->SetBinLabel(5," from b->B");
        if(fmontecarlo) fOutput->Add(MCSources);
        
-       TH1F * PhiTrigger = new TH1F("PhiTrigger","#phi distribution of the trigger particle",36,-0.5*Pi,1.5*Pi);
-       fOutput->Add(PhiTrigger);
+       TH2F * PhiEtaTrigger = new TH2F("PhiEtaTrigger","#phi distribution of the trigger particle",36,-0.5*Pi,1.5*Pi,18,-0.9,0.9);
+       fOutput->Add(PhiEtaTrigger);
        
-       TH1F * PhiSideBand = new TH1F("PhiSideBand","#phi distribution of the sideband particle",36,-0.5*Pi,1.5*Pi);
-       fOutput->Add(PhiSideBand);
+       TH2F * PhiEtaSideBand = new TH2F("PhiEtaSideBand","#phi distribution of the sideband particle",36,-0.5*Pi,1.5*Pi,18,-0.9,0.9);
+       fOutput->Add(PhiEtaSideBand);
        
-       TH1F * PhiPart = new TH1F("PhiPart","#phi distribution of the associated particle",36,-0.5*Pi,1.5*Pi);
-       fOutput->Add(PhiPart);
+       TH2F * PhiEtaPart = new TH2F("PhiEtaPart","#phi distribution of the associated particle",36,-0.5*Pi,1.5*Pi,18,-0.9,0.9);
+       fOutput->Add(PhiEtaPart);
 
 
        //correlations histograms
@@ -745,68 +642,23 @@ void AliAnalysisTaskDStarCorrelations::DefineHistoForAnalysis(){
 }
 
 
-//____________________________  Function for correlations ___________________________________________________
-void AliAnalysisTaskDStarCorrelations::FillCorrelations(Double_t ptTrig, Double_t phiTrig, Double_t etaTrig, Double_t phiTrack, Double_t etaTrack){
-       Double_t pi = TMath::Pi();
-       Double_t deltaPhi, deltaEta;
-       deltaPhi = phiTrig - phiTrack;
-       deltaEta = etaTrig - etaTrack;
-       // set correct Delta Phi range
-       if (deltaPhi > 1.5*pi -pi/32) deltaPhi = deltaPhi - 2*pi;
-       if (deltaPhi < -0.5*pi -pi/32) deltaPhi = deltaPhi + 2*pi;
-       
-               if(fselect==1) ((TH3D*)fOutput->FindObject("DPhiDStarHadron"))->Fill(deltaPhi,ptTrig,deltaEta);
-               if(fselect==2) ((TH3D*)fOutput->FindObject("DPhiDStarKaon"))->Fill(deltaPhi,ptTrig,deltaEta);
-               if(fselect==3) ((TH3D*)fOutput->FindObject("DPhiDStarKZero"))->Fill(deltaPhi,ptTrig,deltaEta);
-       
-       
-       return;
-}
 
-//____________________________  Function for sidebands ___________________________________________________
-void AliAnalysisTaskDStarCorrelations::FillSideBandCorrelations(Double_t ptTrig, Double_t phiTrig, Double_t etaTrig, Double_t phiTrack, Double_t etaTrack){
-       
-       Double_t pi = TMath::Pi();
-       Double_t deltaPhi, deltaEta;
-       deltaPhi = phiTrig - phiTrack;
-       deltaEta = etaTrig - etaTrack;
-       // set correct Delta Phi range
-       if (deltaPhi > 1.5*pi -pi/32) deltaPhi = deltaPhi - 2*pi;
-       if (deltaPhi < -0.5*pi -pi/32) deltaPhi = deltaPhi + 2*pi;
-       
-               if(fselect==1) ((TH3D*)fOutput->FindObject("bkgDPhiDStarHadron"))->Fill(deltaPhi,ptTrig,deltaEta);
-               if(fselect==2) ((TH3D*)fOutput->FindObject("bkgDPhiDStarKaon"))->Fill(deltaPhi,ptTrig,deltaEta);
-               if(fselect==3) ((TH3D*)fOutput->FindObject("bkgDPhiDStarKZero"))->Fill(deltaPhi,ptTrig,deltaEta);
-       
-       
-       return;
-       
-       
-}
+//____________________________  Function for MC correlations ___________________________________________________
+void AliAnalysisTaskDStarCorrelations::FillMCTagCorrelations(Double_t ptTrig, Double_t DelPhi,  Double_t DelEta, Double_t ptTrack, Int_t mcSource){
 
-//____________________________  Function for sidebands ___________________________________________________
-void AliAnalysisTaskDStarCorrelations::FillMCTagCorrelations(Double_t ptTrig, Double_t phiTrig,  Double_t etaTrig, Double_t ptTrack, Double_t phiTrack, Double_t etaTrack, Int_t mcSource){
-Double_t deltaPhi = phiTrig - phiTrack;
-Double_t deltaEta = etaTrig - etaTrack;
-// set correct Delta Phi range
-       
-       Double_t pi = TMath::Pi();
-       
-if (deltaPhi > 1.5*pi -pi/32) deltaPhi = deltaPhi - 2*pi;
-if (deltaPhi < -0.5*pi -pi/32) deltaPhi = deltaPhi + 2*pi;
 
-       if(fselect==1) ((TH3D*)fOutput->FindObject("MCTagDPhiDStarHadron"))->Fill(deltaPhi,ptTrig,deltaEta);
-       if(fselect==2 && ptTrack <1.5) ((TH3D*)fOutput->FindObject("MCTagDPhiDStarKaon"))->Fill(deltaPhi,ptTrig,deltaEta);
-       if(fselect==3) ((TH3D*)fOutput->FindObject("MCTagDPhiDStarKZero"))->Fill(deltaPhi,ptTrig,deltaEta);
+       if(fselect==1) ((TH3D*)fOutput->FindObject("MCTagDPhiDStarHadron"))->Fill(DelPhi,ptTrig,DelEta);
+       if(fselect==2 && ptTrack <1.5) ((TH3D*)fOutput->FindObject("MCTagDPhiDStarKaon"))->Fill(DelPhi,ptTrig,DelEta);
+       if(fselect==3) ((TH3D*)fOutput->FindObject("MCTagDPhiDStarKZero"))->Fill(DelPhi,ptTrig,DelEta);
 
 
 
 ((TH1F*)fOutput->FindObject("MCSources"))->Fill(0);
 
 if (mcSource==44){ // is from charm ->D
-       if(fselect==1) ((TH3D*)fOutput->FindObject("CharmDOriginDPhiDStarHadronMC"))->Fill(deltaPhi,ptTrig,deltaEta);
-       if(fselect==2 && ptTrack <1.5) ((TH3D*)fOutput->FindObject("CharmDOriginDPhiDStarKaonMC"))->Fill(deltaPhi,ptTrig,deltaEta);
-       if(fselect==3) ((TH3D*)fOutput->FindObject("CharmDOriginDPhiDStarKZeroMC"))->Fill(deltaPhi,ptTrig,deltaEta);
+       if(fselect==1) ((TH3D*)fOutput->FindObject("CharmDOriginDPhiDStarHadronMC"))->Fill(DelPhi,ptTrig,DelEta);
+       if(fselect==2 && ptTrack <1.5) ((TH3D*)fOutput->FindObject("CharmDOriginDPhiDStarKaonMC"))->Fill(DelPhi,ptTrig,DelEta);
+       if(fselect==3) ((TH3D*)fOutput->FindObject("CharmDOriginDPhiDStarKZeroMC"))->Fill(DelPhi,ptTrig,DelEta);
        
        
        ((TH1F*)fOutput->FindObject("MCSources"))->Fill(1);
@@ -814,17 +666,17 @@ if (mcSource==44){ // is from charm ->D
        }
 
 if (mcSource==54){ // is from beauty -> D
-       if(fselect==1) ((TH3D*)fOutput->FindObject("BeautyDOriginDPhiDStarHadronMC"))->Fill(deltaPhi,ptTrig,deltaEta);
-       if(fselect==2 && ptTrack <1.5) ((TH3D*)fOutput->FindObject("BeautyDOriginDPhiDStarKaonMC"))->Fill(deltaPhi,ptTrig,deltaEta);
-       if(fselect==3) ((TH3D*)fOutput->FindObject("BeautyDOriginDPhiDStarKZeroMC"))->Fill(deltaPhi,ptTrig,deltaEta);
+       if(fselect==1) ((TH3D*)fOutput->FindObject("BeautyDOriginDPhiDStarHadronMC"))->Fill(DelPhi,ptTrig,DelEta);
+       if(fselect==2 && ptTrack <1.5) ((TH3D*)fOutput->FindObject("BeautyDOriginDPhiDStarKaonMC"))->Fill(DelPhi,ptTrig,DelEta);
+       if(fselect==3) ((TH3D*)fOutput->FindObject("BeautyDOriginDPhiDStarKZeroMC"))->Fill(DelPhi,ptTrig,DelEta);
        if(fselect==3) ((TH1F*)fOutput->FindObject("MCSources"))->Fill(1);
        if(fselect==3) ((TH1F*)fOutput->FindObject("MCSources"))->Fill(3);
        }
 
 if (mcSource==55){ // is from beauty ->B
-       if(fselect==1) ((TH3D*)fOutput->FindObject("BeautyBOriginDPhiDStarHadronMC"))->Fill(deltaPhi,ptTrig,deltaEta);
-       if(fselect==2 && ptTrack <1.5) ((TH3D*)fOutput->FindObject("BeautyBOriginDPhiDStarKaonMC"))->Fill(deltaPhi,ptTrig,deltaEta);
-       if(fselect==3) ((TH3D*)fOutput->FindObject("BeautyOriginBDPhiDStarKZeroMC"))->Fill(deltaPhi,ptTrig,deltaEta);
+       if(fselect==1) ((TH3D*)fOutput->FindObject("BeautyBOriginDPhiDStarHadronMC"))->Fill(DelPhi,ptTrig,DelEta);
+       if(fselect==2 && ptTrack <1.5) ((TH3D*)fOutput->FindObject("BeautyBOriginDPhiDStarKaonMC"))->Fill(DelPhi,ptTrig,DelEta);
+       if(fselect==3) ((TH3D*)fOutput->FindObject("BeautyOriginBDPhiDStarKZeroMC"))->Fill(DelPhi,ptTrig,DelEta);
        if(fselect==3) ((TH1F*)fOutput->FindObject("MCSources"))->Fill(1);
        if(fselect==3) ((TH1F*)fOutput->FindObject("MCSources"))->Fill(4);
        }