@@ -558,7 +558,7 @@ struct TrackedHypertritonRecoTask {
558558 }
559559
560560 template <typename TCollision, typename TTrack, typename TTrackParCov>
561- void fit2BodyWithKF (TCollision const & collision,
561+ bool fit2BodyWithKF (TCollision const & collision,
562562 TTrack const & trackHelium,
563563 TTrack const & trackPion,
564564 TTrackParCov const & trackHeliumCov,
@@ -591,7 +591,12 @@ struct TrackedHypertritonRecoTask {
591591 int nDaughtersV0 = 2 ;
592592 const KFParticle* DaughtersV0[2 ] = {&kfpHelium, &kfpPion};
593593 KFV0 .SetConstructMethod (2 );
594- KFV0 .Construct (DaughtersV0, nDaughtersV0);
594+ try {
595+ KFV0 .Construct (DaughtersV0, nDaughtersV0);
596+ } catch (std::runtime_error& e) {
597+ LOG (debug) << " Failed to create V0 vertex." << e.what ();
598+ return false ;
599+ }
595600
596601 // topological constraint
597602 if (twoBody.kfSetTopologicalConstraint ) {
@@ -639,21 +644,23 @@ struct TrackedHypertritonRecoTask {
639644
640645 // vertex chi2
641646 v0.chi2 = KFV0 .GetChi2 () / KFV0 .GetNDF ();
647+
648+ return true ;
642649 }
643650
644651 template <typename TTrackParCov>
645- void fit2bodyWithDCAFitter (TTrackParCov const & trackHeliumCov,
652+ bool fit2bodyWithDCAFitter (TTrackParCov const & trackHeliumCov,
646653 TTrackParCov const & trackPionCov)
647654 {
648655 int nCandidates = 0 ;
649656 try {
650657 nCandidates = fitter2Body.process (trackHeliumCov, trackPionCov);
651658 } catch (...) {
652659 LOG (error) << " Exception while fitting a tracked two-body candidate" ;
653- return ;
660+ return false ;
654661 }
655662 if (nCandidates == 0 ) {
656- return ;
663+ return false ;
657664 }
658665
659666 // get daughter momenta
@@ -681,6 +688,8 @@ struct TrackedHypertritonRecoTask {
681688 v0.decayVertex [i] = secondaryVertex[i];
682689 }
683690 v0.chi2 = std::sqrt (fitter2Body.getChi2AtPCACandidate ());
691+
692+ return true ;
684693 }
685694
686695 template <typename TTrack, typename TCollision, typename TFillCandidate>
@@ -691,10 +700,10 @@ struct TrackedHypertritonRecoTask {
691700 auto heTrackCov = getTrackParCov (heTrack);
692701 auto piTrackCov = getTrackParCov (piTrack);
693702
694- if (twoBody.useKFParticle ) {
695- fit2BodyWithKF (collision, heTrack, piTrack, heTrackCov, piTrackCov) ;
696- } else {
697- fit2bodyWithDCAFitter (heTrackCov, piTrackCov) ;
703+ if (twoBody.useKFParticle && ! fit2BodyWithKF (collision, heTrack, piTrack, heTrackCov, piTrackCov) ) {
704+ return ;
705+ } else if (! fit2bodyWithDCAFitter (heTrackCov, piTrackCov)) {
706+ return ;
698707 }
699708
700709 v0.cosPA = RecoDecay::cpa (primaryVertex, v0.decayVertex , v0.momentum );
@@ -910,22 +919,22 @@ struct TrackedHypertritonRecoTask {
910919 const auto trackProton = trackDeuteron.sign () > 0 ? trackPositive : trackNegative;
911920 const auto trackPion = trackDeuteron.sign () > 0 ? trackNegative : trackPositive;
912921
913- // get DCA of ITS track to SV
914- const auto itsTrack = tracked3Body.itsTrack_as <Tracks>();
915- auto itsTrackParCov = getTrackParCov (itsTrack);
916- std::array<float , 2 > dcaInfoItsTrack{};
917- o2::base::Propagator::Instance ()->propagateToDCABxByBz ({collision.posX (), collision.posY (), collision.posZ ()}, itsTrackParCov, 2 .f , fitter2Body.getMatCorrType (), &dcaInfoItsTrack);
918- builder3Body.decay3body .itsTrackDCAToSV [0 ] = dcaInfoItsTrack[0 ];
919- builder3Body.decay3body .itsTrackDCAToSV [1 ] = dcaInfoItsTrack[1 ];
920- if (threeBody.useSelections && (builder3Body.decay3body .itsTrackDCAToSV [0 ] > threeBody.maxITSDCAxytrackToSV || builder3Body.decay3body .itsTrackDCAToSV [1 ] > threeBody.maxITSDCAztrackToSV )) {
921- continue ;
922- }
923-
924922 if (builder3Body.buildDecay3BodyCandidate (collision, trackProton, trackPion, trackDeuteron,
925923 decay3Body.globalIndex (), deuteronTOFNSigma (collision, trackDeuteron), tracked3Body.itsClsSize (),
926924 threeBody.useKFParticle , threeBody.setTopologicalConstraint ,
927925 threeBody.useSelections , threeBody.useChi2Selection , threeBody.useTPCforPion ,
928926 threeBody.acceptTPCOnly , threeBody.askOnlyITSMatch , threeBody.calculateCovariance )) {
927+ // get DCA of ITS track to SV
928+ const auto itsTrack = tracked3Body.itsTrack_as <Tracks>();
929+ auto itsTrackParCov = getTrackParCov (itsTrack);
930+ std::array<float , 2 > dcaInfoItsTrack{};
931+ o2::base::Propagator::Instance ()->propagateToDCABxByBz ({builder3Body.decay3body .position [0 ], builder3Body.decay3body .position [1 ], builder3Body.decay3body .position [2 ]}, itsTrackParCov, 2 .f , fitter2Body.getMatCorrType (), &dcaInfoItsTrack);
932+ builder3Body.decay3body .itsTrackDCAToSV [0 ] = dcaInfoItsTrack[0 ];
933+ builder3Body.decay3body .itsTrackDCAToSV [1 ] = dcaInfoItsTrack[1 ];
934+ if (threeBody.useSelections && (builder3Body.decay3body .itsTrackDCAToSV [0 ] > threeBody.maxITSDCAxytrackToSV || builder3Body.decay3body .itsTrackDCAToSV [1 ] > threeBody.maxITSDCAztrackToSV )) {
935+ continue ;
936+ }
937+
929938 fillThreeBodyTables ();
930939 }
931940 }
0 commit comments