7#ifndef ECAL_ECALTRACKFINDERPROCESSOR_H_
8#define ECAL_ECALTRACKFINDERPROCESSOR_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"
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"
42#include <unordered_map>
96 const std::vector<ldmx::EcalHit>& hits, std::vector<double>& energies);
107 const std::vector<ldmx::Measurement>& measurements);
114 const std::vector<Acts::Vector3>& points);
119 std::unordered_multimap<Acts::GeometryIdentifier,
124 using EcalPropagator =
125 Acts::Propagator<Acts::EigenStepper<>, Acts::Navigator>;
126 using TrackContainer = Acts::TrackContainer<Acts::VectorTrackContainer,
127 Acts::VectorMultiTrajectory>;
130 std::unique_ptr<const EcalPropagator> propagator_;
132 const Acts::CombinatorialKalmanFilter<EcalPropagator, TrackContainer>>
136 std::map<int, std::shared_ptr<Acts::Surface>> layer_surfaces_;
141 std::map<int, Acts::GeometryIdentifier> layer_geo_ids_;
144 std::shared_ptr<Acts::Surface> reference_surface_;
147 std::shared_ptr<const Acts::TrackingGeometry> tracking_geometry_;
150 Acts::RotationMatrix3 surf_rotation_;
153 std::string rec_coll_name_{
"EcalRecHits"};
154 std::string rec_pass_name_{
""};
155 std::string out_track_collection_{
"EcalTracks"};
157 double max_chi2_{10.0};
158 double cell_resolution_{1.5};
162 double max_seed_rms_{10.0};
163 double min_momentum_{50.0};
164 double max_momentum_{10000.0};
167 bool use_roc_energy_{
true};
168 std::string roc_file_name_;
169 std::vector<std::vector<float>> roc_range_values_;
178 double processing_time_{0.0};
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.
A source link that stores just an index_.
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 ¶meters) 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.
Class which represents the process under execution.
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.
Translation between real-space positions and cell IDs within the ECal.