7std::vector<float>
trackProp(
const ldmx::Tracks& tracks,
8 ldmx::TrackStateType ts_type,
9 const std::string& ts_title) {
11 std::vector<float> new_track_states;
14 if (tracks.empty())
return new_track_states;
17 for (
auto& track : tracks) {
19 auto trk_ts = track.getTrackState(ts_type);
21 if (!trk_ts.has_value())
continue;
25 if (ecal_track_state.pos_.size() < 3 || ecal_track_state.mom_.size() < 3)
29 new_track_states.push_back(
static_cast<float>(ecal_track_state.pos_[0]));
30 new_track_states.push_back(
static_cast<float>(ecal_track_state.pos_[1]));
31 new_track_states.push_back(
static_cast<float>(ecal_track_state.pos_[2]));
32 new_track_states.push_back(
static_cast<float>(ecal_track_state.mom_[0]));
33 new_track_states.push_back(
static_cast<float>(ecal_track_state.mom_[1]));
34 new_track_states.push_back(
static_cast<float>(ecal_track_state.mom_[2]));
42 return new_track_states;
47std::vector<std::vector<float>>
pTTrackProp(
const ldmx::Tracks& tracks,
50 std::vector<std::pair<float, std::vector<float>>> new_track_states;
53 if (tracks.empty())
return {};
56 for (
auto& track : tracks) {
58 std::vector<float> track_state_vars;
59 track_state_vars.reserve(6);
61 auto trk_ts = track.getTrackState(ldmx::TrackStateType::AtECAL);
63 if (!trk_ts.has_value())
continue;
67 if (ecal_track_state.pos_.size() < 3 || ecal_track_state.mom_.size() < 3)
71 float transverse_momentum =
72 sqrt((ecal_track_state.mom_[0] * ecal_track_state.mom_[0]) +
73 (ecal_track_state.mom_[1] * ecal_track_state.mom_[1]));
76 track_state_vars.push_back(ecal_track_state.pos_[0]);
77 track_state_vars.push_back(ecal_track_state.pos_[1]);
78 track_state_vars.push_back(ecal_track_state.pos_[2]);
79 track_state_vars.push_back(ecal_track_state.mom_[0]);
80 track_state_vars.push_back(ecal_track_state.mom_[1]);
81 track_state_vars.push_back(ecal_track_state.mom_[2]);
84 new_track_states.emplace_back(transverse_momentum,
85 std::move(track_state_vars));
89 std::sort(new_track_states.begin(), new_track_states.end(),
90 [](
const auto& a,
const auto& b) {
91 return a.first > b.first;
93 if (new_track_states.size() > ele_count) new_track_states.resize(ele_count);
97 std::vector<std::vector<float>> max_p_t_track_states;
98 max_p_t_track_states.reserve(new_track_states.size());
99 std::transform(std::make_move_iterator(new_track_states.begin()),
100 std::make_move_iterator(new_track_states.end()),
101 std::back_inserter(max_p_t_track_states),
102 [](
auto&& ts) { return std::move(ts.second); });
104 return max_p_t_track_states;
109std::vector<std::vector<float>>
momTrackProp(
const ldmx::Tracks& tracks,
112 std::vector<std::pair<float, std::vector<float>>> new_track_states;
115 if (tracks.empty())
return {};
118 for (
auto& track : tracks) {
120 std::vector<float> track_state_vars;
121 track_state_vars.reserve(6);
123 auto trk_ts = track.getTrackState(ldmx::TrackStateType::AtECAL);
125 if (!trk_ts.has_value())
continue;
129 if (ecal_track_state.pos_.size() < 3 || ecal_track_state.mom_.size() < 3)
132 float total_momentum =
133 std::sqrt(ecal_track_state.mom_[0] * ecal_track_state.mom_[0] +
134 ecal_track_state.mom_[1] * ecal_track_state.mom_[1] +
135 ecal_track_state.mom_[2] * ecal_track_state.mom_[2]);
138 track_state_vars.push_back(ecal_track_state.pos_[0]);
139 track_state_vars.push_back(ecal_track_state.pos_[1]);
140 track_state_vars.push_back(ecal_track_state.pos_[2]);
141 track_state_vars.push_back(ecal_track_state.mom_[0]);
142 track_state_vars.push_back(ecal_track_state.mom_[1]);
143 track_state_vars.push_back(ecal_track_state.mom_[2]);
146 new_track_states.emplace_back(total_momentum, std::move(track_state_vars));
150 std::sort(new_track_states.begin(), new_track_states.end(),
151 [](
const auto& a,
const auto& b) {
152 return a.first > b.first;
154 if (new_track_states.size() > ele_count) new_track_states.resize(ele_count);
158 std::vector<std::vector<float>> max_p_track_states;
159 max_p_track_states.reserve(new_track_states.size());
160 std::transform(std::make_move_iterator(new_track_states.begin()),
161 std::make_move_iterator(new_track_states.end()),
162 std::back_inserter(max_p_track_states),
163 [](
auto&& ts) { return std::move(ts.second); });
165 return max_p_track_states;
171 ROOT::Math::XYZVector w1, ROOT::Math::XYZVector w2) {
172 ROOT::Math::XYZVector e1 = v1 - v2;
173 ROOT::Math::XYZVector e2 = w1 - w2;
174 ROOT::Math::XYZVector crs = e1.Cross(e2);
179 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,...