5std::vector<float>
trackProp(
const ldmx::Tracks& tracks,
6 ldmx::TrackStateType ts_type,
7 const std::string& ts_title) {
9 std::vector<float> new_track_states;
12 if (tracks.empty())
return new_track_states;
15 for (
auto& track : tracks) {
17 auto trk_ts = track.getTrackState(ts_type);
19 if (!trk_ts.has_value())
continue;
23 if (ecal_track_state.pos_.size() < 3 || ecal_track_state.mom_.size() < 3)
27 new_track_states.push_back(
static_cast<float>(ecal_track_state.pos_[0]));
28 new_track_states.push_back(
static_cast<float>(ecal_track_state.pos_[1]));
29 new_track_states.push_back(
static_cast<float>(ecal_track_state.pos_[2]));
30 new_track_states.push_back(
static_cast<float>(ecal_track_state.mom_[0]));
31 new_track_states.push_back(
static_cast<float>(ecal_track_state.mom_[1]));
32 new_track_states.push_back(
static_cast<float>(ecal_track_state.mom_[2]));
40 return new_track_states;
45std::vector<std::vector<float>>
pTTrackProp(
const ldmx::Tracks& tracks,
48 std::vector<std::pair<float, std::vector<float>>> new_track_states;
51 if (tracks.empty())
return {};
54 for (
auto& track : tracks) {
56 std::vector<float> track_state_vars;
57 track_state_vars.reserve(6);
59 auto trk_ts = track.getTrackState(ldmx::TrackStateType::AtECAL);
61 if (!trk_ts.has_value())
continue;
65 if (ecal_track_state.pos_.size() < 3 || ecal_track_state.mom_.size() < 3)
69 float transverse_momentum =
70 sqrt((ecal_track_state.mom_[0] * ecal_track_state.mom_[0]) +
71 (ecal_track_state.mom_[1] * ecal_track_state.mom_[1]));
74 track_state_vars.push_back(ecal_track_state.pos_[0]);
75 track_state_vars.push_back(ecal_track_state.pos_[1]);
76 track_state_vars.push_back(ecal_track_state.pos_[2]);
77 track_state_vars.push_back(ecal_track_state.mom_[0]);
78 track_state_vars.push_back(ecal_track_state.mom_[1]);
79 track_state_vars.push_back(ecal_track_state.mom_[2]);
82 new_track_states.emplace_back(transverse_momentum,
83 std::move(track_state_vars));
87 std::sort(new_track_states.begin(), new_track_states.end(),
88 [](
const auto& a,
const auto& b) {
89 return a.first > b.first;
91 if (new_track_states.size() > ele_count) new_track_states.resize(ele_count);
95 std::vector<std::vector<float>> max_pT_track_states;
96 max_pT_track_states.reserve(new_track_states.size());
97 std::transform(std::make_move_iterator(new_track_states.begin()),
98 std::make_move_iterator(new_track_states.end()),
99 std::back_inserter(max_pT_track_states),
100 [](
auto&& ts) { return std::move(ts.second); });
102 return max_pT_track_states;
107std::vector<std::vector<float>>
momTrackProp(
const ldmx::Tracks& tracks,
110 std::vector<std::pair<float, std::vector<float>>> new_track_states;
113 if (tracks.empty())
return {};
116 for (
auto& track : tracks) {
118 std::vector<float> track_state_vars;
119 track_state_vars.reserve(6);
121 auto trk_ts = track.getTrackState(ldmx::TrackStateType::AtECAL);
123 if (!trk_ts.has_value())
continue;
127 if (ecal_track_state.pos_.size() < 3 || ecal_track_state.mom_.size() < 3)
130 float total_momentum =
131 std::sqrt(ecal_track_state.mom_[0] * ecal_track_state.mom_[0] +
132 ecal_track_state.mom_[1] * ecal_track_state.mom_[1] +
133 ecal_track_state.mom_[2] * ecal_track_state.mom_[2]);
136 track_state_vars.push_back(ecal_track_state.pos_[0]);
137 track_state_vars.push_back(ecal_track_state.pos_[1]);
138 track_state_vars.push_back(ecal_track_state.pos_[2]);
139 track_state_vars.push_back(ecal_track_state.mom_[0]);
140 track_state_vars.push_back(ecal_track_state.mom_[1]);
141 track_state_vars.push_back(ecal_track_state.mom_[2]);
144 new_track_states.emplace_back(total_momentum, std::move(track_state_vars));
148 std::sort(new_track_states.begin(), new_track_states.end(),
149 [](
const auto& a,
const auto& b) {
150 return a.first > b.first;
152 if (new_track_states.size() > ele_count) new_track_states.resize(ele_count);
156 std::vector<std::vector<float>> max_p_track_states;
157 max_p_track_states.reserve(new_track_states.size());
158 std::transform(std::make_move_iterator(new_track_states.begin()),
159 std::make_move_iterator(new_track_states.end()),
160 std::back_inserter(max_p_track_states),
161 [](
auto&& ts) { return std::move(ts.second); });
163 return max_p_track_states;
169 ROOT::Math::XYZVector w1, ROOT::Math::XYZVector w2) {
170 ROOT::Math::XYZVector e1 = v1 - v2;
171 ROOT::Math::XYZVector e2 = w1 - w2;
172 ROOT::Math::XYZVector crs = e1.Cross(e2);
177 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,...