Belle II Software prerelease-11-00-00a
FrontEndMapper.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <top/geometry/FrontEndMapper.h>
10#include <framework/database/DBImportArray.h>
11#include <framework/logging/LogSystem.h>
12#include <iostream>
13
14
15using namespace std;
16
17namespace Belle2 {
22 namespace TOP {
23
25 {
26 for (unsigned i = 0; i < c_numModules; i++) {
27 for (unsigned k = 0; k < c_numColumns; k++) {
28 m_fromModule[i][k] = 0;
29 }
30 }
31 }
32
33
34 void FrontEndMapper::initialize(const GearDir& frontEndMapping)
35 {
36
37 clear();
38
39 // unordered sets used to check that ...
40
41 unordered_set<unsigned short> scrodIDs; // all SCROD ID's are different
42 unordered_set<string> coppers; // COPPER inputs are used only once
43 unordered_set<int> modules; // (moduleID, col) mapped only once
44
45 // read parameters from gerabox
46 int numModules = 0; // counter of mapped modules
47 for (const GearDir& topModule : frontEndMapping.getNodes("TOPModule")) {
48
49 int moduleCNumber = topModule.getInt("@CNumber");
50 int moduleID = topModule.getInt("moduleID");
51 if (moduleID == 0) continue; // module is not installed into barrel
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()));
56 return;
57 }
58
59 bool moduleMapped = false; // to count mapped modules
60 for (const GearDir& boardstack : topModule.getNodes("Boardstack")) {
61
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()));
68 return;
69 }
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()));
75 return;
76 }
77
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"));
85 return;
86 }
87
88 string finesseSlot = boardstack.getString("FinesseSlot");
89 int finesse = 0;
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;}
94 else {
95 B2ERROR("TOP::FrontEndMapper: invalid finesse slot (valid are A, B, C, D)."
96 << LogVar("FinesseSlot", finesseSlot)
97 << LogVar("path", boardstack.getPath() + "/FinesseSlot"));
98 return;
99 }
100
101 unsigned copperID = (unsigned) boardstack.getInt("COPPERid");
102 m_copperIDs.insert(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"));
110 return;
111 }
112
113 TOPFrontEndMap feemap(moduleID, moduleCNumber, col, scrodID, copperID, finesse,
114 m_mapping.size());
115 m_mapping.push_back(feemap);
116 moduleMapped = true;
117 }
118 if (moduleMapped) numModules++;
119 }
120
121 // set conversion objects
122
123 for (const auto& feemap : m_mapping) {
124 m_fromModule[feemap.getModuleID() - 1][feemap.getBoardstackNumber()] = &feemap;
125 m_fromScrod[feemap.getScrodID()] = &feemap;
126 m_fromCopper[feemap.getCopperID() * 4 + feemap.getFinesseSlot()] = &feemap;
127 }
128 m_valid = true;
129
130 B2INFO("TOP::FrontEndMapper: " << m_mapping.size() << " SCROD's mapped to "
131 << numModules << " TOP module(s)");
132
133 // print mappings if debug level for package 'top' is set to 100 or larger
134 const auto& logSystem = LogSystem::Instance();
135 if (logSystem.isLevelEnabled(LogConfig::c_Debug, 100, "top")) {
136 print();
137 }
138
139 }
140
141
143 {
144 if (!m_mappingDB.isValid()) {
145 clear();
146 return;
147 }
148 update();
149
150 m_mappingDB.addCallback(this, &FrontEndMapper::update);
151
152 const auto& logSystem = LogSystem::Instance();
153 if (logSystem.isLevelEnabled(LogConfig::c_Debug, 100, "top")) {
154 print();
155 }
156
157 }
158
159
161 {
163 for (const auto& map : m_mapping) {
164 array.appendNew(map);
165 }
166 array.import(iov);
167 }
168
169
171 {
172 m_mapping.clear();
173 m_copperIDs.clear();
174 m_fromScrod.clear();
175 m_fromCopper.clear();
176 for (unsigned i = 0; i < c_numModules; i++) {
177 for (unsigned k = 0; k < c_numColumns; k++) {
178 m_fromModule[i][k] = 0;
179 }
180 }
181 m_valid = false;
182 m_fromDB = false;
183 }
184
185
187 {
188 clear();
189 if (!m_mappingDB.isValid()) return;
190
191 for (const auto& feemap : m_mappingDB) {
192 m_copperIDs.insert(feemap.getCopperID());
193 m_fromModule[feemap.getModuleID() - 1][feemap.getBoardstackNumber()] = &feemap;
194 m_fromScrod[feemap.getScrodID()] = &feemap;
195 m_fromCopper[feemap.getCopperID() * 4 + feemap.getFinesseSlot()] = &feemap;
196 }
197 m_valid = true;
198 m_fromDB = true;
199 }
200
201
203 {
204 cout << endl;
205 cout << " Mapping of TOP front-end electronics" << endl << endl;
206
207 const char label[5] = "ABCD";
208 for (int i = 0; i < c_numModules; i++) {
209 int moduleID = i + 1;
210 cout << " slot " << moduleID
211 << " (module " << getModuleCNumber(moduleID) << "):" << endl;
212 for (int bs = 0; bs < c_numColumns; bs++) {
213 const auto* map = getMap(moduleID, bs);
214 if (!map) continue;
215 cout << " BS" << 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()];
221 cout << endl;
222 }
223 }
224 cout << endl;
225
226 }
227
228
229
230 } // TOP namespace
232} // Belle2 namespace
Class for importing array of objects to the database.
bool import(const IntervalOfValidity &iov)
Import the object to database.
GearDir is the basic class used for accessing the parameter store.
Definition GearDir.h:31
A class that describes the interval of experiments/runs for which an object in the database is valid.
@ c_Debug
Debug: for code development.
Definition LogConfig.h:26
static LogSystem & Instance()
Static method to get a reference to the LogSystem instance.
Definition LogSystem.cc:28
Mapping of a boardstack number within a module to SCROD and COPPER/Finesse.
DBArray< TOPFrontEndMap > m_mappingDB
mappings from database
void initialize()
Initialize from database.
bool m_fromDB
true, if from database
const TOPFrontEndMap * m_fromModule[c_numModules][c_numColumns]
conversion
const TOPFrontEndMap * getMap(int moduleID, int bs) const
Return map from TOP module side.
bool m_valid
true, if mapping available
std::unordered_set< unsigned int > m_copperIDs
COPPER ID's.
std::map< unsigned int, const TOPFrontEndMap * > m_fromCopper
conversion
std::map< unsigned short, const TOPFrontEndMap * > m_fromScrod
conversion
int getModuleCNumber(int moduleID) const
Returns module construction number.
void update()
re-do conversion maps when DBArray has changed
void importPayload(const IntervalOfValidity &iov) const
import mappings to database
void print() const
Print mappings to terminal screen.
std::vector< TOPFrontEndMap > m_mapping
mappings from gearbox
std::vector< GearDir > getNodes(const std::string &path="") const
Get vector of GearDirs which point to all the nodes the given path evaluates to.
Definition Interface.cc:21
Class to store variables with their name which were sent to the logging service.
Abstract base class for different kinds of events.
STL namespace.