41 unordered_set<unsigned short> scrodIDs;
42 unordered_set<string> coppers;
43 unordered_set<int> modules;
47 for (
const GearDir& topModule : frontEndMapping.
getNodes(
"TOPModule")) {
49 int moduleCNumber = topModule.getInt(
"@CNumber");
50 int moduleID = topModule.getInt(
"moduleID");
51 if (moduleID == 0)
continue;
52 if (moduleID < 0 or moduleID > c_numModules) {
53 B2ERROR(
"TOP::FrontEndMapper: invalid moduleID in xml file"
54 <<
LogVar(
"moduleID", moduleID)
55 <<
LogVar(
"path", topModule.getPath()));
59 bool moduleMapped =
false;
62 int col = boardstack.getInt(
"@col");
63 if (col < 0 or col >= c_numColumns) {
64 B2ERROR(
"TOP::FrontEndMapper: invalid boardstack number in xml file"
65 <<
LogVar(
"moduleID", moduleID)
66 <<
LogVar(
"boardstack", col)
67 <<
LogVar(
"path", boardstack.getPath()));
70 if (!modules.insert(moduleID * c_numColumns + col).second) {
71 B2ERROR(
"TOP::FrontEndMapper: this boardstack is already mapped."
72 <<
LogVar(
"moduleID", moduleID)
73 <<
LogVar(
"boardstack", col)
74 <<
LogVar(
"path", boardstack.getPath()));
78 unsigned short scrodID = (
unsigned short) boardstack.getInt(
"SCRODid");
79 if (!scrodIDs.insert(scrodID).second) {
80 B2ERROR(
"TOP::FrontEndMapper: this SCROD ID is already used."
81 <<
LogVar(
"moduleID", moduleID)
82 <<
LogVar(
"boardstack", col)
83 <<
LogVar(
"scrod", scrodID)
84 <<
LogVar(
"path", boardstack.getPath() +
"/SCRODid"));
88 string finesseSlot = boardstack.getString(
"FinesseSlot");
90 if (finesseSlot ==
"A") {finesse = 0;}
91 else if (finesseSlot ==
"B") {finesse = 1;}
92 else if (finesseSlot ==
"C") {finesse = 2;}
93 else if (finesseSlot ==
"D") {finesse = 3;}
95 B2ERROR(
"TOP::FrontEndMapper: invalid finesse slot (valid are A, B, C, D)."
96 <<
LogVar(
"FinesseSlot", finesseSlot)
97 <<
LogVar(
"path", boardstack.getPath() +
"/FinesseSlot"));
101 unsigned copperID = (unsigned) boardstack.getInt(
"COPPERid");
103 string copper = boardstack.getString(
"COPPERid") +
" " + finesseSlot;
104 if (!coppers.insert(copper).second) {
105 B2ERROR(
"TOP::FrontEndMapper: this COPPER ID is already used."
106 <<
LogVar(
"moduleID", moduleID)
107 <<
LogVar(
"boardstack", col)
108 <<
LogVar(
"copperID", copper)
109 <<
LogVar(
"path", boardstack.getPath() +
"/COPPERid"));
113 TOPFrontEndMap feemap(moduleID, moduleCNumber, col, scrodID, copperID, finesse,
118 if (moduleMapped) numModules++;
124 m_fromModule[feemap.getModuleID() - 1][feemap.getBoardstackNumber()] = &feemap;
126 m_fromCopper[feemap.getCopperID() * 4 + feemap.getFinesseSlot()] = &feemap;
130 B2INFO(
"TOP::FrontEndMapper: " <<
m_mapping.size() <<
" SCROD's mapped to "
131 << numModules <<
" TOP module(s)");
205 cout <<
" Mapping of TOP front-end electronics" << endl << endl;
207 const char label[5] =
"ABCD";
208 for (
int i = 0; i < c_numModules; i++) {
209 int moduleID = i + 1;
210 cout <<
" slot " << moduleID
212 for (
int bs = 0; bs < c_numColumns; bs++) {
213 const auto* map =
getMap(moduleID, bs);
216 cout <<
" scrod " << map->getScrodID();
217 if (map->getScrodID() < 10) cout <<
" ";
218 if (map->getScrodID() < 100) cout <<
" ";
219 cout <<
" copper " << map->getCopperID();
220 cout <<
" " << label[map->getFinesseSlot()];