8 #include <tracking/v0Finding/fitter/V0Fitter.h>
10 #include <framework/logging/Logger.h>
11 #include <framework/datastore/StoreArray.h>
12 #include <tracking/v0Finding/dataobjects/VertexVector.h>
13 #include <tracking/dataobjects/RecoTrack.h>
14 #include <tracking/trackFitting/fitter/base/TrackFitter.h>
15 #include <tracking/trackFitting/trackBuilder/factories/TrackBuilder.h>
17 #include <mdst/dataobjects/HitPatternVXD.h>
18 #include <mdst/dataobjects/HitPatternCDC.h>
19 #include <mdst/dataobjects/Track.h>
20 #include <mdst/dataobjects/TrackFitResult.h>
21 #include <cdc/dataobjects/CDCRecoHit.h>
22 #include <pxd/reconstruction/PXDRecoHit.h>
23 #include <svd/reconstruction/SVDRecoHit.h>
24 #include <svd/reconstruction/SVDRecoHit2D.h>
26 #include <genfit/Track.h>
27 #include <genfit/TrackPoint.h>
28 #include <genfit/MeasuredStateOnPlane.h>
29 #include <genfit/GFRaveVertexFactory.h>
30 #include <genfit/GFRaveVertex.h>
31 #include <genfit/FieldManager.h>
32 #include <genfit/MaterialEffects.h>
33 #include <genfit/FitStatus.h>
34 #include <genfit/KalmanFitStatus.h>
35 #include <genfit/KalmanFitterInfo.h>
37 #include <framework/utilities/IOIntercept.h>
42 const std::string& v0ValidationVerticesName,
const std::string& recoTracksName,
43 const std::string& copiedRecoTracksName,
bool enableValidation)
44 : m_validation(enableValidation), m_recoTracksName(recoTracksName), m_v0FitterMode(1), m_forcestore(false),
45 m_useOnlyOneSVDHitPair(true)
52 B2DEBUG(24,
"Register DataStore for validation.");
69 B2ASSERT(
"Material effects not set up. Please use SetupGenfitExtrapolationModule.",
70 genfit::MaterialEffects::getInstance()->isInitialized());
71 B2ASSERT(
"Magnetic field not set up. Please use SetupGenfitExtrapolationModule.",
77 if (not(0 <= fitterMode && fitterMode <= 2)) {
78 B2FATAL(
"Invalid fitter mode!");
93 double vertexChi2CutOutside,
94 std::tuple<double, double> invMassRangeKshort,
95 std::tuple<double, double> invMassRangeLambda,
96 std::tuple<double, double> invMassRangePhoton)
109 std::vector<genfit::Track*> trackPair {&trackPlus, &trackMinus};
117 vertexFactory.findVertices(&vertexVector.
v, trackPair);
119 B2ERROR(
"Exception during vertex fit.");
123 if (vertexVector.
size() != 1) {
124 B2DEBUG(21,
"Vertex fit failed. Size of vertexVector not 1, but: " << vertexVector.
size());
128 if ((*vertexVector[0]).getNTracks() != 2) {
129 B2DEBUG(20,
"Wrong number of tracks in vertex.");
133 vertex = *vertexVector[0];
140 const TVector3& vertexPosition,
unsigned int& hasInnerHitStatus)
143 hasInnerHitStatus = 0;
148 double extralengthPlus = stPlus.extrapolateToPoint(vertexPosition);
149 double extralengthMinus = stMinus.extrapolateToPoint(vertexPosition);
150 if (extralengthPlus > 0) hasInnerHitStatus |= 0x1;
151 if (extralengthMinus > 0) hasInnerHitStatus |= 0x2;
152 B2DEBUG(22,
"extralengthPlus=" << extralengthPlus <<
", extralengthMinus=" << extralengthMinus);
157 B2DEBUG(22,
"Could not extrapolate track to vertex.");
176 const int sharedInnermostCluster)
182 if (sharedInnermostCluster > 0 && sharedInnermostCluster < 4) {
185 hitPatternVXDInitializer = hitPatternVXD_forflag.
getInteger();
190 msop.get6DCov(), msop.getCharge(),
192 track.getFitStatus()->getPVal(),
193 Bz, hitPatternCDCInitializer, hitPatternVXDInitializer, track.getFitStatus()->getNdf());
194 return v0TrackFitResult;
208 B2FATAL(
"Given V0Hypothesis not available.");
215 bool& isForceStored,
bool& isHitRemoved)
218 isForceStored =
false;
219 isHitRemoved =
false;
228 unsigned int hasInnerHitStatus = 0;
231 TVector3 vertexPos(0, 0, 0);
249 bool failflag =
false;
257 RecoTrack* recoTrackPlus_forRefit =
nullptr;
258 RecoTrack* recoTrackMinus_forRefit =
nullptr;
259 RecoTrack* cache_recoTrackPlus =
nullptr;
260 RecoTrack* cache_recoTrackMinus =
nullptr;
262 unsigned int count_removeInnerHits = 0;
263 while (hasInnerHitStatus != 0) {
264 ++count_removeInnerHits;
269 if (hasInnerHitStatus & 0x1) {
272 if (recoTrackPlus_forRefit ==
nullptr)
276 if (!cache_recoTrackPlus) {
277 if (not
removeInnerHits(recoTrackPlus, recoTrackPlus_forRefit, pdg_trackPlus, vertexPos)) {
282 if (not
removeInnerHits(cache_recoTrackPlus, recoTrackPlus_forRefit, pdg_trackPlus, vertexPos)) {
287 cache_recoTrackPlus = recoTrackPlus_forRefit;
288 }
else if (recoTrackPlus_forRefit ==
nullptr) {
291 if (recoTrackPlus_forRefit ==
nullptr)
296 if (hasInnerHitStatus & 0x2) {
299 if (recoTrackMinus_forRefit ==
nullptr)
303 if (!cache_recoTrackMinus) {
304 if (not
removeInnerHits(recoTrackMinus, recoTrackMinus_forRefit, pdg_trackMinus, vertexPos)) {
309 if (not
removeInnerHits(cache_recoTrackMinus, recoTrackMinus_forRefit, pdg_trackMinus, vertexPos)) {
314 cache_recoTrackMinus = recoTrackMinus_forRefit;
315 }
else if (recoTrackMinus_forRefit ==
nullptr) {
318 if (recoTrackMinus_forRefit ==
nullptr)
323 hasInnerHitStatus = 0;
327 v0Hypothesis, hasInnerHitStatus, vertexPos,
false)) {
328 B2DEBUG(22,
"Vertex refit failed, or rejected by invariant mass cut.");
331 }
else if (hasInnerHitStatus == 0)
333 if (count_removeInnerHits >= 5) {
334 B2WARNING(
"Inner hits remained after " << count_removeInnerHits <<
" times of removing inner hits!");
342 bool forcestore =
true;
344 hasInnerHitStatus, vertexPos, forcestore)) {
345 B2DEBUG(22,
"Original vertex fit fails. Possibly rejected by invariant mass cut.");
348 isForceStored =
true;
359 unsigned int& hasInnerHitStatus, TVector3& vertexPos,
360 const bool forceStore)
368 if ((plusRepresentation ==
nullptr) or (not recoTrackPlus->
wasFitSuccessful(plusRepresentation))) {
369 B2ERROR(
"Track hypothesis with closest mass not available. Should never happen, but I can continue savely anyway.");
377 if ((minusRepresentation ==
nullptr) or (not recoTrackMinus->
wasFitSuccessful(minusRepresentation))) {
378 B2ERROR(
"Track hypothesis with closest mass not available. Should never happen, but I can continue savely anyway.");
383 std::vector<genfit::AbsTrackRep*> repsPlus = gfTrackPlus.
getTrackReps();
384 std::vector<genfit::AbsTrackRep*> repsMinus = gfTrackMinus.
getTrackReps();
385 if (repsPlus.size() == repsMinus.size()) {
386 for (
unsigned int id = 0;
id < repsPlus.size();
id++) {
387 if (abs(repsPlus[
id]->getPDG()) == pdgTrackPlus)
388 gfTrackPlus.setCardinalRep(
id);
389 if (abs(repsMinus[
id]->getPDG()) == pdgTrackMinus)
390 gfTrackMinus.setCardinalRep(
id);
395 for (
unsigned int id = 0;
id < repsPlus.size();
id++) {
396 if (abs(repsPlus[
id]->getPDG()) == pdgTrackPlus)
397 gfTrackPlus.setCardinalRep(
id);
399 for (
unsigned int id = 0;
id < repsMinus.size();
id++) {
400 if (abs(repsMinus[
id]->getPDG()) == pdgTrackMinus)
401 gfTrackMinus.setCardinalRep(
id);
414 const TVector3& posVert(vert.
getPos());
423 B2DEBUG(22,
"Vertex outside beam pipe, chi^2 too large.");
428 B2DEBUG(22,
"Vertex accepted.");
435 if (forceStore || hasInnerHitStatus == 0) {
439 TLorentzVector lv0, lv1;
441 lv0.SetVectM(tr0->getMom(), trackHypotheses.first.getMass());
442 lv1.SetVectM(tr1->getMom(), trackHypotheses.second.getMass());
443 double v0InvMass = (lv0 + lv1).M();
446 B2DEBUG(22,
"Kshort vertex rejected, invariant mass out of range.");
451 B2DEBUG(22,
"Lambda vertex rejected, invariant mass out of range.");
456 B2DEBUG(22,
"Photon vertex rejected, invariant mass out of range.");
465 const TVector3 origin(0, 0, 0);
471 sharedInnermostCluster);
473 sharedInnermostCluster);
475 B2DEBUG(20,
"Creating new V0.");
476 auto v0 =
m_v0s.appendNew(std::make_pair(trackPlus, tfrPlusVtx),
477 std::make_pair(trackMinus, tfrMinusVtx));
480 B2DEBUG(24,
"Create StoreArray and Output for validation.");
482 std::make_pair(trackPlus, tfrPlusVtx),
483 std::make_pair(trackMinus, tfrMinusVtx),
490 v0->addRelationTo(validationV0);
515 if (not fitter.fit(*newRecoTrack, particleUsedForFitting)) {
517 B2DEBUG(20,
"track fit failed for copied RecoTrack.");
520 B2DEBUG(20,
"\t original track fit was also failed.");
528 const int trackPDG,
const TVector3& vertexPosition)
530 if (!prevRecoTrack || !recoTrack) {
531 B2ERROR(
"Input recotrack is nullptr!");
543 unsigned int nRemoveHits = 0;
544 if (recoHitInformations.size() != prevRecoHitInformations.size()) {
545 B2WARNING(
"Copied RecoTrack has different number of hits from its original RecoTrack!");
549 for (nRemoveHits = 0; nRemoveHits < recoHitInformations.size(); ++nRemoveHits) {
550 if (!prevRecoHitInformations[nRemoveHits]->useInFit()) {
551 recoHitInformations[nRemoveHits]->setUseInFit(
false);
557 prevRecoHitInformations[nRemoveHits]);
560 double extralength = stPrevRecoHit.extrapolateToPoint(vertexPosition);
561 if (extralength > 0) {
562 recoHitInformations[nRemoveHits]->setUseInFit(
false);
565 }
catch (NoTrackFitResult()) {
566 B2WARNING(
"Exception: no FitterInfo assigned for TrackPoint created from this RecoHit.");
567 recoHitInformations[nRemoveHits]->setUseInFit(
false);
573 B2DEBUG(22,
"Could not extrapolate track to vertex when removing inner hits, aborting.");
578 if (nRemoveHits == 0) {
580 B2DEBUG(20,
"No hits removed in removeInnerHits, aborted. Switching to use the original RecoTrack.");
584 if (recoHitInformations.size() <= nRemoveHits) {
585 B2DEBUG(20,
"Removed all the RecoHits in the RecoTrack, aborted. Switching to use the original RecoTrack.");
591 if (recoHitInformations[nRemoveHits - 1]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD) {
592 if (recoHitInformations[nRemoveHits]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD) {
595 if (!lastRemovedSVDHit || !nextSVDHit) B2ERROR(
"Last/Next SVD hit is null!");
597 if (lastRemovedSVDHit->
getSensorID() == nextSVDHit->getSensorID() &&
598 lastRemovedSVDHit->
isUCluster() && !(nextSVDHit->isUCluster())) {
599 recoHitInformations[nRemoveHits]->setUseInFit(
false);
608 recoHitInformations[nRemoveHits - 1]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD &&
609 recoHitInformations.size() > nRemoveHits + 2) {
610 if (recoHitInformations[nRemoveHits ]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD &&
611 recoHitInformations[nRemoveHits + 1]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD &&
612 recoHitInformations[nRemoveHits + 2]->getTrackingDetector() != RecoHitInformation::RecoHitDetector::c_SVD) {
613 recoHitInformations[nRemoveHits ]->setUseInFit(
false);
614 recoHitInformations[nRemoveHits + 1]->setUseInFit(
false);
619 B2DEBUG(22, nRemoveHits <<
" inner hits removed.");
623 if (not fitter.fit(*recoTrack, particleUsedForFitting)) {
624 B2DEBUG(20,
"track fit failed after removing inner hits.");
627 B2DEBUG(20,
"\t previous track fit was also failed.");
643 const std::vector<RecoHitInformation*>& recoHitInformationsMinus = recoTrackMinus->
getRecoHitInformations(
645 unsigned int iInnermostHitPlus, iInnermostHitMinus;
646 for (iInnermostHitPlus = 0 ; iInnermostHitPlus < recoHitInformationsPlus.size() ; ++iInnermostHitPlus)
647 if (recoHitInformationsPlus[iInnermostHitPlus]->useInFit())
break;
648 for (iInnermostHitMinus = 0 ; iInnermostHitMinus < recoHitInformationsMinus.size() ; ++iInnermostHitMinus)
649 if (recoHitInformationsMinus[iInnermostHitMinus]->useInFit())
break;
650 if (iInnermostHitPlus == recoHitInformationsPlus.size() || iInnermostHitMinus == recoHitInformationsMinus.size()) {
651 B2WARNING(
"checkSharedInnermostCluster function called for recoTrack including no hit used for fit! This should not happen!");
654 const auto& recoHitInfoPlus = recoHitInformationsPlus[iInnermostHitPlus];
655 const auto& recoHitInfoMinus = recoHitInformationsMinus[iInnermostHitMinus];
657 if (recoHitInfoPlus->getTrackingDetector() == recoHitInfoMinus->getTrackingDetector()) {
658 if (recoHitInfoPlus->getTrackingDetector() == RecoHitInformation::c_PXD) {
661 if (clusterPlus == clusterMinus) {
664 }
else if (recoHitInfoPlus->getTrackingDetector() == RecoHitInformation::c_SVD) {
669 if (clusterPlus->
isUCluster() && clusterMinus->isUCluster()) {
670 if (recoHitInformationsPlus.size() > iInnermostHitPlus + 1
671 && recoHitInformationsMinus.size() > iInnermostHitMinus + 1) {
672 const auto& recoHitInfoNextPlus = recoHitInformationsPlus[iInnermostHitPlus + 1];
673 const auto& recoHitInfoNextMinus = recoHitInformationsMinus[iInnermostHitMinus + 1];
675 if (recoHitInfoNextPlus->useInFit() && recoHitInfoNextMinus->useInFit()
676 && recoHitInfoNextPlus->getTrackingDetector() == RecoHitInformation::c_SVD
677 && recoHitInfoNextMinus->getTrackingDetector() == RecoHitInformation::c_SVD) {
680 if (!(clusterNextPlus->
isUCluster()) && !(clusterNextMinus->isUCluster())
682 && clusterMinus->getSensorID() == clusterNextMinus->getSensorID()) {
683 if (clusterPlus == clusterMinus)
685 if (clusterNextPlus == clusterNextMinus)
688 B2WARNING(
"SVD cluster to be paired is not on V-side, or not on the same sensor.");
692 B2WARNING(
"No SVD cluster to be paired.");
696 B2WARNING(
"Innermost SVD U-cluster is the only hit in a daughter track. This should not happen.");
700 B2WARNING(
"No SVD U-cluster in the innermost cluster.");
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.
bool wasFitSuccessful(const genfit::AbsTrackRep *representation=nullptr) const
Returns true if the last fit with the given representation was successful.
genfit::AbsTrackRep * getTrackRepresentationForPDG(int pdgCode)
Return an already created track representation of the given reco track for the PDG.
size_t addHitsFromRecoTrack(const RecoTrack *recoTrack, unsigned int sortingParameterOffset=0, bool reversed=false, boost::optional< double > optionalMinimalWeight=boost::none)
Add all hits from another RecoTrack to this RecoTrack.
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...
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).
T * getRelated(const std::string &name="", const std::string &namedRelation="") const
Get the object to or from which this object has a relation.
TO * getRelatedTo(const std::string &name="", const std::string &namedRelation="") const
Get the object to 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)
Get the HitPattern in the VXD.
static uint64_t getHitPatternCDCInitializer(const RecoTrack &recoTrack)
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.
bool removeInnerHits(RecoTrack *prevRecoTrack, RecoTrack *recoTrack, const int trackPDG, const TVector3 &vertexPosition)
Remove inner hits from RecoTrack at once.
bool vertexFitWithRecoTracks(const Track *trackPlus, const Track *trackMinus, RecoTrack *recoTrackPlus, RecoTrack *recoTrackMinus, const Const::ParticleType &v0Hypothesis, unsigned int &hasInnerHitStatus, TVector3 &vertexPos, const bool forceStore)
fit V0 vertex using RecoTrack's as inputs.
double m_beamPipeRadius
Radius where inside/outside beampipe is defined.
std::tuple< double, double > m_invMassRangePhoton
invariant mass cut for Photon.
bool extrapolateToVertex(genfit::MeasuredStateOnPlane &stPlus, genfit::MeasuredStateOnPlane &stMinus, const TVector3 &vertexPosition)
Extrapolate the fit results to the perigee to the vertex.
std::string m_recoTracksName
RecoTrackColName (input).
double m_vertexChi2CutOutside
Chi2 cut outside beampipe.
StoreArray< RecoTrack > m_recoTracks
RecoTrack (input)
double getBzAtVertex(const TVector3 &vertexPosition)
Getter for magnetic field in z direction at the vertex position.
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.
Abstract base class for a track representation.
TVector3 getFieldVal(const TVector3 &position)
This does NOT use the cache!
static FieldManager * getInstance()
Get singleton instance.
GFRaveTrackParameters class Contains a pointer to the original genfit::Track, the weight of the track...
Vertex factory for producing GFRaveVertex objects from Track objects.
TVector3 getPos() const
get Position
TMatrixDSym getCov() const
get 3x3 covariance (error) of position.
#StateOnPlane with additional covariance matrix.
Collection of TrackPoint objects, AbsTrackRep objects and FitStatus objects.
const std::vector< genfit::AbsTrackRep * > & getTrackReps() const
Return the track representations as a list of pointers.
Abstract base class for different kinds of events.