Belle II Software  release-05-01-25
PXDIgnoredPixelsMap Class Reference

This class provides a check for ignored (=cold, hot or otherwise deffective) pixels for the use in PXD data reconstruction. More...

#include <PXDIgnoredPixelsMap.h>

Collaboration diagram for PXDIgnoredPixelsMap:

Public Types

typedef std::pair< unsigned short, unsigned short > map_pixel
 Simple structure for a pixel, u = map_pixel.first, v = map_pixel.second.
 
typedef 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.
 
typedef 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 int)
 
typedef std::unordered_set< unsigned int > IgnoredSinglePixelsSet
 Structure to hold set of masked single pixels indexed by their unique id (unsigned int), stored in hash table.
 

Public Member Functions

 PXDIgnoredPixelsMap (const std::string &xml_filename)
 Constructor. More...
 
 PXDIgnoredPixelsMap ()=delete
 No default constructor.
 
const std::set< map_pixelgetIgnoredPixels (VxdID id)
 Get the set of ignored pixels for a sensor. More...
 
bool pixelOK (VxdID id, map_pixel pixel)
 Check whether a pixel on a given sensor is OK or not. More...
 

Private Attributes

std::unordered_map< unsigned short, IgnoredPixelsRangeSetm_Map
 Structure holding sets of ignored pixel ranges for all sensors by sensor id (unsigned short).
 
std::unordered_map< unsigned short, IgnoredSinglePixelsSetm_MapSingles
 Structure holding sets of ingored single pixels for all sensors by sensor id (unsigned short).
 
IgnoredPixelsRangeSet m_lastIgnored
 Set of ignored pixel ranges for the most currently queried sensor.
 
IgnoredSinglePixelsSet m_lastIgnoredSingles
 Set of ignored single pixels for the most currently queried sensor.
 
VxdID m_lastSensorID
 The most currently queried sensor number.
 
unsigned short m_lastSensorVCells
 The most currently queried sensor number of V pixels (for quick pixel uid evaluation)
 

Detailed Description

This class provides a check for ignored (=cold, hot or otherwise deffective) pixels for the use in PXD data reconstruction.

The class has non-intrusive behavior, that is, it will not interfere when queries on non-existent sensors are asked. Treatment of single masked pixels and masked ranges (rows, cols, ...) is different for performance reasons.

NOTE: More optimization is possible:

  • single rows and cols can go to hash tables (like pixels), as they can be uniquely identified. Then we would have m_MaskRows, m_MaskCols etc.
  • lambdas for ranges of cols/rows can be simplified (2 less comparisons) or even
  • instead hash tables, one could use directly vectors/arrays/std::bitset and only pixels, but with much more memory for map of all sensors (at least 8Mbit for whole Belle2 PXD & std::bitset)

Definition at line 52 of file PXDIgnoredPixelsMap.h.

Constructor & Destructor Documentation

◆ PXDIgnoredPixelsMap()

PXDIgnoredPixelsMap ( const std::string &  xml_filename)
explicit

Constructor.

Parameters
xml_filenameis the name of the xml file containing the map.

Definition at line 23 of file PXDIgnoredPixelsMap.cc.

23  :
25 {
26  // If the xmlFilename is empty, the user apparently doesn't want the map.
27  // So keep low-profile, don't bother.
28  if (xmlFilename == "") {
29  B2DEBUG(10, "No xml list of ignored pixels specified.");
30  return;
31  }
32  // Create an empty property tree object
33 
34  ptree propertyTree;
35 
36  // Load the XML file into the property tree. If reading fails
37  // (cannot open file, parse error), an exception is thrown.
38  string xmlFullPath = FileSystem::findFile(xmlFilename);
39 
40  if (! FileSystem::fileExists(xmlFullPath)) {
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
45  );
46  return;
47  }
48 
49  try {
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);
54  return;
55  } catch (...) {
56  B2WARNING("Unknown excpetion raised during xml parsing "
57  "PXD ignored pixels map cannot be initialized." << endl);
58  return;
59  }
60 
61  try {
62  // traverse the xml tree: navigate through the daughters of <PXD>
63  VxdID sensorID;
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")));
75  const VXD::SensorInfoBase& info = VXD::GeoCache::getInstance().get(sensorID);
76  for (ptree::value_type const& tag : sensor.second) {
77  if (tag.first == "pixels") {
78  auto limits = tag.second;
79  // All possible attributes, default = -1 (att not present)
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);
84 
85  // Fill remaining range parameters
86  if (uStart != -1 && vStart != -1 && uEnd == -1 && vEnd == -1) {
87  // mask one pixel
88  uEnd = uStart;
89  vEnd = vStart;
90  } else if (uStart != -1 && vStart == -1 && uEnd == -1 && vEnd == -1) {
91  // mask column u ... all v rows
92  uEnd = uStart;
93  vStart = 0;
94  vEnd = info.getVCells() - 1;
95  } else if (uStart == -1 && vStart != -1 && uEnd == -1 && vEnd == -1) {
96  // mask row v ... all u columns
97  vEnd = vStart;
98  uStart = 0;
99  uEnd = info.getUCells() - 1;
100  } else if (uStart != -1 && vStart == -1 && uEnd != -1 && vEnd == -1) {
101  // columns from ... to ... (all rows there)
102  vStart = 0;
103  vEnd = info.getVCells() - 1;
104  } else if (uStart == -1 && vStart != -1 && uEnd == -1 && vEnd != -1) {
105  // rows from ... to ... (all columns there)
106  uStart = 0;
107  uEnd = info.getUCells() - 1;
108  } else if (uStart != -1 && vStart != -1 && uEnd != -1 && vEnd != -1) {
109  // already ok, rectangular area
110  } else {
111  // do not accept other combinations
112  continue;
113  }
114  // ensure positive and meaningfull values
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;
123  // area of the masked range
124  unsigned int area = (uE - uS + 1) * (vE - vS + 1);
125  if (area == 1) {
126  // Single pixel masking:
127  // We store pixels by unique id in hash table
128  unsigned int uid = uStart * info.getVCells() + vStart;
129  // uid will be used to generate hash in unordered_set for quick access
130  singles.insert(uid);
131  } else {
132  // lambda function to decide if (u,v) is inside this range
134  [ = ](unsigned int u, unsigned int v) -> bool
135  { return (uS <= u && u <= uE && vS <= v && v <= vE); };
136  // area is used to sort ranges from largest to smallest
137  ranges.insert(std::make_pair(area, range_mask));
138  }
139  }
140  }
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));
143  } // if sensor
144  } // if ladder
145  } // if sensor
146  } catch (...) {
147  B2WARNING("Unknown exception raised during map initialization! "
148  "PXD ignored pixels map may be corrupted." << endl);
149  return;
150  }
151 }

Member Function Documentation

◆ getIgnoredPixels()

const std::set< PXDIgnoredPixelsMap::map_pixel > getIgnoredPixels ( VxdID  id)

Get the set of ignored pixels for a sensor.

Parameters
idVxdID of the required sensor
Returns
the set of ignored pixels, and empty set for non-existent VxdID.

Definition at line 153 of file PXDIgnoredPixelsMap.cc.

◆ pixelOK()

bool pixelOK ( VxdID  id,
PXDIgnoredPixelsMap::map_pixel  pixel 
)

Check whether a pixel on a given sensor is OK or not.

Parameters
idVxdID of the sensor
pixelPixel constructed e.g. as map_pixel(u, v)
Returns
true if pixel or the id is not found in the list, otherwise false.

Definition at line 172 of file PXDIgnoredPixelsMap.cc.


The documentation for this class was generated from the following files:
Belle2::VxdID
Class to uniquely identify a any structure of the PXD and SVD.
Definition: VxdID.h:43
Belle2::VXD::GeoCache::get
static const SensorInfoBase & get(Belle2::VxdID id)
Return a reference to the SensorInfo of a given SensorID.
Definition: GeoCache.h:141
Belle2::PXDIgnoredPixelsMap::pixel_range_test_prototype
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.
Definition: PXDIgnoredPixelsMap.h:57
Belle2::VxdID::setLayerNumber
void setLayerNumber(baseType layer)
Set the layer id.
Definition: VxdID.h:117
Belle2::VxdID::getID
baseType getID() const
Get the unique id.
Definition: VxdID.h:104
Belle2::VXD::SensorInfoBase
Base class to provide Sensor Information for PXD and SVD.
Definition: SensorInfoBase.h:40
Belle2::PXDIgnoredPixelsMap::IgnoredPixelsRangeSet
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...
Definition: PXDIgnoredPixelsMap.h:59
Belle2::PXDIgnoredPixelsMap::m_Map
std::unordered_map< unsigned short, IgnoredPixelsRangeSet > m_Map
Structure holding sets of ignored pixel ranges for all sensors by sensor id (unsigned short).
Definition: PXDIgnoredPixelsMap.h:88
Belle2::VXD::GeoCache::getInstance
static GeoCache & getInstance()
Return a reference to the singleton instance.
Definition: GeoCache.cc:215
Belle2::PXDIgnoredPixelsMap::m_lastSensorVCells
unsigned short m_lastSensorVCells
The most currently queried sensor number of V pixels (for quick pixel uid evaluation)
Definition: PXDIgnoredPixelsMap.h:100
Belle2::VxdID::setSensorNumber
void setSensorNumber(baseType sensor)
Set the sensor id.
Definition: VxdID.h:121
Belle2::PXDIgnoredPixelsMap::m_MapSingles
std::unordered_map< unsigned short, IgnoredSinglePixelsSet > m_MapSingles
Structure holding sets of ingored single pixels for all sensors by sensor id (unsigned short).
Definition: PXDIgnoredPixelsMap.h:90
prepareAsicCrosstalkSimDB.u
u
merged u1 and u2
Definition: prepareAsicCrosstalkSimDB.py:46
Belle2::FileSystem::fileExists
static bool fileExists(const std::string &filename)
Check if the file with given filename exists.
Definition: FileSystem.cc:33
Belle2::PXDIgnoredPixelsMap::IgnoredSinglePixelsSet
std::unordered_set< unsigned int > IgnoredSinglePixelsSet
Structure to hold set of masked single pixels indexed by their unique id (unsigned int),...
Definition: PXDIgnoredPixelsMap.h:61
Belle2::PXDIgnoredPixelsMap::m_lastSensorID
VxdID m_lastSensorID
The most currently queried sensor number.
Definition: PXDIgnoredPixelsMap.h:98
Belle2::VxdID::setLadderNumber
void setLadderNumber(baseType ladder)
Set the ladder id.
Definition: VxdID.h:119
Belle2::FileSystem::findFile
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:147