8#include <tracking/v0Finding/fitter/V0Fitter.h>
9#include <tracking/v0Finding/fitter/V0VertexFitterFactory.h>
11#include <framework/logging/Logger.h>
12#include <framework/datastore/StoreArray.h>
13#include <framework/geometry/VectorUtil.h>
14#include <framework/geometry/BFieldManager.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>
24#include <genfit/Track.h>
25#include <genfit/MeasuredStateOnPlane.h>
26#include <genfit/GFRaveVertex.h>
27#include <genfit/FieldManager.h>
28#include <genfit/MaterialEffects.h>
29#include <genfit/FitStatus.h>
30#include <genfit/KalmanFitStatus.h>
31#include <genfit/KalmanFitterInfo.h>
36 const std::string& v0ValidationVerticesName,
const std::string& recoTracksName,
37 const std::string& copiedRecoTracksName,
bool enableValidation)
46 B2DEBUG(24,
"Register DataStore for validation.");
63 B2ASSERT(
"Material effects not set up. Please use SetupGenfitExtrapolationModule.",
64 genfit::MaterialEffects::getInstance()->isInitialized());
65 B2ASSERT(
"Magnetic field not set up. Please use SetupGenfitExtrapolationModule.",
66 genfit::FieldManager::getInstance()->isInitialized());
76 if (not(0 <= fitterMode && fitterMode <= 2)) {
77 B2FATAL(
"Invalid fitter mode!");
92 double vertexChi2CutOutside,
93 std::tuple<double, double> invMassRangeKshort,
94 std::tuple<double, double> invMassRangeLambda,
95 std::tuple<double, double> invMassRangePhoton)
107 const ROOT::Math::XYZVector& vertexPosition,
unsigned int& hasInnerHitStatus)
110 hasInnerHitStatus = 0;
115 const double extralengthPlus = stPlus.extrapolateToPoint(
XYZToTVector(vertexPosition));
116 const double extralengthMinus = stMinus.extrapolateToPoint(
XYZToTVector(vertexPosition));
117 if (extralengthPlus > 0) hasInnerHitStatus |= 0x1;
118 if (extralengthMinus > 0) hasInnerHitStatus |= 0x2;
119 B2DEBUG(22,
"extralengthPlus=" << extralengthPlus <<
", extralengthMinus=" << extralengthMinus);
124 B2DEBUG(22,
"Could not extrapolate track to vertex.");
131 const genfit::MeasuredStateOnPlane& msop,
const double Bz,
133 const int sharedInnermostCluster)
139 if (sharedInnermostCluster > 0 && sharedInnermostCluster < 4) {
142 hitPatternVXDInitializer = hitPatternVXD_forflag.
getInteger();
146 =
m_trackFitResults.appendNew(ROOT::Math::XYZVector(msop.getPos()), ROOT::Math::XYZVector(msop.getMom()),
147 msop.get6DCov(), msop.getCharge(),
149 track.getFitStatus()->getPVal(),
150 Bz, hitPatternCDCInitializer, hitPatternVXDInitializer, track.getFitStatus()->getNdf());
151 return v0TrackFitResult;
165 B2FATAL(
"Given V0Hypothesis not available.");
172 bool& isForceStored,
bool& isHitRemoved)
175 isForceStored =
false;
176 isHitRemoved =
false;
185 unsigned int hasInnerHitStatus = 0;
188 ROOT::Math::XYZVector vertexPos(0, 0, 0);
206 bool failflag =
false;
214 RecoTrack* recoTrackPlus_forRefit =
nullptr;
215 RecoTrack* recoTrackMinus_forRefit =
nullptr;
216 RecoTrack* cache_recoTrackPlus =
nullptr;
217 RecoTrack* cache_recoTrackMinus =
nullptr;
219 unsigned int count_removeInnerHits = 0;
220 while (hasInnerHitStatus != 0) {
221 ++count_removeInnerHits;
226 if (hasInnerHitStatus & 0x1) {
229 if (recoTrackPlus_forRefit ==
nullptr)
233 if (!cache_recoTrackPlus) {
234 if (not
removeInnerHits(recoTrackPlus, recoTrackPlus_forRefit, pdg_trackPlus, vertexPos)) {
239 if (not
removeInnerHits(cache_recoTrackPlus, recoTrackPlus_forRefit, pdg_trackPlus, vertexPos)) {
244 cache_recoTrackPlus = recoTrackPlus_forRefit;
245 }
else if (recoTrackPlus_forRefit ==
nullptr) {
248 if (recoTrackPlus_forRefit ==
nullptr)
253 if (hasInnerHitStatus & 0x2) {
256 if (recoTrackMinus_forRefit ==
nullptr)
260 if (!cache_recoTrackMinus) {
261 if (not
removeInnerHits(recoTrackMinus, recoTrackMinus_forRefit, pdg_trackMinus, vertexPos)) {
266 if (not
removeInnerHits(cache_recoTrackMinus, recoTrackMinus_forRefit, pdg_trackMinus, vertexPos)) {
271 cache_recoTrackMinus = recoTrackMinus_forRefit;
272 }
else if (recoTrackMinus_forRefit ==
nullptr) {
275 if (recoTrackMinus_forRefit ==
nullptr)
280 hasInnerHitStatus = 0;
284 v0Hypothesis, hasInnerHitStatus, vertexPos,
false)) {
285 B2DEBUG(22,
"Vertex refit failed, or rejected by invariant mass cut.");
288 }
else if (hasInnerHitStatus == 0)
290 if (count_removeInnerHits >= 5) {
291 B2WARNING(
"Inner hits remained after " << count_removeInnerHits <<
" times of removing inner hits!");
299 bool forcestore =
true;
301 hasInnerHitStatus, vertexPos, forcestore)) {
302 B2DEBUG(22,
"Original vertex fit fails. Possibly rejected by invariant mass cut.");
305 isForceStored =
true;
316 unsigned int& hasInnerHitStatus, ROOT::Math::XYZVector& vertexPos,
317 const bool forceStore)
325 if ((plusRepresentation ==
nullptr) or (not recoTrackPlus->
wasFitSuccessful(plusRepresentation))) {
326 B2ERROR(
"Track hypothesis with closest mass not available. Should never happen, but I can continue safely anyway.");
334 if ((minusRepresentation ==
nullptr) or (not recoTrackMinus->
wasFitSuccessful(minusRepresentation))) {
335 B2ERROR(
"Track hypothesis with closest mass not available. Should never happen, but I can continue safely anyway.");
340 const std::vector<genfit::AbsTrackRep*>& repsPlus = gfTrackPlus.getTrackReps();
341 const std::vector<genfit::AbsTrackRep*>& repsMinus = gfTrackMinus.getTrackReps();
342 if (repsPlus.size() == repsMinus.size()) {
343 for (
unsigned int id = 0;
id < repsPlus.size();
id++) {
344 if (abs(repsPlus[
id]->getPDG()) == pdgTrackPlus)
345 gfTrackPlus.setCardinalRep(
id);
346 if (abs(repsMinus[
id]->getPDG()) == pdgTrackMinus)
347 gfTrackMinus.setCardinalRep(
id);
352 for (
unsigned int id = 0;
id < repsPlus.size();
id++) {
353 if (abs(repsPlus[
id]->getPDG()) == pdgTrackPlus)
354 gfTrackPlus.setCardinalRep(
id);
356 for (
unsigned int id = 0;
id < repsMinus.size();
id++) {
357 if (abs(repsMinus[
id]->getPDG()) == pdgTrackMinus)
358 gfTrackMinus.setCardinalRep(
id);
366 genfit::GFRaveVertex vert;
367 if (not
m_vertexFitter->fit(gfTrackPlus, gfTrackMinus, pdgTrackPlus, pdgTrackMinus, vert)) {
371 const ROOT::Math::XYZVector& posVert = ROOT::Math::XYZVector(vert.getPos());
380 B2DEBUG(22,
"Vertex outside beam pipe, chi^2 too large.");
385 B2DEBUG(22,
"Vertex accepted.");
392 if (forceStore || hasInnerHitStatus == 0) {
394 const genfit::GFRaveTrackParameters* tr0 = vert.getParameters(0);
395 const genfit::GFRaveTrackParameters* tr1 = vert.getParameters(1);
396 ROOT::Math::PxPyPzMVector lv0(tr0->getMom().Px(), tr0->getMom().Py(), tr0->getMom().Pz(), trackHypotheses.first.getMass());
397 ROOT::Math::PxPyPzMVector lv1(tr1->getMom().Px(), tr1->getMom().Py(), tr1->getMom().Pz(), trackHypotheses.second.getMass());
399 double v0InvMass = (lv0 + lv1).M();
402 B2DEBUG(22,
"Kshort vertex rejected, invariant mass out of range.");
407 B2DEBUG(22,
"Lambda vertex rejected, invariant mass out of range.");
412 B2DEBUG(22,
"Photon vertex rejected, invariant mass out of range.");
426 sharedInnermostCluster);
428 sharedInnermostCluster);
430 B2DEBUG(20,
"Creating new V0.");
431 const auto* v0 =
m_v0s.appendNew(std::make_pair(trackPlus, tfrPlusVtx),
432 std::make_pair(trackMinus, tfrMinusVtx),
433 posVert.X(), posVert.Y(), posVert.Z());
436 B2DEBUG(24,
"Create StoreArray and Output for validation.");
438 std::make_pair(trackPlus, tfrPlusVtx),
439 std::make_pair(trackMinus, tfrMinusVtx),
440 ROOT::Math::XYZVector(vert.getPos()),
446 v0->addRelationTo(validationV0);
471 if (not fitter.fit(*newRecoTrack, particleUsedForFitting)) {
473 B2DEBUG(20,
"track fit failed for copied RecoTrack.");
476 B2DEBUG(20,
"\t original track fit was also failed.");
484 const int trackPDG,
const ROOT::Math::XYZVector& vertexPosition)
486 if (!prevRecoTrack || !recoTrack) {
487 B2ERROR(
"Input recotrack is nullptr!");
499 unsigned int nRemoveHits = 0;
500 if (recoHitInformations.size() != prevRecoHitInformations.size()) {
501 B2WARNING(
"Copied RecoTrack has different number of hits from its original RecoTrack!");
505 for (nRemoveHits = 0; nRemoveHits < recoHitInformations.size(); ++nRemoveHits) {
506 if (!prevRecoHitInformations[nRemoveHits]->useInFit()) {
507 recoHitInformations[nRemoveHits]->setUseInFit(
false);
513 prevRecoHitInformations[nRemoveHits]);
516 double extralength = stPrevRecoHit.extrapolateToPoint(
XYZToTVector(vertexPosition));
517 if (extralength > 0) {
518 recoHitInformations[nRemoveHits]->setUseInFit(
false);
521 }
catch (NoTrackFitResult()) {
522 B2WARNING(
"Exception: no FitterInfo assigned for TrackPoint created from this RecoHit.");
523 recoHitInformations[nRemoveHits]->setUseInFit(
false);
529 B2DEBUG(22,
"Could not extrapolate track to vertex when removing inner hits, aborting.");
534 if (nRemoveHits == 0) {
536 B2DEBUG(20,
"No hits removed in removeInnerHits, aborted. Switching to use the original RecoTrack.");
540 if (recoHitInformations.size() <= nRemoveHits) {
541 B2DEBUG(20,
"Removed all the RecoHits in the RecoTrack, aborted. Switching to use the original RecoTrack.");
547 if (recoHitInformations[nRemoveHits - 1]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD) {
548 if (recoHitInformations[nRemoveHits]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD) {
549 const SVDCluster* lastRemovedSVDHit = recoHitInformations[nRemoveHits - 1]->getRelatedTo<
SVDCluster>();
551 if (!lastRemovedSVDHit || !nextSVDHit) B2ERROR(
"Last/Next SVD hit is null!");
553 if (lastRemovedSVDHit->
getSensorID() == nextSVDHit->getSensorID() &&
554 lastRemovedSVDHit->
isUCluster() && !(nextSVDHit->isUCluster())) {
555 recoHitInformations[nRemoveHits]->setUseInFit(
false);
564 recoHitInformations[nRemoveHits - 1]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD &&
565 recoHitInformations.size() > nRemoveHits + 2) {
566 if (recoHitInformations[nRemoveHits ]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD &&
567 recoHitInformations[nRemoveHits + 1]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD &&
568 recoHitInformations[nRemoveHits + 2]->getTrackingDetector() != RecoHitInformation::RecoHitDetector::c_SVD) {
569 recoHitInformations[nRemoveHits ]->setUseInFit(
false);
570 recoHitInformations[nRemoveHits + 1]->setUseInFit(
false);
575 B2DEBUG(22, nRemoveHits <<
" inner hits removed.");
579 if (not fitter.fit(*recoTrack, particleUsedForFitting)) {
580 B2DEBUG(20,
"track fit failed after removing inner hits.");
583 B2DEBUG(20,
"\t previous track fit was also failed.");
599 const std::vector<RecoHitInformation*>& recoHitInformationsMinus = recoTrackMinus->
getRecoHitInformations(
601 unsigned int iInnermostHitPlus, iInnermostHitMinus;
602 for (iInnermostHitPlus = 0 ; iInnermostHitPlus < recoHitInformationsPlus.size() ; ++iInnermostHitPlus)
603 if (recoHitInformationsPlus[iInnermostHitPlus]->useInFit())
break;
604 for (iInnermostHitMinus = 0 ; iInnermostHitMinus < recoHitInformationsMinus.size() ; ++iInnermostHitMinus)
605 if (recoHitInformationsMinus[iInnermostHitMinus]->useInFit())
break;
606 if (iInnermostHitPlus == recoHitInformationsPlus.size() || iInnermostHitMinus == recoHitInformationsMinus.size()) {
607 B2WARNING(
"checkSharedInnermostCluster function called for recoTrack including no hit used for fit! This should not happen!");
610 const auto& recoHitInfoPlus = recoHitInformationsPlus[iInnermostHitPlus];
611 const auto& recoHitInfoMinus = recoHitInformationsMinus[iInnermostHitMinus];
613 if (recoHitInfoPlus->getTrackingDetector() == recoHitInfoMinus->getTrackingDetector()) {
614 if (recoHitInfoPlus->getTrackingDetector() == RecoHitInformation::c_PXD) {
617 if (clusterPlus == clusterMinus) {
620 }
else if (recoHitInfoPlus->getTrackingDetector() == RecoHitInformation::c_SVD) {
625 if (clusterPlus->
isUCluster() && clusterMinus->isUCluster()) {
626 if (recoHitInformationsPlus.size() > iInnermostHitPlus + 1
627 && recoHitInformationsMinus.size() > iInnermostHitMinus + 1) {
628 const auto& recoHitInfoNextPlus = recoHitInformationsPlus[iInnermostHitPlus + 1];
629 const auto& recoHitInfoNextMinus = recoHitInformationsMinus[iInnermostHitMinus + 1];
631 if (recoHitInfoNextPlus->useInFit() && recoHitInfoNextMinus->useInFit()
632 && recoHitInfoNextPlus->getTrackingDetector() == RecoHitInformation::c_SVD
633 && recoHitInfoNextMinus->getTrackingDetector() == RecoHitInformation::c_SVD) {
636 if (!(clusterNextPlus->
isUCluster()) && !(clusterNextMinus->isUCluster())
638 && clusterMinus->getSensorID() == clusterNextMinus->getSensorID()) {
639 if (clusterPlus == clusterMinus)
641 if (clusterNextPlus == clusterNextMinus)
644 B2WARNING(
"SVD cluster to be paired is not on V-side, or not on the same sensor.");
648 B2WARNING(
"No SVD cluster to be paired.");
652 B2WARNING(
"Innermost SVD U-cluster is the only hit in a daughter track. This should not happen.");
656 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.
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(const 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.
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 the 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.
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.
bool m_validation
Validation flag.
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.
void setVertexFitter(std::unique_ptr< V0VertexFitter > vertexFitter)
Set the vertex fitter to be used, replacing the default one.
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).
RecoTrack * copyRecoTrack(const RecoTrack *origRecoTrack)
Create a copy of RecoTrack.
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.
RecoTrack * copyRecoTrackAndFit(const RecoTrack *origRecoTrack, const int trackPDG)
Create a copy of RecoTrack and fit the Track.
StoreArray< RecoTrack > m_recoTracks
RecoTrack (input)
static std::pair< Const::ParticleType, Const::ParticleType > getTrackHypotheses(const Const::ParticleType &v0Hypothesis)
Get track hypotheses for a given v0 hypothesis.
std::unique_ptr< V0VertexFitter > m_vertexFitter
Vertex fitter used to 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.
Factory creating the V0VertexFitter selected at run time.
static constexpr auto XYZToTVector
Helper function to convert XYZVector to TVector3.
Abstract base class for different kinds of events.