Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 62 additions & 18 deletions PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,12 @@ struct HfCorrelatorFlowCharmHadronsReduced {
Configurable<std::vector<double>> bdtScore0PtMaxs{"bdtScore0PtMaxs", std::vector<double>{0.1, 0.1, 0.1, 0.1, 0.1}, "pT-differential maximum score 0 for charm candidates"};
Configurable<std::vector<double>> bdtScore1PtMins{"bdtScore1PtMins", std::vector<double>{0.1, 0.1, 0.1, 0.1, 0.1}, "pT-differential minimum score 1 for charm candidates"};
Configurable<std::vector<double>> binsPtAssoc{"binsPtAssoc", std::vector<double>{0.3, 1., 2., 50.}, "pT bin limits for associated particles"};
Configurable<float> centralityMin{"centralityMin", 0, "min. centrality"};
Configurable<float> centralityMax{"centralityMax", 10., "max. centrality"};
Configurable<bool> selCentrality{"selCentrality", false, "Use centrality to select events"};
Configurable<bool> selMultiplicity{"selMultiplicity", false, "Use multiplicity to select events"};
Configurable<float> centMin{"centMin", 0, "min. centrality"};
Configurable<float> centMax{"centMax", 10., "max. centrality"};
Configurable<float> multMin{"multMin", 0, "min. multiplicity"};
Configurable<float> multMax{"multMax", 10., "max. multiplicity"};
Configurable<float> deltaEtaAbsMin{"deltaEtaAbsMin", 0.5, "min. pair delta eta"};
Configurable<float> deltaEtaAbsMax{"deltaEtaAbsMax", 2., "max. pair delta eta"};
Configurable<float> dcaXYTrackMax{"dcaXYTrackMax", 1., "max. track DCA XY"};
Expand All @@ -106,7 +110,7 @@ struct HfCorrelatorFlowCharmHadronsReduced {
Configurable<int> itsNClsMin{"itsNClsMin", 1, "min. ITS clusters"};
Configurable<float> downSamplePairs{"downSamplePairs", 1., "Fraction of pairs to keep"};
Configurable<float> ptMaxForDownSample{"ptMaxForDownSample", 10., "Maximum pt for the application of the downsampling factor"};
Configurable<float> centMaxForDownSample{"centMaxForDownSample", 10., "Maximum centrality for the application of the downsampling factor"};
Configurable<float> centMultMaxForDownSample{"centMultMaxForDownSample", 10., "Maximum centrality for the application of the downsampling factor"};

SliceCache cache;

Expand All @@ -131,17 +135,30 @@ struct HfCorrelatorFlowCharmHadronsReduced {
ConfigurableAxis binsMultFT0M{"binsMultFT0M", {100, 0., 10000.}, "Multiplicity as FT0M signal amplitude"};
ConfigurableAxis binsCent{"binsCent", {100, 0., 100.}, "Centrality bins"};
ConfigurableAxis binsPosZ{"binsPosZ", {100, -10., 10.}, "Primary vertex z coordinate"};
ConfigurableAxis binsEta{"binsEta", {50, -2., 2.}, "Eta bins"};
ConfigurableAxis binsPhi{"binsPhi", {64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, "Phi bins"};
ConfigurableAxis binsDeltaEta{"binsDeltaEta", {100, -2., 2.}, "Delta Eta bins"};
ConfigurableAxis binsDeltaPhi{"binsDeltaPhi", {64, -3., 3.}, "Delta Phi bins"};
ConfigurableAxis binsDeltaPhi{"binsDeltaPhi", {64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, "Delta Phi bins"};
ConfigurableAxis binsMlOne{"binsMlOne", {100, 0., 1.}, "ML score index 1 bins"};
ConfigurableAxis binsMlTwo{"binsMlTwo", {100, 0., 1.}, "ML score index 2 bins"};

HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject};

void init(InitContext&)
{
if (selCentrality && selMultiplicity) {
LOGP(fatal, "You cannot select events based on both centrality and multiplicity! Please check your configuration!");
}
if (!selCentrality && !selMultiplicity) {
LOGP(fatal, "You must select events based on either centrality or multiplicity! Please check your configuration!");
}

// Fatal if selCentrality and process functions using multiplicity mixing, or selMultiplicity and process functions using centrality mixing
if (selCentrality && (doprocessSameEventCharmHadWMultMix || doprocessMixedEventCharmHadWMultMix || doprocessSameEventHadHadWMultMix || doprocessMixedEventHadHadWMultMix)) {
LOGP(fatal, "You cannot select events based on centrality and process functions using multiplicity mixing! Please check your configuration!");
}
if (selMultiplicity && (doprocessSameEventCharmHadWCentMix || doprocessMixedEventCharmHadWCentMix || doprocessSameEventHadHadWCentMix || doprocessMixedEventHadHadWCentMix)) {
LOGP(fatal, "You cannot select events based on multiplicity and process functions using centrality mixing! Please check your configuration!");
}

if ((doprocessSameEventCharmHadWCentMix && doprocessMixedEventCharmHadWMultMix) ||
(doprocessSameEventCharmHadWMultMix && doprocessMixedEventCharmHadWCentMix) ||
(doprocessSameEventHadHadWCentMix && doprocessMixedEventHadHadWMultMix) ||
Expand Down Expand Up @@ -185,6 +202,8 @@ struct HfCorrelatorFlowCharmHadronsReduced {
}
registry.add("hZVtxPoolBinSE", "z vertex SE", {HistType::kTH2F, {{axisPosZ}, {axisPoolBin}}});
registry.add("hZVtxPoolBinME", "z vertex ME", {HistType::kTH2F, {{axisPosZ}, {axisPoolBin}}});
registry.add("hCollisionsCentMultAll", "Collision centrality vs multiplicity", {HistType::kTH2F, {{axisCent}, {axisMultFT0M}}});
registry.add("hCollisionsCentMultSel", "Collision centrality vs multiplicity", {HistType::kTH2F, {{axisCent}, {axisMultFT0M}}});
registry.add("hPoolBinTrigSE", "Trigger candidates pool bin SE", {HistType::kTH1F, {axisPoolBin}});
registry.add("hPoolBinTrigME", "Trigger candidates pool bin ME", {HistType::kTH1F, {axisPoolBin}});
registry.add("hPoolBinAssocSE", "Associated particles pool bin SE", {HistType::kTH1F, {axisPoolBin}});
Expand All @@ -211,6 +230,18 @@ struct HfCorrelatorFlowCharmHadronsReduced {
}
}

template <typename TColl>
bool isSelCollision(const TColl& collision)
{
bool isSel = false;
if (selCentrality) {
isSel = (collision.centrality() >= centMin && collision.centrality() <= centMax);
} else if (selMultiplicity) {
isSel = (collision.multiplicity() >= multMin && collision.multiplicity() <= multMax);
}
return isSel;
}

/// Get the binning pool associated to the collision
/// \param collision is the collision
/// \param binPolicy is the binning policy for the correlation
Expand Down Expand Up @@ -265,9 +296,12 @@ struct HfCorrelatorFlowCharmHadronsReduced {
const TBinningType& binPolicy)
{
auto collision = pair.template hfcRedCorrColl_as<o2::aod::HfcRedCorrColls>();
if (collision.centrality() < centralityMin || collision.centrality() > centralityMax) {
registry.fill(HIST("hCollisionsCentMultAll"), collision.centrality(), collision.multiplicity());
if (!isSelCollision(collision)) {
return;
}
registry.fill(HIST("hCollisionsCentMultSel"), collision.centrality(), collision.multiplicity());

double const ptTrig = trigCand.ptTrig();
if constexpr (requires { trigCand.bdtScore0Trig(); }) { // ML selection on bkg score for Charm-Had case
if (!isSelBdtScoreCut(trigCand, ptTrig)) {
Expand All @@ -276,7 +310,8 @@ struct HfCorrelatorFlowCharmHadronsReduced {
}
if (downSamplePairs < 1.) {
float const pseudoRndm = ptTrig * 1000. - static_cast<int64_t>(ptTrig * 1000);
if (ptTrig < ptMaxForDownSample && collision.centrality() < centMaxForDownSample && pseudoRndm >= downSamplePairs) {
float collCentMult = selCentrality ? collision.centrality() : collision.multiplicity();
if (ptTrig < ptMaxForDownSample && collCentMult < centMultMaxForDownSample && pseudoRndm >= downSamplePairs) {
return;
}
}
Expand Down Expand Up @@ -317,10 +352,14 @@ struct HfCorrelatorFlowCharmHadronsReduced {
if (trigCands.size() == 0 || assocTracks.size() == 0) {
continue;
}
if (trigColl.centrality() < centralityMin || trigColl.centrality() > centralityMax ||
assocColl.centrality() < centralityMin || assocColl.centrality() > centralityMax) {
registry.fill(HIST("hCollisionsCentMultAll"), trigColl.centrality(), trigColl.multiplicity());
registry.fill(HIST("hCollisionsCentMultAll"), assocColl.centrality(), assocColl.multiplicity());
if (!isSelCollision(trigColl) || !isSelCollision(assocColl)) {
continue;
}
registry.fill(HIST("hCollisionsCentMultSel"), trigColl.centrality(), trigColl.multiplicity());
registry.fill(HIST("hCollisionsCentMultSel"), assocColl.centrality(), assocColl.multiplicity());

int const poolBinTrig = getPoolBin<true>(trigColl, binPolicy);
int const poolBinAssoc = getPoolBin<true>(assocColl, binPolicy);
if (poolBinAssoc != poolBinTrig) {
Expand All @@ -345,8 +384,10 @@ struct HfCorrelatorFlowCharmHadronsReduced {
double const ptAssoc = getPt(assocTrack);
if (downSamplePairs < 1.) {
float const pseudoRndm = ptAssoc * 1000. - static_cast<int64_t>(ptAssoc * 1000);
if (ptTrig < ptMaxForDownSample && trigColl.centrality() < centMaxForDownSample &&
assocColl.centrality() < centMaxForDownSample && pseudoRndm >= downSamplePairs) {
float trigCollCentMult = selCentrality ? trigColl.centrality() : trigColl.multiplicity();
float assocCollCentMult = selCentrality ? assocColl.centrality() : assocColl.multiplicity();
if (ptTrig < ptMaxForDownSample && trigCollCentMult < centMultMaxForDownSample &&
assocCollCentMult < centMultMaxForDownSample && pseudoRndm >= downSamplePairs) {
continue;
}
}
Expand Down Expand Up @@ -430,12 +471,15 @@ struct HfCorrelatorFlowCharmHadronsReduced {
Pair<TCollision, TTrigCand, TTrackAssoc, TBinningType> pairData{binPolicy, numberEventsMixed, -1, collisions, tracksTuple, &cache};

for (const auto& [c1, tracks1, c2, tracks2] : pairData) {
if (!isSelCollision(c1) || !isSelCollision(c2)) {
continue;
}
if (tracks1.size() == 0) {
continue;
}

int poolBin = binPolicy.getBin({c2.posZ(), c2.centrality()});
int poolBinTrigCand = binPolicy.getBin({c1.posZ(), c1.centrality()});
int poolBin = binPolicy.getBin({c2.posZ(), selCentrality ? c2.centrality() : c2.multiplicity()});
int poolBinTrigCand = binPolicy.getBin({c1.posZ(), selCentrality ? c1.centrality() : c1.multiplicity()});

if (poolBin != poolBinTrigCand) {
LOGF(info, "Error, poolBins are different");
Expand All @@ -446,7 +490,6 @@ struct HfCorrelatorFlowCharmHadronsReduced {
if (!isSelBdtScoreCut(trigCand, trigCand.ptTrig())) {
continue;
}
LOGF(info, "Mixed event tracks pair: (%d, %d) from events (%d, %d), track event: (%d, %d)", trigCand.index(), assTrk.index(), c1.index(), c2.index(), trigCand.hfcRedCorrCollId(), assTrk.hfcRedCorrCollId());

double deltaPhi = RecoDecay::constrainAngle(assTrk.phiAssoc() - trigCand.phiTrig(), -o2::constants::math::PIHalf);
double deltaEta = assTrk.etaAssoc() - trigCand.etaTrig();
Expand Down Expand Up @@ -476,7 +519,7 @@ struct HfCorrelatorFlowCharmHadronsReduced {
fillSameEvent<false, true>(pair, trigCand, binPolicyPosZMult);
}
}
PROCESS_SWITCH(HfCorrelatorFlowCharmHadronsReduced, processSameEventCharmHadWMultMix, "Process Same Event for Charm-Had with multiplicity pools", true);
PROCESS_SWITCH(HfCorrelatorFlowCharmHadronsReduced, processSameEventCharmHadWMultMix, "Process Same Event for Charm-Had with multiplicity pools", false);

void processSameEventHadHadWMultMix(SameEvtPairsHadHad::iterator const& pair,
aod::HfcRedTrigTracks const&,
Expand Down Expand Up @@ -595,9 +638,10 @@ struct HfCorrelatorFlowCharmHadronsReduced {
void processCharmTriggers(aod::HfcRedTrigCharms const& trigCands,
aod::HfcRedCorrColls const&)
{

for (const auto& trigCand : trigCands) {
auto collision = trigCand.template hfcRedCorrColl_as<o2::aod::HfcRedCorrColls>();
if (collision.centrality() < centralityMin || collision.centrality() > centralityMax) {
if (!isSelCollision(collision)) {
continue;
}
if (!isSelBdtScoreCut(trigCand, trigCand.ptTrig())) {
Expand All @@ -615,7 +659,7 @@ struct HfCorrelatorFlowCharmHadronsReduced {
BinningCentPosZ binPolicyPosZCent{{zPoolBins, centPoolBins}};

for (const auto& collision : collisions) {
if (collision.centrality() < centralityMin || collision.centrality() > centralityMax) {
if (!isSelCollision(collision)) {
continue;
}
int poolBin = binPolicyPosZCent.getBin({collision.posZ(), collision.centrality()});
Expand Down
40 changes: 23 additions & 17 deletions PWGHF/HFC/TableProducer/derivedDataCreatorCorrelationsReduced.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ struct HfDerivedDataCreatorCorrelationsReduced {
Partition<CandLcData> selectedLcToPiKP = aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlag;

ConfigurableAxis binsInvMass{"binsInvMass", {300, 1.6, 2.2}, ""};
ConfigurableAxis binsMultFT0M{"binsMultFT0M", {100, 0., 10000.}, "Multiplicity as FT0M signal amplitude"};
ConfigurableAxis binsMult{"binsMult", {100, 0., 10000.}, "Multiplicity bins"};
ConfigurableAxis binsCent{"binsCent", {100, 0., 100.}, "Centrality bins"};
ConfigurableAxis binsPosZ{"binsPosZ", {100, -10., 10.}, "Primary vertex z coordinate"};
ConfigurableAxis binsEta{"binsEta", {50, -2., 2.}, "Eta bins"};
Expand Down Expand Up @@ -174,7 +174,7 @@ struct HfDerivedDataCreatorCorrelationsReduced {
ccdb->setLocalObjectValidityChecking();

const AxisSpec axisCent = {binsCent, "Centrality"};
const AxisSpec axisMultFT0M = {binsMultFT0M, "MultiplicityFT0M"};
const AxisSpec axisMult = {binsMult, "Multiplicity"};
const AxisSpec axisPosZ = {binsPosZ, "PosZ"};
const AxisSpec axisEta = {binsEta, "#it{#eta}"};
const AxisSpec axisPhi = {binsPhi, "#it{#varphi}"};
Expand All @@ -190,8 +190,10 @@ struct HfDerivedDataCreatorCorrelationsReduced {
registry.add("hEtaVsPtTrigAssoc", "Associated particles etaVsPt", {HistType::kTH3F, {{axisEta}, {axisPtTrig}, {axisPtAssoc}}});
registry.add("hPhiVsPtAssoc", "Associated particles phiVsPt", {HistType::kTH2F, {{axisPhi}, {axisPtAssoc}}});
registry.add("hEtaVsPtAssoc", "Associated particles etaVsPt", {HistType::kTH2F, {{axisEta}, {axisPtAssoc}}});
registry.add("hDcaXYVsPtAssoc", "Associated particles DCAxyVsPt", {HistType::kTH2F, {{axisDcaXY}, {axisPtAssoc}}});
registry.add("hDcaZVsPtAssoc", "Associated particles DCAzVsPt", {HistType::kTH2F, {{axisDcaZ}, {axisPtAssoc}}});
registry.add("hDcaXYVsPtVsCentAssoc", "Associated particles DCAxyVsPtVsCent", {HistType::kTH3F, {{axisPtAssoc}, {axisDcaXY}, {axisCent}}});
registry.add("hDcaZVsPtVsCentAssoc", "Associated particles DCAzVsPtVsCent", {HistType::kTH3F, {{axisPtAssoc}, {axisDcaZ}, {axisCent}}});
registry.add("hDcaXYVsPtVsMultAssoc", "Associated particles DCAxyVsPtVsMult", {HistType::kTH3F, {{axisPtAssoc}, {axisDcaXY}, {axisMult}}});
registry.add("hDcaZVsPtVsMultAssoc", "Associated particles DCAzVsPtVsMult", {HistType::kTH3F, {{axisPtAssoc}, {axisDcaZ}, {axisMult}}});

// Setup pt-dependent DCAxy cut function
if (usePtDiffDcaXYCut) {
Expand Down Expand Up @@ -359,11 +361,13 @@ struct HfDerivedDataCreatorCorrelationsReduced {
/// Fill histograms and tables for same-event correlations
/// \param trigCands are the trigger candidates
/// \param assTrks are the associated tracks
/// \param collCentrality is the collision centrality
/// \param cent is the collision centrality
/// \param mult is the collision multiplicity
template <CandidateType CandType, typename TTrigCands, typename TAssocTrks>
void fillSameEvent(TTrigCands const& trigCands,
TAssocTrks const& assTrks,
const float collCentrality)
const float cent,
const float mult)
{
for (const auto& trigCand : trigCands) {
if (!cutCandRapidity<CandType>(trigCand)) {
Expand Down Expand Up @@ -394,16 +398,18 @@ struct HfDerivedDataCreatorCorrelationsReduced {
}
if (downSampleTrksFactor < 1.) {
float const pseudoRndm = assTrkPt * 1000. - static_cast<int64_t>(assTrkPt * 1000);
if (assTrkPt < ptMaxForDownSample && collCentrality < centMaxForDownSample && pseudoRndm >= downSampleTrksFactor) {
if (assTrkPt < ptMaxForDownSample && cent < centMaxForDownSample && pseudoRndm >= downSampleTrksFactor) {
continue;
}
}
registry.fill(HIST("hPhiVsPtTrigAssoc"), RecoDecay::constrainAngle(assTrk.phi(), -o2::constants::math::PIHalf), trigCandPt, assTrkPt);
registry.fill(HIST("hEtaVsPtTrigAssoc"), assTrk.eta(), trigCandPt, assTrkPt);
registry.fill(HIST("hPhiVsPtAssoc"), RecoDecay::constrainAngle(assTrk.phi(), -o2::constants::math::PIHalf), assTrkPt);
registry.fill(HIST("hEtaVsPtAssoc"), assTrk.eta(), assTrkPt);
registry.fill(HIST("hDcaXYVsPtAssoc"), assTrk.dcaXY(), assTrkPt);
registry.fill(HIST("hDcaZVsPtAssoc"), assTrk.dcaZ(), assTrkPt);
registry.fill(HIST("hDcaXYVsPtVsCentAssoc"), assTrkPt, assTrk.dcaXY(), cent);
registry.fill(HIST("hDcaZVsPtVsCentAssoc"), assTrkPt, assTrk.dcaZ(), cent);
registry.fill(HIST("hDcaXYVsPtVsMultAssoc"), assTrkPt, assTrk.dcaXY(), mult);
registry.fill(HIST("hDcaZVsPtVsMultAssoc"), assTrkPt, assTrk.dcaZ(), mult);

double deltaPhi = RecoDecay::constrainAngle(assTrk.phi() - trigCand.phi(), -o2::constants::math::PIHalf);
rowAssocTrkSels(assTrk.tpcNClsCrossedRows(), assTrk.itsClusterMap(), assTrk.itsNCls(), assTrk.dcaXY(), assTrk.dcaZ());
Expand Down Expand Up @@ -482,7 +488,7 @@ struct HfDerivedDataCreatorCorrelationsReduced {
return;
}
rowCollisions(mult, coll.numContrib(), cent, coll.posZ());
fillSameEvent<CandidateType::DplusToPiKPi>(candsDplus, tracks, cent);
fillSameEvent<CandidateType::DplusToPiKPi>(candsDplus, tracks, cent, mult);
}
PROCESS_SWITCH(HfDerivedDataCreatorCorrelationsReduced, processDplusSameEvent, "Process Same Event for Dplus candidates", true);

Expand Down Expand Up @@ -519,8 +525,8 @@ struct HfDerivedDataCreatorCorrelationsReduced {
return;
}
rowCollisions(mult, coll.numContrib(), cent, coll.posZ());
fillSameEvent<CandidateType::DsToPiKK>(candsDsToPiKK, tracks, cent);
fillSameEvent<CandidateType::DsToKKPi>(candsDsToKKPi, tracks, cent);
fillSameEvent<CandidateType::DsToPiKK>(candsDsToPiKK, tracks, cent, mult);
fillSameEvent<CandidateType::DsToKKPi>(candsDsToKKPi, tracks, cent, mult);
}
PROCESS_SWITCH(HfDerivedDataCreatorCorrelationsReduced, processDsSameEvent, "Process Same Event for Ds candidates", false);

Expand Down Expand Up @@ -560,8 +566,8 @@ struct HfDerivedDataCreatorCorrelationsReduced {
return;
}
rowCollisions(mult, coll.numContrib(), cent, coll.posZ());
fillSameEvent<CandidateType::D0ToPiK>(candsD0ToPiK, tracks, cent);
fillSameEvent<CandidateType::D0ToKPi>(candsD0ToKPi, tracks, cent);
fillSameEvent<CandidateType::D0ToPiK>(candsD0ToPiK, tracks, cent, mult);
fillSameEvent<CandidateType::D0ToKPi>(candsD0ToKPi, tracks, cent, mult);
}
PROCESS_SWITCH(HfDerivedDataCreatorCorrelationsReduced, processD0SameEvent, "Process Same Event for D0 candidates", false);

Expand Down Expand Up @@ -601,8 +607,8 @@ struct HfDerivedDataCreatorCorrelationsReduced {
return;
}
rowCollisions(mult, coll.numContrib(), cent, coll.posZ());
fillSameEvent<CandidateType::LcToPKPi>(candsLcToPKPi, tracks, cent);
fillSameEvent<CandidateType::LcToPiKP>(candsLcToPiKP, tracks, cent);
fillSameEvent<CandidateType::LcToPKPi>(candsLcToPKPi, tracks, cent, mult);
fillSameEvent<CandidateType::LcToPiKP>(candsLcToPiKP, tracks, cent, mult);
}
PROCESS_SWITCH(HfDerivedDataCreatorCorrelationsReduced, processLcSameEvent, "Process Same Event for Lc candidates", false);

Expand Down Expand Up @@ -636,7 +642,7 @@ struct HfDerivedDataCreatorCorrelationsReduced {
return;
}
rowCollisions(mult, coll.numContrib(), cent, coll.posZ());
fillSameEvent<CandidateType::Hadron>(tracks, tracks, cent);
fillSameEvent<CandidateType::Hadron>(tracks, tracks, cent, mult);
}
PROCESS_SWITCH(HfDerivedDataCreatorCorrelationsReduced, processHadronHadronSameEvent, "Process Same Event for hadron candidates", false);

Expand Down
Loading