ATLAS Offline Software
iPatFitter.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #ifndef TRKIPATFITTER_IPATFITTER_H
6 #define TRKIPATFITTER_IPATFITTER_H
7 
8 #include <memory>
9 #include <mutex>
10 #include <vector>
11 
13 #include "GaudiKernel/EventContext.h"
14 #include "GaudiKernel/ToolHandle.h"
23 #include "TrkTrack/Track.h"
24 #include "TrkTrack/TrackInfo.h"
31 namespace Trk {
32 class FitQuality;
33 class TrackStateOnSurface;
37 class iPatFitter : public AthAlgTool, virtual public ITrackFitter {
38  public:
40 
41  // standard AlgTool methods
42  iPatFitter(const std::string& type, const std::string& name,
43  const IInterface* parent, bool isGlobalFit = false);
44  virtual ~iPatFitter() = default;
45 
46  // standard Athena methods
47  virtual StatusCode initialize() override;
48  virtual StatusCode finalize() override;
49 
50  // iPat Fitter settings (FIXME: to provide??):
51  // RunOutlierRemoval - use logic to remove bad hits
52 
53  // refit a track
54  virtual std::unique_ptr<Track> fit(
55  const EventContext& ctx, const Track&,
56  const RunOutlierRemoval runOutlier = false,
57  const ParticleHypothesis particleHypothesis =
58  Trk::nonInteracting) const override;
59 
60  // refit a track adding a PrepRawDataSet
61  virtual std::unique_ptr<Track> fit(
62  const EventContext& ctx, const Track&, const PrepRawDataSet&,
63  const RunOutlierRemoval runOutlier = false,
64  const ParticleHypothesis particleHypothesis =
65  Trk::nonInteracting) const override;
66 
67  // fit a set of PrepRawData objects
68  virtual std::unique_ptr<Track> fit(
69  const EventContext& ctx, const PrepRawDataSet&,
70  const TrackParameters& perigeeStartValue,
71  const RunOutlierRemoval runOutlier = false,
72  const ParticleHypothesis particleHypothesis =
73  Trk::nonInteracting) const override;
74 
75  // refit a track adding a MeasurementSet
76  virtual std::unique_ptr<Track> fit(
77  const EventContext& ctx, const Track&, const MeasurementSet&,
78  const RunOutlierRemoval runOutlier = false,
79  const ParticleHypothesis particleHypothesis =
80  Trk::nonInteracting) const override;
81 
82  // fit a set of MeasurementBase objects with starting value for
83  // perigeeParameters
84  virtual std::unique_ptr<Track> fit(
85  const EventContext& ctx, const MeasurementSet&,
86  const TrackParameters& perigeeStartValue,
87  const RunOutlierRemoval runOutlier = false,
88  const ParticleHypothesis particleHypothesis =
89  Trk::nonInteracting) const override;
90 
91  // combined muon fit
92  virtual std::unique_ptr<Track> fit(
93  const EventContext& ctx, const Track&, const Track&,
94  const RunOutlierRemoval runOutlier = false,
95  const ParticleHypothesis particleHypothesis =
96  Trk::nonInteracting) const override;
97 
98  protected:
99  class FitState {
100  public:
102 
104  if (m_measurements) {
105  for (auto m : *m_measurements) {
106  delete m;
107  }
108  }
109  }
110 
113  m_measurements = std::make_unique<std::vector<FitMeasurement*>>();
114  }
115 
116  std::vector<FitMeasurement*>& getMeasurements() {
117  if (m_measurements) {
118  return *m_measurements;
119  } else {
120  throw std::runtime_error("no measurements exist");
121  }
122  }
123 
124  const std::vector<FitMeasurement*>& getMeasurements() const {
125  if (m_measurements) {
126  return *m_measurements;
127  } else {
128  throw std::runtime_error("no measurements exist");
129  }
130  }
131 
132  bool hasMeasurements() const { return m_measurements.get() != nullptr; }
133 
134  std::unique_ptr<FitParameters> parameters = nullptr;
135  int iterations = 0;
136 
137  private:
138  std::unique_ptr<std::vector<FitMeasurement*>> m_measurements = nullptr;
139  };
140 
141  // fitWithState that creates and returns state
142  std::pair<std::unique_ptr<Track>, std::unique_ptr<FitState>> fitWithState(
143  const EventContext& ctx, const Track&,
144  const RunOutlierRemoval runOutlier = false,
145  const ParticleHypothesis particleHypothesis = Trk::nonInteracting) const;
146 
147  // class implementing the algorithmic code for fitting
148  std::unique_ptr<FitProcedure> m_fitProcedure;
150 
151  // flag to indicate global fitter, only used for logging
152  const bool m_globalFit = false;
153 
154  private:
155  // add MeasurementSet
156  void addMeasurements(const EventContext& ctx,
157  std::vector<FitMeasurement*>& measurements,
158  const MeasurementSet& measurementSet,
159  const FitParameters& parameters) const;
160 
161  // add TrackStateOnSurfaces (true means material already allocated on
162  // trackTSOS)
163  bool addMeasurements(
164  const EventContext& ctx, std::vector<FitMeasurement*>& measurements,
165  const FitParameters& parameters, ParticleHypothesis particleHypothesis,
166  const Trk::TrackStates& trackTSOS) const;
167 
168  // perform fit
169  std::unique_ptr<Track> performFit(
170  FitState& fitState, const ParticleHypothesis particleHypothesis,
171  const TrackInfo& trackInfo,
172  const Trk::TrackStates* leadingTSOS,
173  const FitQuality* perigeeQuality, Garbage_t& garbage) const;
174 
175  // print TSOS on a track (debugging aid)
176  void printTSOS(const Track&) const;
177 
178  void refit(const EventContext& ctx, FitState& fitState, const Track& track,
179  const RunOutlierRemoval runOutlier,
180  const ParticleHypothesis particleHypothesis) const;
181 
182  // configurables (tools and options)
183  Gaudi::Property<bool> m_aggregateMaterial{this, "AggregateMaterial", true};
184  Gaudi::Property<bool> m_asymmetricCaloEnergy{this, "AsymmetricCaloEnergy",
185  true};
186  Gaudi::Property<bool> m_fullCombinedFit{this, "FullCombinedFit", true};
187  Gaudi::Property<bool> m_lineFit{this, "LineFit", false};
188  Gaudi::Property<double> m_lineMomentum{this, "LineMomentum",
189  100. * Gaudi::Units::GeV};
190 
191  ToolHandle<IMaterialAllocator> m_materialAllocator{
192  this, "MaterialAllocator", "Trk::MaterialAllocator/MaterialAllocator"};
193  ToolHandle<IIntersector> m_rungeKuttaIntersector{
194  this, "RungeKuttaIntersector",
195  "Trk::RungeKuttaIntersector/RungeKuttaIntersector"};
196  ToolHandle<IIntersector> m_solenoidalIntersector{
197  this, "SolenoidalIntersector",
198  "Trk::SolenoidalIntersector/SolenoidalIntersector"};
199  ToolHandle<IPropagator> m_stepPropagator{
200  this, "Propagator", "Trk::STEP_Propagator/AtlasSTEP_Propagator"};
201  ToolHandle<IIntersector> m_straightLineIntersector{
202  this, "StraightLineIntersector",
203  "Trk::StraightLineIntersector/StraightLineIntersector"};
205  this, "TrackingVolumesSvc", "TrackingVolumesSvc/TrackingVolumesSvc"};
206  ToolHandle<Trk::IExtendedTrackSummaryTool> m_trackSummaryTool{
207  this, "TrackSummaryTool", "MuonTrackSummaryTool"};
208 
209  // configurable tolerances, warnings
210  Gaudi::Property<double> m_orderingTolerance{this, "OrderingTolerance",
211  1. * Gaudi::Units::mm};
212  Gaudi::Property<unsigned> m_maxWarnings{
213  this, "MaxNumberOfWarnings", 10,
214  "Maximum number of permitted WARNING messages per message type."};
215 
216  // configurables for validation purposes
217  Gaudi::Property<bool> m_constrainedAlignmentEffects{
218  this, "ConstrainedAlignmentEffects", false};
219  Gaudi::Property<bool> m_extendedDebug{this, "ExtendedDebug", false};
220  Gaudi::Property<int> m_forcedRefitsForValidation{
221  this, "ForcedRefitsForValidation", 0};
222  Gaudi::Property<int> m_maxIterations{this, "MaxIterations", 25};
223 
224  // constants
225  std::unique_ptr<Trk::Volume> m_calorimeterVolume;
226  std::unique_ptr<Trk::Volume> m_indetVolume;
228 
229  // counters
230  mutable std::atomic<unsigned> m_countFitAttempts = 0;
231  mutable std::atomic<unsigned> m_countGoodFits = 0;
232  mutable std::atomic<unsigned> m_countIterations = 0;
233  mutable std::atomic<unsigned> m_countRefitAttempts = 0;
234  mutable std::atomic<unsigned> m_countGoodRefits = 0;
235  mutable std::atomic<unsigned> m_countRefitIterations = 0;
236 
237  // count warnings
238  std::unique_ptr<MessageHelper> m_messageHelper;
239 };
240 
241 } // end of namespace Trk
242 
243 #endif // TRKIPATFITTER_IPATFITTER_H
Trk::iPatFitter::m_constrainedAlignmentEffects
Gaudi::Property< bool > m_constrainedAlignmentEffects
Definition: iPatFitter.h:217
Trk::TrackInfo
Contains information about the 'fitter' of this track.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/TrackInfo.h:32
Trk::iPatFitter::performFit
std::unique_ptr< Track > performFit(FitState &fitState, const ParticleHypothesis particleHypothesis, const TrackInfo &trackInfo, const Trk::TrackStates *leadingTSOS, const FitQuality *perigeeQuality, Garbage_t &garbage) const
Definition: iPatFitter.cxx:904
Trk::PrepRawDataSet
std::vector< const PrepRawData * > PrepRawDataSet
vector of clusters and drift circles
Definition: FitterTypes.h:26
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
Trk::iPatFitter::m_materialAllocator
ToolHandle< IMaterialAllocator > m_materialAllocator
Definition: iPatFitter.h:191
TrackParameters.h
Trk::iPatFitter::m_forcedRefitsForValidation
Gaudi::Property< int > m_forcedRefitsForValidation
Definition: iPatFitter.h:220
Trk::MagneticFieldProperties
Definition: MagneticFieldProperties.h:31
MuonTrackSummary.h
Trk::iPatFitter::m_messageHelper
std::unique_ptr< MessageHelper > m_messageHelper
Definition: iPatFitter.h:238
Trk::iPatFitter::m_rungeKuttaIntersector
ToolHandle< IIntersector > m_rungeKuttaIntersector
Definition: iPatFitter.h:193
Trk::iPatFitter::m_stepPropagator
ToolHandle< IPropagator > m_stepPropagator
Definition: iPatFitter.h:199
BeamSpot::mutex
std::mutex mutex
Definition: InDetBeamSpotVertex.cxx:18
Trk::iPatFitter::FitState::deleteMeasurements
void deleteMeasurements()
Definition: iPatFitter.h:103
Trk::iPatFitter::iPatFitter
iPatFitter(const std::string &type, const std::string &name, const IInterface *parent, bool isGlobalFit=false)
Definition: iPatFitter.cxx:40
Trk::iPatFitter::FitState::hasMeasurements
bool hasMeasurements() const
Definition: iPatFitter.h:132
Trk::iPatFitter::m_countRefitIterations
std::atomic< unsigned > m_countRefitIterations
Definition: iPatFitter.h:235
Trk::iPatFitter::initialize
virtual StatusCode initialize() override
Definition: iPatFitter.cxx:49
Trk::iPatFitter::FitState::~FitState
~FitState()
Definition: iPatFitter.h:101
Trk::iPatFitter
Main Fitter tool providing the implementation for the different fitting, extension and refitting use ...
Definition: iPatFitter.h:37
Trk::iPatFitter::m_lineFit
Gaudi::Property< bool > m_lineFit
Definition: iPatFitter.h:187
IPropagator.h
Trk::iPatFitter::fit
virtual std::unique_ptr< Track > fit(const EventContext &ctx, const Track &, const RunOutlierRemoval runOutlier=false, const ParticleHypothesis particleHypothesis=Trk::nonInteracting) const override
RE-FIT A TRACK.
Definition: iPatFitter.cxx:262
Trk::iPatFitter::m_countRefitAttempts
std::atomic< unsigned > m_countRefitAttempts
Definition: iPatFitter.h:233
Trk::iPatFitter::FitState::newMeasurements
void newMeasurements()
Definition: iPatFitter.h:111
FitProcedure.h
Trk::iPatFitter::m_countGoodRefits
std::atomic< unsigned > m_countGoodRefits
Definition: iPatFitter.h:234
Trk::ITrackFitter
Definition: ITrackFitter.h:42
FitParameters.h
Trk::RunOutlierRemoval
bool RunOutlierRemoval
switch to toggle quality processing after fit
Definition: FitterTypes.h:22
MessageHelper.h
Track.h
MagneticFieldProperties.h
Trk::iPatFitter::m_maxWarnings
Gaudi::Property< unsigned > m_maxWarnings
Definition: iPatFitter.h:212
Trk::iPatFitter::FitState::m_measurements
std::unique_ptr< std::vector< FitMeasurement * > > m_measurements
Definition: iPatFitter.h:138
Trk::iPatFitter::m_trackingVolumesSvc
ServiceHandle< ITrackingVolumesSvc > m_trackingVolumesSvc
Definition: iPatFitter.h:204
Trk::ParticleHypothesis
ParticleHypothesis
Definition: ParticleHypothesis.h:25
IMaterialAllocator.h
Trk::iPatFitter::FitState::parameters
std::unique_ptr< FitParameters > parameters
Definition: iPatFitter.h:134
Trk::iPatFitter::m_orderingTolerance
Gaudi::Property< double > m_orderingTolerance
Definition: iPatFitter.h:210
Trk::iPatFitter::addMeasurements
void addMeasurements(const EventContext &ctx, std::vector< FitMeasurement * > &measurements, const MeasurementSet &measurementSet, const FitParameters &parameters) const
Definition: iPatFitter.cxx:520
Trk::iPatFitter::m_globalFit
const bool m_globalFit
Definition: iPatFitter.h:152
Trk::iPatFitter::m_lineMomentum
Gaudi::Property< double > m_lineMomentum
Definition: iPatFitter.h:188
Trk::iPatFitter::m_countFitAttempts
std::atomic< unsigned > m_countFitAttempts
Definition: iPatFitter.h:230
Trk::iPatFitter::m_maxIterations
Gaudi::Property< int > m_maxIterations
Definition: iPatFitter.h:222
Trk::iPatFitter::m_extendedDebug
Gaudi::Property< bool > m_extendedDebug
Definition: iPatFitter.h:219
Trk::iPatFitter::m_aggregateMaterial
Gaudi::Property< bool > m_aggregateMaterial
Definition: iPatFitter.h:183
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
AthAlgTool.h
Trk::iPatFitter::refit
void refit(const EventContext &ctx, FitState &fitState, const Track &track, const RunOutlierRemoval runOutlier, const ParticleHypothesis particleHypothesis) const
Definition: iPatFitter.cxx:1131
test_pyathena.parent
parent
Definition: test_pyathena.py:15
Trk::iPatFitter::m_fitProcedure
std::unique_ptr< FitProcedure > m_fitProcedure
Definition: iPatFitter.h:148
Trk::IMaterialAllocator::Garbage_t
std::vector< std::unique_ptr< const TrackStateOnSurface > > Garbage_t
Definition: IMaterialAllocator.h:40
Trk::iPatFitter::m_fitProcedureMutex
std::mutex m_fitProcedureMutex
Definition: iPatFitter.h:149
Trk::FitQuality
Class to represent and store fit qualities from track reconstruction in terms of and number of degre...
Definition: FitQuality.h:97
Trk::ParametersBase
Definition: ParametersBase.h:55
Trk::iPatFitter::m_calorimeterVolume
std::unique_ptr< Trk::Volume > m_calorimeterVolume
Definition: iPatFitter.h:225
DataVector< const Trk::TrackStateOnSurface >
trackInfo
Definition: TrigInDetUtils.h:13
Trk::MeasurementSet
std::vector< const MeasurementBase * > MeasurementSet
vector of fittable measurements
Definition: FitterTypes.h:30
Trk::iPatFitter::m_solenoidalIntersector
ToolHandle< IIntersector > m_solenoidalIntersector
Definition: iPatFitter.h:196
Trk::iPatFitter::m_stepField
Trk::MagneticFieldProperties m_stepField
Definition: iPatFitter.h:227
Trk::iPatFitter::m_countIterations
std::atomic< unsigned > m_countIterations
Definition: iPatFitter.h:232
Trk
Ensure that the ATLAS eigen extensions are properly loaded.
Definition: FakeTrackBuilder.h:9
Trk::iPatFitter::FitState
Definition: iPatFitter.h:99
Trk::iPatFitter::FitState::getMeasurements
const std::vector< FitMeasurement * > & getMeasurements() const
Definition: iPatFitter.h:124
Trk::iPatFitter::finalize
virtual StatusCode finalize() override
Definition: iPatFitter.cxx:135
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
Trk::iPatFitter::m_asymmetricCaloEnergy
Gaudi::Property< bool > m_asymmetricCaloEnergy
Definition: iPatFitter.h:184
TrackInfo.h
Trk::nonInteracting
@ nonInteracting
Definition: ParticleHypothesis.h:25
Trk::iPatFitter::Garbage_t
IMaterialAllocator::Garbage_t Garbage_t
Definition: iPatFitter.h:39
IIntersector.h
FitMeasurement.h
Trk::iPatFitter::fitWithState
std::pair< std::unique_ptr< Track >, std::unique_ptr< FitState > > fitWithState(const EventContext &ctx, const Track &, const RunOutlierRemoval runOutlier=false, const ParticleHypothesis particleHypothesis=Trk::nonInteracting) const
Definition: iPatFitter.cxx:179
python.SystemOfUnits.mm
int mm
Definition: SystemOfUnits.py:83
Trk::iPatFitter::m_fullCombinedFit
Gaudi::Property< bool > m_fullCombinedFit
Definition: iPatFitter.h:186
TrackingVolume.h
IExtendedTrackSummaryTool.h
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
Trk::iPatFitter::m_straightLineIntersector
ToolHandle< IIntersector > m_straightLineIntersector
Definition: iPatFitter.h:201
Trk::iPatFitter::printTSOS
void printTSOS(const Track &) const
Definition: iPatFitter.cxx:1093
physics_parameters.parameters
parameters
Definition: physics_parameters.py:144
Trk::iPatFitter::m_trackSummaryTool
ToolHandle< Trk::IExtendedTrackSummaryTool > m_trackSummaryTool
Definition: iPatFitter.h:206
Track
Definition: TriggerChamberClusterOnTrackCreator.h:21
Trk::iPatFitter::~iPatFitter
virtual ~iPatFitter()=default
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
Trk::FitParameters
Definition: FitParameters.h:29
AthAlgTool
Definition: AthAlgTool.h:26
Trk::iPatFitter::FitState::getMeasurements
std::vector< FitMeasurement * > & getMeasurements()
Definition: iPatFitter.h:116
GeV
#define GeV
Definition: CaloTransverseBalanceVecMon.cxx:30
ITrackingVolumesSvc.h
ITrackFitter.h
Trk::iPatFitter::m_countGoodFits
std::atomic< unsigned > m_countGoodFits
Definition: iPatFitter.h:231
python.Dumpers.FitQuality
FitQuality
Definition: Dumpers.py:63
ServiceHandle
Definition: ClusterMakerTool.h:37
Trk::iPatFitter::FitState::iterations
int iterations
Definition: iPatFitter.h:135
Trk::iPatFitter::m_indetVolume
std::unique_ptr< Trk::Volume > m_indetVolume
Definition: iPatFitter.h:226