 |
Belle II Software
release-05-01-25
|
12 #include <pxd/online/PXDIgnoredPixelsMap.h>
13 #include <boost/property_tree/xml_parser.hpp>
14 #include <framework/logging/Logger.h>
15 #include <framework/utilities/FileSystem.h>
16 #include <vxd/geometry/GeoCache.h>
20 using boost::property_tree::ptree;
24 m_Map(0), m_MapSingles(0), m_lastSensorID(0), m_lastSensorVCells(0)
28 if (xmlFilename ==
"") {
29 B2DEBUG(10,
"No xml list of ignored pixels specified.");
41 B2WARNING(
"The xml filename: " << xmlFilename << endl <<
42 "resolved to: " << xmlFullPath << endl <<
43 "by FileSystem::findFile does not exist." << endl <<
44 "PXD ignored pixels map cannot be initialized." << endl
50 read_xml(xmlFullPath, propertyTree);
51 }
catch (std::exception
const& ex) {
52 B2WARNING(
"STD excpetion raised during xml parsing " << ex.what() << endl <<
53 "PXD ignored pixels map cannot be initialized." << endl);
56 B2WARNING(
"Unknown excpetion raised during xml parsing "
57 "PXD ignored pixels map cannot be initialized." << endl);
64 for (ptree::value_type
const& layer : propertyTree.get_child(
"PXD"))
65 if (layer.first ==
"layer") {
66 sensorID.
setLayerNumber(
static_cast<unsigned short>(layer.second.get<
int>(
"<xmlattr>.n")));
67 for (ptree::value_type
const& ladder : layer.second)
68 if (ladder.first ==
"ladder") {
69 sensorID.
setLadderNumber(
static_cast<unsigned short>(ladder.second.get<
int>(
"<xmlattr>.n")));
70 for (ptree::value_type
const& sensor : ladder.second)
71 if (sensor.first ==
"sensor") {
72 sensorID.
setSensorNumber(
static_cast<unsigned short>(sensor.second.get<
int>(
"<xmlattr>.n")));
76 for (ptree::value_type
const& tag : sensor.second) {
77 if (tag.first ==
"pixels") {
78 auto limits = tag.second;
80 short uStart = limits.get<
short>(
"<xmlattr>.uStart", -1);
81 short uEnd = limits.get<
short>(
"<xmlattr>.uEnd", -1);
82 short vStart = limits.get<
short>(
"<xmlattr>.vStart", -1);
83 short vEnd = limits.get<
short>(
"<xmlattr>.vEnd", -1);
86 if (uStart != -1 && vStart != -1 && uEnd == -1 && vEnd == -1) {
90 }
else if (uStart != -1 && vStart == -1 && uEnd == -1 && vEnd == -1) {
94 vEnd = info.getVCells() - 1;
95 }
else if (uStart == -1 && vStart != -1 && uEnd == -1 && vEnd == -1) {
99 uEnd = info.getUCells() - 1;
100 }
else if (uStart != -1 && vStart == -1 && uEnd != -1 && vEnd == -1) {
103 vEnd = info.getVCells() - 1;
104 }
else if (uStart == -1 && vStart != -1 && uEnd == -1 && vEnd != -1) {
107 uEnd = info.getUCells() - 1;
108 }
else if (uStart != -1 && vStart != -1 && uEnd != -1 && vEnd != -1) {
115 unsigned short uS(uStart);
116 unsigned short vS(vStart);
117 unsigned short uE(uEnd);
118 unsigned short vE(vEnd);
119 if (uE >= info.getUCells()) uE = info.getUCells() - 1;
120 if (vE >= info.getVCells()) vE = info.getVCells() - 1;
121 if (vS > vE) vS = vE;
122 if (uS > uE) uS = uE;
124 unsigned int area = (uE - uS + 1) * (vE - vS + 1);
128 unsigned int uid = uStart * info.getVCells() + vStart;
134 [ = ](
unsigned int u,
unsigned int v) ->
bool
135 {
return (uS <= u && u <= uE && vS <= v && v <= vE); };
137 ranges.insert(std::make_pair(area, range_mask));
141 m_Map.insert(std::pair<unsigned short, PXDIgnoredPixelsMap::IgnoredPixelsRangeSet>(sensorID.
getID(), ranges));
142 m_MapSingles.insert(std::pair<unsigned short, PXDIgnoredPixelsMap::IgnoredSinglePixelsSet>(sensorID.
getID(), singles));
147 B2WARNING(
"Unknown exception raised during map initialization! "
148 "PXD ignored pixels map may be corrupted." << endl);
158 std::set<PXDIgnoredPixelsMap::map_pixel> pixels;
162 for (
int pixelU = 0; pixelU < info.getUCells(); pixelU++) {
163 for (
int pixelV = 0; pixelV < info.getVCells(); pixelV++) {
179 auto mapIter =
m_Map.find(
id);
182 if (mapIter !=
m_Map.end())
198 const unsigned int u = pixel.first;
199 const unsigned int v = pixel.second;
205 if (iter->second(u, v))
Class to uniquely identify a any structure of the PXD and SVD.
PXDIgnoredPixelsMap()=delete
No default constructor.
static const SensorInfoBase & get(Belle2::VxdID id)
Return a reference to the SensorInfo of a given SensorID.
std::function< bool(unsigned short, unsigned short) > pixel_range_test_prototype
Prototype for lambda function used to check if a pixel is in masked range.
void setLayerNumber(baseType layer)
Set the layer id.
baseType getID() const
Get the unique id.
Base class to provide Sensor Information for PXD and SVD.
std::multimap< unsigned int, pixel_range_test_prototype, std::greater< unsigned int > > IgnoredPixelsRangeSet
Structure to hold set of masked pixel ranges ordered from largest to smallest by their area (unsigned...
IgnoredPixelsRangeSet m_lastIgnored
Set of ignored pixel ranges for the most currently queried sensor.
std::unordered_map< unsigned short, IgnoredPixelsRangeSet > m_Map
Structure holding sets of ignored pixel ranges for all sensors by sensor id (unsigned short).
IgnoredSinglePixelsSet m_lastIgnoredSingles
Set of ignored single pixels for the most currently queried sensor.
static GeoCache & getInstance()
Return a reference to the singleton instance.
Abstract base class for different kinds of events.
int getVCells() const
Return number of pixel/strips in v direction.
unsigned short m_lastSensorVCells
The most currently queried sensor number of V pixels (for quick pixel uid evaluation)
void setSensorNumber(baseType sensor)
Set the sensor id.
std::unordered_map< unsigned short, IgnoredSinglePixelsSet > m_MapSingles
Structure holding sets of ingored single pixels for all sensors by sensor id (unsigned short).
const std::set< map_pixel > getIgnoredPixels(VxdID id)
Get the set of ignored pixels for a sensor.
bool pixelOK(VxdID id, map_pixel pixel)
Check whether a pixel on a given sensor is OK or not.
static bool fileExists(const std::string &filename)
Check if the file with given filename exists.
std::unordered_set< unsigned int > IgnoredSinglePixelsSet
Structure to hold set of masked single pixels indexed by their unique id (unsigned int),...
VxdID m_lastSensorID
The most currently queried sensor number.
std::pair< unsigned short, unsigned short > map_pixel
Simple structure for a pixel, u = map_pixel.first, v = map_pixel.second.
void setLadderNumber(baseType ladder)
Set the ladder id.
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...