File indexing completed on 2026-07-26 08:22:18
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "read_cells.hpp"
0010
0011 #include "traccc/io/csv/make_cell_reader.hpp"
0012 #include "traccc/utils/logging.hpp"
0013
0014
0015 #include <algorithm>
0016 #include <cassert>
0017 #include <iostream>
0018 #include <map>
0019 #include <set>
0020 #include <utility>
0021 #include <vector>
0022
0023 namespace {
0024
0025
0026
0027 struct cell_order {
0028 bool operator()(const traccc::io::csv::cell& lhs,
0029 const traccc::io::csv::cell& rhs) const {
0030 if (lhs.channel1 != rhs.channel1) {
0031 return (lhs.channel1 < rhs.channel1);
0032 } else {
0033 return (lhs.channel0 < rhs.channel0);
0034 }
0035 }
0036 };
0037
0038 std::map<std::uint64_t, std::vector<traccc::io::csv::cell> >
0039 read_deduplicated_cells(std::string_view filename,
0040 std::unique_ptr<const traccc::Logger> ilogger) {
0041 TRACCC_LOCAL_LOGGER(std::move(ilogger));
0042
0043
0044 std::map<std::uint64_t, std::map<traccc::io::csv::cell, float, ::cell_order> >
0045 cellMap;
0046
0047
0048 auto reader = traccc::io::csv::make_cell_reader(filename);
0049
0050
0051 traccc::io::csv::cell iocell;
0052 unsigned int nduplicates = 0;
0053 while (reader.read(iocell)) {
0054
0055
0056 auto ret = cellMap[iocell.geometry_id].insert({iocell, iocell.value});
0057 if (ret.second == false) {
0058 cellMap[iocell.geometry_id].at(iocell) += iocell.value;
0059 ++nduplicates;
0060 }
0061 }
0062 if (nduplicates > 0) {
0063 TRACCC_WARNING(nduplicates << " duplicate cells found in " << filename);
0064 }
0065
0066
0067 std::map<std::uint64_t, std::vector<traccc::io::csv::cell> > result;
0068 for (const auto& [geometry_id, cells] : cellMap) {
0069 for (const auto& [cell, value] : cells) {
0070 traccc::io::csv::cell summed_cell{cell};
0071 summed_cell.value = value;
0072 result[geometry_id].push_back(summed_cell);
0073 }
0074 }
0075
0076
0077 return result;
0078 }
0079
0080 std::map<std::uint64_t, std::vector<traccc::io::csv::cell> > read_all_cells(
0081 std::string_view filename) {
0082
0083 std::map<std::uint64_t, std::vector<traccc::io::csv::cell> > result;
0084
0085
0086 auto reader = traccc::io::csv::make_cell_reader(filename);
0087
0088
0089 traccc::io::csv::cell iocell;
0090 while (reader.read(iocell)) {
0091
0092
0093 result[iocell.geometry_id].push_back(iocell);
0094 }
0095
0096
0097 for (auto& [_, cells] : result) {
0098 std::sort(cells.begin(), cells.end(), ::cell_order());
0099 }
0100
0101
0102 return result;
0103 }
0104
0105 }
0106
0107 namespace traccc::io::csv {
0108
0109 void read_cells(edm::silicon_cell_collection::host& cells,
0110 std::string_view filename,
0111 std::unique_ptr<const Logger> ilogger,
0112 const detector_conditions_description::host* det_cond,
0113 bool deduplicate, bool use_acts_geometry_id) {
0114
0115 cells.resize(0u);
0116
0117
0118 auto cellsMap =
0119 (deduplicate ? read_deduplicated_cells(filename, ilogger->clone())
0120 : read_all_cells(filename));
0121
0122
0123
0124 std::map<geometry_id, unsigned int> geomIdMap;
0125 if (det_cond) {
0126 if (use_acts_geometry_id) {
0127 for (unsigned int i = 0; i < det_cond->acts_geometry_id().size(); ++i) {
0128 geomIdMap[det_cond->acts_geometry_id()[i]] = i;
0129 }
0130 } else {
0131 for (unsigned int i = 0; i < det_cond->geometry_id().size(); ++i) {
0132 geomIdMap[det_cond->geometry_id()[i].value()] = i;
0133 }
0134 }
0135 }
0136
0137
0138 for (const auto& [geometry_id, cellz] : cellsMap) {
0139
0140
0141 unsigned int ddIndex = 0;
0142
0143 if (det_cond) {
0144 auto it = geomIdMap.find(geometry_id);
0145 if (it == geomIdMap.end()) {
0146 throw std::runtime_error("Could not find geometry ID (" +
0147 std::to_string(geometry_id) +
0148 ") in the detector description");
0149 }
0150 ddIndex = it->second;
0151 }
0152
0153
0154 for (const csv::cell& cell : cellz) {
0155 cells.push_back(
0156 {cell.channel0, cell.channel1, cell.value, cell.timestamp, ddIndex});
0157 }
0158 }
0159 }
0160
0161 }