31 std::vector<TracccCell>& cells,
32 std::vector<TracccTrackParameters>& TracccTrackParams,
33 std::vector<LocalMeasurementInfoInTracks>& TracccMeasurementInfoInTracks
36 auto start_prep = std::chrono::high_resolution_clock::now();
37 int numCells = cells.size();
39 std::vector<int64_t> CellPositions;
42 for (
const auto& cell : cells)
44 CellPositions.push_back(cell.geometry_id);
45 CellPositions.push_back(cell.measurement_id);
46 CellPositions.push_back(cell.channel0);
47 CellPositions.push_back(cell.channel1);
55 std::string csv_filename =
"events/event" +
57 std::ofstream csv_file(csv_filename);
58 if (!csv_file.is_open()) {
60 return StatusCode::FAILURE;
62 csv_file <<
"geometry_id,measurement_id,channel0,channel1,timestamp,value\n";
63 for (
const auto& cell : cells) {
64 csv_file << cell.geometry_id <<
","
65 << cell.measurement_id <<
","
66 << cell.channel0 <<
","
67 << cell.channel1 <<
","
68 << cell.timestamp <<
","
69 << cell.value <<
"\n";
75 inputData[
"CELL_POSITIONS"] = std::make_pair(
76 std::vector<int64_t>{numCells, 4}, std::move(CellPositions));
77 inputData[
"CELL_PROPERTIES"] = std::make_pair(
81 outputData[
"TRK_PARAMS"] = std::make_pair(
82 std::vector<int64_t>{-1, 8}, std::vector<float>{});
83 outputData[
"MEASUREMENTS"] = std::make_pair(
84 std::vector<int64_t>{-1, 6}, std::vector<float>{});
85 outputData[
"COVARIANCES"] = std::make_pair(
86 std::vector<int64_t>{-1, 25}, std::vector<float>{});
87 outputData[
"GEOMETRY_IDS"] = std::make_pair(
88 std::vector<int64_t>{-1, 1}, std::vector<int64_t>{});
90 auto end_prep = std::chrono::high_resolution_clock::now();
91 std::chrono::duration<double, std::milli> prep_time = end_prep - start_prep;
92 ATH_MSG_INFO(
"Traccc Triton input preparation time: " << prep_time.count() <<
" ms");
94 auto start_inference = std::chrono::high_resolution_clock::now();
96 auto end_inference = std::chrono::high_resolution_clock::now();
97 std::chrono::duration<double, std::milli> inference_time = end_inference - start_inference;
98 ATH_MSG_INFO(
"Traccc Triton inference time: " << inference_time.count() <<
" ms");
100 auto start_parse = std::chrono::high_resolution_clock::now();
103 auto& trkParamsVec = std::get<std::vector<float>>(outputData[
"TRK_PARAMS"].second);
104 auto& measurementsVec = std::get<std::vector<float>>(outputData[
"MEASUREMENTS"].second);
105 auto& covariancesVec = std::get<std::vector<float>>(outputData[
"COVARIANCES"].second);
106 auto& outputGeometryIds = std::get<std::vector<int64_t>>(outputData[
"GEOMETRY_IDS"].second);
108 if (trkParamsVec.empty()) {
110 return StatusCode::SUCCESS;
113 TracccTrackParams.clear();
114 TracccMeasurementInfoInTracks.clear();
116 int numTrkFeatures = 8;
117 int numMeasurementFeatures = 6;
119 const size_t nMeasEntries = measurementsVec.size() / numMeasurementFeatures;
120 const size_t nCovEntries = covariancesVec.size() / 25;
127 for (
size_t geo_idx = 0; geo_idx < outputGeometryIds.size(); ++geo_idx)
130 if (outputGeometryIds.at(geo_idx) == 0)
132 TracccMeasurementInfoInTracks.push_back(measurement);
136 measurement.
phi.clear();
137 measurement.
theta.clear();
138 measurement.
qop.clear();
139 measurement.
time.clear();
144 params.chi2 = trkParamsVec.at(track * numTrkFeatures + 0);
145 params.ndf = trkParamsVec.at(track * numTrkFeatures + 1);
146 params.l0 = trkParamsVec.at(track * numTrkFeatures + 2);
147 params.l1 = trkParamsVec.at(track * numTrkFeatures + 3);
148 params.phi = trkParamsVec.at(track * numTrkFeatures + 4);
149 params.theta = trkParamsVec.at(track * numTrkFeatures + 5);
150 params.qop = trkParamsVec.at(track * numTrkFeatures + 6);
151 params.time = trkParamsVec.at(track * numTrkFeatures + 7);
153 TracccTrackParams.push_back(params);
159 if (meas_pos >= nMeasEntries || cov_pos >= nCovEntries) {
160 ATH_MSG_ERROR(
"Out-of-range while parsing outputs: meas_pos="
161 << meas_pos <<
"/" << nMeasEntries
162 <<
" cov_pos=" << cov_pos <<
"/" << nCovEntries
163 <<
" geo_idx=" << geo_idx);
167 measurement.
local_x.push_back(measurementsVec.at(meas_pos * numMeasurementFeatures + 0));
168 measurement.
local_y.push_back(measurementsVec.at(meas_pos * numMeasurementFeatures + 1));
169 measurement.
phi.push_back(measurementsVec.at(meas_pos * numMeasurementFeatures + 2));
170 measurement.
theta.push_back(measurementsVec.at(meas_pos * numMeasurementFeatures + 3));
171 measurement.
qop.push_back(measurementsVec.at(meas_pos * numMeasurementFeatures + 4));
172 measurement.
time.push_back(measurementsVec.at(meas_pos * numMeasurementFeatures + 5));
174 for (
size_t cov_idx = 0; cov_idx < 25; ++cov_idx)
176 measurement.
covariances.push_back(covariancesVec.at(cov_pos * 25 + cov_idx));
179 measurement.
athena_id.push_back(outputGeometryIds.at(geo_idx));
188 TracccMeasurementInfoInTracks.push_back(measurement);
191 params.chi2 = trkParamsVec.at(track * numTrkFeatures + 0);
192 params.ndf = trkParamsVec.at(track * numTrkFeatures + 1);
193 params.l0 = trkParamsVec.at(track * numTrkFeatures + 2);
194 params.l1 = trkParamsVec.at(track * numTrkFeatures + 3);
195 params.phi = trkParamsVec.at(track * numTrkFeatures + 4);
196 params.theta = trkParamsVec.at(track * numTrkFeatures + 5);
197 params.qop = trkParamsVec.at(track * numTrkFeatures + 6);
198 params.time = trkParamsVec.at(track * numTrkFeatures + 7);
199 TracccTrackParams.push_back(params);
202 ATH_MSG_INFO(
"Number of tracks found: " << TracccTrackParams.size());
204 if (TracccTrackParams.size() != TracccMeasurementInfoInTracks.size()) {
206 <<
" measurements=" << TracccMeasurementInfoInTracks.size());
209 int n_tracks_to_print = std::min(3, (
int)TracccTrackParams.size());
210 for (
int i = 0; i < n_tracks_to_print; ++i) {
212 <<
"chi2=" << TracccTrackParams[i].
chi2
213 <<
", ndf=" << TracccTrackParams[i].ndf
214 <<
", l0=" << TracccTrackParams[i].l0
215 <<
", l1=" << TracccTrackParams[i].l1
216 <<
", phi=" << TracccTrackParams[i].
phi
217 <<
", theta=" << TracccTrackParams[i].
theta
218 <<
", qop=" << TracccTrackParams[i].qop
219 <<
", time=" << TracccTrackParams[i].time);
221 if (i < (
int)TracccMeasurementInfoInTracks.size()) {
222 const auto& measurements = TracccMeasurementInfoInTracks[i];
223 for (
size_t j = 0; j < measurements.athena_id.size(); ++j) {
225 <<
"local_x=" << measurements.local_x[j]
226 <<
", local_y=" << measurements.local_y[j]
227 <<
", phi=" << measurements.phi[j]
228 <<
", theta=" << measurements.theta[j]
229 <<
", qop=" << measurements.qop[j]
230 <<
", time=" << measurements.time[j]
231 <<
", athena_id=" << measurements.athena_id[j]);
234 const size_t cov_per_meas = 25;
235 size_t cov_start = j * cov_per_meas;
236 if (measurements.covariances.size() >= cov_start + cov_per_meas) {
237 std::ostringstream oss;
238 oss <<
" Covariance matrix:";
239 for (
size_t r = 0;
r < 5; ++
r) {
241 for (
size_t c = 0; c < 5; ++c) {
242 oss << measurements.covariances[cov_start +
r * 5 + c] <<
" ";
254 auto end_parse = std::chrono::high_resolution_clock::now();
255 std::chrono::duration<double, std::milli> parse_time = end_parse - start_parse;
256 ATH_MSG_INFO(
"Traccc Triton output parsing time: " << parse_time.count() <<
" ms");
258 return StatusCode::SUCCESS;