Skip to content

Commit c0ee816

Browse files
committed
phi-Xi correlations (1)
1 parent 529b7f8 commit c0ee816

3 files changed

Lines changed: 397 additions & 13 deletions

File tree

PWGLF/DataModel/LFPhiStrangeCorrelationTables.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,39 @@ DECLARE_SOA_TABLE(K0sReducedCandidatesMcReco, "AOD", "K0SCANDMCRECO",
140140
lf_selection_k0s_reduced::Phi,
141141
lf_selection_k0s_reduced::InMassRegion<lf_selection_k0s_reduced::M>);
142142

143+
namespace lf_selection_xi_reduced
144+
{
145+
DECLARE_SOA_INDEX_COLUMN(Collision, collision);
146+
147+
DECLARE_SOA_COLUMN(M, m, float);
148+
DECLARE_SOA_COLUMN(Pt, pt, float);
149+
DECLARE_SOA_COLUMN(Y, y, float);
150+
DECLARE_SOA_COLUMN(Phi, phi, float);
151+
152+
DECLARE_SOA_DYNAMIC_COLUMN(InMassRegion, inMassRegion,
153+
[](float m, float minM, float maxM) -> bool {
154+
return (m >= minM && m <= maxM);
155+
});
156+
} // namespace lf_selection_xi_reduced
157+
158+
DECLARE_SOA_TABLE(XiReducedCandidatesData, "AOD", "XICANDDATA",
159+
soa::Index<>,
160+
lf_selection_xi_reduced::CollisionId,
161+
lf_selection_xi_reduced::M,
162+
lf_selection_xi_reduced::Pt,
163+
lf_selection_xi_reduced::Y,
164+
lf_selection_xi_reduced::Phi,
165+
lf_selection_xi_reduced::InMassRegion<lf_selection_xi_reduced::M>);
166+
167+
DECLARE_SOA_TABLE(XiReducedCandidatesMcReco, "AOD", "XICANDMCRECO",
168+
soa::Index<>,
169+
lf_selection_xi_reduced::CollisionId,
170+
lf_selection_xi_reduced::M,
171+
lf_selection_xi_reduced::Pt,
172+
lf_selection_xi_reduced::Y,
173+
lf_selection_xi_reduced::Phi,
174+
lf_selection_xi_reduced::InMassRegion<lf_selection_xi_reduced::M>);
175+
143176
namespace lf_selection_pion_track
144177
{
145178
DECLARE_SOA_INDEX_COLUMN(Collision, collision);

PWGLF/TableProducer/Strangeness/phiStrangeCorrelator.cxx

Lines changed: 176 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ struct K0sReducedCandProducer {
382382
// Configurables for V0 selection
383383
struct : ConfigurableGroup {
384384
Configurable<float> v0SettingCosPA{"v0SettingCosPA", 0.98f, "V0 CosPA"};
385-
Configurable<float> v0SettingRadius{"v0SettingRadius", 0.5f, "v0radius"};
385+
Configurable<float> v0SettingRadius{"v0SettingRadius", 0.5f, "V0 decay radius"};
386386
Configurable<float> v0SettingDCAV0Dau{"v0SettingDCAV0Dau", 1.0f, "DCA V0 Daughters"};
387387
Configurable<float> v0SettingDCAPosToPV{"v0SettingDCAPosToPV", 0.1f, "DCA Pos To PV"};
388388
Configurable<float> v0SettingDCANegToPV{"v0SettingDCANegToPV", 0.1f, "DCA Neg To PV"};
@@ -410,7 +410,9 @@ struct K0sReducedCandProducer {
410410
Filter collisionFilter = aod::lf_selection_event::defaultSel == true;
411411

412412
// Defining filters on V0s (cannot filter on dynamic columns)
413-
Filter v0PreFilter = (nabs(aod::v0data::dcapostopv) > v0Configs.v0SettingDCAPosToPV && nabs(aod::v0data::dcanegtopv) > v0Configs.v0SettingDCANegToPV && aod::v0data::dcaV0daughters < v0Configs.v0SettingDCAV0Dau);
413+
Filter v0PreFilter = (nabs(aod::v0data::dcapostopv) > v0Configs.v0SettingDCAPosToPV &&
414+
nabs(aod::v0data::dcanegtopv) > v0Configs.v0SettingDCANegToPV &&
415+
aod::v0data::dcaV0daughters < v0Configs.v0SettingDCAV0Dau);
414416

415417
// Defining the type of the collisions for data and MC
416418
using SelCollisions = soa::Join<aod::Collisions, aod::CentFT0Ms, aod::PVMults, aod::PhiStrangeEvtSelDataLike>;
@@ -530,6 +532,177 @@ struct K0sReducedCandProducer {
530532
PROCESS_SWITCH(K0sReducedCandProducer, processMCReco, "Process function to select reduced K0s candidates in MCReco w MC truth", false);
531533
};
532534

535+
struct XiReducedCandProducer {
536+
// Produce the table with the Xi candidates information
537+
Produces<aod::XiReducedCandidatesData> xiReducedCandidatesData;
538+
Produces<aod::XiReducedCandidatesMcReco> xiReducedCandidatesMcReco;
539+
540+
HistogramRegistry histos{"xiReducedCandidates", {}, OutputObjHandlingPolicy::AnalysisObject, true, true};
541+
542+
// Configurable on multiplicity bins
543+
Configurable<std::vector<double>> binsMult{"binsMult", {0.0, 1.0, 5.0, 10.0, 15.0, 20.0, 30.0, 40.0, 50.0, 70.0, 100.0}, "Multiplicity bin limits"};
544+
545+
// Configurables for tracks selection
546+
struct : ConfigurableGroup {
547+
Configurable<float> etaMax{"etaMax", 0.8f, "eta max"};
548+
Configurable<float> nSigmaCutTPCSecPion{"nSigmaCutTPCSecPion", 4.0f, "Value of the TPC Nsigma cut for secondary Pions"};
549+
Configurable<float> nSigmaCutTPCSecProton{"nSigmaCutTPCSecProton", 4.0f, "Value of the TPC Nsigma cut for secondary Protons"};
550+
551+
Configurable<int> minTPCnClsFound{"minTPCnClsFound", 70, "min number of found TPC clusters"};
552+
Configurable<int> minNCrossedRowsTPC{"minNCrossedRowsTPC", 70, "min number of TPC crossed rows"};
553+
Configurable<float> maxChi2TPC{"maxChi2TPC", 4.0f, "max chi2 per cluster TPC"};
554+
} trackConfigs;
555+
556+
// Configurables for Cascade selection
557+
struct : ConfigurableGroup {
558+
Configurable<float> cascSettingV0CosPA{"cascSettingV0CosPA", 0.98f, "V0 CosPA"};
559+
Configurable<float> cascSettingCosPA{"cascSettingCosPA", 0.98f, "Cascade CosPA"};
560+
Configurable<float> cascSettingV0Radius{"cascSettingV0Radius", 0.5f, "V0 decay radius"};
561+
Configurable<float> cascSettingRadius{"cascSettingRadius", 0.5f, "Cascade decay radius"};
562+
Configurable<float> cascSettingDCAV0Dau{"cascSettingDCAV0Dau", 1.0f, "DCA V0 Daughters"};
563+
Configurable<float> cascSettingDCACascDau{"cascSettingDCACascDau", 1.0f, "DCA Cascade Daughters"};
564+
Configurable<float> cascSettingDCAPosToPV{"cascSettingDCAPosToPV", 0.1f, "DCA Pos To PV"};
565+
Configurable<float> cascSettingDCANegToPV{"cascSettingDCANegToPV", 0.1f, "DCA Neg To PV"};
566+
Configurable<float> cascSettingDCABachToPV{"cascSettingDCABachToPV", 0.1f, "DCA Bach To PV"};
567+
Configurable<float> cascSettingMinPt{"cascSettingMinPt", 0.8f, "Cascade min pt"};
568+
569+
Configurable<float> cfgYAcceptance{"cfgYAcceptance", 0.5f, "Rapidity acceptance"};
570+
} cascadeConfigs;
571+
572+
// Configurables for Xi pT bins
573+
Configurable<std::vector<double>> binspTXi{"binspTXi", {0.8, 1.2, 1.6, 2.0, 2.5, 3.0, 4.0, 6.0}, "pT bin limits for Xi"};
574+
575+
// Constants
576+
static constexpr double massXiMinus = o2::constants::physics::MassXiMinus;
577+
static constexpr double massXiPlus = o2::constants::physics::MassXiPlusBar;
578+
579+
// Filter on default selected collisions
580+
Filter collisionFilter = aod::lf_selection_event::defaultSel == true;
581+
582+
// Defining filters on Cascades (cannot filter on dynamic columns)
583+
Filter cascadePreFilter = (nabs(aod::cascdata::dcapostopv) > cascadeConfigs.cascSettingDCAPosToPV &&
584+
nabs(aod::cascdata::dcanegtopv) > cascadeConfigs.cascSettingDCANegToPV &&
585+
nabs(aod::cascdata::dcabachtopv) > cascadeConfigs.cascSettingDCABachToPV &&
586+
aod::cascdata::dcaV0daughters < cascadeConfigs.cascSettingDCAV0Dau &&
587+
aod::cascdata::dcacascdaughters < cascadeConfigs.cascSettingDCACascDau);
588+
589+
// Defining the type of the collisions for data and MC
590+
using SelCollisions = soa::Join<aod::Collisions, aod::CentFT0Ms, aod::PVMults, aod::PhiStrangeEvtSelDataLike>;
591+
using SimCollisions = soa::Join<SelCollisions, aod::McCollisionLabels>;
592+
593+
using FilteredSelCollisions = soa::Filtered<SelCollisions>;
594+
using FilteredSimCollisions = soa::Filtered<SimCollisions>;
595+
596+
// Defining the type of the Cascades and corresponding daughter and bachelor tracks for data and MC
597+
using FullCascades = soa::Filtered<aod::CascDatas>;
598+
using FullMCCascades = soa::Filtered<soa::Join<aod::CascDatas, aod::McCascLabels>>;
599+
600+
using DauTracks = soa::Join<aod::TracksIU, aod::TracksExtra, aod::pidTPCFullPi, aod::pidTPCFullPr>;
601+
using DauMCTracks = soa::Join<DauTracks, aod::McTrackLabels>;
602+
603+
void init(InitContext&)
604+
{
605+
AxisSpec binnedmultAxis{(std::vector<double>)binsMult, "centFT0M"};
606+
AxisSpec binnedpTXiAxis{(std::vector<double>)binspTXi, "#it{p}_{T} (GeV/#it{c})"};
607+
AxisSpec massXiAxis = {200, 1.2f, 1.4f, "#it{M}_{inv} [GeV/#it{c}^{2}]"};
608+
609+
histos.add("h3XiCandidatesMass", "#Xi candidate invariant mass", kTH3F, {binnedmultAxis, binnedpTXiAxis, massXiAxis});
610+
}
611+
612+
// Single track selection for strangeness sector
613+
template <typename T>
614+
bool selectionTrackStrangeness(const T& track)
615+
{
616+
if (!track.hasTPC())
617+
return false;
618+
if (track.tpcNClsFound() < trackConfigs.minTPCnClsFound)
619+
return false;
620+
if (track.tpcNClsCrossedRows() < trackConfigs.minNCrossedRowsTPC)
621+
return false;
622+
if (track.tpcChi2NCl() > trackConfigs.maxChi2TPC)
623+
return false;
624+
625+
if (std::abs(track.eta()) > trackConfigs.etaMax)
626+
return false;
627+
return true;
628+
}
629+
630+
// Cascade selection
631+
template <bool isMC, typename T1, typename T2>
632+
bool selectionCascade(const T1& cascade, const T2& collision)
633+
{
634+
using DauTrackType = std::conditional_t<isMC, DauMCTracks, DauTracks>;
635+
636+
const auto& posDaughterTrack = cascade.template posTrack_as<DauTrackType>();
637+
const auto& negDaughterTrack = cascade.template negTrack_as<DauTrackType>();
638+
const auto& bachDaughterTrack = cascade.template bachelor_as<DauTrackType>();
639+
640+
if (!selectionTrackStrangeness(posDaughterTrack) || !selectionTrackStrangeness(negDaughterTrack) || !selectionTrackStrangeness(bachDaughterTrack))
641+
return false;
642+
643+
if constexpr (!isMC) {
644+
if (std::abs(posDaughterTrack.tpcNSigmaPi()) > trackConfigs.nSigmaCutTPCSecPion)
645+
return false;
646+
if (std::abs(negDaughterTrack.tpcNSigmaPi()) > trackConfigs.nSigmaCutTPCSecPion)
647+
return false;
648+
if (std::abs(bachDaughterTrack.tpcNSigmaPr()) > trackConfigs.nSigmaCutTPCSecProton)
649+
return false;
650+
}
651+
652+
const auto& pvx = collision.posX();
653+
const auto& pvy = collision.posY();
654+
const auto& pvz = collision.posZ();
655+
656+
if (cascade.v0cosPA(pvx, pvy, pvz) < cascadeConfigs.cascSettingV0CosPA)
657+
return false;
658+
if (cascade.cascCosPA(pvx, pvy, pvz) < cascadeConfigs.cascSettingCosPA)
659+
return false;
660+
if (cascade.v0radius() < cascadeConfigs.cascSettingV0Radius)
661+
return false;
662+
if (cascade.cascradius() < cascadeConfigs.cascSettingRadius)
663+
return false;
664+
if (cascade.pt() < cascadeConfigs.cascSettingMinPt)
665+
return false;
666+
667+
if (std::abs(cascade.yXi()) > cascadeConfigs.cfgYAcceptance)
668+
return false;
669+
return true;
670+
}
671+
672+
void processData(FilteredSelCollisions::iterator const& collision, FullCascades const& cascades, DauTracks const& dauTracks)
673+
{
674+
for (const auto& cascade : cascades) {
675+
// Cut on cascade dynamic columns
676+
if (!selectionCascade<false>(cascade, collision))
677+
continue;
678+
679+
histos.fill(HIST("h3XiCandidatesMass"), collision.centFT0M(), cascade.pt(), cascade.mXi());
680+
681+
xiReducedCandidatesData(collision.globalIndex(), cascade.mXi(), cascade.pt(), cascade.yXi(), cascade.phi());
682+
}
683+
}
684+
685+
PROCESS_SWITCH(XiReducedCandProducer, processData, "Process function to select reduced Xi candidates in Data or in McReco (w/o McTruth) analysis", true);
686+
687+
void processMCReco(FilteredSimCollisions::iterator const& collision, FullMCCascades const& V0s, DauMCTracks const&, aod::McParticles const& mcParticles)
688+
{
689+
for (const auto& cascade : cascades) {
690+
if (!selectionCascade<true>(cascade, collision))
691+
continue;
692+
if (!cascade.has_mcParticle())
693+
continue;
694+
695+
const auto& cascadeMcParticle = mcParticles.rawIteratorAt(cascade.mcParticleId());
696+
if (std::abs(cascadeMcParticle.pdgCode()) != PDG_t::kXiPlusBar || !cascadeMcParticle.isPhysicalPrimary())
697+
continue;
698+
699+
xiReducedCandidatesMcReco(collision.globalIndex(), cascade.mXi(), cascadeMcParticle.pt(), cascadeMcParticle.y(), cascadeMcParticle.phi());
700+
}
701+
}
702+
703+
PROCESS_SWITCH(XiReducedCandProducer, processMCReco, "Process function to select reduced Xi candidates in MCReco w MC truth", false);
704+
};
705+
533706
struct PionTrackProducer {
534707
// Produce the table with the pion tracks information
535708
Produces<aod::PionTracksData> pionTracksData;
@@ -1035,6 +1208,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
10351208
{
10361209
return WorkflowSpec{adaptAnalysisTask<PhiMesonCandProducer>(cfgc),
10371210
adaptAnalysisTask<K0sReducedCandProducer>(cfgc),
1211+
adaptAnalysisTask<XiReducedCandProducer>(cfgc),
10381212
adaptAnalysisTask<PionTrackProducer>(cfgc),
10391213
adaptAnalysisTask<EventSelectionProducer>(cfgc)};
10401214
}

0 commit comments

Comments
 (0)