11 #include <analysis/dataobjects/Particle.h>
12 #include <framework/dataobjects/UncertainHelix.h>
13 #include <mdst/dataobjects/MCParticle.h>
15 #include <analysis/VertexFitting/TreeFitter/InternalTrack.h>
16 #include <analysis/VertexFitting/TreeFitter/FitParams.h>
17 #include <analysis/VertexFitting/TreeFitter/HelixUtils.h>
18 #include <framework/logging/Logger.h>
19 #include <mdst/dataobjects/Track.h>
23 namespace TreeFitter {
24 constexpr
double pi = TMath::Pi();
25 constexpr
double twoPi = TMath::TwoPi();
32 bool forceMassConstraint
35 m_massconstraint(false),
36 m_noEnergySum(noEnergySum),
37 m_isconversion(false),
47 B2ERROR(
"Trying to create an InternalTrack from NULL. This should never happen.");
51 if (forceMassConstraint) {
67 status |= daughter->initMotherlessParticle(fitparams);
74 fitparams.
getStateVector().segment(posindex, 3) = Eigen::Matrix<double, 3, 1>::Zero(3);
83 vector<ParticleBase*> alldaughters;
84 vector<ParticleBase*> vtxdaughters;
85 vector<RecoTrack*> trkdaughters;
90 if (daughter->type() == ParticleBase::TFParticleType::kRecoTrack) {
91 trkdaughters.push_back(
static_cast<RecoTrack*
>(daughter));
92 }
else if (daughter->hasPosition() && fitparams.
getStateVector()(daughter->posIndex()) != 0) {
93 vtxdaughters.push_back(daughter);
97 if (trkdaughters.size() >= 2) {
108 double flt1(0), flt2(0);
125 fitparams.
getStateVector().segment(posindex, 3) = Eigen::Matrix<double, 1, 3>::Zero(3);
131 daughter->initParticleWithMother(fitparams);
155 fitparams.
getStateVector().segment(momindex, 4) = Eigen::Matrix<double, 4, 1>::Zero(4);
158 int daumomindex = daughter->momIndex();
159 int maxrow = daughter->hasEnergy() ? 4 : 3;
164 double mass = daughter->pdgMass();
165 double pSquared = fitparams.
getStateVector().segment(daumomindex, maxrow).squaredNorm();
166 fitparams.
getStateVector()(momindex + 3) += std::sqrt(pSquared + mass * mass);
169 return ErrCode(ErrCode::Status::success);
177 for (
int i = 0; i < 3; ++i) {
185 for (
int i = 0; i < maxrow; ++i) {
190 status |= daughter->initCovariance(fitparams);
198 list.push_back(
Constraint(
this, Constraint::helix, depth, 5, 5));
201 list.push_back(
Constraint(
this, Constraint::mass, depth, 1, 3));
205 daughter->addToConstraintList(list, depth - 1);
215 case Constraint::helix:
218 case Constraint::mass:
235 Eigen::Matrix<double, 1, 6> positionAndMomentumIn = Eigen::Matrix<double, 1, 6>::Zero(1, 6);
236 Eigen::Matrix<double, 1, 6> positionAndMomentumOut = Eigen::Matrix<double, 1, 6>::Zero(1, 6);
238 positionAndMomentumIn.segment(0, 3) = fitparams.
getStateVector().segment(posIndexMother, 3);
239 positionAndMomentumIn.segment(3, 3) = fitparams.
getStateVector().segment(momindex, 3);
240 positionAndMomentumOut.segment(0, 3) = fitparams.
getStateVector().segment(posindex, 3);
242 const int momIndexDaughter = daughter->momIndex();
243 positionAndMomentumOut.segment(3, 3) += fitparams.
getStateVector().segment(momIndexDaughter, 3);
246 TVector3 vertexPosition(positionAndMomentumIn(0), positionAndMomentumIn(1), positionAndMomentumIn(2));
247 TVector3 momentum(positionAndMomentumIn(3), positionAndMomentumIn(4), positionAndMomentumIn(5));
249 TMatrixDSym carthesianCovariance(6);
250 for (
size_t i = 0 ; i < 3; ++i) {
251 for (
size_t j = 0; j < 3; ++j) {
252 carthesianCovariance(i , j) = fitparams.
getCovariance()(posindex + i, posindex + j);
253 carthesianCovariance(i , j + 3) = fitparams.
getCovariance()(posindex + i, momindex + j);
254 carthesianCovariance(i + 3, j) = fitparams.
getCovariance()(momindex + i, posindex + j);
255 carthesianCovariance(i + 3, j + 3) = fitparams.
getCovariance()(momindex + i, momindex + j);
264 carthesianCovariance,
268 Eigen::Matrix<double, 5, 5> covarianceMatrix = Eigen::Matrix<double, 5, 5>::Zero(5, 5);
270 for (
int i = 0; i < 5; ++i) {
271 for (
int j = 0; j < 5; ++j) {
272 covarianceMatrix(i, j) = covarianceMatrixROOT(i, j);
277 TVector3(positionAndMomentumOut(0), positionAndMomentumOut(1), positionAndMomentumOut(2)),
278 TVector3(positionAndMomentumOut(3), positionAndMomentumOut(4), positionAndMomentumOut(5)),
283 Eigen::Matrix<double, 5, 6> jacobian = Eigen::Matrix<double, 5, 6>::Zero(5, 6);
286 positionAndMomentumIn(0),
287 positionAndMomentumIn(1),
288 positionAndMomentumIn(2),
289 positionAndMomentumIn(3),
290 positionAndMomentumIn(4),
291 positionAndMomentumIn(5),
296 p.getResiduals().segment(0, 5)(0) = helixIn.getD0() - helixOut.getD0();
297 p.getResiduals().segment(0, 5)(1) = helixIn.getPhi0() - helixOut.getPhi0();
298 p.getResiduals().segment(0, 5)(2) = helixIn.getOmega() - helixOut.getOmega();
299 p.getResiduals().segment(0, 5)(3) = helixIn.getZ0() - helixOut.getZ0();
300 p.getResiduals().segment(0, 5)(4) = helixIn.getTanLambda() - helixOut.getTanLambda();
303 double phiResidual = p.getResiduals().segment(0, 5)(1);
304 phiResidual = std::fmod(phiResidual + pi, twoPi);
305 if (phiResidual < 0) {
306 phiResidual += twoPi;
309 p.getResiduals().segment(0, 5)(1) = phiResidual;
311 p.getV().triangularView<Eigen::Lower>() = covarianceMatrix.triangularView<Eigen::Lower>();
312 p.getH().block<5, 3>(0, posIndexMother) = -1.0 * jacobian.block<5, 3>(0, 0);
313 p.getH().block<5, 3>(0, momindex) = -1.0 * jacobian.block<5, 3>(0, 3);
352 daughter->forceP4Sum(fitparams);
355 Eigen::Matrix<double, 1, 6> positionAndMomentumOut = Eigen::Matrix<double, 1, 6>::Zero(1, 6);
356 positionAndMomentumOut.segment(0, 3) = fitparams.
getStateVector().segment(posindex, 3);
359 const int momIndexDaughter = daughter->momIndex();
360 positionAndMomentumOut.segment(3, 3) += fitparams.
getStateVector().segment(momIndexDaughter, 3);
364 TVector3(positionAndMomentumOut(0), positionAndMomentumOut(1), positionAndMomentumOut(2)),
365 TVector3(positionAndMomentumOut(3), positionAndMomentumOut(4), positionAndMomentumOut(5)),
372 double arcLength2D = helixOut.getArcLength2DAtXY(x, y);
373 TVector3 pAtProduction = helixOut.getMomentumAtArcLength2D(arcLength2D,
m_bfield);
380 double newEnergy = sqrt(
pdgMass() *
pdgMass() + pAtProduction.Mag2());