Belle II Software  release-08-01-10
TrackFitter.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 #include <tracking/trackFitting/fitter/base/TrackFitter.h>
9 
10 #include <tracking/dataobjects/RecoTrack.h>
11 
12 #include <genfit/AbsTrackRep.h>
13 #include <genfit/FitStatus.h>
14 #include <genfit/AbsFitter.h>
15 #include <genfit/DAF.h>
16 #include <genfit/KalmanFitterInfo.h>
17 
18 using namespace Belle2;
19 
20 constexpr double TrackFitter::s_defaultDeltaPValue;
21 constexpr double TrackFitter::s_defaultProbCut;
22 constexpr unsigned int TrackFitter::s_defaultMaxFailedHits;
23 
25 {
26  int currentPdgCode = particleType.getPDGCode();
27 
28  const auto& pdgParticleCharge = particleType.getParticlePDG()->Charge();
29  const auto& recoTrackCharge = recoTrack.getChargeSeed();
30 
31  // Copy from GenfitterModule
32  B2ASSERT("Charge of candidate and PDG particle don't match. (Code assumes |q| = 1).",
33  fabs(pdgParticleCharge) == fabs(recoTrackCharge * 3.0));
34 
35  /*
36  * Because the charged stable particles do describe a positive as well as a negative particle,
37  * we have to correct the charge if needed.
38  */
39  if (std::signbit(pdgParticleCharge) != std::signbit(recoTrackCharge))
40  currentPdgCode *= -1;
41 
42  return currentPdgCode;
43 }
44 
45 bool TrackFitter::fit(RecoTrack& recoTrack) const
46 {
47  if (not recoTrack.getRepresentations().empty() and recoTrack.getCardinalRepresentation()) {
48  return fit(recoTrack, recoTrack.getCardinalRepresentation());
49  } else {
50  return fit(recoTrack, Const::pion);
51  }
52 }
53 
54 bool TrackFitter::fit(RecoTrack& recoTrack, const Const::ChargedStable& particleType) const
55 {
56  const int currentPdgCode = TrackFitter::createCorrectPDGCodeForChargedStable(particleType, recoTrack);
58  currentPdgCode);
59 
60  return fit(recoTrack, trackRepresentation);
61 }
62 
63 bool TrackFitter::fit(RecoTrack& recoTrack, const int pdgCode) const
64 {
66  pdgCode);
67 
68  return fit(recoTrack, trackRepresentation);
69 }
70 
71 bool TrackFitter::fitWithoutCheck(RecoTrack& recoTrack, const genfit::AbsTrackRep& trackRepresentation) const
72 {
73  // Fit the track
74  try {
75  // Delete the old information to start from scratch
76  recoTrack.deleteFittedInformationForRepresentation(&trackRepresentation);
77  m_fitter->processTrackWithRep(&RecoTrackGenfitAccess::getGenfitTrack(recoTrack), &trackRepresentation);
78  } catch (genfit::Exception& e) {
79  B2WARNING(e.getExcString());
80  }
81 
82  recoTrack.setDirtyFlag(false);
83 
84  // Do the hits synchronisation
85  const std::vector<RecoHitInformation*>& relatedRecoHitInformation = recoTrack.getRecoHitInformations();
86 
87  for (RecoHitInformation* recoHitInformation : relatedRecoHitInformation) {
88  const genfit::TrackPoint* trackPoint = recoTrack.getCreatedTrackPoint(recoHitInformation);
89  if (trackPoint) {
90  genfit::KalmanFitterInfo* kalmanFitterInfo = trackPoint->getKalmanFitterInfo(&trackRepresentation);
91  if (not kalmanFitterInfo) {
92  recoHitInformation->setFlag(RecoHitInformation::RecoHitFlag::c_dismissedByFit);
93  } else {
94  std::vector<double> weights = kalmanFitterInfo->getWeights();
95  for (const double weight : weights) {
96  if (weight < 1.e-9) {
97  recoHitInformation->setFlag(RecoHitInformation::RecoHitFlag::c_dismissedByFit);
98  }
99  }
100  }
101  }
102  }
103 
104  return recoTrack.wasFitSuccessful(&trackRepresentation);
105 }
106 
107 bool TrackFitter::fit(RecoTrack& recoTrack, genfit::AbsTrackRep* trackRepresentation) const
108 {
109  B2ASSERT("No fitter was loaded! Have you reset the fitter to an invalid one?", m_fitter);
110 
111  const bool measurementAdderNeedsTrackRefit = m_measurementAdder.addMeasurements(recoTrack);
112 
113  if (RecoTrackGenfitAccess::getGenfitTrack(recoTrack).getNumPoints() == 0) {
114  B2WARNING("No track points (measurements) were added to this reco track. Have you used an invalid measurement adder?");
115  return false;
116  }
117 
118  const std::vector<genfit::AbsTrackRep*>& trackRepresentations = recoTrack.getRepresentations();
119  if (std::find(trackRepresentations.begin(), trackRepresentations.end(), trackRepresentation) == trackRepresentations.end()) {
120  B2FATAL("The TrackRepresentation provided is not part of the Reco Track.");
121  }
122 
123  if (not recoTrack.getDirtyFlag() and not m_skipDirtyCheck and not measurementAdderNeedsTrackRefit
124  and recoTrack.hasTrackFitStatus(trackRepresentation) and recoTrack.getTrackFitStatus(trackRepresentation)->isFitted()) {
125  B2DEBUG(100, "Hit content did not change, track representation is already present and you used only default parameters." <<
126  "I will not fit the track again. If you still want to do so, set the dirty flag of the track.");
127  return recoTrack.wasFitSuccessful(trackRepresentation);
128  }
129 
130  const auto previousSetting = gErrorIgnoreLevel; // Save current log level
131  gErrorIgnoreLevel = m_gErrorIgnoreLevel; // Set the log level defined in the TrackFitter
132  auto fitWithoutCheckResult = fitWithoutCheck(recoTrack, *trackRepresentation);
133  gErrorIgnoreLevel = previousSetting; // Restore previous setting
134  return fitWithoutCheckResult;
135 }
136 
138 {
139  if (!m_DAFparameters.isValid())
140  B2FATAL("DAF parameters are not available.");
141  genfit::DAF* dafFitter = new genfit::DAF(m_DAFparameters->getAnnealingScheme(),
142  m_DAFparameters->getMinimumIterations(),
143  m_DAFparameters->getMaximumIterations(),
144  m_DAFparameters->getMinimumIterationsForPVal(),
145  true,
146  m_DAFparameters->getDeltaPValue(),
147  m_DAFparameters->getDeltaWeight(),
148  m_DAFparameters->getProbabilityCut());
149  dafFitter->setMaxFailedHits(m_DAFparameters->getMaximumFailedHits());
150 
151  m_fitter.reset(dafFitter);
152 
153  m_skipDirtyCheck = false;
154 }
155 
156 void TrackFitter::resetFitter(const std::shared_ptr<genfit::AbsFitter>& fitter)
157 {
158  m_fitter = fitter;
159  m_skipDirtyCheck = true;
160 }
Provides a type-safe way to pass members of the chargedStableSet set.
Definition: Const.h:580
int getPDGCode() const
PDG code.
Definition: Const.h:464
const TParticlePDG * getParticlePDG() const
Accessor for ROOT TParticlePDG object.
Definition: UnitConst.cc:351
static const ChargedStable pion
charged pion particle
Definition: Const.h:652
bool addMeasurements(RecoTrack &recoTrack) const
After you have filled the internal storage with measurement creators (either by providing your own or...
This class stores additional information to every CDC/SVD/PXD hit stored in a RecoTrack.
static genfit::Track & getGenfitTrack(RecoTrack &recoTrack)
Give access to the RecoTrack's genfit::Track.
Definition: RecoTrack.cc:404
static genfit::AbsTrackRep * createOrReturnRKTrackRep(RecoTrack &recoTrack, int PDGcode)
Checks if a TrackRap for the PDG id of the RecoTrack (and its charge conjugate) does already exit and...
Definition: RecoTrack.cc:409
This is the Reconstruction Event-Data Model Track.
Definition: RecoTrack.h:79
const genfit::FitStatus * getTrackFitStatus(const genfit::AbsTrackRep *representation=nullptr) const
Return the track fit status for the given representation or for the cardinal one. You are not allowed...
Definition: RecoTrack.h:621
bool wasFitSuccessful(const genfit::AbsTrackRep *representation=nullptr) const
Returns true if the last fit with the given representation was successful.
Definition: RecoTrack.cc:336
void setDirtyFlag(const bool &dirtyFlag=true)
Set to true, if you want to rebuild the measurements and do the fit independent on changes of the hit...
Definition: RecoTrack.h:722
const std::vector< genfit::AbsTrackRep * > & getRepresentations() const
Return a list of track representations. You are not allowed to modify or delete them!
Definition: RecoTrack.h:638
bool hasTrackFitStatus(const genfit::AbsTrackRep *representation=nullptr) const
Check, if there is a fit status for the given representation or for the cardinal one.
Definition: RecoTrack.cc:543
const genfit::TrackPoint * getCreatedTrackPoint(const RecoHitInformation *recoHitInformation) const
Get a pointer to the TrackPoint that was created from this hit.
Definition: RecoTrack.cc:230
std::vector< RecoHitInformation * > getRecoHitInformations(bool getSorted=false) const
Return a list of all RecoHitInformations associated with the RecoTrack.
Definition: RecoTrack.cc:557
genfit::AbsTrackRep * getCardinalRepresentation() const
Get a pointer to the cardinal track representation. You are not allowed to modify or delete it!
Definition: RecoTrack.h:631
bool getDirtyFlag() const
This returns true, if a hit was added after the last fit and measurement creation and a refit should ...
Definition: RecoTrack.h:715
void deleteFittedInformationForRepresentation(const genfit::AbsTrackRep *rep)
Delete all fitted information for the given representations.
Definition: RecoTrack.cc:470
short int getChargeSeed() const
Return the charge seed stored in the reco track. ATTENTION: This is not the fitted charge.
Definition: RecoTrack.h:508
DBObjPtr< DAFparameters > m_DAFparameters
DAF parameters Database OjbPtr.
Definition: TrackFitter.h:291
static int createCorrectPDGCodeForChargedStable(const Const::ChargedStable &particleType, const RecoTrack &recoTrack)
Helper function to multiply the PDG code of a charged stable with the charge of the reco track (if ne...
Definition: TrackFitter.cc:24
static constexpr double s_defaultProbCut
Default probCut for the default DAF fitter.
Definition: TrackFitter.h:121
bool fit(RecoTrack &recoTrack, genfit::AbsTrackRep *trackRepresentation) const
Fit a reco track with a given non-default track representation.
Definition: TrackFitter.cc:107
static constexpr double s_defaultDeltaPValue
Default deltaPValue for the default DAF fitter.
Definition: TrackFitter.h:119
void resetFitter(const std::shared_ptr< genfit::AbsFitter > &fitter)
Set the internal storage of the fitter to a provided one, if you want to use non-default settings.
Definition: TrackFitter.cc:156
MeasurementAdder m_measurementAdder
The measurement adder algorithm class.
Definition: TrackFitter.h:285
void resetFitterToDefaultSettings()
Use the default settings of the fitter to fit the reco tracks.
Definition: TrackFitter.cc:137
Int_t m_gErrorIgnoreLevel
Control the output level of the ROOT functions used by the GenFit fitter. Default is increased from k...
Definition: TrackFitter.h:288
static constexpr unsigned int s_defaultMaxFailedHits
Default maxFailedHits for the default DAF fitter.
Definition: TrackFitter.h:123
std::shared_ptr< genfit::AbsFitter > m_fitter
The internal storage of the used fitting algorithms.
Definition: TrackFitter.h:280
bool m_skipDirtyCheck
Flag to skip the dirty flag check which is needed when using non-default fitters.
Definition: TrackFitter.h:282
bool fitWithoutCheck(RecoTrack &recoTrack, const genfit::AbsTrackRep &trackRepresentation) const
Helper function to do the fit.
Definition: TrackFitter.cc:71
Abstract base class for a track representation.
Definition: AbsTrackRep.h:66
Determinstic Annealing Filter (DAF) implementation.
Definition: DAF.h:49
Exception class for error handling in GENFIT (provides storage for diagnostic information)
Definition: Exception.h:48
bool isFitted() const
Has the track been fitted?
Definition: FitStatus.h:94
Collects information needed and produced by a AbsKalmanFitter implementations and is specific to one ...
std::vector< double > getWeights() const
Get weights of measurements.
Object containing AbsMeasurement and AbsFitterInfo objects.
Definition: TrackPoint.h:46
KalmanFitterInfo * getKalmanFitterInfo(const AbsTrackRep *rep=nullptr) const
Helper to avoid casting.
Definition: TrackPoint.cc:180
Abstract base class for different kinds of events.