43 constexpr int toCov6[7] = {3, 4, 5, -1, 0, 1, 2};
104 const int pdgTrackMinus, genfit::GFRaveVertex& vertex)
114 [&](
const genfit::Track & track,
const int pdg) {
115 const TParticlePDG* particle = pdgDB->GetParticle(pdg);
117 B2ERROR(
"Unknown PDG code of the daughter hypothesis." <<
LogVar(
"PDG code", pdg));
125 const genfit::MeasuredStateOnPlane state = track.getFittedState();
126 state.getPosMomCov(pos, mom, cov6);
128 const double mass = particle->Mass();
129 const CLHEP::HepLorentzVector clhepMom(mom.X(), mom.Y(), mom.Z(), std::sqrt(mom.Mag2() + mass * mass));
132 const CLHEP::HepSymMatrix clhepCov7 = makeCov7x7(cov6, clhepMom);
133 const int charge = track.getFitStatus()->getCharge();
135 vertexFit.
addTrack(clhepMom, clhepPos, clhepCov7, charge);
140 if (not addTrackToFit(trackPlus, pdgTrackPlus))
return false;
141 if (not addTrackToFit(trackMinus, pdgTrackMinus))
return false;
143 B2ERROR(
"Exception during vertex fit.");
148 if (!ok)
return false;
152 const TVector3 extrapolationTarget(posVertex.x(), posVertex.y(), posVertex.z());
154 std::vector<genfit::GFRaveTrackParameters*> trackParamsVertex;
155 trackParamsVertex.reserve(2);
156 for (
int i = 0; i <= 1; ++i) {
157 const genfit::Track& daughter = i == 0 ? trackPlus : trackMinus;
165 genfit::MeasuredStateOnPlane daughterState = daughter.getFittedState();
166 daughterState.extrapolateToPoint(extrapolationTarget);
167 daughterState.getPosMomCov(pos, mom, cov6);
169 B2ERROR(
"Exception while extrapolating a daughter to the fitted vertex.");
170 for (
auto* trackParams : trackParamsVertex)
delete trackParams;
180 genfit::GFRaveTrackParameters* trackParams =
new genfit::GFRaveTrackParameters(
nullptr,
nullptr, 1, state, cov6,
true);
181 trackParamsVertex.push_back(trackParams);
183 const double ndfVertex =
static_cast<double>(vertexFit.
getNDF());
184 const double chisqVertex = vertexFit.
getCHIsq();
186 vertex = genfit::GFRaveVertex{TVector3{posVertex.x(), posVertex.y(), posVertex.z()}, CLHEPToROOT::getTMatrixDSym(covVertex), trackParamsVertex, ndfVertex, chisqVertex};
bool fit(genfit::Track &trackPlus, genfit::Track &trackMinus, const int pdgTrackPlus, const int pdgTrackMinus, genfit::GFRaveVertex &vertex) override
Fit the V0 vertex. The PDG codes of the daughters are used to compute their energies.