LDMX Software
GSFProcessor.h
1#pragma once
2
3//--- Framework ---//
4#include "Framework/Configure/Parameters.h"
6#include "Framework/Logger.h"
8
9//--- C++ ---//
10#include <memory>
11#include <random>
12
13//--- LDMX ---//
14#include "Tracking/Reco/TrackingGeometryUser.h"
15
16//--- ACTS ---//
17
18// Utils and Definitions
19#include "Acts/Definitions/Common.hpp"
20#include "Acts/Definitions/TrackParametrization.hpp"
21#include "Acts/Definitions/Units.hpp"
22#include "Acts/EventData/BoundTrackParameters.hpp"
23#include "Acts/Utilities/Logger.hpp"
24
25// geometry
26#include "Acts/Geometry/GeometryContext.hpp"
27
28// magfield
29#include "Acts/MagneticField/MagneticFieldContext.hpp"
30#include "Acts/MagneticField/MagneticFieldProvider.hpp"
31
32// geometry
33#include <Acts/Geometry/TrackingGeometry.hpp>
34
35// propagation testing
36#include "Acts/MagneticField/ConstantBField.hpp"
37#include "Acts/Propagator/ActorList.hpp"
38#include "Acts/Propagator/EigenStepperDenseExtension.hpp"
39#include "Acts/Propagator/MaterialInteractor.hpp"
40#include "Acts/Propagator/Navigator.hpp"
41#include "Acts/Propagator/Propagator.hpp"
42#include "Acts/Propagator/StandardAborters.hpp"
43#include "Acts/Propagator/VoidNavigator.hpp"
44#include "Acts/Propagator/detail/SteppingLogger.hpp"
45#include "Acts/Surfaces/PerigeeSurface.hpp"
46#include "Acts/Utilities/Logger.hpp"
47#include "Tracking/EigenStepper.h" // IWYU pragma: keep
48
49// Kalman Filter
50
51// #include "Acts/EventData/Measurement.hpp"
52#include "Acts/EventData/MultiTrajectory.hpp"
53#include "Acts/EventData/MultiTrajectoryHelpers.hpp"
54#include "Acts/EventData/VectorTrackContainer.hpp"
55#include "Acts/Geometry/GeometryIdentifier.hpp"
56#include "Acts/TrackFinding/CombinatorialKalmanFilter.hpp"
57#include "Acts/TrackFinding/MeasurementSelector.hpp"
58#include "Acts/TrackFitting/GainMatrixUpdater.hpp"
59#include "Acts/Utilities/CalibrationContext.hpp"
60
61//--- Refit with backward propagation ---//
62#include "Acts/TrackFitting/KalmanFitter.hpp"
63
64// GSF
65#include "Acts/Propagator/MultiEigenStepperLoop.hpp"
66#include "Acts/TrackFitting/BetheHeitlerApprox.hpp"
67#include "Acts/TrackFitting/GaussianSumFitter.hpp"
68#include "Acts/TrackFitting/GsfMixtureReduction.hpp"
69
70//--- Tracking ---//
71#include "Tracking/Event/Measurement.h"
72#include "Tracking/Event/Track.h"
73#include "Tracking/Reco/TrackExtrapolatorTool.h"
74#include "Tracking/Sim/IndexSourceLink.h"
75#include "Tracking/Sim/MeasurementCalibrator.h"
76#include "Tracking/Sim/TrackingUtils.h"
77
78//--- Interpolated magnetic field ---//
79#include "Tracking/Sim/BFieldXYZUtils.h"
80
81using ActionList =
82 Acts::ActorList<Acts::detail::SteppingLogger, Acts::MaterialInteractor,
83 Acts::EndOfWorldReached>;
84
85// using GsfPropagator = Acts::Propagator<
86// Acts::MultiEigenStepperLoop<
87// Acts::StepperExtensionList<
88// Acts::detail::GenericDefaultExtension<double> >,
89// Acts::WeightedComponentReducerLoop,
90// Acts::detail::VoidAuctioneer>,
91// Acts::Navigator>;
92
93using MultiStepper = Acts::MultiEigenStepperLoop<>;
94using Propagator = Acts::Propagator<Acts::EigenStepper<>, Acts::Navigator>;
95using GsfPropagator = Acts::Propagator<MultiStepper, Acts::Navigator>;
96using GsfExtrapPropagator =
97 Acts::Propagator<Acts::EigenStepper<>, Acts::VoidNavigator>;
98using GsfFitter =
99 Acts::GaussianSumFitter<GsfPropagator, Acts::VectorMultiTrajectory>;
100
101namespace tracking {
102namespace reco {
103
104class GSFProcessor final : public TrackingGeometryUser {
105 public:
112 GSFProcessor(const std::string& name, framework::Process& process);
113
115 virtual ~GSFProcessor() = default;
116
120 void onProcessStart() override;
121
128 void onNewRun(const ldmx::RunHeader& rh) override;
129
133 void onProcessEnd() override;
134
140 void configure(framework::config::Parameters& parameters) override;
141
147 void produce(framework::Event& event) override;
148
149 private:
150 // Forms the layer to acts map
151 // auto makeLayerSurfacesMap(std::shared_ptr<const Acts::TrackingGeometry>
152 // trackingGeometry) const -> std::unordered_map<unsigned int, const
153 // Acts::Surface*>;
154
155 // Make geoid -> source link map Measurements
156 // auto makeGeoIdSourceLinkMap(
157 // const geo::TrackersTrackingGeometry& tg,
158 // const std::vector<ldmx::Measurement > &ldmxsps) ->
159 // std::unordered_multimap<Acts::GeometryIdentifier,
160 // ActsExamples::IndexSourceLink>;
161
162 // If we want to dump the tracking geometry
163 // bool dumpobj_{false};
164 // int pionstates_{10};
165 // int nevents_{0};
166 // Processing time counter
167 // double processing_time_{0.};
168
169 int nevents_{0};
170 int n_input_tracks_{0};
171 int n_gsf_failed_{0};
172 int n_output_tracks_{0};
173 int n_target_extrap_failed_{0};
174 int n_ecal_extrap_failed_{0};
175 double processing_time_{0.};
176
177 // Fallback statistics
178 int n_fieldmap_gsf_failed_{0};
179 int n_fallback_gsf_recovered_{0};
180 int n_fieldmap_start_extrap_failed_{0};
181 int n_fallback_start_extrap_recovered_{0};
182 int n_fieldmap_target_extrap_failed_{0};
183 int n_fallback_target_extrap_recovered_{0};
184 int n_fieldmap_ecal_extrap_failed_{0};
185 int n_fallback_ecal_extrap_recovered_{0};
186 int n_start_extrap_failed_{0};
187
188 // refitting of tracks
189 // bool kf_refit_{false};
190 // bool gsf_refit_{false};
191
193 bool debug_{false};
194
196 std::default_random_engine generator_;
197
199 std::shared_ptr<std::normal_distribution<float>> normal_;
200
201 // Constant BField
202 // double bfield_{0};
203 // Use constant bfield
204 // bool const_b_field_{true};
205
206 // Remove stereo measurements
207 // bool remove_stereo_{false};
208
209 // Use 2d measurements instead of 1D
210 // bool use1Dmeasurements_{true};
211
212 // Minimum number of hits on tracks
213 // int min_hits_{7};
214
216 std::vector<double> extrapolate_location_{0., 0., 0.};
217 // bool use_seed_perigee_{false};
218
220 std::string measurement_collection_{"TaggerMeasurements"};
221
222 // double outlier_pval_{3.84};
223
225 std::string out_trk_collection_{"GSFTracks"};
226
227 // Select the hits using TrackID and pdg_id__
228
229 // int track_id_{-1};
230 // int pdg_id_{11};
231
232 // Mass for the propagator hypothesis in MeV
233 // double mass_{0.511};
234
236 std::string seed_coll_name_{"seedTracks"};
237
239 std::unique_ptr<const GsfFitter> gsf_;
240
242 std::unique_ptr<const GsfFitter> gsf_zero_b_;
243
245 std::unique_ptr<const GsfFitter> gsf_const_b_;
246
248 std::string track_collection_{"TaggerTracks"};
249
251 std::string meas_collection_{"DigiTaggerSimHits"};
252
254 std::string track_passname_;
255
257 std::string meas_passname_;
258
261
264
267
269 bool abort_on_error_{false};
270
273
275 double weight_cutoff_{1.0e-4};
276
279
282
284 std::string field_map_{""};
285
287 double bfield_{-1.5};
288
291
293 bool use_perigee_{false};
294
295 // Keep track on which system this processor is running on
296 bool tagger_tracking_{true};
297
299 double tagger_start_x_{-617.};
300
302 std::unique_ptr<const Propagator> propagator_;
303
305 std::unordered_map<unsigned int, const Acts::Surface*> layer_surface_map_;
306
307 // Track Extrapolator Tool (VoidNavigator to reach surfaces outside geometry)
308 std::unique_ptr<const GsfExtrapPropagator> propagator_extrap_;
309 std::shared_ptr<tracking::reco::TrackExtrapolatorTool<GsfExtrapPropagator>>
310 trk_extrap_;
311
312 // Zero-field extrapolator, fallback for the recoil
313 std::unique_ptr<const GsfExtrapPropagator> propagator_extrap_zero_b_;
314 std::shared_ptr<tracking::reco::TrackExtrapolatorTool<GsfExtrapPropagator>>
315 trk_extrap_zero_b_;
316
317 // Constant-field extrapolator, fallback for the tagger
318 std::unique_ptr<const GsfExtrapPropagator> propagator_extrap_const_b_;
319 std::shared_ptr<tracking::reco::TrackExtrapolatorTool<GsfExtrapPropagator>>
320 trk_extrap_const_b_;
321
324 std::shared_ptr<Acts::Surface> beam_origin_surface_;
325
327 std::shared_ptr<Acts::Surface> tagger_start_surface_;
328
330 std::shared_ptr<Acts::Surface> target_surface_;
331
333 std::shared_ptr<Acts::Surface> ecal_surface_;
334
335}; // GSFProcessor
336
337} // namespace reco
338} // namespace tracking
The only reason this file exists is to silence an annoying maybe-uninitialized warning that originate...
Base classes for all user event processing components to extend.
Conditions object for random number seeds.
Implements an event buffer system for storing event data.
Definition Event.h:42
Class which represents the process under execution.
Definition Process.h:37
virtual void process(Event &event) final
Processing an event for a Producer is calling produce.
Class encapsulating parameters for configuring a processor.
Definition Parameters.h:29
Run-specific configuration and data stored in its own output TTree alongside the event TTree in the o...
Definition RunHeader.h:67
bool disable_all_material_handling_
Disable all material interactions during propagation.
std::shared_ptr< Acts::Surface > target_surface_
Target surface at z=0 mm (recoil track initialization, perigee output)
std::unique_ptr< const GsfFitter > gsf_
Gaussian Sum Fitter instance for track refitting.
virtual ~GSFProcessor()=default
Destructor.
double bfield_
Bz of the tagger fallback field, in Tesla.
std::unique_ptr< const GsfFitter > gsf_zero_b_
Zero-field GSF, fallback for the recoil.
void produce(framework::Event &event) override
Run the processor.
BFieldDistortion bfield_distortion_
Mis-placement of the reconstruction field; must match the CKF's.
bool debug_
Enable verbose debug output logging.
std::string track_collection_
Collection name for input tracks to be refit.
size_t max_components_
Maximum number of mixture components in GSF fit.
std::string meas_collection_
Collection name for measurements associated with tracks.
bool abort_on_error_
Abort fit if any error occurs (strict error handling)
std::string seed_coll_name_
Collection name for seed tracks (currently unused)
std::string meas_passname_
Pass name for measurement collection in event.
void onProcessEnd() override
Callback for the EventProcessor to take any necessary action when the processing of events finishes,...
double weight_cutoff_
Weight threshold below which mixture components are dropped.
std::string field_map_
Path to magnetic field map file.
std::unordered_map< unsigned int, const Acts::Surface * > layer_surface_map_
Layer ID to ACTS Surface mapping for hit surface lookup.
std::shared_ptr< Acts::Surface > tagger_start_surface_
Tagger GSF start surface at x=tagger_start_x_ in ACTS.
std::string measurement_collection_
Collection name for input measurements.
std::shared_ptr< std::normal_distribution< float > > normal_
Normal distribution for smearing measurements.
void configure(framework::config::Parameters &parameters) override
Configure the processor using the given user specified parameters.
int propagator_max_steps_
Maximum number of propagation steps before aborting.
bool use_perigee_
Use perigee parameterization for tracks.
std::vector< double > extrapolate_location_
Location to extrapolate tracks to (x, y, z in mm)
GSFProcessor(const std::string &name, framework::Process &process)
Constructor.
void onProcessStart() override
Callback for the EventProcessor to take any necessary action when the processing of events starts,...
void onNewRun(const ldmx::RunHeader &rh) override
onNewRun is the first function called for each processor after the conditions are fully configured an...
std::string track_collection_event_passname_
Pass name qualifier for track collection event key.
std::unique_ptr< const Propagator > propagator_
Propagator for track extrapolation using eigen stepper.
std::default_random_engine generator_
Random number generator for smearing operations.
double propagator_step_size_
Step size for track propagation in mm.
std::shared_ptr< Acts::Surface > beam_origin_surface_
Beam origin surface at z=-700 mm (tagger post-fit extrapolation via VoidNavigator)
std::string track_passname_
Pass name for track collection in event.
std::shared_ptr< Acts::Surface > ecal_surface_
ECAL surface at z=240.5 mm (ECAL scoring plane for recoil tracking)
std::unique_ptr< const GsfFitter > gsf_const_b_
Constant-field (bfield_) GSF, fallback for the tagger.
std::string meas_collection_event_passname_
Pass name qualifier for measurement collection event key.
double tagger_start_x_
ACTS x of the tagger GSF start surface [mm].
std::string out_trk_collection_
Collection name for output GSF-refitted tracks.
a helper base class providing some methods to shorten access to common conditions used within the tra...
The measurement calibrator can be a function or a class/struct able to retrieve the sim hits containe...
A deliberate mis-placement of the reconstruction magnetic field, used to quantify how well we need to...