Belle II Software  release-08-01-10
SVDIgnoredStripsMap.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 <svd/online/SVDIgnoredStripsMap.h>
10 #include <boost/property_tree/xml_parser.hpp>
11 #include <framework/logging/Logger.h>
12 #include <framework/utilities/FileSystem.h>
13 
14 using namespace Belle2;
15 using namespace std;
16 using boost::property_tree::ptree;
17 
18 
19 SVDIgnoredStripsMap::SVDIgnoredStripsMap(const string& xmlFilename):
20  m_Map(12), m_lastSensorID(0)
21 {
22  // If the xmlFilename is empty, the user apparently doesn't want the map.
23  // So keep low-profile, don't bother.
24  if (xmlFilename == "") {
25  B2INFO("No xml list of ignored strips specified.");
26  return;
27  }
28  // Create an empty property tree object
29 
30  ptree propertyTree;
31 
32  // Load the XML file into the property tree. If reading fails
33  // (cannot open file, parse error), an exception is thrown.
34  string xmlFullPath = FileSystem::findFile(xmlFilename);
35 
36  if (! FileSystem::fileExists(xmlFullPath)) {
37  B2WARNING("The xml filename: " << xmlFilename << endl <<
38  "resolved to: " << xmlFullPath << endl <<
39  "by FileSystem::findFile does not exist." << endl <<
40  "SVD ignored strips map cannot be initialized." << endl
41  );
42  return;
43  }
44 
45  try {
46  read_xml(xmlFullPath, propertyTree);
47  } catch (std::exception const& ex) {
48  B2WARNING("STD excpetion raised during xml parsing " << ex.what() << endl <<
49  "SVD ignored strips map cannot be initialized." << endl);
50  return;
51  } catch (...) {
52  B2WARNING("Unknown excpetion raised during xml parsing "
53  "SVD ignored strips map cannot be initialized." << endl);
54  return;
55  }
56 
57  try {
58  // traverse the xml tree: navigate through the daughters of <SVD>
59  VxdID sensorID;
60  for (ptree::value_type const& layer : propertyTree.get_child("SVD"))
61  if (layer.first == "layer") {
62  sensorID.setLayerNumber(static_cast<unsigned short>(layer.second.get<int>("<xmlattr>.n")));
63  for (ptree::value_type const& ladder : layer.second)
64  if (ladder.first == "ladder") {
65  sensorID.setLadderNumber(static_cast<unsigned short>(ladder.second.get<int>("<xmlattr>.n")));
66  for (ptree::value_type const& sensor : ladder.second)
67  if (sensor.first == "sensor") {
68  sensorID.setSensorNumber(static_cast<unsigned short>(sensor.second.get<int>("<xmlattr>.n")));
69  for (ptree::value_type const& side : sensor.second)
70  if (side.first == "side") {
71  std::string tagSide = side.second.get<std::string>("<xmlattr>.side");
72  sensorID.setSegmentNumber((tagSide == "U" || tagSide == "u") ? 1 : 0);
73  // We have complete VxdID, now we read the list of strips.
74  IgnoredStripsSet strips;
75  for (ptree::value_type const& tag : side.second)
76  if (tag.first == "strip") {
77  strips.insert(tag.second.get<unsigned short>("<xmlattr>.stripNo"));
78  } else if (tag.first == "stripsFromTo") {
79  auto limits = tag.second;
80  unsigned short fromStrip = limits.get<unsigned short>("<xmlattr>.fromStrip");
81  unsigned short toStrip = limits.get<unsigned short>("<xmlattr>.toStrip");
82  for (unsigned short iStrip = fromStrip; iStrip <= toStrip; iStrip++)
83  strips.insert(iStrip);
84  }
85  m_Map.insert(std::pair<unsigned short, IgnoredStripsSet>(sensorID.getID(), strips));
86  } // if side
87  } // if sensor
88  } // if ladder
89  } // if sensor
90  } catch (...) {
91  B2WARNING("Unknown excpetion raised during map initialization! "
92  "SVD ignored strips map may be corrupted." << endl);
93  return;
94  }
95 }
96 
97 const std::set<unsigned short>& SVDIgnoredStripsMap::getIgnoredStrips(VxdID id)
98 {
99  if (id == m_lastSensorID)
100  return m_lastIgnored;
101  else {
102  m_lastSensorID = id;
103  auto mapIter = m_Map.find(id);
104  if (mapIter != m_Map.end()) {
105  m_lastIgnored = mapIter->second;
106  } else {
107  m_lastIgnored.clear();
108  }
109  return m_lastIgnored;
110  }
111 }
112 
113 bool SVDIgnoredStripsMap::stripOK(VxdID id, unsigned short strip)
114 {
115  if (id != m_lastSensorID) {
116  m_lastSensorID = id;
117  auto mapIter = m_Map.find(id);
118  if (mapIter != m_Map.end()) {
119  m_lastIgnored = mapIter->second;
120  } else {
121  m_lastIgnored.clear();
122  return true;
123  }
124  }
125  return (m_lastIgnored.count(strip) == 0);
126 }
127 
128 
129 
130 
static std::string findFile(const std::string &path, bool silent=false)
Search for given file or directory in local or central release directory, and return absolute path if...
Definition: FileSystem.cc:148
static bool fileExists(const std::string &filename)
Check if the file with given filename exists.
Definition: FileSystem.cc:32
bool stripOK(VxdID id, unsigned short strip)
Check whether a strip on a given sensor is OK or not.
const std::set< unsigned short > & getIgnoredStrips(VxdID id)
Get the set of ignored strips for a sensor.
IgnoredStripsSet m_lastIgnored
Set of ingored strips for the most currently queried sensor.
VxdID m_lastSensorID
The most currently queried sensor number.
std::set< unsigned short > IgnoredStripsSet
A set of ignored strips.
SVDIgnoredStripsMap()=delete
No default constructor.
std::unordered_map< unsigned short, IgnoredStripsSet > m_Map
Structure holiding sets of ingored strips for all sensors.
Class to uniquely identify a any structure of the PXD and SVD.
Definition: VxdID.h:33
void setSegmentNumber(baseType segment)
Set the sensor segment.
Definition: VxdID.h:113
baseType getID() const
Get the unique id.
Definition: VxdID.h:94
void setSensorNumber(baseType sensor)
Set the sensor id.
Definition: VxdID.h:111
void setLadderNumber(baseType ladder)
Set the ladder id.
Definition: VxdID.h:109
void setLayerNumber(baseType layer)
Set the layer id.
Definition: VxdID.h:107
Abstract base class for different kinds of events.