@@ -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+
533706struct 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