Project
Loading...
Searching...
No Matches
CrateMapper.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
16
17#include "MIDRaw/CrateMapper.h"
18
19#include <algorithm>
20#include <array>
21#include <exception>
22#include "fmt/format.h"
26#include "MIDRaw/GBTMapper.h"
27
28namespace o2
29{
30namespace mid
31{
33{
35 init();
36}
37
38void CrateMapper::init()
39{
41 // Crate 0
42 // link 0
43 mROToDEMap.emplace(raw::makeUniqueLocID(0, 0), detparams::makeUniqueFEEId(0, 0, 0));
44 mROToDEMap.emplace(raw::makeUniqueLocID(0, 1), detparams::makeUniqueFEEId(1, 0, 0));
45 mROToDEMap.emplace(raw::makeUniqueLocID(0, 2), detparams::makeUniqueFEEId(1, 0, 1));
46 mROToDEMap.emplace(raw::makeUniqueLocID(0, 3), detparams::makeUniqueFEEId(2, 0, 0));
47 mROToDEMap.emplace(raw::makeUniqueLocID(0, 4), detparams::makeUniqueFEEId(2, 0, 1));
48 mROToDEMap.emplace(raw::makeUniqueLocID(0, 5), detparams::makeUniqueFEEId(3, 0, 0));
49 mROToDEMap.emplace(raw::makeUniqueLocID(0, 6), detparams::makeUniqueFEEId(3, 0, 1));
50 mROToDEMap.emplace(raw::makeUniqueLocID(0, 7), detparams::makeUniqueFEEId(3, 0, 2));
51 // link 1
52 mROToDEMap.emplace(raw::makeUniqueLocID(0, 8), detparams::makeUniqueFEEId(5, 0, 1));
53 mROToDEMap.emplace(raw::makeUniqueLocID(0, 9), detparams::makeUniqueFEEId(5, 0, 2));
54 mROToDEMap.emplace(raw::makeUniqueLocID(0, 10), detparams::makeUniqueFEEId(5, 0, 3));
55 mROToDEMap.emplace(raw::makeUniqueLocID(0, 11), detparams::makeUniqueFEEId(6, 0, 0));
56 mROToDEMap.emplace(raw::makeUniqueLocID(0, 12), detparams::makeUniqueFEEId(6, 0, 1));
57 mROToDEMap.emplace(raw::makeUniqueLocID(0, 13), detparams::makeUniqueFEEId(7, 0, 0));
58 mROToDEMap.emplace(raw::makeUniqueLocID(0, 14), detparams::makeUniqueFEEId(7, 0, 1));
59 mROToDEMap.emplace(raw::makeUniqueLocID(0, 15), detparams::makeUniqueFEEId(8, 0, 0));
60
61 // Crate 1, 3
62 for (int icrate = 0; icrate < 2; ++icrate) {
63 uint8_t crateId = (icrate == 0) ? 1 : 3;
64 uint8_t columnId = (icrate == 0) ? 1 : 2;
65 // link 0
66 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 0), detparams::makeUniqueFEEId(0, columnId, 0));
67 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 1), detparams::makeUniqueFEEId(1, columnId, 0));
68 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 2), detparams::makeUniqueFEEId(1, columnId, 1));
69 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 3), detparams::makeUniqueFEEId(2, columnId, 0));
70 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 4), detparams::makeUniqueFEEId(2, columnId, 1));
71 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 5), detparams::makeUniqueFEEId(3, columnId, 0));
72 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 6), detparams::makeUniqueFEEId(3, columnId, 1));
73 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 7), detparams::makeUniqueFEEId(3, columnId, 2));
74
75 // link 1
76 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 8), detparams::makeUniqueFEEId(3, columnId, 3));
77 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 9), detparams::makeUniqueFEEId(4, columnId, 0));
78 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 10), detparams::makeUniqueFEEId(4, columnId, 1));
79 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 11), detparams::makeUniqueFEEId(4, columnId, 2));
80 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 12), detparams::makeUniqueFEEId(4, columnId, 3));
81 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 13), detparams::makeUniqueFEEId(5, columnId, 0));
82 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 14), detparams::makeUniqueFEEId(5, columnId, 1));
83 }
84
85 // Crate 2
86 // link 0
87 mROToDEMap.emplace(raw::makeUniqueLocID(2, 0), detparams::makeUniqueFEEId(5, 1, 2));
88 mROToDEMap.emplace(raw::makeUniqueLocID(2, 1), detparams::makeUniqueFEEId(5, 1, 3));
89 mROToDEMap.emplace(raw::makeUniqueLocID(2, 2), detparams::makeUniqueFEEId(6, 1, 0));
90 mROToDEMap.emplace(raw::makeUniqueLocID(2, 3), detparams::makeUniqueFEEId(6, 1, 1));
91 mROToDEMap.emplace(raw::makeUniqueLocID(2, 4), detparams::makeUniqueFEEId(7, 1, 0));
92 mROToDEMap.emplace(raw::makeUniqueLocID(2, 5), detparams::makeUniqueFEEId(7, 1, 1));
93 mROToDEMap.emplace(raw::makeUniqueLocID(2, 6), detparams::makeUniqueFEEId(8, 1, 0));
94 // link 1
95 mROToDEMap.emplace(raw::makeUniqueLocID(2, 8), detparams::makeUniqueFEEId(5, 2, 2));
96 mROToDEMap.emplace(raw::makeUniqueLocID(2, 9), detparams::makeUniqueFEEId(5, 2, 3));
97 mROToDEMap.emplace(raw::makeUniqueLocID(2, 10), detparams::makeUniqueFEEId(6, 2, 0));
98 mROToDEMap.emplace(raw::makeUniqueLocID(2, 11), detparams::makeUniqueFEEId(6, 2, 1));
99 mROToDEMap.emplace(raw::makeUniqueLocID(2, 12), detparams::makeUniqueFEEId(7, 2, 0));
100 mROToDEMap.emplace(raw::makeUniqueLocID(2, 13), detparams::makeUniqueFEEId(7, 2, 1));
101 mROToDEMap.emplace(raw::makeUniqueLocID(2, 14), detparams::makeUniqueFEEId(8, 2, 0));
102
103 // Crate 4, 5, 6
104 for (int icrate = 0; icrate < 3; ++icrate) {
105 uint16_t crateId = icrate + 4;
106 uint8_t columnId = icrate + 3;
107 // link 0
108 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 0), detparams::makeUniqueFEEId(0, columnId, 0));
109 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 1), detparams::makeUniqueFEEId(1, columnId, 0));
110 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 2), detparams::makeUniqueFEEId(1, columnId, 1));
111 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 3), detparams::makeUniqueFEEId(2, columnId, 0));
112 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 4), detparams::makeUniqueFEEId(2, columnId, 1));
113 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 5), detparams::makeUniqueFEEId(3, columnId, 0));
114 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 6), detparams::makeUniqueFEEId(3, columnId, 1));
115 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 7), detparams::makeUniqueFEEId(4, columnId, 0));
116 // link 1
117 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 8), detparams::makeUniqueFEEId(4, columnId, 1));
118 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 9), detparams::makeUniqueFEEId(5, columnId, 0));
119 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 10), detparams::makeUniqueFEEId(5, columnId, 1));
120 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 11), detparams::makeUniqueFEEId(6, columnId, 0));
121 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 12), detparams::makeUniqueFEEId(6, columnId, 1));
122 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 13), detparams::makeUniqueFEEId(7, columnId, 0));
123 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 14), detparams::makeUniqueFEEId(7, columnId, 1));
124 mROToDEMap.emplace(raw::makeUniqueLocID(crateId, 15), detparams::makeUniqueFEEId(8, columnId, 0));
125 }
126
127 // Crate 7
128 uint8_t rpcLineId = 0;
129 for (uint8_t iboard = 0; iboard < 9; ++iboard) {
130 mROToDEMap.emplace(raw::makeUniqueLocID(7, iboard), detparams::makeUniqueFEEId(rpcLineId++, 6, 0));
131 }
132
134 for (auto& item : mROToDEMap) {
135 mDEToROMap.emplace(item.second, item.first);
136 }
137
139 for (auto& item : mROToDEMap) {
140 bool hasDirectInputY = false;
141 auto lineId = detparams::getLineIdFromFEEId(item.second);
142 if (lineId == 0) { // First loc in the RPC
143 hasDirectInputY = true;
144 } else {
145 auto crateId = raw::getCrateId(item.first);
146 auto locId = raw::getLocId(item.first);
147 if ((crateId == 0 && locId == 8) ||
148 (crateId == 2 && (locId == 0 || locId == 8))) {
149 hasDirectInputY = true;
150 }
151 }
152 if (hasDirectInputY) {
153 mLocIdsWithDirectInputY.emplace(item.first);
154 }
155 }
156}
157
158uint8_t CrateMapper::deLocalBoardToRO(uint8_t deId, uint8_t columnId, uint8_t lineId) const
159{
160 auto item = mDEToROMap.find(detparams::makeUniqueFEEId(detparams::getRPCLine(deId), columnId, lineId));
161 if (item == mDEToROMap.end()) {
162 throw std::runtime_error(fmt::format("Non-existent deId: {:d} columnId: {:d} lineId: {:d}", deId, columnId, lineId));
163 }
164 return detparams::isRightSide(deId) ? item->second : item->second + (crateparams::sNCratesPerSide << 4);
165}
166
167uint16_t CrateMapper::roLocalBoardToDE(uint8_t uniqueLocId) const
168{
169 auto item = mROToDEMap.find(getROBoardIdRight(uniqueLocId));
170 if (item == mROToDEMap.end()) {
171 throw std::runtime_error(fmt::format("Non-existent crateId: {:d} boardId: {:d}", raw::getCrateId(uniqueLocId), raw::getLocId(uniqueLocId)));
172 }
173 return item->second;
174}
175
176std::vector<uint8_t> CrateMapper::getROBoardIds(uint16_t gbtUniqueId) const
177{
178 std::vector<uint8_t> roBoardIds;
179 std::array<uint8_t, 2> offsets{0, 0x80};
180 for (auto& item : mROToDEMap) {
181 // For simplicity, the map only contains one side
182 // So we loop on the two sides
183 for (auto& off : offsets) {
184 auto locId = item.first + off;
185 if (gbtUniqueId != 0xFFFF) {
186 if (!gbtmapper::isBoardInGBT(locId, gbtUniqueId)) {
187 continue;
188 }
189 }
190 roBoardIds.emplace_back(locId);
191 }
192 }
193 std::sort(roBoardIds.begin(), roBoardIds.end());
194 return roBoardIds;
195}
196
197} // namespace mid
198} // namespace o2
Mapper to convert the RO Ids to a format suitable for O2.
MID RO crate parameters.
Useful detector parameters for MID.
MID GBT mapping.
Structure to store the readout board information.
std::vector< uint8_t > getROBoardIds(uint16_t gbtUniqueId=0xFFFF) const
Returns the list of local board IDs (RO convention)
bool hasDirectInputY(uint8_t uniqueLocId) const
Checks if local board ID (RO convention) has direct input from FEE y strips.
Definition CrateMapper.h:49
uint8_t deLocalBoardToRO(uint8_t deId, uint8_t columnId, uint8_t lineId) const
Converts the LOC ID expressed in the offline convention into the readout convention.
uint16_t roLocalBoardToDE(uint8_t uniqueLocId) const
Converts the LOC ID expressed in readout convention into the LOC ID in MT11 right in the offline conv...
GLuint GLsizei const GLuint const GLintptr * offsets
Definition glcorearb.h:2595
uint16_t makeUniqueFEEId(int deId, int columnId, int lineId)
bool isRightSide(int deId)
int getLineIdFromFEEId(uint16_t uniqueFEEId)
bool isBoardInGBT(uint8_t uniqueLocId, uint16_t gbtUniqueId)
Definition GBTMapper.h:37
uint8_t getCrateId(uint8_t uniqueLocId)
Definition ROBoard.h:75
uint8_t makeUniqueLocID(uint8_t crateId, uint8_t locId)
Definition ROBoard.h:86
uint8_t getLocId(uint8_t uniqueLocId)
Definition ROBoard.h:80
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...