LDMX Software
MeasurementCalibrator.h
1#ifndef LDMXMEASUREMENTCALIBRATOR_H_
2#define LDMXMEASUREMENTCALIBRATOR_H_
3
4#include <vector>
5
6#include "Acts/Definitions/Algebra.hpp"
7#include "Acts/EventData/MultiTrajectory.hpp"
8#include "Acts/EventData/SourceLink.hpp"
9#include "Acts/EventData/VectorMultiTrajectory.hpp"
10#include "Acts/Utilities/CalibrationContext.hpp"
11#include "Tracking/Event/Measurement.h"
12#include "Tracking/Sim/IndexSourceLink.h"
13#include "Tracking/Sim/LdmxSpacePoint.h"
14
37
38namespace tracking {
39namespace sim {
40
42 public:
45
46 // The calibrator needs to access the sim hit container
48 const std::vector<ldmx::Measurement>& measurements) {
49 m_measurements_ = &measurements;
50 }
51
58 template <typename traj_t>
59 void calibrate(const Acts::GeometryContext& /*gctx*/,
60 const Acts::CalibrationContext& /*cctx*/,
61 const Acts::SourceLink& genericSourceLink /*sourceLink*/,
62 typename traj_t::TrackStateProxy trackState) const {
64 genericSourceLink.get<acts_examples::IndexSourceLink>()};
65 assert(m_measurements_ and
66 "Undefined measurement container in LdmxMeasurementCalibrator");
67 assert((source_link.index() < m_measurements_->size()) and
68 "Source link index is outside the container bounds in "
69 "LdmxMeasurementCalibrator");
70
71 auto meas = m_measurements_->at(source_link.index());
72 Acts::Vector2 local_pos{meas.getLocalPosition()[0],
73 meas.getLocalPosition()[1]};
74 trackState.allocateCalibrated(2);
75 auto ts_cal{trackState.template calibrated<2>()};
76 auto ts_cal_cov{trackState.template calibratedCovariance<2>()};
77 ts_cal.setZero();
78 ts_cal.template head<2>() = local_pos;
79 Acts::SquareMatrix2 local_cov;
80 local_cov.setZero();
81 local_cov(0, 0) = meas.getLocalCovariance()[0];
82 local_cov(1, 1) = meas.getLocalCovariance()[1];
83 ts_cal_cov.setZero();
84 // make tsCalCov 2x2 block the local_cov we just set
85 ts_cal_cov.block(0, 0, 2, 2) = local_cov;
86
87 Acts::ActsMatrix<2, 6> projector;
88 projector.setZero();
89 projector(0, 0) = 1.;
90 projector(1, 1) = 1.;
91
92 trackState.setProjector(projector);
93 trackState.setUncalibratedSourceLink(genericSourceLink);
94 }
95
102 template <typename traj_t>
103 void calibrate1d(const Acts::GeometryContext& /*gctx*/,
104 const Acts::CalibrationContext& /*cctx*/,
105 const Acts::SourceLink& genericSourceLink /*sourceLink*/,
106 typename traj_t::TrackStateProxy trackState) const {
108 genericSourceLink.get<acts_examples::IndexSourceLink>()};
109
110 assert(m_measurements_ and
111 "Undefined measurement container in LdmxMeasurementCalibrator");
112 assert((source_link.index() < m_measurements_->size()) and
113 "Source link index is outside the container bounds in "
114 "LdmxMeasurementCalibrator");
115
116 auto meas = m_measurements_->at(source_link.index());
117
118 trackState.allocateCalibrated(1);
119 auto ts_cal{trackState.template calibrated<1>()};
120 auto ts_cal_cov{trackState.template calibratedCovariance<1>()};
121
122 ts_cal.setZero();
123 ts_cal(0) = (meas.getLocalPosition())[0];
124 ts_cal_cov.setZero();
125 ts_cal_cov(0, 0) = (meas.getLocalCovariance())[0];
126
127 Acts::ActsMatrix<2, 6> projector;
128 projector.setZero();
129 projector(0, 0) = 1.;
130 projector(1, 1) = 1.;
131 trackState.setProjector(projector.row(0));
132 trackState.setUncalibratedSourceLink(genericSourceLink);
133 }
134
135 // Function to test the measurement calibrator
136 // It takes an user defined source link and returns the information of the
137 // linked measurement
138 void test(const Acts::GeometryContext& /*gctx*/,
139 const acts_examples::IndexSourceLink& sourceLink) const {
140 auto meas = m_measurements_->at(sourceLink.index());
141
142 Acts::Vector3 global_pos{meas.getGlobalPosition()[0],
143 meas.getGlobalPosition()[1],
144 meas.getGlobalPosition()[2]};
145 std::cout << "Measurement global_position::\n" << global_pos << std::endl;
146
147 Acts::Vector2 local_pos{meas.getLocalPosition()[0],
148 meas.getLocalPosition()[1]};
149 std::cout << "Measurement local_position::\n" << local_pos << std::endl;
150 }
151
152 private:
153 // use pointer so the calibrator is copyable and default constructible.
154 const std::vector<ldmx::Measurement>* m_measurements_ = nullptr;
155};
156
157} // namespace sim
158} // namespace tracking
159
160#endif
void calibrate1d(const Acts::GeometryContext &, const Acts::CalibrationContext &, const Acts::SourceLink &genericSourceLink, typename traj_t::TrackStateProxy trackState) const
Find the measurement corresponding to the source link.
void calibrate(const Acts::GeometryContext &, const Acts::CalibrationContext &, const Acts::SourceLink &genericSourceLink, typename traj_t::TrackStateProxy trackState) const
Find the measurement corresponding to the source link.
LdmxMeasurementCalibrator()=default
Construct an invalid calibrator. Required to allow copying.
The measurement calibrator can be a function or a class/struct able to retrieve the sim hits containe...