8std::vector<float>
trackProp(
const ldmx::Tracks& tracks,
9 ldmx::TrackStateType ts_type,
10 const std::string& ts_title) {
12 std::vector<float> new_track_states;
15 if (tracks.empty())
return new_track_states;
18 for (
auto& track : tracks) {
20 auto trk_ts = track.getTrackState(ts_type);
22 if (!trk_ts.has_value())
continue;
26 if (ecal_track_state.pos_.size() < 3 || ecal_track_state.mom_.size() < 3)
30 new_track_states.push_back(
static_cast<float>(ecal_track_state.pos_[0]));
31 new_track_states.push_back(
static_cast<float>(ecal_track_state.pos_[1]));
32 new_track_states.push_back(
static_cast<float>(ecal_track_state.pos_[2]));
33 new_track_states.push_back(
static_cast<float>(ecal_track_state.mom_[0]));
34 new_track_states.push_back(
static_cast<float>(ecal_track_state.mom_[1]));
35 new_track_states.push_back(
static_cast<float>(ecal_track_state.mom_[2]));
43 return new_track_states;
48std::vector<std::vector<float>>
pTTrackProp(
const ldmx::Tracks& tracks,
51 std::vector<std::pair<float, std::vector<float>>> new_track_states;
54 if (tracks.empty())
return {};
57 for (
auto& track : tracks) {
59 std::vector<float> track_state_vars;
60 track_state_vars.reserve(6);
62 auto trk_ts = track.getTrackState(ldmx::TrackStateType::AtECAL);
64 if (!trk_ts.has_value())
continue;
68 if (ecal_track_state.pos_.size() < 3 || ecal_track_state.mom_.size() < 3)
72 float transverse_momentum =
73 sqrt((ecal_track_state.mom_[0] * ecal_track_state.mom_[0]) +
74 (ecal_track_state.mom_[1] * ecal_track_state.mom_[1]));
77 track_state_vars.push_back(ecal_track_state.pos_[0]);
78 track_state_vars.push_back(ecal_track_state.pos_[1]);
79 track_state_vars.push_back(ecal_track_state.pos_[2]);
80 track_state_vars.push_back(ecal_track_state.mom_[0]);
81 track_state_vars.push_back(ecal_track_state.mom_[1]);
82 track_state_vars.push_back(ecal_track_state.mom_[2]);
85 new_track_states.emplace_back(transverse_momentum,
86 std::move(track_state_vars));
90 std::sort(new_track_states.begin(), new_track_states.end(),
91 [](
const auto& a,
const auto& b) {
92 return a.first > b.first;
94 if (new_track_states.size() > ele_count) new_track_states.resize(ele_count);
98 std::vector<std::vector<float>> max_p_t_track_states;
99 max_p_t_track_states.reserve(new_track_states.size());
100 std::transform(std::make_move_iterator(new_track_states.begin()),
101 std::make_move_iterator(new_track_states.end()),
102 std::back_inserter(max_p_t_track_states),
103 [](
auto&& ts) { return std::move(ts.second); });
105 return max_p_t_track_states;
110std::vector<std::vector<float>>
momTrackProp(
const ldmx::Tracks& tracks,
113 std::vector<std::pair<float, std::vector<float>>> new_track_states;
116 if (tracks.empty())
return {};
119 for (
auto& track : tracks) {
121 std::vector<float> track_state_vars;
122 track_state_vars.reserve(6);
124 auto trk_ts = track.getTrackState(ldmx::TrackStateType::AtECAL);
126 if (!trk_ts.has_value())
continue;
130 if (ecal_track_state.pos_.size() < 3 || ecal_track_state.mom_.size() < 3)
133 float total_momentum =
134 std::sqrt(ecal_track_state.mom_[0] * ecal_track_state.mom_[0] +
135 ecal_track_state.mom_[1] * ecal_track_state.mom_[1] +
136 ecal_track_state.mom_[2] * ecal_track_state.mom_[2]);
139 track_state_vars.push_back(ecal_track_state.pos_[0]);
140 track_state_vars.push_back(ecal_track_state.pos_[1]);
141 track_state_vars.push_back(ecal_track_state.pos_[2]);
142 track_state_vars.push_back(ecal_track_state.mom_[0]);
143 track_state_vars.push_back(ecal_track_state.mom_[1]);
144 track_state_vars.push_back(ecal_track_state.mom_[2]);
147 new_track_states.emplace_back(total_momentum, std::move(track_state_vars));
151 std::sort(new_track_states.begin(), new_track_states.end(),
152 [](
const auto& a,
const auto& b) {
153 return a.first > b.first;
155 if (new_track_states.size() > ele_count) new_track_states.resize(ele_count);
159 std::vector<std::vector<float>> max_p_track_states;
160 max_p_track_states.reserve(new_track_states.size());
161 std::transform(std::make_move_iterator(new_track_states.begin()),
162 std::make_move_iterator(new_track_states.end()),
163 std::back_inserter(max_p_track_states),
164 [](
auto&& ts) { return std::move(ts.second); });
166 return max_p_track_states;
172 ROOT::Math::XYZVector w1, ROOT::Math::XYZVector w2) {
173 ROOT::Math::XYZVector e1 = v1 - v2;
174 ROOT::Math::XYZVector e2 = w1 - w2;
175 ROOT::Math::XYZVector crs = e1.Cross(e2);
180 return std::abs(crs.Dot(v1 - w1) / crs.R());
std::vector< float > trackProp(const ldmx::Tracks &tracks, ldmx::TrackStateType ts_type, const std::string &ts_title)
Return a vector of parameters for a propagated recoil track.
float distPtToLine(ROOT::Math::XYZVector h1, ROOT::Math::XYZVector p1, ROOT::Math::XYZVector p2)
Return the minimum distance between the point h1 and the line passing through points p1 and p2.
float distTwoLines(ROOT::Math::XYZVector v1, ROOT::Math::XYZVector v2, ROOT::Math::XYZVector w1, ROOT::Math::XYZVector w2)
Returns the distance between the lines v and w, with v defined to pass through the points (v1,...