Skip to content

Commit a9ad081

Browse files
committed
Don't fill 2-body tables if vertex fit fails
Fix computation of ITS track DCA to SV
1 parent b73c945 commit a9ad081

1 file changed

Lines changed: 29 additions & 20 deletions

File tree

PWGLF/TableProducer/Nuspex/trackedHypertritonRecoTask.cxx

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)