Belle II Software  release-05-02-19
FrontEndMapper.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2010 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Marko Staric *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #include <top/geometry/FrontEndMapper.h>
12 #include <framework/database/DBImportArray.h>
13 #include <framework/logging/LogSystem.h>
14 #include <iostream>
15 
16 
17 using namespace std;
18 
19 namespace Belle2 {
24  namespace TOP {
25 
26  FrontEndMapper::FrontEndMapper()
27  {
28  for (unsigned i = 0; i < c_numModules; i++) {
29  for (unsigned k = 0; k < c_numColumns; k++) {
30  m_fromModule[i][k] = 0;
31  }
32  }
33  }
34 
35 
36  FrontEndMapper::~FrontEndMapper()
37  {
38  if (m_mappingDB) delete m_mappingDB;
39  }
40 
41 
42  void FrontEndMapper::initialize(const GearDir& frontEndMapping)
43  {
44 
45  clear();
46 
47  // unordered sets used to check that ...
48 
49  unordered_set<unsigned short> scrodIDs; // all SCROD ID's are different
50  unordered_set<string> coppers; // COPPER inputs are used only once
51  unordered_set<int> modules; // (moduleID, col) mapped only once
52 
53  // read parameters from gerabox
54  int numModules = 0; // counter of mapped modules
55  for (const GearDir& topModule : frontEndMapping.getNodes("TOPModule")) {
56 
57  int moduleCNumber = topModule.getInt("@CNumber");
58  int moduleID = topModule.getInt("moduleID");
59  if (moduleID == 0) continue; // module is not installed into barrel
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()));
64  return;
65  }
66 
67  bool moduleMapped = false; // to count mapped modules
68  for (const GearDir& boardstack : topModule.getNodes("Boardstack")) {
69 
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()));
76  return;
77  }
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()));
83  return;
84  }
85 
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"));
93  return;
94  }
95 
96  string finesseSlot = boardstack.getString("FinesseSlot");
97  int finesse = 0;
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;}
102  else {
103  B2ERROR("TOP::FrontEndMapper: invalid slot (valid are A, B, C, D)."
104  << LogVar("FinesseSlot", finesseSlot)
105  << LogVar("path", boardstack.getPath() + "/FinesseSlot"));
106  return;
107  }
108 
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"));
118  return;
119  }
120 
121  TOPFrontEndMap feemap(moduleID, moduleCNumber, col, scrodID, copperID, finesse,
122  m_mapping.size());
123  m_mapping.push_back(feemap);
124  moduleMapped = true;
125  }
126  if (moduleMapped) numModules++;
127  }
128 
129  // set conversion objects
130 
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;
135  }
136  m_valid = true;
137 
138  B2INFO("TOP::FrontEndMapper: " << m_mapping.size() << " SCROD's mapped to "
139  << numModules << " TOP module(s)");
140 
141  // print mappings if debug level for package 'top' is set to 100 or larger
142  const auto& logSystem = LogSystem::Instance();
143  if (logSystem.isLevelEnabled(LogConfig::c_Debug, 100, "top")) {
144  print();
145  }
146 
147  }
148 
149 
150  void FrontEndMapper::initialize()
151  {
152 
153  if (m_mappingDB) delete m_mappingDB;
154  m_mappingDB = new DBArray<TOPFrontEndMap>();
155 
156  if (!m_mappingDB->isValid()) {
157  clear();
158  return;
159  }
160  update();
161 
162  m_mappingDB->addCallback(this, &FrontEndMapper::update);
163 
164  const auto& logSystem = LogSystem::Instance();
165  if (logSystem.isLevelEnabled(LogConfig::c_Debug, 100, "top")) {
166  print();
167  }
168 
169  }
170 
171 
172  void FrontEndMapper::import(const IntervalOfValidity& iov) const
173  {
175  for (const auto& map : m_mapping) {
176  array.appendNew(map);
177  }
178  array.import(iov);
179  }
180 
181 
182  void FrontEndMapper::clear()
183  {
184  m_mapping.clear();
185  m_copperIDs.clear();
186  m_fromScrod.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;
191  }
192  }
193  m_valid = false;
194  m_fromDB = false;
195  }
196 
197 
198  void FrontEndMapper::update()
199  {
200  clear();
201  if (!m_mappingDB->isValid()) return;
202 
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;
208  }
209  m_valid = true;
210  m_fromDB = true;
211  }
212 
213 
214  void FrontEndMapper::print() const
215  {
216  cout << endl;
217  cout << " Mapping of TOP front-end electronics" << endl << endl;
218 
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);
226  if (!map) continue;
227  cout << " BS" << 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()];
233  cout << endl;
234  }
235  }
236  cout << endl;
237 
238  }
239 
240 
241 
242  } // TOP namespace
244 } // Belle2 namespace
Belle2::TOPFrontEndMap
Mapping of a boardstack number within a module to SCROD and COPPER/Finesse.
Definition: TOPFrontEndMap.h:32
Belle2::IntervalOfValidity
A class that describes the interval of experiments/runs for which an object in the database is valid.
Definition: IntervalOfValidity.h:35
Belle2::DBImportArray::appendNew
T * appendNew()
Construct a new T object at the end of the array.
Definition: DBImportArray.h:77
Belle2::DBArray
Class for accessing arrays of objects in the database.
Definition: DBArray.h:36
Belle2::DBImportBase::import
bool import(const IntervalOfValidity &iov)
Import the object to database.
Definition: DBImportBase.cc:38
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::GearDir
GearDir is the basic class used for accessing the parameter store.
Definition: GearDir.h:41
LogVar
Class to store variables with their name which were sent to the logging service.
Definition: LogVariableStream.h:24
Belle2::DBImportArray
Class for importing array of objects to the database.
Definition: DBImportArray.h:35
Belle2::gearbox::Interface::getNodes
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:31