LDMX Software
EcalTrackFinderProcessor.h
Go to the documentation of this file.
1
7#ifndef ECAL_ECALTRACKFINDERPROCESSOR_H_
8#define ECAL_ECALTRACKFINDERPROCESSOR_H_
9
10// LDMX
12#include "DetDescr/EcalID.h"
13#include "Ecal/Event/EcalHit.h"
14#include "Framework/Configure/Parameters.h"
16#include "Tracking/Event/Measurement.h"
17#include "Tracking/Event/Track.h"
18#include "Tracking/Sim/IndexSourceLink.h"
19
20// ACTS
21#include "Acts/Definitions/Algebra.hpp"
22#include "Acts/Definitions/TrackParametrization.hpp"
23#include "Acts/EventData/TrackContainer.hpp"
24#include "Acts/EventData/VectorMultiTrajectory.hpp"
25#include "Acts/EventData/VectorTrackContainer.hpp"
26#include "Acts/Geometry/GeometryIdentifier.hpp"
27#include "Acts/Geometry/TrackingGeometry.hpp"
28#include "Acts/MagneticField/ConstantBField.hpp"
29#include "Acts/Material/HomogeneousVolumeMaterial.hpp"
30#include "Acts/Propagator/EigenStepper.hpp"
31#include "Acts/Propagator/Navigator.hpp"
32#include "Acts/Propagator/Propagator.hpp"
33#include "Acts/Surfaces/PlaneSurface.hpp"
34#include "Acts/Surfaces/RectangleBounds.hpp"
35#include "Acts/Surfaces/Surface.hpp"
36#include "Acts/TrackFinding/CombinatorialKalmanFilter.hpp"
37#include "Acts/TrackFitting/GainMatrixUpdater.hpp"
38
39// C++
40#include <map>
41#include <memory>
42#include <unordered_map>
43#include <vector>
44
45namespace ecal {
46
59 public:
63 EcalTrackFinderProcessor(const std::string& name,
65
69 virtual ~EcalTrackFinderProcessor() = default;
70
74 void configure(framework::config::Parameters& parameters) override;
75
79 void onNewRun(const ldmx::RunHeader&) override;
80
84 void produce(framework::Event& event) override;
85
89 void onProcessEnd() override;
90
91 private:
95 std::vector<ldmx::Measurement> createMeasurements(
96 const std::vector<ldmx::EcalHit>& hits, std::vector<double>& energies);
97
101 void createEcalSurfaces();
102
106 std::vector<ldmx::Track> findSeeds(
107 const std::vector<ldmx::Measurement>& measurements);
108
113 std::tuple<Acts::Vector3, Acts::Vector3, double> fitStraightLine(
114 const std::vector<Acts::Vector3>& points);
115
119 std::unordered_multimap<Acts::GeometryIdentifier,
121 makeGeoIdSourceLinkMap(const std::vector<ldmx::Measurement>& measurements);
122
123 // Type aliases for ACTS objects
124 using EcalPropagator =
125 Acts::Propagator<Acts::EigenStepper<>, Acts::Navigator>;
126 using TrackContainer = Acts::TrackContainer<Acts::VectorTrackContainer,
127 Acts::VectorMultiTrajectory>;
128
129 // ACTS objects
130 std::unique_ptr<const EcalPropagator> propagator_;
131 std::unique_ptr<
132 const Acts::CombinatorialKalmanFilter<EcalPropagator, TrackContainer>>
133 ckf_;
134
135 // ECAL layer surfaces (layer ID -> surface) - used during geometry building
136 std::map<int, std::shared_ptr<Acts::Surface>> layer_surfaces_;
137
138 // Mapping from ECAL layer ID to the GeometryIdentifier assigned by the
139 // TrackingGeometryBuilder. These IDs are what the CKF Navigator sees when
140 // it reaches a surface, so source links must be keyed by these IDs.
141 std::map<int, Acts::GeometryIdentifier> layer_geo_ids_;
142
143 // Reference surface (ECAL front face)
144 std::shared_ptr<Acts::Surface> reference_surface_;
145
146 // ACTS tracking geometry for ECAL
147 std::shared_ptr<const Acts::TrackingGeometry> tracking_geometry_;
148
149 // Rotation matrix for surface orientation (u=Y, v=Z, normal=X in ACTS)
150 Acts::RotationMatrix3 surf_rotation_;
151
152 // Configuration parameters
153 std::string rec_coll_name_{"EcalRecHits"};
154 std::string rec_pass_name_{""};
155 std::string out_track_collection_{"EcalTracks"};
156 int min_hits_{3}; // Minimum hits per track
157 double max_chi2_{10.0}; // Outlier chi2 cut
158 double cell_resolution_{1.5}; // ECAL cell resolution [mm]
159 bool debug_{false}; // ACTS debug logging
160
161 // Seed finding parameters
162 double max_seed_rms_{10.0}; // Max RMS for seed fit [mm]
163 double min_momentum_{50.0}; // Min momentum estimate [MeV]
164 double max_momentum_{10000.0}; // Max momentum estimate [MeV]
165
166 // ROC cone energy collection
167 bool use_roc_energy_{true}; // Use 68% containment cone for track energy
168 std::string roc_file_name_; // Path to ROC containment radii CSV file
169 std::vector<std::vector<float>> roc_range_values_; // ROC data from file
170
171 // Geometry
172 const ldmx::EcalGeometry* geometry_{nullptr};
173
174 // Statistics
175 int nevents_{0};
176 int ntracks_{0};
177 int nseeds_{0};
178 double processing_time_{0.0};
179};
180
181} // namespace ecal
182
183#endif // ECAL_ECALTRACKFINDERPROCESSOR_H_
Class that translates raw positions of ECal module hits into cells in a hexagonal readout.
Class that defines an ECal detector ID with a cell number.
Base classes for all user event processing components to extend.
Uses ACTS framework to fit tracks through ECAL hits with zero B-field.
virtual ~EcalTrackFinderProcessor()=default
Destructor.
EcalTrackFinderProcessor(const std::string &name, framework::Process &process)
Constructor.
void onNewRun(const ldmx::RunHeader &) override
Initialize ACTS tracking objects once the detector geometry is known.
std::vector< ldmx::Measurement > createMeasurements(const std::vector< ldmx::EcalHit > &hits, std::vector< double > &energies)
Create ACTS measurement objects from ECAL hits.
std::unordered_multimap< Acts::GeometryIdentifier, acts_examples::IndexSourceLink > makeGeoIdSourceLinkMap(const std::vector< ldmx::Measurement > &measurements)
Create geometry ID to source link map for CKF.
std::tuple< Acts::Vector3, Acts::Vector3, double > fitStraightLine(const std::vector< Acts::Vector3 > &points)
Fit straight line through 3D points Returns: (position, direction, RMS residual)
void produce(framework::Event &event) override
Process event to find ECAL tracks.
void configure(framework::config::Parameters &parameters) override
Configure the processor.
std::vector< ldmx::Track > findSeeds(const std::vector< ldmx::Measurement > &measurements)
Find seed tracks via straight-line fitting.
void createEcalSurfaces()
Create unbounded plane surfaces at each ECAL layer.
void onProcessEnd() override
Print statistics.
Implements an event buffer system for storing event data.
Definition Event.h:42
Class which represents the process under execution.
Definition Process.h:37
Base class for a module which produces a data product.
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
Translation between real-space positions and cell IDs within the ECal.
Run-specific configuration and data stored in its own output TTree alongside the event TTree in the o...
Definition RunHeader.h:57