fmixing(kFALSE),\r
fFullmode(kFALSE),\r
fSystem(pp),\r
+fEfficiencyVariable(kNone),\r
fReco(kTRUE),\r
fUseEfficiencyCorrection(kFALSE),\r
fUseDmesonEfficiencyCorrection(kFALSE),\r
fUseCentrality(kFALSE),\r
+fUseHadronicChannelAtKineLevel(kFALSE),\r
fPhiBins(32),\r
fEvents(0),\r
fDebugLevel(0),\r
fDisplacement(0),\r
fDim(0),\r
fNofPtBins(0),\r
+fMaxEtaDStar(0.9),\r
fDMesonSigmas(0),\r
\r
fD0Window(0),\r
fmixing(kFALSE),\r
fFullmode(mode),\r
fSystem(syst),\r
+fEfficiencyVariable(kNone),\r
fReco(kTRUE),\r
fUseEfficiencyCorrection(kFALSE),\r
fUseDmesonEfficiencyCorrection(kFALSE),\r
+fUseCentrality(kFALSE),\r
+fUseHadronicChannelAtKineLevel(kFALSE),\r
fPhiBins(32),\r
fEvents(0),\r
fDebugLevel(0),\r
fDisplacement(0),\r
fDim(0),\r
fNofPtBins(0),\r
+fMaxEtaDStar(0.9),\r
fDMesonSigmas(0),\r
fD0Window(0),\r
\r
AliRDHFCutsDStartoKpipi* copyfCuts=new AliRDHFCutsDStartoKpipi(*fCuts);\r
\r
\r
- \r
- \r
+ \r
// Post the D* cuts\r
PostData(3,copyfCuts);\r
\r
// Post the hadron cuts\r
PostData(4,fCuts2);\r
- \r
-\r
- \r
+ \r
return;\r
}\r
\r
void AliAnalysisTaskDStarCorrelations::UserExec(Option_t *){\r
\r
\r
- \r
- \r
if(fDebugLevel){\r
\r
if(fReco) std::cout << "USING RECONSTRUCTION" << std::endl;\r
// ******************************** END event selections **************************************************\r
\r
AliCentrality *centralityObj = 0;\r
- //Int_t multiplicity = -1;\r
Double_t MultipOrCent = -1;\r
\r
if(fUseCentrality){\r
//AliInfo(Form("Centrality is %f", MultipOrCent));\r
}\r
\r
- if(!fUseCentrality){\r
- /* if(fSystem == pp || fSystem == pA){*/\r
- // MultipOrCent = fTracklets->GetNumberOfTracklets();\r
- MultipOrCent = AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aodEvent,-1.,1.);\r
- //AliInfo(Form("multiplicity is %f", MultipOrCent));\r
- }\r
- \r
+ if(!fUseCentrality) MultipOrCent = AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aodEvent,-1.,1.);\r
\r
+ \r
fCorrelator->SetAODEvent(aodEvent); // set the event to be processed\r
\r
((TH1D*)fOutput->FindObject("NofEvents"))->Fill(1);\r
- //\r
- Bool_t correlatorON = fCorrelator->Initialize(); //define the pool for mixing\r
+ \r
+ Bool_t correlatorON = fCorrelator->Initialize(); //define the pool for mixing and check if event is in pool settings\r
if(!correlatorON) {\r
AliInfo("AliHFCorrelator didn't initialize the pool correctly or processed a bad event");\r
return;\r
}\r
\r
if(fmontecarlo) fCorrelator->SetMCArray(fmcArray);\r
- \r
- \r
+ \r
// check the event type\r
// load MC header\r
if(fmontecarlo){\r
Int_t poolbin = fCuts2->GetPoolBin(MultipOrCent, zVtxPosition);\r
\r
\r
- \r
// initialize variables you will need for the D*\r
\r
Double_t ptDStar;//\r
Int_t pdgDgD0toKpi[2]={321,211};\r
\r
Bool_t isDStarCand = kFALSE;\r
- Bool_t isFilled = kFALSE;\r
+ Bool_t isDfromB = kFALSE;\r
Bool_t isEventMixingFilledPeak = kFALSE;\r
Bool_t isEventMixingFilledSB = kFALSE;\r
+ Bool_t EventHasDStarCandidate = kFALSE;\r
+ Bool_t EventHasDZeroSideBandCandidate = kFALSE;\r
+ Bool_t EventHasDStarSideBandCandidate = kFALSE;\r
//loop on D* candidates\r
\r
Int_t looponDCands = 0;\r
Int_t nOfDStarCandidates = 0;\r
Int_t nOfSBCandidates = 0;\r
\r
- \r
- \r
Double_t DmesonEfficiency = 1.;\r
Double_t DmesonWeight = 1.;\r
- Bool_t isDfromB = kFALSE;\r
+ Double_t efficiencyvariable = -999;\r
+ \r
\r
\r
for (Int_t iDStartoD0pi = 0; iDStartoD0pi<looponDCands; iDStartoD0pi++) {\r
AliAODRecoCascadeHF* dstarD0pi;\r
AliAODRecoDecayHF2Prong* theD0particle;\r
AliAODMCParticle* DStarMC;\r
- Short_t daughtercharge;\r
+ Short_t daughtercharge = -2;\r
Int_t trackiddaugh0 = -1; // track id if it is reconstruction - label if it is montecarlo info\r
Int_t trackiddaugh1 = -1;\r
Int_t trackidsoftPi = -1;\r
if (!theD0particle) continue;\r
\r
\r
- \r
// track quality cuts\r
Int_t isTkSelected = fCuts->IsSelected(dstarD0pi,AliRDHFCuts::kTracks); // quality cuts on tracks\r
// region of interest + topological cuts + PID\r
if(!isTkSelected) continue;\r
if(!isSelected) continue;\r
if(!fCuts->IsInFiducialAcceptance(dstarD0pi->Pt(),dstarD0pi->YDstar())) continue;\r
- \r
- // new piece of code\r
- \r
- \r
- // Double_t rapidity = dstarD0pi->YDstar();\r
- \r
- DmesonEfficiency = fCuts2->GetTrigWeight(dstarD0pi->Pt(),MultipOrCent);\r
- \r
- /* if(fDeffMapvsPt){\r
- if(fDebugLevel) std::cout << "Reading pT eff map from " << fDeffMapvsPt->GetName() << std::endl;\r
- Int_t bin=fDeffMapvsPt->FindBin(dstarD0pi->Pt());\r
- if(fDeffMapvsPt->IsBinUnderflow(bin)||fDeffMapvsPt->IsBinOverflow(bin)) DmesonEfficiency = 1.;\r
- else DmesonEfficiency = fDeffMapvsPt->GetBinContent(bin);\r
- \r
- \r
- \r
- \r
- }\r
- if(fDeffMapvsPtvsMult)\r
- {\r
- Int_t bin=fDeffMapvsPtvsMult->FindBin(dstarD0pi->Pt(),MultipOrCent);\r
- if(fDeffMapvsPtvsMult->IsBinUnderflow(bin)||fDeffMapvsPtvsMult->IsBinOverflow(bin)) DmesonEfficiency = 1.;\r
- else DmesonEfficiency = fDeffMapvsPtvsMult->GetBinContent(bin);\r
- }\r
- if(fDeffMapvsPtvsEta){\r
- Int_t bin=fDeffMapvsPtvsEta->FindBin(dstarD0pi->Pt(),rapidity);\r
- if(fDeffMapvsPtvsEta->IsBinUnderflow(bin)||fDeffMapvsPtvsEta->IsBinOverflow(bin)) DmesonEfficiency = 1.;\r
- else DmesonEfficiency = fDeffMapvsPtvsEta->GetBinContent(bin);\r
- \r
- \r
- \r
- \r
- }\r
- */\r
- \r
- \r
- ptDStar = dstarD0pi->Pt();\r
- phiDStar = dstarD0pi->Phi();\r
- etaDStar = dstarD0pi->Eta();\r
+ \r
+ \r
+ ptDStar = dstarD0pi->Pt();\r
+ phiDStar = dstarD0pi->Phi();\r
+ etaDStar = dstarD0pi->Eta();\r
+ if(TMath::Abs(etaDStar) > fMaxEtaDStar) continue;\r
+ if(fEfficiencyVariable == kMult || fEfficiencyVariable == kCentr) efficiencyvariable = MultipOrCent;\r
+ if(fEfficiencyVariable == kEta) efficiencyvariable = etaDStar;\r
+ if(fEfficiencyVariable == kRapidity) efficiencyvariable = dstarD0pi->YDstar();\r
+ if(fEfficiencyVariable == kNone) efficiencyvariable = 0;\r
+ \r
+ // get the D meson efficiency\r
+ DmesonEfficiency = fCuts2->GetTrigWeight(dstarD0pi->Pt(),efficiencyvariable);\r
+ \r
+ \r
\r
if(fUseDmesonEfficiencyCorrection){\r
if(DmesonEfficiency>1.e-5) DmesonWeight = 1./DmesonEfficiency;\r
else DmesonWeight = 1.; \r
\r
// continue;\r
- \r
+ \r
Int_t mcLabelDStar = -999;\r
- if(fmontecarlo){\r
+ if(fmontecarlo){\r
// find associated MC particle for D* ->D0toKpi\r
- mcLabelDStar = dstarD0pi->MatchToMC(413,421,pdgDgDStartoD0pi,pdgDgD0toKpi,fmcArray,kFALSE);\r
+ mcLabelDStar = dstarD0pi->MatchToMC(413,421,pdgDgDStartoD0pi,pdgDgD0toKpi,fmcArray/*,kFALSE*/);\r
if(mcLabelDStar>=0) isDStarMCtag = kTRUE;\r
+ if(!isDStarMCtag) continue;\r
+ AliAODMCParticle *MCDStar = (AliAODMCParticle*)fmcArray->At(mcLabelDStar);\r
+ //check if DStar from B\r
+ Int_t labelMother = MCDStar->GetMother();\r
+ AliAODMCParticle * mother = dynamic_cast<AliAODMCParticle*>(fmcArray->At(labelMother));\r
+ if(!mother) continue;\r
+ Int_t motherPDG =TMath::Abs(mother->PdgCode());\r
+ if((motherPDG>=500 && motherPDG <600) || (motherPDG>=5000 && motherPDG<6000 )) isDfromB = kTRUE;\r
}\r
\r
- \r
\r
phiDStar = fCorrelator->SetCorrectPhiRange(phiDStar);\r
\r
//good D0 candidates\r
if (TMath::Abs(invMassDZero-mPDGD0)<fDMesonSigmas[1]*mD0Window){\r
\r
- if(!fmixing) ((TH3F*)fOutput->FindObject("DeltaInvMass"))->Fill(ptDStar,deltainvMDStar,MultipOrCent,DmesonWeight);\r
- \r
+ if(!fmixing) ((TH2F*)fOutput->FindObject("DeltaInvMass"))->Fill(ptDStar,deltainvMDStar,DmesonWeight);\r
// good D*?\r
if(TMath::Abs(deltainvMDStar-(mPDGDstar-mPDGD0))<fDMesonSigmas[0]*dmDStarWindow){\r
\r
if(!fmixing) ((TH1F*)fOutput->FindObject("RecoPtDStar"))->Fill(ptDStar,DmesonWeight);\r
if(!fmixing) ((TH2F*)fOutput->FindObject("PhiEtaTrigger"))->Fill(phiDStar,etaDStar);\r
isInPeak = kTRUE;\r
+ EventHasDStarCandidate = kTRUE;\r
nOfDStarCandidates++;\r
} // end Good D*\r
\r
// D* sideband?\r
- if((deltainvMDStar-(mPDGDstar-mPDGD0)>4*dmDStarWindow) && (deltainvMDStar-(mPDGDstar-mPDGD0)<8*dmDStarWindow)){\r
+ if((deltainvMDStar-(mPDGDstar-mPDGD0)>fDMesonSigmas[2]*dmDStarWindow) && (deltainvMDStar-(mPDGDstar-mPDGD0)<fDMesonSigmas[3]*dmDStarWindow)){\r
isInDStarSideBand = kTRUE;\r
+ EventHasDStarSideBandCandidate = kTRUE;\r
} // end D* sideband\r
\r
}// end good D0 candidates\r
\r
//D0 sidebands\r
if (TMath::Abs(invMassDZero-mPDGD0)>fDMesonSigmas[2]*mD0Window && TMath::Abs(invMassDZero-mPDGD0)<fDMesonSigmas[3]*mD0Window ){\r
- if(!fmixing)((TH3F*)fOutput->FindObject("bkgDeltaInvMass"))->Fill(ptDStar,deltainvMDStar,MultipOrCent,DmesonWeight);\r
+ if(!fmixing)((TH2F*)fOutput->FindObject("bkgDeltaInvMass"))->Fill(ptDStar,deltainvMDStar,DmesonWeight);\r
if(!fmixing && fFullmode)((TH2F*)fOutput->FindObject("D0InvMassinSB"))->Fill(ptDStar,invMassDZero,DmesonWeight);\r
\r
if(TMath::Abs(deltainvMDStar-(mPDGDstar-mPDGD0))<fDMesonSigmas[0] *dmDStarWindow){ // is in DStar peak region?\r
if(!fmixing) ((TH1F*)fOutput->FindObject("RecoPtBkg"))->Fill(ptDStar,DmesonWeight);\r
isInDZeroSideBand = kTRUE;\r
+ EventHasDZeroSideBandCandidate = kTRUE;\r
nOfSBCandidates++;\r
if(!fmixing) ((TH2F*)fOutput->FindObject("PhiEtaSideBand"))->Fill(phiDStar,etaDStar);\r
}\r
\r
}//end if sidebands\r
\r
- // getting the number of triggers in the MCtag D* case\r
- if(fmontecarlo && isDStarMCtag) ((TH1F*)fOutput->FindObject("MCtagPtDStar"))->Fill(ptDStar);\r
+ \r
\r
\r
if(!isInPeak && !isInDStarSideBand && !isInDZeroSideBand) continue; // skip if it is not side band or peak event - SAVE CPU TIME\r
\r
\r
// check properties of the events containing the D*\r
- \r
- \r
- \r
- if(isInPeak &&!isFilled) {\r
- \r
- if(fFullmode) ((TH2F*)fOutput->FindObject("EventPropsCheckifDStar"))->Fill(MultipOrCent,zVtxPosition);\r
- isFilled = kTRUE;\r
- }\r
+\r
+ \r
\r
isDStarCand = kTRUE;\r
\r
Int_t DStarLabel = -1;\r
\r
if(!fReco){ // use pure MC information\r
- \r
- \r
- // check if DStar from B\r
- \r
- \r
- \r
+ \r
+ // get the DStar Particle\r
DStarMC = dynamic_cast<AliAODMCParticle*>(fmcArray->At(iDStartoD0pi));\r
if (!DStarMC) {\r
AliWarning("Careful: DStar MC Particle not found in tree, skipping");\r
continue;\r
}\r
DStarLabel = DStarMC->GetLabel();\r
- if(DStarLabel>0)isDStarMCtag = kTRUE;\r
+ if(DStarLabel>0)isDStarMCtag = kTRUE;\r
\r
Int_t PDG =TMath::Abs(DStarMC->PdgCode());\r
- \r
if(PDG !=413) continue; // skip if it is not a DStar\r
// check fiducial acceptance\r
- if(!fCuts->IsInFiducialAcceptance(DStarMC->Pt(),DStarMC->Y())) continue;\r
- \r
- //chech if DStar from B\r
- \r
+ if(!fCuts->IsInFiducialAcceptance(DStarMC->Pt(),DStarMC->Y())) continue;\r
\r
+ //check if DStar from B\r
Int_t labelMother = DStarMC->GetMother();\r
- \r
AliAODMCParticle * mother = dynamic_cast<AliAODMCParticle*>(fmcArray->At(labelMother));\r
- \r
- if(!mother) continue;\r
+ if(!mother) continue;\r
Int_t motherPDG =TMath::Abs(mother->PdgCode());\r
- \r
- \r
- \r
- if((motherPDG>=500 && motherPDG <600) || (motherPDG>=5000 && motherPDG<6000 ))\r
- {isDfromB = kTRUE; }\r
- \r
- \r
- //end check\r
- \r
- \r
- \r
- \r
- Bool_t isDZero = kFALSE;\r
- Bool_t isSoftPi = kFALSE;\r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- //check decay channel on MC ************************************************\r
- \r
- Int_t NDaugh = DStarMC->GetNDaughters();\r
- if(NDaugh != 2) continue; // skip decay channels w/0 2 prongs\r
- for(Int_t i=0; i<NDaugh;i++){ // loop on daughters\r
- \r
- Int_t daugh_label = DStarMC->GetDaughter(i);\r
- AliAODMCParticle* mcDaughter = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daugh_label));\r
- if(!mcDaughter) continue;\r
- Int_t daugh_pdg = TMath::Abs(mcDaughter->GetPdgCode());\r
- if(fDebugLevel) std::cout << "Daughter " << i << " pdg code is " << daugh_pdg << std::endl;\r
+ if((motherPDG>=500 && motherPDG <600) || (motherPDG>=5000 && motherPDG<6000 )) isDfromB = kTRUE;\r
+ \r
+ Bool_t isDZero = kFALSE;\r
+ Bool_t isSoftPi = kFALSE;\r
+ \r
+ if(fUseHadronicChannelAtKineLevel){\r
+ //check decay channel on MC ************************************************\r
+ Int_t NDaugh = DStarMC->GetNDaughters();\r
+ if(NDaugh != 2) continue; // skip decay channels w/0 2 prongs\r
+ \r
+ for(Int_t i=0; i<NDaugh;i++){ // loop on daughters\r
+ Int_t daugh_label = DStarMC->GetDaughter(i);\r
+ AliAODMCParticle* mcDaughter = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daugh_label));\r
+ if(!mcDaughter) continue;\r
+ Int_t daugh_pdg = TMath::Abs(mcDaughter->GetPdgCode());\r
+ if(fDebugLevel) std::cout << "Daughter " << i << " pdg code is " << daugh_pdg << std::endl;\r
\r
- if(daugh_pdg == 421) {isDZero = kTRUE;\r
- Int_t NDaughD0 = mcDaughter->GetNDaughters();\r
- if(NDaughD0 != 2) continue; // skip decay channels w/0 2 prongs\r
- trackiddaugh0 = mcDaughter->GetDaughter(0);\r
- trackiddaugh1 = mcDaughter->GetDaughter(1);\r
+ if(daugh_pdg == 421) {isDZero = kTRUE;\r
+ Int_t NDaughD0 = mcDaughter->GetNDaughters();\r
+ if(NDaughD0 != 2) continue; // skip decay channels w/0 2 prongs\r
+ trackiddaugh0 = mcDaughter->GetDaughter(0);\r
+ trackiddaugh1 = mcDaughter->GetDaughter(1);\r
+ Bool_t isKaon = kFALSE;\r
+ Bool_t isPion = kFALSE;\r
\r
- Bool_t isKaon = kFALSE;\r
- Bool_t isPion = kFALSE;\r
- \r
- for(Int_t k=0;k<NDaughD0;k++){\r
- \r
- Int_t labelD0daugh = mcDaughter->GetDaughter(k);\r
- AliAODMCParticle* mcGrandDaughter = dynamic_cast<AliAODMCParticle*>(fmcArray->At(labelD0daugh));\r
- if(!mcGrandDaughter) continue;\r
- Int_t granddaugh_pdg = TMath::Abs(mcGrandDaughter->GetPdgCode());\r
- if(granddaugh_pdg==321) isKaon = kTRUE;\r
- if(granddaugh_pdg==211) isPion = kTRUE;\r
- }\r
- if(!isKaon || !isKaon) continue; // skip if not correct decay channel of D0\r
- }\r
+ for(Int_t k=0;k<NDaughD0;k++){\r
+ Int_t labelD0daugh = mcDaughter->GetDaughter(k);\r
+ AliAODMCParticle* mcGrandDaughter = dynamic_cast<AliAODMCParticle*>(fmcArray->At(labelD0daugh));\r
+ if(!mcGrandDaughter) continue;\r
+ Int_t granddaugh_pdg = TMath::Abs(mcGrandDaughter->GetPdgCode());\r
+ if(granddaugh_pdg==321) isKaon = kTRUE;\r
+ if(granddaugh_pdg==211) isPion = kTRUE;\r
+ }\r
+ if(!isKaon || !isKaon) continue; // skip if not correct decay channel of D0\r
+ }\r
\r
- if(daugh_pdg == 211) {\r
- isSoftPi = kTRUE;\r
- daughtercharge = mcDaughter->Charge();\r
- trackidsoftPi = daugh_label;}\r
- }\r
- \r
- \r
- if(!isDZero || !isSoftPi) continue; // skip if not correct decay channel\r
- \r
- \r
- // end check decay channel\r
+ if(daugh_pdg == 211) {\r
+ isSoftPi = kTRUE;\r
+ daughtercharge = mcDaughter->Charge();\r
+ trackidsoftPi = daugh_label;}\r
+ }\r
+ if(!isDZero || !isSoftPi) continue; // skip if not correct decay channel\r
+ } // end check decay channel\r
\r
ptDStar = DStarMC->Pt();\r
phiDStar = DStarMC->Phi();\r
etaDStar = DStarMC->Eta();\r
+ \r
+ if(TMath::Abs(etaDStar) > fMaxEtaDStar) continue;\r
\r
} // end use pure MC information\r
\r
- \r
- // check if it is a DStar from B\r
- \r
- \r
+ \r
+ // getting the number of triggers in the MCtag D* case\r
+ if(fmontecarlo && isDStarMCtag) ((TH1F*)fOutput->FindObject("MCtagPtDStar"))->Fill(ptDStar);\r
if(fmontecarlo && isDStarMCtag && !isDfromB) ((TH1D*)fOutputMC->FindObject("MCtagPtDStarfromCharm"))->Fill(ptDStar);\r
if(fmontecarlo && isDStarMCtag && isDfromB) ((TH1D*)fOutputMC->FindObject("MCtagPtDStarfromBeauty"))->Fill(ptDStar);\r
\r
\r
fCorrelator->SetTriggerParticleProperties(ptDStar,phiDStar,etaDStar); // pass to the object the necessary trigger part parameters\r
- \r
- \r
fCorrelator->SetTriggerParticleDaughterCharge(daughtercharge);\r
\r
\r
// ************************************************ CORRELATION ANALYSIS STARTS HERE\r
\r
\r
- \r
- \r
Bool_t execPool = fCorrelator->ProcessEventPool();\r
\r
\r
((TH1D*)fOutput->FindObject("CheckPoolReadiness"))->Fill(2);\r
isEventMixingFilledSB=kTRUE;\r
}\r
- \r
- \r
}\r
\r
Int_t NofEventsinPool = 1;\r
if(fmixing) NofEventsinPool = fCorrelator->GetNofEventsInPool();\r
\r
- // if(fmixing) cout << "Nof events in pool = " << NofEventsinPool << endl;\r
\r
for (Int_t jMix =0; jMix < NofEventsinPool; jMix++){// loop on events in the pool; if it is SE analysis, stops at one\r
\r
Bool_t analyzetracks = fCorrelator->ProcessAssociatedTracks(jMix);\r
- \r
if(!analyzetracks) {\r
AliInfo("AliHFCorrelator::Cannot process the track array");\r
continue;\r
\r
//initialization of variables for correlations with leading particles\r
Double_t DeltaPhiLeading = -999.;\r
- Double_t DeltaEtaLeading = -999.;\r
- //Double_t ptleading = -999.;\r
- // Int_t labelleading = -999;\r
- \r
- // Int_t crosscheck = (Int_t)((fCorrelator->GetTrackArray())->GetEntriesFast());\r
- \r
+ Double_t DeltaEtaLeading = -999.;\r
+ \r
\r
Int_t NofTracks = fCorrelator->GetNofTracks();\r
\r
\r
Double_t weight;\r
\r
- for(Int_t iTrack = 0; iTrack<NofTracks; iTrack++){ // looping on track candidates\r
- Bool_t runcorrelation = fCorrelator->Correlate(iTrack);\r
- if(!runcorrelation) continue;\r
+ for(Int_t iTrack = 0; iTrack<NofTracks; iTrack++){ // looping on track candidates\r
+ Bool_t runcorrelation = fCorrelator->Correlate(iTrack);\r
+ if(!runcorrelation) continue;\r
\r
- Double_t DeltaPhi = fCorrelator->GetDeltaPhi();\r
- Double_t DeltaEta = fCorrelator->GetDeltaEta();\r
+ Double_t DeltaPhi = fCorrelator->GetDeltaPhi();\r
+ Double_t DeltaEta = fCorrelator->GetDeltaEta();\r
\r
- AliReducedParticle * hadron = fCorrelator->GetAssociatedParticle();\r
- if(!hadron) {/*cout << "No Hadron" << endl;*/ continue;}\r
- \r
- Double_t ptHad = hadron->Pt();\r
- Double_t phiHad = hadron->Phi();\r
- Double_t etaHad = hadron->Eta();\r
- Int_t label = hadron->GetLabel();\r
- Int_t trackid = hadron->GetID();\r
- Double_t efficiency = hadron->GetWeight();\r
- \r
- weight = 1;\r
- if(fUseEfficiencyCorrection && efficiency){\r
- //weight = 1./efficiency;\r
- weight = DmesonWeight * (1./efficiency);\r
- }\r
- // weight = DmesonWeight * (1./efficiency);\r
- \r
- phiHad = fCorrelator->SetCorrectPhiRange(phiHad);\r
+ AliReducedParticle * hadron = fCorrelator->GetAssociatedParticle();\r
+ if(!hadron) {/*cout << "No Hadron" << endl;*/ continue;}\r
\r
+ Double_t ptHad = hadron->Pt();\r
+ Double_t phiHad = hadron->Phi();\r
+ Double_t etaHad = hadron->Eta();\r
+ Int_t label = hadron->GetLabel();\r
+ Int_t trackid = hadron->GetID();\r
+ Double_t efficiency = hadron->GetWeight();\r
\r
- if(fFullmode) ((TH2F*)fOutput->FindObject("WeightChecks"))->Fill(ptHad,efficiency);\r
- \r
- arraytofill[0] = DeltaPhi;\r
- arraytofill[1] = DeltaEta;\r
- arraytofill[2] = ptDStar;\r
- arraytofill[3] = ptHad;\r
- arraytofill[4] = poolbin;\r
+ weight = 1;\r
+ if(fUseEfficiencyCorrection && efficiency){\r
+ weight = DmesonWeight * (1./efficiency);\r
+ }\r
+ \r
+ phiHad = fCorrelator->SetCorrectPhiRange(phiHad);\r
\r
\r
+ if(fFullmode) ((TH2F*)fOutput->FindObject("WeightChecks"))->Fill(ptHad,efficiency);\r
\r
+ arraytofill[0] = DeltaPhi;\r
+ arraytofill[1] = DeltaEta;\r
+ arraytofill[2] = ptDStar;\r
+ arraytofill[3] = ptHad;\r
+ arraytofill[4] = poolbin;\r
+ \r
\r
- MCarraytofill[0] = DeltaPhi;\r
- MCarraytofill[1] = DeltaEta;\r
- MCarraytofill[2] = ptDStar;\r
- MCarraytofill[3] = etaDStar;\r
- MCarraytofill[4] = ptHad;\r
+ MCarraytofill[0] = DeltaPhi;\r
+ MCarraytofill[1] = DeltaEta;\r
+ MCarraytofill[2] = ptDStar;\r
+ MCarraytofill[3] = ptHad;\r
+ MCarraytofill[4] = poolbin;\r
\r
- Bool_t isDdaughter = kFALSE;\r
+ \r
if(fmontecarlo){\r
if(label<0 && fFullmode) ((TH2D*)fOutputMC->FindObject("TrackLabels"))->Fill(0.,NofTracks);\r
if(label>=0 && fFullmode) ((TH2D*)fOutputMC->FindObject("TrackLabels"))->Fill(1.,NofTracks);\r
if(label<0) continue; // skip track with wrong label\r
}\r
- if(!fmixing && fReco){ // skip D* Daughetrs if it is reconstruced DStar\r
- if(trackid == trackiddaugh0) continue;\r
- if(trackid == trackiddaugh1) continue;\r
- if(trackid == trackidsoftPi) continue;\r
- }\r
- if(!fmixing && !fReco && fmontecarlo){ // skip D* Daughetrs if it is Pure MCDStar\r
- // if(label == trackiddaugh0) continue;\r
- // if(label == trackiddaugh1) continue;\r
- // if(label == trackidsoftPi) continue;\r
- Int_t hadronlabel = label;\r
- for(Int_t k=0; k<4;k++){ // go back 4 generations and check the mothers\r
- if(DStarLabel<0){ break;}\r
- if(hadronlabel<0) { break;}\r
- AliAODMCParticle* mcParticle = dynamic_cast<AliAODMCParticle*>(fmcArray->At(hadronlabel));\r
- if(!mcParticle) {AliInfo("NO MC PARTICLE"); break;}\r
- \r
- hadronlabel = mcParticle->GetMother();\r
- if(hadronlabel == DStarLabel) isDdaughter = kTRUE;\r
- }\r
- \r
+ \r
+ Bool_t isDdaughter = kFALSE;\r
+ // skip the D daughters in the correlation\r
+ if(!fmixing && fReco){\r
+ if(trackid == trackiddaugh0) continue;\r
+ if(trackid == trackiddaugh1) continue;\r
+ if(trackid == trackidsoftPi) continue;\r
+ }\r
+ \r
+ if(!fmixing && !fReco){\r
+ AliAODMCParticle *part = (AliAODMCParticle*)fmcArray->At(label);\r
+ if(!part) continue;\r
+ if(IsDDaughter(DStarMC, part)) continue;\r
+ cout << "Skipping DStar daugheter " << endl;\r
+ }\r
+ if(!fmixing && !fReco && fmontecarlo){ // skip D* Daughetrs if it is Pure MCDStar\r
+ Int_t hadronlabel = label;\r
+ for(Int_t k=0; k<4;k++){ // go back 4 generations and check the mothers\r
+ if(DStarLabel<0){ break;}\r
+ if(hadronlabel<0) { break;}\r
+ AliAODMCParticle* mcParticle = dynamic_cast<AliAODMCParticle*>(fmcArray->At(hadronlabel));\r
+ if(!mcParticle) {AliInfo("NO MC PARTICLE"); break;}\r
+ hadronlabel = mcParticle->GetMother();\r
+ if(hadronlabel == DStarLabel) isDdaughter = kTRUE;\r
+ }\r
\r
- if(isDdaughter && fDebugLevel){\r
- std::cout << "It is the D* daughter with label " << label << std::endl;\r
- std::cout << "Daughter 0 label = " << trackiddaugh0 << std::endl;\r
- std::cout << "Daughter 1 label = " << trackiddaugh1 << std::endl;\r
- std::cout << "Soft pi label = " << trackidsoftPi << std::endl;\r
- }\r
+ if(isDdaughter && fDebugLevel){\r
+ std::cout << "It is the D* daughter with label " << label << std::endl;\r
+ std::cout << "Daughter 0 label = " << trackiddaugh0 << std::endl;\r
+ std::cout << "Daughter 1 label = " << trackiddaugh1 << std::endl;\r
+ std::cout << "Soft pi label = " << trackidsoftPi << std::endl;\r
+ }\r
\r
if(isDdaughter) continue; // skip if track is from DStar\r
}\r
\r
- // from here on it is up to the user to decide what object to fill\r
+ // ================ FILL CORRELATION HISTOGRAMS ===============================\r
\r
+ // monte carlo case (mc tagged D*)\r
if((fmontecarlo && isDStarMCtag) || (fmontecarlo && !fReco)){ // check correlations of MC tagged DStars in MonteCarlo\r
\r
Bool_t* PartSource = fCuts2->IsMCpartFromHF(label,fmcArray); // check source of associated particle (hadron/kaon/K0)\r
((THnSparseF*)fOutputMC->FindObject("MCDStarCorrelationsDStarHadron"))->Fill(MCarraytofill);\r
\r
delete[] PartSource;\r
- \r
}\r
+ \r
+ // Good DStar canidates\r
if(isInPeak) {\r
\r
if(!fReco && TMath::Abs(etaHad)>0.8) continue; // makes sure you study the correlation on MC truth only if particles are in acceptance\r
- \r
- if(fselect==1) ((THnSparseF*)fOutput->FindObject("CorrelationsDStarHadron"))->Fill(arraytofill,weight);\r
+ if(fselect==1) ((THnSparseF*)fOutput->FindObject("CorrelationsDStarHadron"))->Fill(arraytofill,weight);\r
if(fselect==2) ((THnSparseF*)fOutput->FindObject("CorrelationsDStarKaon"))->Fill(arraytofill,weight);\r
if(fselect==3) ((THnSparseF*)fOutput->FindObject("CorrelationsDStarKZero"))->Fill(arraytofill,weight);\r
\r
((TH3F*)fOutput->FindObject("PhiEtaPart"))->Fill(phiHad,etaHad,MultipOrCent);\r
if(fFullmode)((TH1D*)fOutput->FindObject("TracksInPeakSpectra"))->Fill(ptHad);\r
- \r
- //counterPeak++; // count tracks per peak per event\r
- \r
+ \r
}\r
+ \r
+ // Sidebands from D0 candidate\r
if(isInDZeroSideBand) {\r
\r
if(!fReco && TMath::Abs(etaHad)>0.8) continue; // makes sure you study the correlation on MC truth only if particles are in acceptance\r
- \r
- \r
if(fselect==1) ((THnSparseF*)fOutput->FindObject("DZeroBkgCorrelationsDStarHadron"))->Fill(arraytofill,weight);\r
if(fselect==2) ((THnSparseF*)fOutput->FindObject("DZeroBkgCorrelationsDStarKaon"))->Fill(arraytofill,weight);\r
if(fselect==3) ((THnSparseF*)fOutput->FindObject("DZeroBkgCorrelationsDStarKZero"))->Fill(arraytofill,weight);\r
\r
if(fFullmode) ((TH1D*)fOutput->FindObject("TracksInSBSpectra"))->Fill(ptHad);\r
\r
- \r
- //counterSB++;\r
- }\r
+ }\r
+ \r
+ // Sidebands from D* candidate\r
if(isInDStarSideBand) {\r
\r
if(!fReco && TMath::Abs(etaHad)>0.8) continue; // makes sure you study the correlation on MC truth only if particles are in acceptance\r
- \r
- \r
if(fselect==1 && fFullmode) ((THnSparseF*)fOutput->FindObject("DStarBkgCorrelationsDStarHadron"))->Fill(arraytofill,weight);\r
if(fselect==2 && fFullmode) ((THnSparseF*)fOutput->FindObject("DStarBkgCorrelationsDStarKaon"))->Fill(arraytofill,weight);\r
if(fselect==3 && fFullmode) ((THnSparseF*)fOutput->FindObject("DStarBkgCorrelationsDStarKZero"))->Fill(arraytofill,weight);\r
- \r
- \r
- \r
- //counterSB++;\r
+\r
}\r
\r
\r
if(isInPeak && fFullmode) ((TH3D*)fOutput->FindObject("LeadingCand"))->Fill(DeltaPhiLeading,ptDStar,DeltaEtaLeading);\r
if(isInDZeroSideBand && fFullmode) ((TH3D*)fOutput->FindObject("LeadingSB"))->Fill(DeltaPhiLeading,ptDStar,DeltaEtaLeading);\r
\r
- if(fmontecarlo && isDStarMCtag){\r
- // Bool_t* LeadPartSource = fCuts2->IsMCpartFromHF(labelleading,fmcArray);\r
- // FillMCTagLeadingCorrelations(ptDStar,DeltaPhiLeading,DeltaEtaLeading,LeadPartSource);\r
- \r
- }\r
- \r
} // end loop on events in the pool\r
\r
}// end loop on D* candidates\r
\r
\r
+ \r
+ // check events with D* or SB canidates\r
+ if(fFullmode && EventHasDStarCandidate) ((TH2F*)fOutput->FindObject("EventPropsCheckifDStar"))->Fill(MultipOrCent,zVtxPosition);\r
+ if(fFullmode && EventHasDZeroSideBandCandidate) ((TH2F*)fOutput->FindObject("EventPropsCheckifDZeroSB"))->Fill(MultipOrCent,zVtxPosition);\r
+ \r
+ if(fFullmode && EventHasDStarCandidate) ((TH2F*)fOutput->FindObject("EventPropsCheckifDStarSB"))->Fill(MultipOrCent,zVtxPosition);\r
+ \r
+ \r
if(fFullmode) ((TH2F*)fOutput->FindObject("DStarCandidates"))->Fill(nOfDStarCandidates,MultipOrCent);\r
if(fFullmode) ((TH2F*)fOutput->FindObject("SBCandidates"))->Fill(nOfSBCandidates,MultipOrCent);\r
\r
+ // update event pool\r
Bool_t updated = fCorrelator->PoolUpdate();\r
\r
// if(updated) EventMixingChecks(aodEvent);\r
if(!updated) AliInfo("Pool was not updated");\r
\r
- \r
- \r
\r
} //end the exec\r
\r
\r
return;\r
}\r
-\r
+//_____________________________________________________\r
+Bool_t AliAnalysisTaskDStarCorrelations::IsDDaughter(AliAODMCParticle* d, AliAODMCParticle* track) const {\r
+ \r
+ //Daughter removal in MCKine case\r
+ Bool_t isDaughter = kFALSE;\r
+ Int_t labelD0 = d->GetLabel();\r
+ \r
+ Int_t mother = track->GetMother();\r
+ \r
+ //Loop on the mothers to find the D0 label (it must be the trigger D0, not a generic D0!)\r
+ while (mother > 0){\r
+ AliAODMCParticle* mcMoth = dynamic_cast<AliAODMCParticle*>(fmcArray->At(mother)); //it's the mother of the track!\r
+ if (mcMoth){\r
+ if (mcMoth->GetLabel() == labelD0) isDaughter = kTRUE;\r
+ mother = mcMoth->GetMother(); //goes back by one\r
+ } else{\r
+ AliError("Failed casting the mother particle!");\r
+ break;\r
+ }\r
+ }\r
+ \r
+ return isDaughter;\r
+}\r
\r
//_____________________________________________________\r
void AliAnalysisTaskDStarCorrelations::DefineThNSparseForAnalysis(){\r
Double_t binLowLimitSparse[5]={lowcorrbin,-1.6, 0, 0,-0.5};\r
Double_t binUpLimitSparse[5]= {upcorrbin, 1.6,30,25,nbinsPool-0.5};\r
\r
- Int_t MCnbinsSparse[7]={nbinscorr,40,50,40,250,10,2};\r
- Double_t MCbinLowLimitSparse[7]={lowcorrbin,-2,0.,-1,0,0.5,-0.5};\r
- Double_t MCbinUpLimitSparse[7]={upcorrbin,2,50,1,25,9.5,1.5};\r
+ Int_t MCnbinsSparse[7]= {nbinscorr, 32,30,250,nbinsPool,10,2}; \r
+ Double_t MCbinLowLimitSparse[7]={lowcorrbin,-1.6, 0, 0,-0.5,-0.5,-0.5}; // \r
+ Double_t MCbinUpLimitSparse[7]= {upcorrbin, 1.6,30,25,nbinsPool-0.5,9.5,1.5};\r
+ \r
TString sparsename = "CorrelationsDStar";\r
if(fselect==1) sparsename += "Hadron";\r
if(fselect==2) sparsename += "Kaon";\r
\r
//TH2F *DeltaInvMass = new TH2F("DeltaInvMass","K#pi#pi - K#pi invariant mass distribution",300,0,30,750,0.1,0.2);\r
//if(!fmixing) fOutput->Add(DeltaInvMass);\r
- TH3F *DeltaInvMass = new TH3F("DeltaInvMass","K#pi#pi - K#pi invariant mass distribution",30,0,30,750,0.1,0.2,100,0,100);\r
+ TH2F *DeltaInvMass = new TH2F("DeltaInvMass","K#pi#pi - K#pi invariant mass distribution; D* p_{T}; #DeltaInvMass",30,0,30,750,0.1,0.2);\r
if(!fmixing) fOutput->Add(DeltaInvMass);\r
\r
- TH3F *bkgDeltaInvMass = new TH3F("bkgDeltaInvMass","K#pi#pi - K#pi invariant mass distribution",30,0,30,750,0.1,0.2,100,0,100);\r
+ TH2F *bkgDeltaInvMass = new TH2F("bkgDeltaInvMass","K#pi#pi - K#pi invariant mass distribution; SB p_{T}; #DeltaInvMass",30,0,30,750,0.1,0.2);\r
if(!fmixing) fOutput->Add(bkgDeltaInvMass);\r
\r
DeltaInvMass->Sumw2();\r
TH2F * EventPropsCheckifDStar = new TH2F("EventPropsCheckifDStar","Properties of the event with D* Cand; Multiplicity; ZVtx Position [cm]",1000,0,1000,40,-10,10);\r
if(fFullmode)fOutput->Add(EventPropsCheckifDStar);\r
\r
+ TH2F * EventPropsCheckifDZeroSB = new TH2F("EventPropsCheckifDZeroSB","Properties of the event with D* Cand; Multiplicity; ZVtx Position [cm]",1000,0,1000,40,-10,10);\r
+ if(fFullmode)fOutput->Add(EventPropsCheckifDZeroSB);\r
+ \r
+ TH2F * EventPropsCheckifDStarSB = new TH2F("EventPropsCheckifDStarSB","Properties of the event with D* Cand; Multiplicity; ZVtx Position [cm]",1000,0,1000,40,-10,10);\r
+ if(fFullmode)fOutput->Add(EventPropsCheckifDStarSB);\r
+ \r
\r
TH2F * WeightChecks = new TH2F("WeightChecks","Checks on efficiency correction",300,0,30,100,0.005,1.005);\r
if(fFullmode)fOutput->Add(WeightChecks);\r