@@ -120,6 +120,7 @@ struct HfCandidateCreatorXicToXiPiPi {
120120 Configurable<float > minDecayLength{" minDecayLength" , 0.015 , " Minimum decay length (computed with DCAFitter)" };
121121 Configurable<float > minCosPA{" minCosPA" , 0.9 , " Minimum coine of pointing angle (computed with DCAFitter)" };
122122 Configurable<float > maxChi2Pca{" maxChi2Pca" , 3 ., " Maximum chi2 PCA (computed with DCAFitter)" };
123+ Configurable<float > maxNsigmaXiDaus{" maxNsigmaXiDaus" , 3 ., " Maximum PID Nsigma values for Xi daughters (both TPC and TOF)" };
123124 } softTrigCuts;
124125
125126 Service<o2::ccdb::BasicCCDBManager> ccdb{};
@@ -231,9 +232,26 @@ struct HfCandidateCreatorXicToXiPiPi {
231232 // / \param pVecCascade is the cascade momentum vector
232233 // / \param trackParBachelor is the array with two bachelor track parametrisations
233234 // / \param collision is the collision containing the candidate
235+ // / \param nSigTpcBachelorPi is the TPC n-sigma for the Xi bachelor track with pion hypothesis
236+ // / \param nSigTofBachelorPi is the TOF n-sigma for the Xi bachelor track with pion hypothesis
237+ // / \param nSigTpcPiFromLambda is the TPC n-sigma for the pion track from the Lambda decay with pion hypothesis
238+ // / \param nSigTofPiFromLambda is the TOF n-sigma for the pion track from the Lambda decay with pion hypothesis
239+ // / \param nSigTpcPrFromLambda is the TPC n-sigma for the proton track from the Lambda decay with proton hypothesis
240+ // / \param nSigTofPrFromLambda is the TOF n-sigma for the proton track from the Lambda decay with proton hypothesis
241+ // / \return true if the candidate passes the software trigger selections, otherwise false
234242 template <typename TTrackParCov, typename Coll>
235- bool isSelectedXicSoftwareTriggers (std::array<float , 3 > const & pVecCascade, std::array<TTrackParCov, 2 > const & trackParBachelor, Coll const & collision)
243+ bool isSelectedXicSoftwareTriggers (std::array<float , 3 > const & pVecCascade, std::array<TTrackParCov, 2 > const & trackParBachelor, Coll const & collision, float nSigTpcBachelorPi, float nSigTofBachelorPi, float nSigTpcPiFromLambda, float nSigTofPiFromLambda, float nSigTpcPrFromLambda, float nSigTofPrFromLambda, bool hasTofBachelorPi, bool hasTofPiFromLambda, bool hasTofPrFromLambda )
236244 {
245+ if (std::abs (nSigTpcBachelorPi) < softTrigCuts.maxNsigmaXiDaus || (hasTofBachelorPi && std::abs (nSigTofBachelorPi) < softTrigCuts.maxNsigmaXiDaus )) {
246+ return false ;
247+ }
248+ if (std::abs (nSigTpcPiFromLambda) < softTrigCuts.maxNsigmaXiDaus || (hasTofPiFromLambda && std::abs (nSigTofPiFromLambda) < softTrigCuts.maxNsigmaXiDaus )) {
249+ return false ;
250+ }
251+ if (std::abs (nSigTpcPrFromLambda) < softTrigCuts.maxNsigmaXiDaus || (hasTofPrFromLambda && std::abs (nSigTofPrFromLambda) < softTrigCuts.maxNsigmaXiDaus )) {
252+ return false ;
253+ }
254+
237255 int nCand{0 };
238256 try {
239257 nCand = df2Prong.process (trackParBachelor[0 ], trackParBachelor[1 ]);
@@ -349,13 +367,42 @@ struct HfCandidateCreatorXicToXiPiPi {
349367 trackCasc.setAbsCharge (1 );
350368 trackCasc.setPID (o2::track::PID ::XiMinus);
351369
370+ // ----------------------------calculate physical properties-----------------------
371+ // Charge of charm baryon
372+ int8_t const signXic = casc.sign () < 0 ? +1 : -1 ;
373+
352374 // ----------------------------fit SV and create XicPlus track------------------
353375 auto trackParCovCharmBachelor0 = getTrackParCov (trackCharmBachelor0);
354376 auto trackParCovCharmBachelor1 = getTrackParCov (trackCharmBachelor1);
355377
356378 // if enabled, apply selections of software trigger
379+ float pPiFromLambda{}, pPrFromLambda{}, nSigTpcBachelorPi{}, nSigTofBachelorPi{}, nSigTpcPiFromLambda{}, nSigTofPiFromLambda{}, nSigTpcPrFromLambda{}, nSigTofPrFromLambda{};
357380 if (softTrigCuts.applySoftwareTrigSelections ) {
358- if (!isSelectedXicSoftwareTriggers (pVecCasc, std::array{trackParCovCharmBachelor0, trackParCovCharmBachelor1}, collision)) {
381+ // get PID information already here
382+ auto trackPionFromXi = casc.bachelor_as <TracksWCovDcaPidPrPi>();
383+ auto trackPosLambdaDaughter = casc.posTrack_as <TracksWCovDcaPidPrPi>();
384+ auto trackNegLambdaDaughter = casc.negTrack_as <TracksWCovDcaPidPrPi>();
385+ nSigTpcBachelorPi = trackPionFromXi.tpcNSigmaPi ();
386+ nSigTofBachelorPi = trackPionFromXi.tofNSigmaPi ();
387+ bool hasTofBachelorPi = trackPionFromXi.hasTOF ();
388+ bool hasTofPiFromLambda = false ;
389+ bool hasTofPrFromLambda = false ;
390+ if (signXic == +1 ) {
391+ pPiFromLambda = trackNegLambdaDaughter.p ();
392+ nSigTpcPiFromLambda = trackNegLambdaDaughter.tpcNSigmaPi ();
393+ nSigTofPiFromLambda = trackNegLambdaDaughter.tofNSigmaPi ();
394+ pPrFromLambda = trackPosLambdaDaughter.p ();
395+ nSigTpcPrFromLambda = trackPosLambdaDaughter.tpcNSigmaPr ();
396+ nSigTofPrFromLambda = trackPosLambdaDaughter.tofNSigmaPr ();
397+ } else {
398+ pPiFromLambda = trackPosLambdaDaughter.p ();
399+ nSigTpcPiFromLambda = trackPosLambdaDaughter.tpcNSigmaPi ();
400+ nSigTofPiFromLambda = trackPosLambdaDaughter.tofNSigmaPi ();
401+ pPrFromLambda = trackNegLambdaDaughter.p ();
402+ nSigTpcPrFromLambda = trackNegLambdaDaughter.tpcNSigmaPr ();
403+ nSigTofPrFromLambda = trackNegLambdaDaughter.tofNSigmaPr ();
404+ }
405+ if (!isSelectedXicSoftwareTriggers (pVecCasc, std::array{trackParCovCharmBachelor0, trackParCovCharmBachelor1}, collision, nSigTpcBachelorPi, nSigTofBachelorPi, nSigTpcPiFromLambda, nSigTofPiFromLambda, nSigTpcPrFromLambda, nSigTofPrFromLambda)) {
359406 continue ;
360407 }
361408 }
@@ -371,10 +418,6 @@ struct HfCandidateCreatorXicToXiPiPi {
371418 }
372419 registry.fill (HIST (" hCandCounter" ), VertexFit);
373420
374- // ----------------------------calculate physical properties-----------------------
375- // Charge of charm baryon
376- int8_t const signXic = casc.sign () < 0 ? +1 : -1 ;
377-
378421 // get SV properties
379422 const auto & secondaryVertex = df.getPCACandidate ();
380423 auto chi2SV = df.getChi2AtPCACandidate ();
@@ -436,28 +479,29 @@ struct HfCandidateCreatorXicToXiPiPi {
436479 float const nSigTofPiFromXicPlus0 = trackCharmBachelor0.tofNSigmaPi ();
437480 float const nSigTpcPiFromXicPlus1 = trackCharmBachelor1.tpcNSigmaPi ();
438481 float const nSigTofPiFromXicPlus1 = trackCharmBachelor1.tofNSigmaPi ();
439- // Bachelor pion
440- auto trackPionFromXi = casc.bachelor_as <TracksWCovDcaPidPrPi>();
441- float const nSigTpcBachelorPi = trackPionFromXi.tpcNSigmaPi ();
442- float const nSigTofBachelorPi = trackPionFromXi.tofNSigmaPi ();
443- // Lambda daughters
444- auto trackPosLambdaDaughter = casc.posTrack_as <TracksWCovDcaPidPrPi>();
445- auto trackNegLambdaDaughter = casc.negTrack_as <TracksWCovDcaPidPrPi>();
446- float pPiFromLambda{}, pPrFromLambda{}, nSigTpcPiFromLambda{}, nSigTofPiFromLambda{}, nSigTpcPrFromLambda{}, nSigTofPrFromLambda{};
447- if (signXic == +1 ) {
448- pPiFromLambda = trackNegLambdaDaughter.p ();
449- nSigTpcPiFromLambda = trackNegLambdaDaughter.tpcNSigmaPi ();
450- nSigTofPiFromLambda = trackNegLambdaDaughter.tofNSigmaPi ();
451- pPrFromLambda = trackPosLambdaDaughter.p ();
452- nSigTpcPrFromLambda = trackPosLambdaDaughter.tpcNSigmaPr ();
453- nSigTofPrFromLambda = trackPosLambdaDaughter.tofNSigmaPr ();
454- } else {
455- pPiFromLambda = trackPosLambdaDaughter.p ();
456- nSigTpcPiFromLambda = trackPosLambdaDaughter.tpcNSigmaPi ();
457- nSigTofPiFromLambda = trackPosLambdaDaughter.tofNSigmaPi ();
458- pPrFromLambda = trackNegLambdaDaughter.p ();
459- nSigTpcPrFromLambda = trackNegLambdaDaughter.tpcNSigmaPr ();
460- nSigTofPrFromLambda = trackNegLambdaDaughter.tofNSigmaPr ();
482+ if (!softTrigCuts.applySoftwareTrigSelections ) {
483+ // Bachelor pion
484+ auto trackPionFromXi = casc.bachelor_as <TracksWCovDcaPidPrPi>();
485+ nSigTpcBachelorPi = trackPionFromXi.tpcNSigmaPi ();
486+ nSigTofBachelorPi = trackPionFromXi.tofNSigmaPi ();
487+ // Lambda daughters
488+ auto trackPosLambdaDaughter = casc.posTrack_as <TracksWCovDcaPidPrPi>();
489+ auto trackNegLambdaDaughter = casc.negTrack_as <TracksWCovDcaPidPrPi>();
490+ if (signXic == +1 ) {
491+ pPiFromLambda = trackNegLambdaDaughter.p ();
492+ nSigTpcPiFromLambda = trackNegLambdaDaughter.tpcNSigmaPi ();
493+ nSigTofPiFromLambda = trackNegLambdaDaughter.tofNSigmaPi ();
494+ pPrFromLambda = trackPosLambdaDaughter.p ();
495+ nSigTpcPrFromLambda = trackPosLambdaDaughter.tpcNSigmaPr ();
496+ nSigTofPrFromLambda = trackPosLambdaDaughter.tofNSigmaPr ();
497+ } else {
498+ pPiFromLambda = trackPosLambdaDaughter.p ();
499+ nSigTpcPiFromLambda = trackPosLambdaDaughter.tpcNSigmaPi ();
500+ nSigTofPiFromLambda = trackPosLambdaDaughter.tofNSigmaPi ();
501+ pPrFromLambda = trackNegLambdaDaughter.p ();
502+ nSigTpcPrFromLambda = trackNegLambdaDaughter.tpcNSigmaPr ();
503+ nSigTofPrFromLambda = trackNegLambdaDaughter.tofNSigmaPr ();
504+ }
461505 }
462506
463507 // --------------------------------------------fill histograms----------------------------------------------------------------
@@ -546,11 +590,40 @@ struct HfCandidateCreatorXicToXiPiPi {
546590 auto trackCharmBachelor1 = rowTrackIndexXicPlus.prong1_as <TracksWCovExtraPidPrPi>();
547591
548592 // if enabled, apply selections of software trigger
593+ float pPiFromLambda{}, pPrFromLambda{}, nSigTpcBachelorPi{}, nSigTofBachelorPi{}, nSigTpcPiFromLambda{}, nSigTofPiFromLambda{}, nSigTpcPrFromLambda{}, nSigTofPrFromLambda{};
549594 if (softTrigCuts.applySoftwareTrigSelections ) {
595+ // get PID information already here
596+ auto trackPionFromXi = casc.bachelor_as <TracksWCovDcaPidPrPi>();
597+ auto trackPosLambdaDaughter = casc.posTrack_as <TracksWCovDcaPidPrPi>();
598+ auto trackNegLambdaDaughter = casc.negTrack_as <TracksWCovDcaPidPrPi>();
599+ nSigTpcBachelorPi = trackPionFromXi.tpcNSigmaPi ();
600+ nSigTofBachelorPi = trackPionFromXi.tofNSigmaPi ();
601+ bool hasTofBachelorPi = trackPionFromXi.hasTOF ();
602+ bool hasTofPiFromLambda = false ;
603+ bool hasTofPrFromLambda = false ;
604+ if (signXic == +1 ) {
605+ pPiFromLambda = trackNegLambdaDaughter.p ();
606+ nSigTpcPiFromLambda = trackNegLambdaDaughter.tpcNSigmaPi ();
607+ nSigTofPiFromLambda = trackNegLambdaDaughter.tofNSigmaPi ();
608+ hasTofPiFromLambda = trackNegLambdaDaughter.hasTOF ();
609+ pPrFromLambda = trackPosLambdaDaughter.p ();
610+ nSigTpcPrFromLambda = trackPosLambdaDaughter.tpcNSigmaPr ();
611+ nSigTofPrFromLambda = trackPosLambdaDaughter.tofNSigmaPr ();
612+ hasTofPrFromLambda = trackPosLambdaDaughter.hasTOF ();
613+ } else {
614+ pPiFromLambda = trackPosLambdaDaughter.p ();
615+ nSigTpcPiFromLambda = trackPosLambdaDaughter.tpcNSigmaPi ();
616+ nSigTofPiFromLambda = trackPosLambdaDaughter.tofNSigmaPi ();
617+ hasTofPiFromLambda = trackPosLambdaDaughter.hasTOF ();
618+ pPrFromLambda = trackNegLambdaDaughter.p ();
619+ nSigTpcPrFromLambda = trackNegLambdaDaughter.tpcNSigmaPr ();
620+ nSigTofPrFromLambda = trackNegLambdaDaughter.tofNSigmaPr ();
621+ hasTofPrFromLambda = trackNegLambdaDaughter.hasTOF ();
622+ }
550623 auto trackParCovCharmBachelor0 = getTrackParCov (trackCharmBachelor0);
551624 auto trackParCovCharmBachelor1 = getTrackParCov (trackCharmBachelor1);
552625 std::array<float , 3 > const pVecCasc = {casc.px (), casc.py (), casc.pz ()};
553- if (!isSelectedXicSoftwareTriggers (pVecCasc, std::array{trackParCovCharmBachelor0, trackParCovCharmBachelor1}, collision)) {
626+ if (!isSelectedXicSoftwareTriggers (pVecCasc, std::array{trackParCovCharmBachelor0, trackParCovCharmBachelor1}, collision, nSigTpcBachelorPi, nSigTofBachelorPi, nSigTpcPiFromLambda, nSigTofPiFromLambda, nSigTpcPrFromLambda, nSigTofPrFromLambda, hasTofBachelorPi, hasTofPiFromLambda, hasTofPrFromLambda )) {
554627 continue ;
555628 }
556629 }
@@ -730,28 +803,33 @@ struct HfCandidateCreatorXicToXiPiPi {
730803 float const nSigTofPiFromXicPlus0 = trackCharmBachelor0.tofNSigmaPi ();
731804 float const nSigTpcPiFromXicPlus1 = trackCharmBachelor1.tpcNSigmaPi ();
732805 float const nSigTofPiFromXicPlus1 = trackCharmBachelor1.tofNSigmaPi ();
733- // Bachelor pion
734- auto trackPionFromXi = casc.bachelor_as <TracksWCovExtraPidPrPi>();
735- float const nSigTpcBachelorPi = trackPionFromXi.tpcNSigmaPi ();
736- float const nSigTofBachelorPi = trackPionFromXi.tofNSigmaPi ();
737- // Lambda daughters
738- auto trackPosLambdaDaughter = casc.posTrack_as <TracksWCovExtraPidPrPi>();
739- auto trackNegLambdaDaughter = casc.negTrack_as <TracksWCovExtraPidPrPi>();
740- float pPiFromLambda{}, pPrFromLambda{}, nSigTpcPiFromLambda{}, nSigTofPiFromLambda{}, nSigTpcPrFromLambda{}, nSigTofPrFromLambda{};
741- if (signXic == +1 ) {
742- pPiFromLambda = trackNegLambdaDaughter.p ();
743- nSigTpcPiFromLambda = trackNegLambdaDaughter.tpcNSigmaPi ();
744- nSigTofPiFromLambda = trackNegLambdaDaughter.tofNSigmaPi ();
745- pPrFromLambda = trackPosLambdaDaughter.p ();
746- nSigTpcPrFromLambda = trackPosLambdaDaughter.tpcNSigmaPr ();
747- nSigTofPrFromLambda = trackPosLambdaDaughter.tofNSigmaPr ();
748- } else {
749- pPiFromLambda = trackPosLambdaDaughter.p ();
750- nSigTpcPiFromLambda = trackPosLambdaDaughter.tpcNSigmaPi ();
751- nSigTofPiFromLambda = trackPosLambdaDaughter.tofNSigmaPi ();
752- pPrFromLambda = trackNegLambdaDaughter.p ();
753- nSigTpcPrFromLambda = trackNegLambdaDaughter.tpcNSigmaPr ();
754- nSigTofPrFromLambda = trackNegLambdaDaughter.tofNSigmaPr ();
806+ if (!softTrigCuts.applySoftwareTrigSelections ) {
807+ // Bachelor pion
808+ auto trackPionFromXi = casc.bachelor_as <TracksWCovDcaPidPrPi>();
809+ nSigTpcBachelorPi = trackPionFromXi.tpcNSigmaPi ();
810+ nSigTofBachelorPi = trackPionFromXi.tofNSigmaPi ();
811+ // Lambda daughters
812+ auto trackPosLambdaDaughter = casc.posTrack_as <TracksWCovDcaPidPrPi>();
813+ auto trackNegLambdaDaughter = casc.negTrack_as <TracksWCovDcaPidPrPi>();
814+ if (signXic == +1 ) {
815+ pPiFromLambda = trackNegLambdaDaughter.p ();
816+ nSigTpcPiFromLambda = trackNegLambdaDaughter.tpcNSigmaPi ();
817+ nSigTofPiFromLambda = trackNegLambdaDaughter.tofNSigmaPi ();
818+ hasTofPiFromLambda = trackNegLambdaDaughter.hasTOF ();
819+ pPrFromLambda = trackPosLambdaDaughter.p ();
820+ nSigTpcPrFromLambda = trackPosLambdaDaughter.tpcNSigmaPr ();
821+ nSigTofPrFromLambda = trackPosLambdaDaughter.tofNSigmaPr ();
822+ hasTofPrFromLambda = trackPosLambdaDaughter.hasTOF ();
823+ } else {
824+ pPiFromLambda = trackPosLambdaDaughter.p ();
825+ nSigTpcPiFromLambda = trackPosLambdaDaughter.tpcNSigmaPi ();
826+ nSigTofPiFromLambda = trackPosLambdaDaughter.tofNSigmaPi ();
827+ hasTofPiFromLambda = trackPosLambdaDaughter.hasTOF ();
828+ pPrFromLambda = trackNegLambdaDaughter.p ();
829+ nSigTpcPrFromLambda = trackNegLambdaDaughter.tpcNSigmaPr ();
830+ nSigTofPrFromLambda = trackNegLambdaDaughter.tofNSigmaPr ();
831+ hasTofPrFromLambda = trackNegLambdaDaughter.hasTOF ();
832+ }
755833 }
756834
757835 // -------------------------------fill histograms--------------------------------------------
0 commit comments