11 #include <top/geometry/FrontEndMapper.h>
12 #include <framework/database/DBImportArray.h>
13 #include <framework/logging/LogSystem.h>
26 FrontEndMapper::FrontEndMapper()
28 for (
unsigned i = 0; i < c_numModules; i++) {
29 for (
unsigned k = 0; k < c_numColumns; k++) {
30 m_fromModule[i][k] = 0;
36 FrontEndMapper::~FrontEndMapper()
38 if (m_mappingDB)
delete m_mappingDB;
42 void FrontEndMapper::initialize(
const GearDir& frontEndMapping)
49 unordered_set<unsigned short> scrodIDs;
50 unordered_set<string> coppers;
51 unordered_set<int> modules;
55 for (
const GearDir& topModule : frontEndMapping.
getNodes(
"TOPModule")) {
57 int moduleCNumber = topModule.getInt(
"@CNumber");
58 int moduleID = topModule.getInt(
"moduleID");
59 if (moduleID == 0)
continue;
60 if (moduleID < 0 or moduleID > c_numModules) {
61 B2ERROR(
"TOP::FrontEndMapper: invalid moduleID in xml file"
62 <<
LogVar(
"moduleID", moduleID)
63 <<
LogVar(
"path", topModule.getPath()));
67 bool moduleMapped =
false;
70 int col = boardstack.getInt(
"@col");
71 if (col < 0 or col >= c_numColumns) {
72 B2ERROR(
"TOP::FrontEndMapper: invalid boardstack number in xml file"
73 <<
LogVar(
"moduleID", moduleID)
74 <<
LogVar(
"boardstack", col)
75 <<
LogVar(
"path", boardstack.getPath()));
78 if (!modules.insert(moduleID * c_numColumns + col).second) {
79 B2ERROR(
"TOP::FrontEndMapper: this boardstack is already mapped."
80 <<
LogVar(
"moduleID", moduleID)
81 <<
LogVar(
"boardstack", col)
82 <<
LogVar(
"path", boardstack.getPath()));
86 unsigned short scrodID = (
unsigned short) boardstack.getInt(
"SCRODid");
87 if (!scrodIDs.insert(scrodID).second) {
88 B2ERROR(
"TOP::FrontEndMapper: this SCROD ID is already used."
89 <<
LogVar(
"moduleID", moduleID)
90 <<
LogVar(
"boardstack", col)
91 <<
LogVar(
"scrod", scrodID)
92 <<
LogVar(
"path", boardstack.getPath() +
"/SCRODid"));
96 string finesseSlot = boardstack.getString(
"FinesseSlot");
98 if (finesseSlot ==
"A") {finesse = 0;}
99 else if (finesseSlot ==
"B") {finesse = 1;}
100 else if (finesseSlot ==
"C") {finesse = 2;}
101 else if (finesseSlot ==
"D") {finesse = 3;}
103 B2ERROR(
"TOP::FrontEndMapper: invalid slot (valid are A, B, C, D)."
104 <<
LogVar(
"FinesseSlot", finesseSlot)
105 <<
LogVar(
"path", boardstack.getPath() +
"/FinesseSlot"));
109 unsigned copperID = (unsigned) boardstack.getInt(
"COPPERid");
110 m_copperIDs.insert(copperID);
111 string copper = boardstack.getString(
"COPPERid") +
" " + finesseSlot;
112 if (!coppers.insert(copper).second) {
113 B2ERROR(
"TOP::FrontEndMapper: this COPPER ID is already used."
114 <<
LogVar(
"moduleID", moduleID)
115 <<
LogVar(
"boardstack", col)
116 <<
LogVar(
"copperID", copper)
117 <<
LogVar(
"path", boardstack.getPath() +
"/COPPERid"));
121 TOPFrontEndMap feemap(moduleID, moduleCNumber, col, scrodID, copperID, finesse,
123 m_mapping.push_back(feemap);
126 if (moduleMapped) numModules++;
131 for (
const auto& feemap : m_mapping) {
132 m_fromModule[feemap.getModuleID() - 1][feemap.getBoardstackNumber()] = &feemap;
133 m_fromScrod[feemap.getScrodID()] = &feemap;
134 m_fromCopper[feemap.getCopperID() * 4 + feemap.getFinesseSlot()] = &feemap;
138 B2INFO(
"TOP::FrontEndMapper: " << m_mapping.size() <<
" SCROD's mapped to "
139 << numModules <<
" TOP module(s)");
142 const auto& logSystem = LogSystem::Instance();
143 if (logSystem.isLevelEnabled(LogConfig::c_Debug, 100,
"top")) {
150 void FrontEndMapper::initialize()
153 if (m_mappingDB)
delete m_mappingDB;
156 if (!m_mappingDB->isValid()) {
162 m_mappingDB->addCallback(
this, &FrontEndMapper::update);
164 const auto& logSystem = LogSystem::Instance();
165 if (logSystem.isLevelEnabled(LogConfig::c_Debug, 100,
"top")) {
175 for (
const auto& map : m_mapping) {
182 void FrontEndMapper::clear()
187 m_fromCopper.clear();
188 for (
unsigned i = 0; i < c_numModules; i++) {
189 for (
unsigned k = 0; k < c_numColumns; k++) {
190 m_fromModule[i][k] = 0;
198 void FrontEndMapper::update()
201 if (!m_mappingDB->isValid())
return;
203 for (
const auto& feemap : *m_mappingDB) {
204 m_copperIDs.insert(feemap.getCopperID());
205 m_fromModule[feemap.getModuleID() - 1][feemap.getBoardstackNumber()] = &feemap;
206 m_fromScrod[feemap.getScrodID()] = &feemap;
207 m_fromCopper[feemap.getCopperID() * 4 + feemap.getFinesseSlot()] = &feemap;
214 void FrontEndMapper::print()
const
217 cout <<
" Mapping of TOP front-end electronics" << endl << endl;
219 char label[5] =
"ABCD";
220 for (
int i = 0; i < c_numModules; i++) {
221 int moduleID = i + 1;
222 cout <<
" slot " << moduleID
223 <<
" (module " << getModuleCNumber(moduleID) <<
"):" << endl;
224 for (
int bs = 0; bs < c_numColumns; bs++) {
225 const auto* map = getMap(moduleID, bs);
228 cout <<
" scrod " << map->getScrodID();
229 if (map->getScrodID() < 10) cout <<
" ";
230 if (map->getScrodID() < 100) cout <<
" ";
231 cout <<
" copper " << map->getCopperID();
232 cout <<
" " << label[map->getFinesseSlot()];