159 uint32_t nProtonCandidates{0};
160 uint32_t nPionCandidates{0};
161 uint32_t nSelectedTracks{0};
163 for (
size_t iTrk = 0; iTrk <
tracks.size(); ++iTrk) {
173 particleInfo.fBeta = std::numeric_limits<double>::quiet_NaN();
174 particleInfo.fQp = std::numeric_limits<double>::quiet_NaN();
175 particleInfo.fbSelected =
false;
188 particleInfo.fbSelected =
true;
192 qpVar = qpVar * qpVar;
194 trkParam.first.SetQp(particleInfo.fQp);
195 trkParam.first.SetC44(qpVar);
196 trkParam.second.SetQp(particleInfo.fQp);
197 trkParam.second.SetC44(qpVar);
199 switch (particleInfo.fPdg) {
200 case -211: ++nPionCandidates;
break;
201 case 2212: ++nProtonCandidates;
break;
206 if (!nPionCandidates || !nProtonCandidates) {
216 KFPTrackVector kfpTracksFst;
217 KFPTrackVector kfpTracksLst;
218 kfpTracksFst.Resize(nSelectedTracks);
219 kfpTracksLst.Resize(nSelectedTracks);
237 uint32_t nLambdaCandidates =
238 std::count_if(particles.begin(), particles.end(), [&](
const auto& p) { return p.GetPDG() == 3122; });
241 return static_cast<bool>(nLambdaCandidates);
344 double tx{trkParam.
GetTx()};
345 double ty{trkParam.
GetTy()};
346 double qp{trkParam.
GetQp()};
347 double p{particleInfo.
fCharge / qp};
349 double t2inv{1. / (1. + tx * tx + ty * ty)};
350 double pz{std::sqrt(t2inv * p2)};
354 trackVector.SetParameter(trkParam.
GetX(), 0, iKfpTrk);
355 trackVector.SetParameter(trkParam.
GetY(), 1, iKfpTrk);
356 trackVector.SetParameter(trkParam.
GetZ(), 2, iKfpTrk);
357 trackVector.SetParameter(px, 3, iKfpTrk);
358 trackVector.SetParameter(py, 4, iKfpTrk);
359 trackVector.SetParameter(pz, 5, iKfpTrk);
362 std::array<std::array<double, 3>, 3> Jp;
363 Jp[2][0] = -t2inv * px;
364 Jp[2][1] = -t2inv * py;
366 Jp[0][0] = tx * Jp[2][0] + pz;
367 Jp[0][1] = tx * Jp[2][1];
368 Jp[0][2] = tx * Jp[2][2];
369 Jp[1][0] = ty * Jp[2][0];
370 Jp[1][1] = ty * Jp[2][1] + pz;
371 Jp[1][2] = ty * Jp[2][2];
376 trackVector.SetCovariance(trkParam.
C00(), 0, iKfpTrk);
377 trackVector.SetCovariance(trkParam.
C01(), 1, iKfpTrk);
378 trackVector.SetCovariance(trkParam.
C11(), 2, iKfpTrk);
381 auto MomPosCovariance = [&](
const int k,
const int l) constexpr->double
384 const auto& JpA = Jp[k];
385 for (
int i = 0; i < 3; ++i) {
386 val += JpA[i] * trkParam.C(i + 2, l);
390 trackVector.SetCovariance(MomPosCovariance(0, 0), 6, iKfpTrk);
391 trackVector.SetCovariance(MomPosCovariance(0, 1), 7, iKfpTrk);
392 trackVector.SetCovariance(MomPosCovariance(1, 0), 10, iKfpTrk);
393 trackVector.SetCovariance(MomPosCovariance(1, 1), 11, iKfpTrk);
394 trackVector.SetCovariance(MomPosCovariance(2, 0), 15, iKfpTrk);
395 trackVector.SetCovariance(MomPosCovariance(2, 1), 16, iKfpTrk);
398 auto MomentumCovariance = [&](
const int k,
const int l) constexpr->double
401 const auto& JpA = Jp[k];
402 const auto& JpB = Jp[l];
403 for (
int i = 0; i < 3; ++i) {
405 for (
int j = 0; j < 3; ++j) {
406 factor += JpB[j] * trkParam.C(i + 2, j + 2);
408 val += JpA[i] * factor;
412 trackVector.SetCovariance(MomentumCovariance(0, 0), 9, iKfpTrk);
413 trackVector.SetCovariance(MomentumCovariance(1, 0), 13, iKfpTrk);
414 trackVector.SetCovariance(MomentumCovariance(1, 1), 14, iKfpTrk);
415 trackVector.SetCovariance(MomentumCovariance(2, 0), 18, iKfpTrk);
416 trackVector.SetCovariance(MomentumCovariance(2, 1), 19, iKfpTrk);
417 trackVector.SetCovariance(MomentumCovariance(2, 2), 20, iKfpTrk);
420 trackVector.SetCovariance(0.f, 3, iKfpTrk);
421 trackVector.SetCovariance(0.f, 4, iKfpTrk);
422 trackVector.SetCovariance(0.f, 5, iKfpTrk);
423 trackVector.SetCovariance(0.f, 8, iKfpTrk);
424 trackVector.SetCovariance(0.f, 12, iKfpTrk);
425 trackVector.SetCovariance(0.f, 17, iKfpTrk);
430 for (
int iF = 0; iF < 10; ++iF) {
431 trackVector.SetFieldCoefficient(0.f, iF, iKfpTrk);
434 trackVector.SetId(iCaTrk, iKfpTrk);
435 trackVector.SetPDG(particleInfo.fPdg, iKfpTrk);
436 trackVector.SetQ(particleInfo.fCharge, iKfpTrk);
437 trackVector.SetNPixelHits(0, iKfpTrk);
440 trackVector.SetPVIndex(-1, iKfpTrk);