8#include <tracking/v0Finding/fitter/V0Fitter.h>
10#include <framework/logging/Logger.h>
11#include <framework/datastore/StoreArray.h>
12#include <framework/geometry/VectorUtil.h>
13#include <framework/geometry/BFieldManager.h>
14#include <tracking/v0Finding/dataobjects/VertexVector.h>
15#include <tracking/dataobjects/RecoTrack.h>
16#include <tracking/trackFitting/fitter/base/TrackFitter.h>
17#include <tracking/trackFitting/trackBuilder/factories/TrackBuilder.h>
19#include <mdst/dataobjects/HitPatternVXD.h>
20#include <mdst/dataobjects/HitPatternCDC.h>
21#include <mdst/dataobjects/Track.h>
22#include <mdst/dataobjects/TrackFitResult.h>
23#include <cdc/dataobjects/CDCRecoHit.h>
24#include <pxd/reconstruction/PXDRecoHit.h>
25#include <svd/reconstruction/SVDRecoHit.h>
26#include <svd/reconstruction/SVDRecoHit2D.h>
28#include <genfit/Track.h>
29#include <genfit/TrackPoint.h>
30#include <genfit/MeasuredStateOnPlane.h>
31#include <genfit/GFRaveVertexFactory.h>
32#include <genfit/GFRaveVertex.h>
33#include <genfit/FieldManager.h>
34#include <genfit/MaterialEffects.h>
35#include <genfit/FitStatus.h>
36#include <genfit/KalmanFitStatus.h>
37#include <genfit/KalmanFitterInfo.h>
39#include <framework/utilities/IOIntercept.h>
44 const std::string& v0ValidationVerticesName,
const std::string& recoTracksName,
45 const std::string& copiedRecoTracksName,
bool enableValidation)
46 : m_validation(enableValidation), m_recoTracksName(recoTracksName), m_v0FitterMode(1), m_forcestore(false),
47 m_useOnlyOneSVDHitPair(true)
54 B2DEBUG(24,
"Register DataStore for validation.");
71 B2ASSERT(
"Material effects not set up. Please use SetupGenfitExtrapolationModule.",
72 genfit::MaterialEffects::getInstance()->isInitialized());
73 B2ASSERT(
"Magnetic field not set up. Please use SetupGenfitExtrapolationModule.",
74 genfit::FieldManager::getInstance()->isInitialized());
79 if (not(0 <= fitterMode && fitterMode <= 2)) {
80 B2FATAL(
"Invalid fitter mode!");
95 double vertexChi2CutOutside,
96 std::tuple<double, double> invMassRangeKshort,
97 std::tuple<double, double> invMassRangeLambda,
98 std::tuple<double, double> invMassRangePhoton)
111 std::vector<genfit::Track*> trackPair {&trackPlus, &trackMinus};
118 genfit::GFRaveVertexFactory vertexFactory;
119 vertexFactory.findVertices(&vertexVector.
v, trackPair);
121 B2ERROR(
"Exception during vertex fit.");
125 if (vertexVector.
size() != 1) {
126 B2DEBUG(21,
"Vertex fit failed. Size of vertexVector not 1, but: " << vertexVector.
size());
130 if ((*vertexVector[0]).getNTracks() != 2) {
131 B2DEBUG(20,
"Wrong number of tracks in vertex.");
135 vertex = *vertexVector[0];
142 const ROOT::Math::XYZVector& vertexPosition,
unsigned int& hasInnerHitStatus)
145 hasInnerHitStatus = 0;
150 double extralengthPlus = stPlus.extrapolateToPoint(
XYZToTVector(vertexPosition));
151 double extralengthMinus = stMinus.extrapolateToPoint(
XYZToTVector(vertexPosition));
152 if (extralengthPlus > 0) hasInnerHitStatus |= 0x1;
153 if (extralengthMinus > 0) hasInnerHitStatus |= 0x2;
154 B2DEBUG(22,
"extralengthPlus=" << extralengthPlus <<
", extralengthMinus=" << extralengthMinus);
159 B2DEBUG(22,
"Could not extrapolate track to vertex.");
166 const genfit::MeasuredStateOnPlane& msop,
const double Bz,
168 const int sharedInnermostCluster)
174 if (sharedInnermostCluster > 0 && sharedInnermostCluster < 4) {
177 hitPatternVXDInitializer = hitPatternVXD_forflag.
getInteger();
181 =
m_trackFitResults.appendNew(ROOT::Math::XYZVector(msop.getPos()), ROOT::Math::XYZVector(msop.getMom()),
182 msop.get6DCov(), msop.getCharge(),
184 track.getFitStatus()->getPVal(),
185 Bz, hitPatternCDCInitializer, hitPatternVXDInitializer, track.getFitStatus()->getNdf());
186 return v0TrackFitResult;
200 B2FATAL(
"Given V0Hypothesis not available.");
207 bool& isForceStored,
bool& isHitRemoved)
210 isForceStored =
false;
211 isHitRemoved =
false;
220 unsigned int hasInnerHitStatus = 0;
223 ROOT::Math::XYZVector vertexPos(0, 0, 0);
241 bool failflag =
false;
249 RecoTrack* recoTrackPlus_forRefit =
nullptr;
250 RecoTrack* recoTrackMinus_forRefit =
nullptr;
251 RecoTrack* cache_recoTrackPlus =
nullptr;
252 RecoTrack* cache_recoTrackMinus =
nullptr;
254 unsigned int count_removeInnerHits = 0;
255 while (hasInnerHitStatus != 0) {
256 ++count_removeInnerHits;
261 if (hasInnerHitStatus & 0x1) {
264 if (recoTrackPlus_forRefit ==
nullptr)
268 if (!cache_recoTrackPlus) {
269 if (not
removeInnerHits(recoTrackPlus, recoTrackPlus_forRefit, pdg_trackPlus, vertexPos)) {
274 if (not
removeInnerHits(cache_recoTrackPlus, recoTrackPlus_forRefit, pdg_trackPlus, vertexPos)) {
279 cache_recoTrackPlus = recoTrackPlus_forRefit;
280 }
else if (recoTrackPlus_forRefit ==
nullptr) {
283 if (recoTrackPlus_forRefit ==
nullptr)
288 if (hasInnerHitStatus & 0x2) {
291 if (recoTrackMinus_forRefit ==
nullptr)
295 if (!cache_recoTrackMinus) {
296 if (not
removeInnerHits(recoTrackMinus, recoTrackMinus_forRefit, pdg_trackMinus, vertexPos)) {
301 if (not
removeInnerHits(cache_recoTrackMinus, recoTrackMinus_forRefit, pdg_trackMinus, vertexPos)) {
306 cache_recoTrackMinus = recoTrackMinus_forRefit;
307 }
else if (recoTrackMinus_forRefit ==
nullptr) {
310 if (recoTrackMinus_forRefit ==
nullptr)
315 hasInnerHitStatus = 0;
319 v0Hypothesis, hasInnerHitStatus, vertexPos,
false)) {
320 B2DEBUG(22,
"Vertex refit failed, or rejected by invariant mass cut.");
323 }
else if (hasInnerHitStatus == 0)
325 if (count_removeInnerHits >= 5) {
326 B2WARNING(
"Inner hits remained after " << count_removeInnerHits <<
" times of removing inner hits!");
334 bool forcestore =
true;
336 hasInnerHitStatus, vertexPos, forcestore)) {
337 B2DEBUG(22,
"Original vertex fit fails. Possibly rejected by invariant mass cut.");
340 isForceStored =
true;
351 unsigned int& hasInnerHitStatus, ROOT::Math::XYZVector& vertexPos,
352 const bool forceStore)
360 if ((plusRepresentation ==
nullptr) or (not recoTrackPlus->
wasFitSuccessful(plusRepresentation))) {
361 B2ERROR(
"Track hypothesis with closest mass not available. Should never happen, but I can continue safely anyway.");
369 if ((minusRepresentation ==
nullptr) or (not recoTrackMinus->
wasFitSuccessful(minusRepresentation))) {
370 B2ERROR(
"Track hypothesis with closest mass not available. Should never happen, but I can continue safely anyway.");
375 std::vector<genfit::AbsTrackRep*> repsPlus = gfTrackPlus.getTrackReps();
376 std::vector<genfit::AbsTrackRep*> repsMinus = gfTrackMinus.getTrackReps();
377 if (repsPlus.size() == repsMinus.size()) {
378 for (
unsigned int id = 0;
id < repsPlus.size();
id++) {
379 if (abs(repsPlus[
id]->getPDG()) == pdgTrackPlus)
380 gfTrackPlus.setCardinalRep(
id);
381 if (abs(repsMinus[
id]->getPDG()) == pdgTrackMinus)
382 gfTrackMinus.setCardinalRep(
id);
387 for (
unsigned int id = 0;
id < repsPlus.size();
id++) {
388 if (abs(repsPlus[
id]->getPDG()) == pdgTrackPlus)
389 gfTrackPlus.setCardinalRep(
id);
391 for (
unsigned int id = 0;
id < repsMinus.size();
id++) {
392 if (abs(repsMinus[
id]->getPDG()) == pdgTrackMinus)
393 gfTrackMinus.setCardinalRep(
id);
401 genfit::GFRaveVertex vert;
406 const ROOT::Math::XYZVector& posVert = ROOT::Math::XYZVector(vert.getPos());
415 B2DEBUG(22,
"Vertex outside beam pipe, chi^2 too large.");
420 B2DEBUG(22,
"Vertex accepted.");
427 if (forceStore || hasInnerHitStatus == 0) {
429 const genfit::GFRaveTrackParameters* tr0 = vert.getParameters(0);
430 const genfit::GFRaveTrackParameters* tr1 = vert.getParameters(1);
431 ROOT::Math::PxPyPzMVector lv0(tr0->getMom().Px(), tr0->getMom().Py(), tr0->getMom().Pz(), trackHypotheses.first.getMass());
432 ROOT::Math::PxPyPzMVector lv1(tr1->getMom().Px(), tr1->getMom().Py(), tr1->getMom().Pz(), trackHypotheses.second.getMass());
434 double v0InvMass = (lv0 + lv1).M();
437 B2DEBUG(22,
"Kshort vertex rejected, invariant mass out of range.");
442 B2DEBUG(22,
"Lambda vertex rejected, invariant mass out of range.");
447 B2DEBUG(22,
"Photon vertex rejected, invariant mass out of range.");
461 sharedInnermostCluster);
463 sharedInnermostCluster);
465 B2DEBUG(20,
"Creating new V0.");
466 auto v0 =
m_v0s.appendNew(std::make_pair(trackPlus, tfrPlusVtx),
467 std::make_pair(trackMinus, tfrMinusVtx),
468 posVert.X(), posVert.Y(), posVert.Z());
471 B2DEBUG(24,
"Create StoreArray and Output for validation.");
473 std::make_pair(trackPlus, tfrPlusVtx),
474 std::make_pair(trackMinus, tfrMinusVtx),
475 ROOT::Math::XYZVector(vert.getPos()),
481 v0->addRelationTo(validationV0);
506 if (not fitter.fit(*newRecoTrack, particleUsedForFitting)) {
508 B2DEBUG(20,
"track fit failed for copied RecoTrack.");
511 B2DEBUG(20,
"\t original track fit was also failed.");
519 const int trackPDG,
const ROOT::Math::XYZVector& vertexPosition)
521 if (!prevRecoTrack || !recoTrack) {
522 B2ERROR(
"Input recotrack is nullptr!");
534 unsigned int nRemoveHits = 0;
535 if (recoHitInformations.size() != prevRecoHitInformations.size()) {
536 B2WARNING(
"Copied RecoTrack has different number of hits from its original RecoTrack!");
540 for (nRemoveHits = 0; nRemoveHits < recoHitInformations.size(); ++nRemoveHits) {
541 if (!prevRecoHitInformations[nRemoveHits]->useInFit()) {
542 recoHitInformations[nRemoveHits]->setUseInFit(
false);
548 prevRecoHitInformations[nRemoveHits]);
551 double extralength = stPrevRecoHit.extrapolateToPoint(
XYZToTVector(vertexPosition));
552 if (extralength > 0) {
553 recoHitInformations[nRemoveHits]->setUseInFit(
false);
556 }
catch (NoTrackFitResult()) {
557 B2WARNING(
"Exception: no FitterInfo assigned for TrackPoint created from this RecoHit.");
558 recoHitInformations[nRemoveHits]->setUseInFit(
false);
564 B2DEBUG(22,
"Could not extrapolate track to vertex when removing inner hits, aborting.");
569 if (nRemoveHits == 0) {
571 B2DEBUG(20,
"No hits removed in removeInnerHits, aborted. Switching to use the original RecoTrack.");
575 if (recoHitInformations.size() <= nRemoveHits) {
576 B2DEBUG(20,
"Removed all the RecoHits in the RecoTrack, aborted. Switching to use the original RecoTrack.");
582 if (recoHitInformations[nRemoveHits - 1]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD) {
583 if (recoHitInformations[nRemoveHits]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD) {
586 if (!lastRemovedSVDHit || !nextSVDHit) B2ERROR(
"Last/Next SVD hit is null!");
588 if (lastRemovedSVDHit->
getSensorID() == nextSVDHit->getSensorID() &&
589 lastRemovedSVDHit->
isUCluster() && !(nextSVDHit->isUCluster())) {
590 recoHitInformations[nRemoveHits]->setUseInFit(
false);
599 recoHitInformations[nRemoveHits - 1]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD &&
600 recoHitInformations.size() > nRemoveHits + 2) {
601 if (recoHitInformations[nRemoveHits ]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD &&
602 recoHitInformations[nRemoveHits + 1]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD &&
603 recoHitInformations[nRemoveHits + 2]->getTrackingDetector() != RecoHitInformation::RecoHitDetector::c_SVD) {
604 recoHitInformations[nRemoveHits ]->setUseInFit(
false);
605 recoHitInformations[nRemoveHits + 1]->setUseInFit(
false);
610 B2DEBUG(22, nRemoveHits <<
" inner hits removed.");
614 if (not fitter.fit(*recoTrack, particleUsedForFitting)) {
615 B2DEBUG(20,
"track fit failed after removing inner hits.");
618 B2DEBUG(20,
"\t previous track fit was also failed.");
634 const std::vector<RecoHitInformation*>& recoHitInformationsMinus = recoTrackMinus->
getRecoHitInformations(
636 unsigned int iInnermostHitPlus, iInnermostHitMinus;
637 for (iInnermostHitPlus = 0 ; iInnermostHitPlus < recoHitInformationsPlus.size() ; ++iInnermostHitPlus)
638 if (recoHitInformationsPlus[iInnermostHitPlus]->useInFit())
break;
639 for (iInnermostHitMinus = 0 ; iInnermostHitMinus < recoHitInformationsMinus.size() ; ++iInnermostHitMinus)
640 if (recoHitInformationsMinus[iInnermostHitMinus]->useInFit())
break;
641 if (iInnermostHitPlus == recoHitInformationsPlus.size() || iInnermostHitMinus == recoHitInformationsMinus.size()) {
642 B2WARNING(
"checkSharedInnermostCluster function called for recoTrack including no hit used for fit! This should not happen!");
645 const auto& recoHitInfoPlus = recoHitInformationsPlus[iInnermostHitPlus];
646 const auto& recoHitInfoMinus = recoHitInformationsMinus[iInnermostHitMinus];
648 if (recoHitInfoPlus->getTrackingDetector() == recoHitInfoMinus->getTrackingDetector()) {
649 if (recoHitInfoPlus->getTrackingDetector() == RecoHitInformation::c_PXD) {
652 if (clusterPlus == clusterMinus) {
655 }
else if (recoHitInfoPlus->getTrackingDetector() == RecoHitInformation::c_SVD) {
660 if (clusterPlus->
isUCluster() && clusterMinus->isUCluster()) {
661 if (recoHitInformationsPlus.size() > iInnermostHitPlus + 1
662 && recoHitInformationsMinus.size() > iInnermostHitMinus + 1) {
663 const auto& recoHitInfoNextPlus = recoHitInformationsPlus[iInnermostHitPlus + 1];
664 const auto& recoHitInfoNextMinus = recoHitInformationsMinus[iInnermostHitMinus + 1];
666 if (recoHitInfoNextPlus->useInFit() && recoHitInfoNextMinus->useInFit()
667 && recoHitInfoNextPlus->getTrackingDetector() == RecoHitInformation::c_SVD
668 && recoHitInfoNextMinus->getTrackingDetector() == RecoHitInformation::c_SVD) {
671 if (!(clusterNextPlus->
isUCluster()) && !(clusterNextMinus->isUCluster())
673 && clusterMinus->getSensorID() == clusterNextMinus->getSensorID()) {
674 if (clusterPlus == clusterMinus)
676 if (clusterNextPlus == clusterNextMinus)
679 B2WARNING(
"SVD cluster to be paired is not on V-side, or not on the same sensor.");
683 B2WARNING(
"No SVD cluster to be paired.");
687 B2WARNING(
"Innermost SVD U-cluster is the only hit in a daughter track. This should not happen.");
691 B2WARNING(
"No SVD U-cluster in the innermost cluster.");
static ROOT::Math::XYZVector getFieldInTesla(const ROOT::Math::XYZVector &pos)
return the magnetic field at a given position in Tesla.
Provides a type-safe way to pass members of the chargedStableSet set.
The ParticleType class for identifying different particle types.
int getPDGCode() const
PDG code.
static const ParticleType Lambda
Lambda particle.
static const ChargedStable pion
charged pion particle
static const ParticleType antiLambda
Anti-Lambda particle.
static const ChargedStable proton
proton particle
static const ParticleType invalidParticle
Invalid particle, used internally.
static const ParticleType Kshort
K^0_S particle.
static const ParticleType photon
photon particle
static const ChargedStable electron
electron particle
@ c_WriteOut
Object/array should be saved by output modules.
@ c_ErrorIfAlreadyRegistered
If the object/array was already registered, produce an error (aborting initialisation).
Hit pattern of the VXD within a track.
unsigned int getInteger() const
Getter for the underlying integer.
void setInnermostHitShareStatus(const unsigned short innermostHitShareStatus)
Set the innermost hit share flags for V0 daughters.
bool start()
Start intercepting the output.
Capture stdout and stderr and convert into log messages.
@ c_Debug
Debug: for code development.
The PXD Cluster class This class stores all information about reconstructed PXD clusters The position...
static genfit::Track & getGenfitTrack(RecoTrack &recoTrack)
Give access to the RecoTrack's genfit::Track.
This is the Reconstruction Event-Data Model Track.
size_t addHitsFromRecoTrack(const RecoTrack *recoTrack, unsigned int sortingParameterOffset=0, bool reversed=false, std::optional< double > optionalMinimalWeight=std::nullopt)
Add all hits from another RecoTrack to this RecoTrack.
bool wasFitSuccessful(const genfit::AbsTrackRep *representation=nullptr) const
Returns true if the last fit with the given representation was successful.
RecoTrack * copyToStoreArray(StoreArray< RecoTrack > &storeArray) const
Append a new RecoTrack to the given store array and copy its general properties, but not the hits the...
std::vector< RecoHitInformation * > getRecoHitInformations(bool getSorted=false) const
Return a list of all RecoHitInformations associated with the RecoTrack.
static void registerRequiredRelations(StoreArray< RecoTrack > &recoTracks, std::string const &pxdHitsStoreArrayName="", std::string const &svdHitsStoreArrayName="", std::string const &cdcHitsStoreArrayName="", std::string const &bklmHitsStoreArrayName="", std::string const &eklmHitsStoreArrayName="", std::string const &recoHitInformationStoreArrayName="")
Convenience method which registers all relations required to fully use a RecoTrack.
const genfit::MeasuredStateOnPlane & getMeasuredStateOnPlaneFromFirstHit(const genfit::AbsTrackRep *representation=nullptr) const
Return genfit's MeasuredStateOnPlane for the first hit in a fit useful for extrapolation of measureme...
genfit::AbsTrackRep * getTrackRepresentationForPDG(int pdgCode) const
Return an already created track representation of the given reco track for the PDG.
const genfit::MeasuredStateOnPlane & getMeasuredStateOnPlaneFromRecoHit(const RecoHitInformation *recoHitInfo, const genfit::AbsTrackRep *representation=nullptr) const
Return genfit's MeasuredStateOnPlane on plane for associated with one RecoHitInformation.
void addRelationTo(const RelationsInterface< BASE > *object, float weight=1.0, const std::string &namedRelation="") const
Add a relation from this object to another object (with caching).
TO * getRelatedTo(const std::string &name="", const std::string &namedRelation="") const
Get the object to which this object has a relation.
T * getRelated(const std::string &name="", const std::string &namedRelation="") const
Get the object to or from which this object has a relation.
The SVD Cluster class This class stores all information about reconstructed SVD clusters.
VxdID getSensorID() const
Get the sensor ID.
bool isUCluster() const
Get the direction of strips.
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
bool registerRelationTo(const StoreArray< TO > &toArray, DataStore::EDurability durability=DataStore::c_Event, DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut, const std::string &namedRelation="") const
Register a relation to the given StoreArray.
static uint32_t getHitPatternVXDInitializer(const RecoTrack &recoTrack, const genfit::AbsTrackRep *representation=nullptr)
Get the HitPattern in the VXD.
static uint64_t getHitPatternCDCInitializer(const RecoTrack &recoTrack, const genfit::AbsTrackRep *representation=nullptr)
Get the HitPattern in the CDC.
Values of the result of a track fit with a given particle hypothesis.
Const::ParticleType getParticleType() const
Getter for ParticleType of the mass hypothesis of the track fit.
Algorithm class to handle the fitting of RecoTrack objects.
Class that bundles various TrackFitResults.
const TrackFitResult * getTrackFitResultWithClosestMass(const Const::ChargedStable &requestedType) const
Return the track fit for a fit hypothesis with the closest mass.
bool m_useOnlyOneSVDHitPair
false only if the V0Fitter mode is 3
void setFitterMode(int fitterMode)
set V0 fitter mode.
RecoTrack * copyRecoTrackAndFit(RecoTrack *origRecoTrack, const int trackPDG)
Create a copy of RecoTrack and fit the Track.
StoreArray< V0ValidationVertex > m_validationV0s
V0ValidationVertex (output, optional).
StoreArray< RecoTrack > m_copiedRecoTracks
RecoTrack used to refit tracks (output)
bool m_forcestore
true only if the V0Fitter mode is 1
void initializeCuts(double beamPipeRadius, double vertexChi2CutOutside, std::tuple< double, double > invMassRangeKshort, std::tuple< double, double > invMassRangeLambda, std::tuple< double, double > invMassRangePhoton)
Initialize the cuts which will be applied during the fit and store process.
RecoTrack * copyRecoTrack(RecoTrack *origRecoTrack)
Create a copy of RecoTrack.
bool m_validation
Validation flag.
std::pair< Const::ParticleType, Const::ParticleType > getTrackHypotheses(const Const::ParticleType &v0Hypothesis) const
Get track hypotheses for a given v0 hypothesis.
StoreArray< V0 > m_v0s
V0 (output).
int checkSharedInnermostCluster(const RecoTrack *recoTrackPlus, const RecoTrack *recoTrackMinus)
Compare innermost hits of daughter pairs to check if they are the same (shared) or not.
TrackFitResult * buildTrackFitResult(const genfit::Track &track, const RecoTrack *recoTrack, const genfit::MeasuredStateOnPlane &msop, const double Bz, const Const::ParticleType &trackHypothesis, const int sharedInnermostCluster)
Build TrackFitResult of V0 Track and set relation to genfit Track.
V0Fitter(const std::string &trackFitResultsName="", const std::string &v0sName="", const std::string &v0ValidationVerticesName="", const std::string &recoTracksName="", const std::string &copiedRecoTracksName="CopiedRecoTracks", bool enableValidation=false)
Constructor for the V0Fitter.
StoreArray< TrackFitResult > m_trackFitResults
TrackFitResult (output).
bool fitAndStore(const Track *trackPlus, const Track *trackMinus, const Const::ParticleType &v0Hypothesis, bool &isForceStored, bool &isHitRemoved)
Fit V0 with given hypothesis and store if fit was successful.
double m_beamPipeRadius
Radius where inside/outside beampipe is defined.
bool vertexFitWithRecoTracks(const Track *trackPlus, const Track *trackMinus, RecoTrack *recoTrackPlus, RecoTrack *recoTrackMinus, const Const::ParticleType &v0Hypothesis, unsigned int &hasInnerHitStatus, ROOT::Math::XYZVector &vertexPos, const bool forceStore)
fit V0 vertex using RecoTrack's as inputs.
std::tuple< double, double > m_invMassRangePhoton
invariant mass cut for Photon.
bool removeInnerHits(RecoTrack *prevRecoTrack, RecoTrack *recoTrack, const int trackPDG, const ROOT::Math::XYZVector &vertexPosition)
Remove inner hits from RecoTrack at once.
std::string m_recoTracksName
RecoTrackColName (input).
bool extrapolateToVertex(genfit::MeasuredStateOnPlane &stPlus, genfit::MeasuredStateOnPlane &stMinus, const ROOT::Math::XYZVector &vertexPosition)
Extrapolate the fit results to the perigee to the vertex.
double m_vertexChi2CutOutside
Chi2 cut outside beampipe.
StoreArray< RecoTrack > m_recoTracks
RecoTrack (input)
bool fitGFRaveVertex(genfit::Track &trackPlus, genfit::Track &trackMinus, genfit::GFRaveVertex &vertex)
Fit the V0 vertex.
int m_v0FitterMode
0: store V0 at the first vertex fit, regardless of inner hits, 1: remove hits inside the V0 vertex po...
std::tuple< double, double > m_invMassRangeKshort
invariant mass cut for Kshort.
std::tuple< double, double > m_invMassRangeLambda
invariant mass cut for Lambda.
Need this container for exception-safe cleanup, GFRave's interface isn't exception-safe as is.
std::vector< genfit::GFRaveVertex * > v
Fitted vertices.
size_t size() const noexcept
Return size of vertex vector.
static constexpr auto XYZToTVector
Helper function to convert XYZVector to TVector3.
Abstract base class for different kinds of events.