@@ -147,6 +147,23 @@ struct HfFilter { // Main struct for HF triggers
147147 Configurable<bool > keepAlsoWrongDmesProtonPairs{" keepAlsoWrongDmesProtonPairs" , true , " flat go keep also wrong sign D0p pairs" };
148148 Configurable<bool > keepAlsoWrongDstarMesProtonPairs{" keepAlsoWrongDstarMesProtonPairs" , true , " flat go keep also wrong sign D*0p pairs" };
149149
150+ // parameters for Sigma_C
151+ struct : o2::framework::ConfigurableGroup {
152+ Configurable<bool > isTrigSigmaCP{" isTrigSigmaCP" , true , " for SigmaCPPK trigger select True" };
153+ Configurable<bool > isTrigSigmaCPPK{" isTrigSigmaCPPK" , true , " for SigmaCPPK trigger select True, False for SigmaCP" };
154+ Configurable<std::vector<int >> trkPIDspecies{" trkPIDspecies" , std::vector<int >{o2::track::PID::Proton, o2::track::PID::Pion, o2::track::PID::Kaon}, " Trk sel: Particles species for PID, proton, pion, kaon" };
155+ Configurable<std::vector<float >> pidTPCMax{" pidTPCMax" , std::vector<float >{3 ., 0 ., 0 .}, " maximum nSigma TPC" };
156+ Configurable<std::vector<float >> pidTOFMax{" pidTOFMax" , std::vector<float >{3 ., 0 ., 0 .}, " maximum nSigma TOF" };
157+ Configurable<bool > forceTOF{" forceTOF" , false , " fill PID information for associated tracks" };
158+ Configurable<float > tofPIDThreshold{" tofPIDThreshold" , 1.0 , " minimum pT after which TOF PID is applicable" };
159+ Configurable<float > minPtProton{" minPtProton" , 0.39 , " minimum pT for associated proton" };
160+ Configurable<float > maxPtProton{" maxPtProton" , 4.51 , " maximum pT for associated proton" };
161+ Configurable<float > minMassSigmaCCorr{" minMassSigmaCCorr" , 0.15 , " minimum mass of SigmaC for correlation with proton" };
162+ Configurable<float > maxMassSigmaCCorr{" maxMassSigmaCCorr" , 0.19 , " maximum mass of SigmaC for correlation with proton" };
163+ Configurable<float > minPtSigmaC{" minPtSigmaC" , 4.99 , " minimum pT of SigmaC for correlation with proton" };
164+ Configurable<float > maxPtSigmaC{" maxPtSigmaC" , 12.0 , " maximum pT of SigmaC for correlation with proton" };
165+ } configSigmaC;
166+
150167 // parameters for charm baryons to Xi bachelor
151168 Configurable<LabeledArray<float >> cutsXiCascades{" cutsXiCascades" , {cutsCascades[0 ], 1 , 8 , labelsEmpty, labelsColumnsCascades}, " Selections for cascades (Xi) for Xi+bachelor triggers" };
152169 Configurable<LabeledArray<float >> cutsXiBachelor{" cutsXiBachelor" , {cutsCharmBaryons[0 ], 1 , 11 , labelsEmpty, labelsColumnsCharmBarCuts}, " Selections for charm baryons (Xi+Pi, Xi+Ka, Xi+Pi+Pi)" };
@@ -161,6 +178,7 @@ struct HfFilter { // Main struct for HF triggers
161178 Configurable<LabeledArray<double >> thresholdBDTScoreDSToPiKK{" thresholdBDTScoreDSToPiKK" , {hf_cuts_bdt_multiclass::Cuts[0 ], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, " Threshold values for BDT output scores of Ds+ candidates" };
162179 Configurable<LabeledArray<double >> thresholdBDTScoreLcToPiKP{" thresholdBDTScoreLcToPiKP" , {hf_cuts_bdt_multiclass::Cuts[0 ], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, " Threshold values for BDT output scores of Lc+ candidates" };
163180 Configurable<LabeledArray<double >> thresholdBDTScoreXicToPiKP{" thresholdBDTScoreXicToPiKP" , {hf_cuts_bdt_multiclass::Cuts[0 ], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, " Threshold values for BDT output scores of Xic+ candidates" };
181+ Configurable<LabeledArray<double >> thresholdBDTScoreScLcToPiKP{" thresholdBDTScoreScLcToPiKP" , {hf_cuts_bdt_multiclass::Cuts[0 ], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, " Threshold values for BDT output scores of Lc<--Sc candidates" };
164182
165183 Configurable<bool > acceptBdtBkgOnly{" acceptBdtBkgOnly" , true , " Enable / disable selection based on BDT bkg score only" };
166184
@@ -206,7 +224,7 @@ struct HfFilter { // Main struct for HF triggers
206224 int currentRun{0 }; // needed to detect if the run changed and trigger update of calibrations etc.
207225
208226 // array of BDT thresholds
209- std::array<LabeledArray<double >, kNCharmParticles > thresholdBDTScores;
227+ std::array<LabeledArray<double >, kNCharmParticles + 1 > thresholdBDTScores;
210228
211229 o2::vertexing::DCAFitterN<2 > df2; // fitter for Charm Hadron vertex (2-prong vertex fitter)
212230 o2::vertexing::DCAFitterN<3 > df3; // fitter for Charm/Beauty Hadron vertex (3-prong vertex fitter)
@@ -224,7 +242,7 @@ struct HfFilter { // Main struct for HF triggers
224242 std::array<std::shared_ptr<TH1>, kNCharmParticles > hCharmProtonKstarDistr{};
225243 std::array<std::shared_ptr<TH1>, kNCharmParticles > hCharmDeuteronKstarDistr{};
226244 std::array<std::shared_ptr<TH2>, nTotBeautyParts> hMassVsPtB{};
227- std::array<std::shared_ptr<TH2>, kNCharmParticles + 23 > hMassVsPtC{}; // +9 for resonances (D*+, D*0, Ds*+, Ds1+, Ds2*+, Xic+* right sign, Xic+* wrong sign, Xic0* right sign, Xic0* wrong sign) +2 for SigmaC (SigmaC++, SigmaC0) +2 for SigmaCK pairs (SigmaC++K-, SigmaC0K0s) +3 for charm baryons (Xi+Pi, Xi+Ka, Xi+Pi+Pi) + JPsi + 4 for charm baryons (D0+p, D0+pWrongSign, D*0p, D*0+pWrongSign)
245+ std::array<std::shared_ptr<TH2>, kNCharmParticles + 24 > hMassVsPtC{}; // +9 for resonances (D*+, D*0, Ds*+, Ds1+, Ds2*+, Xic+* right sign, Xic+* wrong sign, Xic0* right sign, Xic0* wrong sign) +2 for SigmaC (SigmaC++, SigmaC0) +2 for SigmaCK pairs (SigmaC++K-, SigmaC0K0s) +3 for charm baryons (Xi+Pi, Xi+Ka, Xi+Pi+Pi) + JPsi + 4 for charm baryons (D0+p, D0+pWrongSign, D*0p, D*0+pWrongSign)
228246 std::array<std::shared_ptr<TH2>, 4 > hPrDePID; // proton TPC, proton TOF, deuteron TPC, deuteron TOF
229247 std::array<std::shared_ptr<TH1>, kNCharmParticles > hBDTScoreBkg{};
230248 std::array<std::shared_ptr<TH1>, kNCharmParticles > hBDTScorePrompt{};
@@ -369,6 +387,8 @@ struct HfFilter { // Main struct for HF triggers
369387 // ThetaC
370388 hMassVsPtC[kNCharmParticles + 21 ] = registry.add <TH2>(" fMassVsPtCharmBaryonToDstarP" , " #it{M} vs. #it{p}_{T} distribution of triggered D^{*0}#p candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts" , HistType::kTH2D , {ptAxis, massAxisC[kNCharmParticles + 21 ]});
371389 hMassVsPtC[kNCharmParticles + 22 ] = registry.add <TH2>(" fMassVsPtCharmBaryonToDstarPWrongSign" , " #it{M} vs. #it{p}_{T} distribution of triggered D^{*0}#p wrong sign candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts" , HistType::kTH2D , {ptAxis, massAxisC[kNCharmParticles + 22 ]});
390+ // SigmaC-p
391+ hMassVsPtC[kNCharmParticles + 23 ] = registry.add <TH2>(" fMassVsPtSigmaCP" , " #it{M} vs. #it{p}_{T} distribution of #Sigma_{c} for SigmaCP trigger;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts" , HistType::kTH2D , {ptAxis, massAxisC[kNCharmParticles + 23 ]});
372392
373393 for (int iBeautyPart{0 }; iBeautyPart < kNBeautyParticles ; ++iBeautyPart) {
374394 hMassVsPtB[iBeautyPart] = registry.add <TH2>(Form (" fMassVsPt%s" , beautyParticleNames[iBeautyPart].data ()), Form (" #it{M} vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts" , beautyParticleNames[iBeautyPart].data ()), HistType::kTH2D , {ptAxis, massAxisB[iBeautyPart]});
@@ -431,7 +451,7 @@ struct HfFilter { // Main struct for HF triggers
431451 ccdbApi.init (url);
432452 lut = o2::base::MatLayerCylSet::rectifyPtrFromFile (ccdb->get <o2::base::MatLayerCylSet>(" GLO/Param/MatLUT" ));
433453
434- thresholdBDTScores = {thresholdBDTScoreD0ToKPi, thresholdBDTScoreDPlusToPiKPi, thresholdBDTScoreDSToPiKK, thresholdBDTScoreLcToPiKP, thresholdBDTScoreXicToPiKP};
454+ thresholdBDTScores = {thresholdBDTScoreD0ToKPi, thresholdBDTScoreDPlusToPiKPi, thresholdBDTScoreDSToPiKK, thresholdBDTScoreLcToPiKP, thresholdBDTScoreXicToPiKP, thresholdBDTScoreScLcToPiKP };
435455 }
436456
437457 void process (CollsWithEvSel const & collisions,
@@ -455,7 +475,7 @@ struct HfFilter { // Main struct for HF triggers
455475 bool isSelectedITSROFBorder = evSel.applyITSROFBorderCut ? collision.selection_bit (o2::aod::evsel::kNoITSROFrameBorder ) : true ;
456476 bool isSelectedPvZ = (std::fabs (collision.posZ ()) < evSel.maxPvZ );
457477 if (!isSelectedTVX || !isSelectedTFBorder || !isSelectedITSROFBorder || !isSelectedPvZ) {
458- tags (keepEvent[kHighPt2P ], keepEvent[kHighPt3P ], keepEvent[kBeauty3P ], keepEvent[kBeauty4P ], keepEvent[kFemto2P ], keepEvent[kFemto3P ], keepEvent[kDoubleCharm2P ], keepEvent[kDoubleCharm3P ], keepEvent[kDoubleCharmMix ], keepEvent[kV0Charm2P ], keepEvent[kV0Charm3P ], keepEvent[kCharmBarToXiBach ], keepEvent[kSigmaCPPK ], keepEvent[kSigmaC0K0 ], keepEvent[kPhotonCharm2P ], keepEvent[kPhotonCharm3P ], keepEvent[kSingleCharm2P ], keepEvent[kSingleCharm3P ], keepEvent[kSingleNonPromptCharm2P ], keepEvent[kSingleNonPromptCharm3P ], keepEvent[kCharmBarToXi2Bach ], keepEvent[kPrCharm2P ], keepEvent[kBtoJPsiKa ], keepEvent[kBtoJPsiKstar ], keepEvent[kBtoJPsiPhi ], keepEvent[kBtoJPsiPrKa ], keepEvent[kBtoJPsiPi ]);
478+ tags (keepEvent[kHighPt2P ], keepEvent[kHighPt3P ], keepEvent[kBeauty3P ], keepEvent[kBeauty4P ], keepEvent[kFemto2P ], keepEvent[kFemto3P ], keepEvent[kDoubleCharm2P ], keepEvent[kDoubleCharm3P ], keepEvent[kDoubleCharmMix ], keepEvent[kV0Charm2P ], keepEvent[kV0Charm3P ], keepEvent[kCharmBarToXiBach ], keepEvent[kSigmaCPPK ], keepEvent[kSigmaC0K0 ], keepEvent[ kSigmaCP ], keepEvent[kPhotonCharm2P ], keepEvent[kPhotonCharm3P ], keepEvent[kSingleCharm2P ], keepEvent[kSingleCharm3P ], keepEvent[kSingleNonPromptCharm2P ], keepEvent[kSingleNonPromptCharm3P ], keepEvent[kCharmBarToXi2Bach ], keepEvent[kPrCharm2P ], keepEvent[kBtoJPsiKa ], keepEvent[kBtoJPsiKstar ], keepEvent[kBtoJPsiPhi ], keepEvent[kBtoJPsiPrKa ], keepEvent[kBtoJPsiPi ]);
459479 continue ;
460480 }
461481
@@ -1507,8 +1527,12 @@ struct HfFilter { // Main struct for HF triggers
15071527 }
15081528 } // end femto selection
15091529
1510- // SigmaC++ K- trigger
1511- if (!keepEvent[kSigmaCPPK ] && is3Prong[2 ] > 0 && is3ProngInMass[2 ] > 0 && isSignalTagged[2 ] > 0 && helper.isSelectedKaonFromXicResoToSigmaC <true >(track)) {
1530+ // SigmaC++ K- and SigmaC++,0 - p trigger
1531+
1532+ bool isTrackKaon = helper.isSelectedKaonFromXicResoToSigmaC <true >(track);
1533+ bool isTrackProton = helper.isSelectedTrack4Corr (track, configSigmaC.trkPIDspecies , configSigmaC.pidTPCMax , configSigmaC.pidTOFMax , configSigmaC.minPtProton , configSigmaC.maxPtProton , configSigmaC.tofPIDThreshold , configSigmaC.forceTOF );
1534+
1535+ if (!(keepEvent[kSigmaCPPK ] || keepEvent[kSigmaCP ]) && is3Prong[2 ] > 0 && is3ProngInMass[2 ] > 0 && isSignalTagged[2 ] > 0 && (isTrackKaon || isTrackProton)) {
15121536 // we need a candidate Lc->pKpi and a candidate soft kaon
15131537
15141538 // look for SigmaC++ candidates
@@ -1523,18 +1547,14 @@ struct HfFilter { // Main struct for HF triggers
15231547 // do not consider as candidate soft pion a track already used to build the current 3-prong candidate
15241548 continue ;
15251549 }
1526-
1527- // exclude already the current track if it corresponds to the K- candidate
1550+ // exclude already the current track if it corresponds to the K- or proton candidate
15281551 if (globalIndexSoftPi == track.globalIndex ()) {
15291552 continue ;
15301553 }
15311554
15321555 // check the candidate SigmaC++ charge
15331556 std::array<int , 4 > chargesSc = {trackFirst.sign (), trackSecond.sign (), trackThird.sign (), trackSoftPi.sign ()};
15341557 int chargeSc = std::accumulate (chargesSc.begin (), chargesSc.end (), 0 ); // SIGNED electric charge of SigmaC candidate
1535- if (std::abs (chargeSc) != 2 ) {
1536- continue ;
1537- }
15381558
15391559 // select soft pion candidates
15401560 auto trackParSoftPi = getTrackPar (trackSoftPi);
@@ -1548,22 +1568,19 @@ struct HfFilter { // Main struct for HF triggers
15481568 }
15491569 int16_t isSoftPionSelected = helper.isSelectedTrackForSoftPionOrBeauty <kSigmaCPPK >(trackSoftPi, trackParSoftPi, dcaSoftPi);
15501570 if (TESTBIT (isSoftPionSelected, kSoftPionForSigmaC ) /* && (TESTBIT(is3Prong[2], 0) || TESTBIT(is3Prong[2], 1))*/ ) {
1551-
1552- // check the mass of the SigmaC++ candidate
1571+ // check the mass of the SigmaC++,0 candidate
15531572 auto pVecSigmaC = RecoDecay::pVec (pVecFirst, pVecSecond, pVecThird, pVecSoftPi);
15541573 auto ptSigmaC = RecoDecay::pt (pVecSigmaC);
15551574 int8_t whichSigmaC = helper.isSelectedSigmaCInDeltaMassRange <2 >(pVecFirst, pVecThird, pVecSecond, pVecSoftPi, ptSigmaC, is3Prong[2 ], hMassVsPtC[kNCharmParticles + 9 ], activateQA);
15561575 if (whichSigmaC > 0 ) {
1557- // / let's build a candidate SigmaC++K- pair
1576+ // / let's build a candidate SigmaC++K- pair and SigmaC++,0K - proton
15581577 // / and keep it only if:
15591578 // / - it has the correct charge (±1)
15601579 // / - it is in the correct mass range
15611580
15621581 // check the charge for SigmaC++K- candidates
1563- if (std::abs (chargeSc + track.sign ()) != 1 ) {
1564- continue ;
1565- }
15661582
1583+ if (std::abs (chargeSc + track.sign ()) == 1 && std::abs (chargeSc) == 2 && configSigmaC.isTrigSigmaCPPK ){
15671584 // check the invariant mass
15681585 float massSigmaCPKPi{-999 .}, massSigmaCPiKP{-999 .}, deltaMassXicResoPKPi{-999 .}, deltaMassXicResoPiKP{-999 .};
15691586 float ptSigmaCKaon = RecoDecay::pt (pVecSigmaC, pVecFourth);
@@ -1579,7 +1596,7 @@ struct HfFilter { // Main struct for HF triggers
15791596 }
15801597 bool isPKPiOk = (cutsPtDeltaMassCharmReso->get (0u , 10u ) < deltaMassXicResoPKPi && deltaMassXicResoPKPi < cutsPtDeltaMassCharmReso->get (1u , 10u ));
15811598 bool isPiKPOk = (cutsPtDeltaMassCharmReso->get (0u , 10u ) < deltaMassXicResoPiKP && deltaMassXicResoPiKP < cutsPtDeltaMassCharmReso->get (1u , 10u ));
1582- if (isPKPiOk || isPiKPOk) {
1599+ if (( isPKPiOk || isPiKPOk) && isTrackKaon ) {
15831600 // / This is a good SigmaC++K- event
15841601 keepEvent[kSigmaCPPK ] = true ;
15851602
@@ -1604,6 +1621,16 @@ struct HfFilter { // Main struct for HF triggers
16041621 }
16051622 }
16061623 }
1624+ }
1625+ }
1626+ float deltaEta = std::abs (RecoDecay::eta (pVecSigmaC) - track.eta () && pt3Prong < 3.0 );
1627+ if (configSigmaC.isTrigSigmaCP && isTrackProton && deltaEta < 1.0 ) {
1628+
1629+ auto tagBDT = helper.isBDTSelected (scores[2 ], thresholdBDTScores[5 ]);
1630+
1631+ if (helper.selectionSigmaCForScPCorr (pVecFirst, pVecThird, pVecSecond, pVecSoftPi, ptSigmaC, is3Prong[2 ], hMassVsPtC[kNCharmParticles + 23 ], activateQA, configSigmaC.minMassSigmaCCorr , configSigmaC.maxMassSigmaCCorr , configSigmaC.minPtSigmaC , configSigmaC.maxPtSigmaC ) && TESTBIT (tagBDT, RecoDecay::OriginType::Prompt)) {
1632+ keepEvent[kSigmaCP ] = true ;
1633+ }
16071634 }
16081635 } // end SigmaC++ candidate
16091636 } // end loop over tracks (soft pi)
@@ -2001,7 +2028,7 @@ struct HfFilter { // Main struct for HF triggers
20012028 }
20022029 }
20032030
2004- tags (keepEvent[kHighPt2P ], keepEvent[kHighPt3P ], keepEvent[kBeauty3P ], keepEvent[kBeauty4P ], keepEvent[kFemto2P ], keepEvent[kFemto3P ], keepEvent[kDoubleCharm2P ], keepEvent[kDoubleCharm3P ], keepEvent[kDoubleCharmMix ], keepEvent[kV0Charm2P ], keepEvent[kV0Charm3P ], keepEvent[kCharmBarToXiBach ], keepEvent[kSigmaCPPK ], keepEvent[kSigmaC0K0 ], keepEvent[kPhotonCharm2P ], keepEvent[kPhotonCharm3P ], keepEvent[kSingleCharm2P ], keepEvent[kSingleCharm3P ], keepEvent[kSingleNonPromptCharm2P ], keepEvent[kSingleNonPromptCharm3P ], keepEvent[kCharmBarToXi2Bach ], keepEvent[kPrCharm2P ], keepEvent[kBtoJPsiKa ], keepEvent[kBtoJPsiKstar ], keepEvent[kBtoJPsiPhi ], keepEvent[kBtoJPsiPrKa ], keepEvent[kBtoJPsiPi ]);
2031+ tags (keepEvent[kHighPt2P ], keepEvent[kHighPt3P ], keepEvent[kBeauty3P ], keepEvent[kBeauty4P ], keepEvent[kFemto2P ], keepEvent[kFemto3P ], keepEvent[kDoubleCharm2P ], keepEvent[kDoubleCharm3P ], keepEvent[kDoubleCharmMix ], keepEvent[kV0Charm2P ], keepEvent[kV0Charm3P ], keepEvent[kCharmBarToXiBach ], keepEvent[kSigmaCPPK ], keepEvent[kSigmaC0K0 ], keepEvent[kSigmaCP ], keepEvent[ kPhotonCharm2P ], keepEvent[kPhotonCharm3P ], keepEvent[kSingleCharm2P ], keepEvent[kSingleCharm3P ], keepEvent[kSingleNonPromptCharm2P ], keepEvent[kSingleNonPromptCharm3P ], keepEvent[kCharmBarToXi2Bach ], keepEvent[kPrCharm2P ], keepEvent[kBtoJPsiKa ], keepEvent[kBtoJPsiKstar ], keepEvent[kBtoJPsiPhi ], keepEvent[kBtoJPsiPrKa ], keepEvent[kBtoJPsiPi ]);
20052032
20062033 if (!std::accumulate (keepEvent, keepEvent + kNtriggersHF , 0 )) {
20072034 hProcessedEvents->Fill (1 );
0 commit comments