16#include <fmt/format.h>
20#include <unordered_map>
26using PadRemappingTable = std::unordered_map<int, int>;
27using PadRemappingTableWithLimits = std::pair<PadRemappingTable, std::pair<int, int>>;
28using PadRemappingTablesForDE = std::vector<PadRemappingTableWithLimits>;
29using PadRemappingTables = std::unordered_map<int, PadRemappingTablesForDE>;
32bool updateDigitMapping(
o2::mch::Digit& digit,
const PadRemappingTables& padsRemapping)
36 auto padsRemappingForDE = padsRemapping.find(deId);
37 if (padsRemappingForDE == padsRemapping.end()) {
43 for (
auto& padsRemappingForDS : padsRemappingForDE->second) {
44 if (padId < padsRemappingForDS.second.first || padId > padsRemappingForDS.second.second) {
48 auto padIDRemapped = padsRemappingForDS.first.find(digit.
getPadID());
49 if (padIDRemapped == padsRemappingForDS.first.end()) {
54 digit.
setPadID(padIDRemapped->second);
63void initST1PadsRemappingTable(PadRemappingTables& fullTable)
65 std::array<int, 8> deToRemap{100, 101, 102, 103, 200, 201, 202, 203};
66 std::array<int, 7> dsToRemap{1, 27, 53, 79, 105, 131, 157};
68 std::vector<int> newToOld(64);
134 for (
auto deId : deToRemap) {
137 fullTable[deId] = PadRemappingTablesForDE();
139 auto& tableForDE = fullTable[deId];
142 for (
auto dsId : dsToRemap) {
144 auto& tableForDSWithLimits = tableForDE.emplace_back();
145 auto& tableForDS = tableForDSWithLimits.first;
147 int padIdMin = std::numeric_limits<int>::max();
149 for (
int channel = 0; channel < 64; channel++) {
152 int padId =
segment.findPadByFEE(dsId, channel);
155 int channelInOldMapping = newToOld[channel];
157 int padIdRemapped =
segment.findPadByFEE(dsId, channelInOldMapping);
159 tableForDS[padId] = padIdRemapped;
161 padIdMin = std::min(padIdMin, padId);
162 padIdMax = std::max(padIdMax, padId);
165 tableForDSWithLimits.second.first = padIdMin;
166 tableForDSWithLimits.second.second = padIdMax;
173 static PadRemappingTables padsRemapping;
175 constexpr int lastRunToBeFixed = 560402;
177 if (runNumber > lastRunToBeFixed) {
182 if (padsRemapping.empty()) {
183 initST1PadsRemappingTable(padsRemapping);
187 updateDigitMapping(digit, padsRemapping);
194void initST2PadsRemappingTable(PadRemappingTables& fullTable)
197 std::array<int, 8> deToRemap{300, 301, 302, 303, 400, 401, 402, 403};
198 std::array<int, 5> dsToRemap{99, 100, 101, 102, 103};
200 for (
auto deId : deToRemap) {
203 fullTable[deId] = PadRemappingTablesForDE();
205 auto& tableForDE = fullTable[deId];
208 for (
auto dsId : dsToRemap) {
210 auto& tableForDSWithLimits = tableForDE.emplace_back();
211 auto& tableForDS = tableForDSWithLimits.first;
216 int channelForPadIdMin = -1;
217 for (
int channel = 0; channel < 64; channel++) {
218 auto padId =
segment.findPadByFEE(dsId,
int(channel));
222 throw std::out_of_range(fmt::format(
"Unknown padId for DE{} DS{} channel {}", deId, dsId, channel));
224 if (padIdMin < 0 || padId < padIdMin) {
226 channelForPadIdMin = channel;
232 for (
int channel = 0; channel < 64; channel++) {
233 auto padId =
segment.findPadByFEE(dsId,
int(channel));
234 if (padId < padIdMin) {
240 padIdMax = std::max(padIdMax, padId);
242 int padIdInDS = padId - padIdMin;
243 int padColumn = padIdInDS / 16;
244 int padRow = padIdInDS % 16;
246 int padIdRemapped = -1;
251 padIdRemapped = padId + 16 * 3;
255 padIdRemapped = padId + 16;
259 padIdRemapped = padId - 16;
263 padIdRemapped = padId - 16 * 3;
268 tableForDS[padId] = padIdRemapped;
271 tableForDSWithLimits.second.first = padIdMin;
272 tableForDSWithLimits.second.second = padIdMax;
280 static PadRemappingTables padsRemapping;
282 constexpr int lastRunToBeFixed = 560402;
284 if (runNumber > lastRunToBeFixed) {
289 if (padsRemapping.empty()) {
290 initST2PadsRemappingTable(padsRemapping);
294 updateDigitMapping(digit, padsRemapping);
308 if (modifierST1 || modifierST2) {
309 return [modifierST1, modifierST2](
Digit& digit) {
312 if (modifierST1 && detID >= 100 && detID < 300) {
315 if (modifierST2 && detID >= 300 && detID < 500) {
MCH digit implementation.
A Segmentation lets you find pads of a detection element and then inspect those pads.
O2MCHMAPPINGIMPL3_EXPORT const Segmentation & segmentation(int detElemId)
std::function< void(Digit &)> DigitModifier
DigitModifier createDigitModifier(int runNumber, bool updateST1, bool updateST2)