/* $Id$ */
-#include <TDatabasePDG.h>
+//#include <TDatabasePDG.h>
#include <TParticle.h>
#include <TVector3.h>
#include <TChain.h>
#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)
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),
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),
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;}
if(fDebug > 1) printf("AliAnalysisTaskDStarCorrelations::Init() \n");
AliRDHFCutsDStartoKpipi* copyfCuts=new AliRDHFCutsDStartoKpipi(*fCuts);
+
+
+
+
// Post the D* cuts
PostData(2,copyfCuts);
// 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;
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;
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++) {
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;
}
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){
((TH1F*)fOutput->FindObject("RecoPtDStar"))->Fill(ptDStar);
isInPeak = kTRUE;
+ ((TH2F*)fOutput->FindObject("PhiEtaTrigger"))->Fill(phiDStar,etaDStar);
}
}// end if good candidates
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
}
-//_____________________________________________________
-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(){
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);
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
}
-//____________________________ 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);
}
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);
}