ATLAS Offline Software
IdDictGroup.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3  */
4 
5 #include "IdDict/IdDictGroup.h"
6 #include "src/Debugger.h"
7 #include "IdDict/IdDictRegion.h"
10 #include "IdDict/IdDictMgr.h"
13 #include "Identifier/MultiRange.h"
14 #include "Identifier/Range.h"
16 
17 #include <iostream>
18 #include <map>
19 #include <numeric> // for iota
20 
21 
23  :
24  m_generated_implementation(false) {
25 }
26 
27 IdDictGroup::IdDictGroup (const std::string& name)
28  :
29  m_name(name),
30  m_generated_implementation(false) {
31 }
32 
34 }
35 
36 const std::string& IdDictGroup::name() {
37  return(m_name);
38 }
39 
40 const std::vector<IdDictDictEntry*>&
42  return(m_entries);
43 }
44 
45 const std::vector<IdDictRegion*>&
47  return(m_regions);
48 }
49 
53 
54  for (const IdDictRegion* region : m_regions) {
55 
56  // skip regions created from parents
57  if ("dummy" == region->name()) continue;
58 
59  // skip empty regions - may arise from alternate_regions
60  // where a tag selects an empty region
61  if (region->is_empty()) continue;
62 
64  result.add(std::move(r));
65  }
66 
67  return(result);
68 }
69 
70 void
72  m_entries.push_back(region);
73 }
74 
75 void
78  size_t& index) {
79  for (IdDictDictEntry* ent : m_entries) {
80  ent->set_index(index);
81  index++;
82 
83  ent->resolve_references(idd, dictionary);
84  }
85 }
86 
87 void
90  const std::string& tag) {
91  if (Debugger::debug()) {
92  std::cout << "IdDictGroup::generate_implementation>" << std::endl;
93  }
94 
96  // Loop over entries and fill regions vec with selected region
97  // (AltRegions have a selection)
98  for (IdDictDictEntry* ent : m_entries) {
99  ent->generate_implementation(idd, dictionary, tag);
100  // Get region and save in m_regions
101  IdDictRegion* region = dynamic_cast<IdDictRegion*> (ent);
102  if (region) {
103  m_regions.push_back(region);
104  } else {
105  IdDictAltRegions* altregions = dynamic_cast<IdDictAltRegions*> (ent);
106  if (altregions) {
107  m_regions.push_back(altregions->selected_region());
108  }
109  }
110  }
111 
112  if (m_regions.size() != m_entries.size()) {
113  std::cout << "IdDictGroup::generate_implementation - mismatch of sizes: regions/entries "
114  << m_regions.size() << " " << m_entries.size()
115  << std::endl;
116  }
117 
119  }
120 }
121 
122 void
125  m_regions.clear();
126  for (IdDictDictEntry* ent : m_entries) {
127  ent->reset_implementation();
128  }
130  }
131 }
132 
133 bool
135  // Should check that all regions have the same number of levels,
136  // which is part of the definition of a group
137  return(true);
138 }
139 
149  std::map< ExpandedIdentifier, IdDictDictEntry* > regions;
150 
151  for (IdDictRegion* region : m_regions) {
153  RangeIterator itr(range);
154  auto first = itr.begin();
155  auto last = itr.end();
156  if (first != last) {
157  regions[*first] = region;
158  } else {
159  std::cout << "IdDictDictionary::sort - WARNING empty region cannot sort "
160  << std::endl;
161  }
162  }
163  if (regions.size() == m_regions.size()) {
164  // Reorder the regions
166  std::vector<IdDictRegion*>::size_type vecIt = 0;
167  for (; mapIt != regions.end(); ++mapIt, ++vecIt) {
168  m_entries[vecIt] = (*mapIt).second;
169  }
170  } else {
171  std::cout << "IdDictGroup::sort - WARNING region map size is NOT the same as the vector size. Map size "
172  << regions.size() << " vector size " << m_regions.size()
173  << std::endl;
174  }
175 }
176 
177 void
179  for (IdDictDictEntry* region : m_entries) {
180  region->clear();
181  delete region;
182  }
183 
184  m_entries.clear();
185 }
186 
187 
191  : m_impl (impl),
192  m_children (std::in_place_index<0>,
193  impl.ored_field().get_indices(), 0)
194 {
195 }
196 
197 
200 {
201  if (m_children.index() == 0) {
202  uint64_t c = 0;
203  auto& children = std::get<0> (m_children);
204  size_t ipos = children.size();
205  while (ipos > 0 && children[ipos-1] == 0) {
206  --ipos;
207  }
208  if (ipos > 0) {
209  c = children[ipos-1];
210  size_t ipos2 = ipos;
211  while (ipos2 > 0 && children[ipos2-1] == c) {
212  --ipos2;
213  }
214  if (ipos2 > 0) return;
215  }
216  m_children.emplace<1> (ipos, c);
217  }
218 }
219 
220 
231  const ExpandedIdentifier& prefix,
232  size_t index2,
233  ExpandedIdentifier& unpackedId,
234  std::vector<const IdDictFieldImplementation*>* impls /*= nullptr*/) const
235 {
236  using element_type = ExpandedIdentifier::element_type;
237  using size_type = IdentifierField::size_type;
238 
239  // Give up if the tree representation hasn't been built.
240  if (m_region_tree.empty()) std::abort();
241 
242  // Clear output.
243  unpackedId.clear();
244  if (impls) {
245  impls->clear();
246  impls->reserve (12);
247  }
248 
249  // Start at the first node, and assume success.
250  unsigned inode = 0;
251  int ret = 0;
252 
253  // Loop over fields.
254  for (size_t index = 0; index <= index2; ++index) {
255 
256  // Fetch the node.
258 
259  // Find the index+value for this field. If we're looking at a prefix,
260  // get it from there; otherwise, unpack from the input identifier.
261  element_type val;
262  size_type validx;
263  if (index < prefix.fields()) {
264  val = prefix[index];
265  validx = n.m_impl.ored_field().get_value_index (val);
266  }
267  else {
268  validx = n.m_impl.unpackToIndex (id);
269  try {
270  val = n.m_impl.ored_field().get_value_at (validx);
271  } catch (const std::out_of_range&) {
272  ret = 1;
273  break;
274  }
275  }
276 
277  // Find the next node.
278  if (n.m_children.index() == 0) {
279  // Children stored as a vector.
280  const auto& children = std::get<0> (n.m_children);
281  if (validx < children.size()) {
282  inode = children[validx];
283  }
284  else {
285  inode = 0;
286  }
287  }
288  else {
289  // Children stored as a size,node-number field.
290  const auto& children = std::get<1> (n.m_children);
291  if (validx < children.first) {
292  inode = children.second;
293  }
294  else {
295  inode = 0;
296  }
297  }
298 
299  // Give up if no regions match the identifier.
300  if (!inode) {
301  break;
302  }
303 
304  // Record this field in the output.
305  unpackedId.add (val);
306 
307  // Also return the implementation, if requested.
308  // But we need to be sure that we return an implementation that actually
309  // matches the field value.
310  if (impls) {
311  if (n.m_impl.field().match (val)) {
312  impls->push_back (&n.m_impl);
313  }
314  else if (n.m_other_impls) {
315  for (const IdDictFieldImplementation* ii : *n.m_other_impls) {
316  if (ii->field().match (val)) {
317  impls->push_back (ii);
318  break;
319  }
320  }
321  }
322  if (unpackedId.fields() != impls->size()) std::abort();
323  }
324 
325  // Stop if we've reached the end of the identifier.
326  if (inode == IdDictRegionTreeNode::END) break;
327  }
328 
329  return ret;
330 }
331 
332 
340  unsigned ifield,
341  unsigned inode)
342 {
343  using element_type = IdentifierField::element_type;
344  using element_vector = IdentifierField::element_vector;
345  using size_type = IdentifierField::size_type;
346  using index_vector = IdentifierField::index_vector;
347 
348  // Helper to retrieve the indices that may actually be used by a field.
349  // n is the node we're looking for. We use the ored_field referenced there
350  // to know what can actually be stored in the field.
351  // impl gives the field that we're trying to match.
352  // So we return the indices for the ored_field corresponding
353  // to valid values for impl.
354  auto get_field_indices = [] (const IdDictRegionTreeNode& n,
356  {
357  index_vector indices;
358  const Range::field& ored_field = n.m_impl.ored_field();
359  if (impl.field().isEnumerated()) {
360  const element_vector& vals = impl.field().get_values();
361  indices.reserve (vals.size());
362  for (element_type v : vals) {
363  indices.push_back (ored_field.get_value_index (v));
364  }
365  }
366  else if (impl.field().isBounded()) {
367  auto [minval, maxval] = impl.field().get_minmax();
368  size_type minidx = ored_field.get_value_index (minval);
369  size_type maxidx = ored_field.get_value_index (maxval);
370  indices.resize (maxidx - minidx + 1);
371  std::iota (indices.begin(), indices.end(), minidx);
372  }
373  else {
374  std::abort();
375  }
376  return indices;
377  };
378 
379  // This will be the field we're matching.
380  const IdDictFieldImplementation& prev_impl = re.implementation(ifield-1);
381 
382  {
383  // Get the children for the current node.
385  auto& children = std::get<0> (n.m_children);
386 
387  // If we're looking at the last field, fill in the node pointersj
388  // with END; then we're done.
389  if (ifield == re.n_implementation()) {
390  index_vector indices = get_field_indices (n, prev_impl);
391  for (size_t idx : indices) {
393  }
394  return;
395  }
396 
397  // Verify consistency of the field with what's stored in the node.
398  if (prev_impl.bits() != n.m_impl.bits() ||
399  prev_impl.bits_offset() != n.m_impl.bits_offset() ||
400  prev_impl.ored_field() != n.m_impl.ored_field())
401  {
402  dump();
403  std::abort();
404  }
405 
406  // If this implementation has a field that is not equivalent with what
407  // we saved in the node, then save it in m_other_impls.
408  if (n.m_impl.field() != prev_impl.field()) {
409  if (!n.m_other_impls) {
410  n.m_other_impls = std::make_unique<std::vector<const IdDictFieldImplementation*> > (1, &prev_impl);
411  }
412  else {
413  if (std::ranges::find_if (*n.m_other_impls,
414  [&](const IdDictFieldImplementation* a)
415  { return a->field() == prev_impl.field(); })
416  == n.m_other_impls->end())
417  {
418  n.m_other_impls->push_back (&prev_impl);
419  }
420  }
421  }
422  }
423 
424  // Indices we want to store.
425  index_vector indices = get_field_indices (m_region_tree[inode], prev_impl);
426  const IdDictFieldImplementation& impl = re.implementation(ifield);
427 
428  // Children for the node.
429  auto children = [&]() -> std::vector<unsigned>& { return std::get<0> (m_region_tree[inode].m_children); };
430 
431  unsigned new_node = 0;
432  std::vector<unsigned> nodes_seen;
433 
434  // Loop over indices that we want to add.
435  for (size_t idx : indices) {
436 
437  // If we've already recorded this index as END, fail.
438  unsigned next_node = children().at (idx);
439  if (next_node == IdDictRegionTreeNode::END) {
440  dump();
441  std::abort();
442  }
443 
444  if (next_node != 0) {
445  // There is an existing node. Process it recursively; but we only
446  // need to this once for each unique node.
447  if (std::ranges::find (nodes_seen, next_node) == nodes_seen.end()) {
448  add_tree_field (re, ifield+1, next_node);
449  nodes_seen.push_back (next_node);
450  }
451  }
452  else {
453  // No node had been recorded for this index.
454  if (new_node != 0) {
455  // We've already made a new node. So just record it.
456  children().at(idx) = new_node;
457  }
458  else {
459  // Need to make a new node.
460  new_node = m_region_tree.size();
461  if (new_node == IdDictRegionTreeNode::END) {
462  std::abort();
463  }
464  // Careful --- this will invalidate references to nodes.
465  m_region_tree.emplace_back (impl);
466  children().at(idx) = new_node;
467  add_tree_field (re, ifield+1, new_node);
468  }
469  }
470  }
471 }
472 
473 
477 void
479 {
480  // Loop through regions.
481  [[maybe_unused]] unsigned iregion = 0; // Region index, really only for debugging.
482  for (const IdDictRegion* re : m_regions) {
483  // Skip dummy/empty regions.
484  if (re->fieldSize() == 0 || re->name() == "dummy") {
485  ++iregion;
486  continue;
487  }
488 
489  // Add an initial node if we haven't done so already.
490  if (m_region_tree.empty()) {
491  m_region_tree.emplace_back (re->implementation(0));
492  }
493 
494  // Add nodes for the current region, starting at field 1.
495  add_tree_field (*re, 1, 0);
496 
497  ++iregion;
498  }
499 
500  // Compress child vectors if possible.
502  n.optimize();
503  }
504 }
505 
506 
510 void IdDictGroup::dump() const
511 {
512  std::cout << "===== IdDictGroup " << m_name << "\n";
513  dump_regions();
514  dump_tree();
515 }
516 
517 
522 {
523  std::cout << "Regions:\n";
524  for (unsigned iregion = 0; const IdDictRegion* re : m_regions) {
525  std::cout << " " << iregion++ << " " << re->name() << " " << re->group_name() << " " << re->tag() << "\n";
526  size_t nimpl = re->n_implementation();
527  bool first = true;
528  for (size_t i = 0; i < nimpl; ++i) {
529  const IdDictFieldImplementation& impl = re->implementation(i);
530  std::cout << (first ? " " : "; ") << impl.field() << " " << impl.ored_field() << " " << impl.bits() << "/" << impl.bits_offset();
531  first = false;
532  }
533  std::cout << "\n";
534  }
535 }
536 
537 
542 {
543  size_t sz = 0;
544  for (const auto& n : m_region_tree) {
545  if (n.m_children.index() == 0) {
546  sz += std::get<0>(n.m_children).size();
547  }
548  }
549  std::cout << "Region Tree totsize " << sz << "\n";
550  for (unsigned inode = 0; const auto& n : m_region_tree) {
551  std::cout << " " << inode++ << " " << n.m_impl.field()
552  << " " << n.m_impl.ored_field() << " -- ";
553 
554  if (n.m_children.index() == 0) {
555  const auto& children = std::get<0> (n.m_children);
556  unsigned istart = 0;
557  unsigned ichild = 0;
558  bool first = true;
559  for (size_t i = 0; uint64_t c : children) {
560  if (c != ichild) {
561  if (ichild != 0) {
562  if (!first) std::cout << " ";
563  first = false;
564  if (istart != i-1) {
565  std::cout << istart << "-";
566  }
567  std::cout << i-1 << ":";
568  if (ichild == IdDictRegionTreeNode::END) {
569  std::cout << "END";
570  }
571  else {
572  std::cout << ichild;
573  }
574  }
575  ichild = c;
576  istart = i;
577  }
578  ++i;
579  }
580  if (ichild != 0) {
581  if (!first) std::cout << " ";
582  if (istart != children.size()-1) {
583  std::cout << istart << "-";
584  }
585  std::cout << children.size()-1 << ":";
586  if (ichild == IdDictRegionTreeNode::END) {
587  std::cout << "END";
588  }
589  else {
590  std::cout << ichild;
591  }
592  }
593  }
594  else {
595  const auto& children = std::get<1> (n.m_children);
596  if (children.first == 1) {
597  std::cout << "0:";
598  }
599  else {
600  std::cout << "0-" << children.first-1 << ":";
601  }
602  if (children.second == IdDictRegionTreeNode::END) {
603  std::cout << "END";
604  }
605  else {
606  std::cout << children.second;
607  }
608  }
609  if (n.m_other_impls) {
610  std::cout << " [";
611  bool first = true;
612  for (const IdDictFieldImplementation* ii : *n.m_other_impls) {
613  if (!first)
614  std::cout << "; ";
615  else
616  first = false;
617  std::cout << ii->field();
618  }
619  std::cout << "]";
620  }
621  std::cout << "\n";
622  }
623  std::cout.flush();
624 }
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
IdDictMgr.h
beamspotman.r
def r
Definition: beamspotman.py:672
IdDictRegion::clear
virtual void clear() override
Definition: IdDictRegion.cxx:225
IdDictGroup::m_name
std::string m_name
Definition: IdDictGroup.h:117
IdDictRegion::build_range
virtual Range build_range() const override
Definition: IdDictRegion.cxx:265
IdDictAltRegions::selected_region
IdDictRegion * selected_region()
Currently selected region.
Definition: IdDictAltRegions.h:81
fitman.sz
sz
Definition: fitman.py:527
get_generator_info.result
result
Definition: get_generator_info.py:21
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
IdentifierField::element_type
ExpandedIdentifier::element_type element_type
Definition: IdentifierField.h:85
index
Definition: index.py:1
IdDictGroup::sort
void sort()
Sort:
Definition: IdDictGroup.cxx:148
IdDictGroup::m_regions
std::vector< IdDictRegion * > m_regions
Definition: IdDictGroup.h:119
IdDictDictionary.h
Trk::indices
std::pair< long int, long int > indices
Definition: AlSymMatBase.h:24
Range.h
IdDictGroup::verify
bool verify() const
Definition: IdDictGroup.cxx:134
ExpandedIdentifier::add
void add(element_type value)
Append a value into a new field.
RangeIterator
This iterator is able to generate all possible identifiers, from a fully bounded Range.
Definition: RangeIterator.h:19
ExpandedIdentifier
Definition: DetectorDescription/Identifier/Identifier/ExpandedIdentifier.h:102
ExpandedIdentifier::fields
size_type fields() const
ExpandedIdentifier.h
Debugger.h
m_name
std::string m_name
Definition: ColumnarPhysliteTest.cxx:64
IdDictDictEntry
Definition: IdDictDictEntry.h:13
IdDictAltRegions
Definition: IdDictAltRegions.h:20
IdDictGroup::dump_tree
void dump_tree() const
Dump the tree structure built from the regions for fast unpacking.
Definition: IdDictGroup.cxx:541
IdDictGroup.h
IdDictRegion
Definition: IdDictRegion.h:20
IdDictGroup::generate_implementation
void generate_implementation(const IdDictMgr &idd, IdDictDictionary &dictionary, const std::string &tag="")
Definition: IdDictGroup.cxx:88
RangeIterator::begin
RangeIterator begin() const
Definition: RangeIterator.cxx:12
IdDictAltRegions.h
IdDictGroup::m_entries
std::vector< IdDictDictEntry * > m_entries
Definition: IdDictGroup.h:118
IdDictGroup::region
const IdDictRegion & region(size_t index) const
Definition: IdDictGroup.h:227
IdentifierField::match
bool match(element_type value) const
The basic match operation Given a value, test to see if it satisfies the constraints for this field.
Definition: IdentifierField.cxx:71
IdDictGroup::resolve_references
void resolve_references(const IdDictMgr &idd, IdDictDictionary &dictionary, size_t &index)
Definition: IdDictGroup.cxx:76
IdDictMgr
Definition: IdDictMgr.h:15
IdDictGroup::build_region_tree
void build_region_tree()
Take the list of regions and build a tree structure for fast unpacking.
Definition: IdDictGroup.cxx:478
IdDictFieldImplementation::field
const Range::field & field() const
Definition: IdDictFieldImplementation.h:191
IdentifierField::get_value_index
size_type get_value_index(element_type value) const
Definition: IdentifierField.cxx:49
lumiFormat.i
int i
Definition: lumiFormat.py:85
IdDictGroup::IdDictGroup
IdDictGroup()
Definition: IdDictGroup.cxx:22
beamspotman.n
n
Definition: beamspotman.py:727
IdDictGroup::build_multirange
MultiRange build_multirange() const
Get MultiRange for this group.
Definition: IdDictGroup.cxx:51
IdDictGroup::unpack
int unpack(const Identifier &id, const ExpandedIdentifier &prefix, size_t index2, ExpandedIdentifier &unpackedId, std::vector< const IdDictFieldImplementation * > *impls=nullptr) const
Unpack the value_type id to an expanded Identifier, considering the provided prefix (result will incl...
Definition: IdDictGroup.cxx:230
IdDictFieldImplementation::bits_offset
size_type bits_offset() const
Definition: IdDictFieldImplementation.h:208
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:194
checkCorrelInHIST.prefix
dictionary prefix
Definition: checkCorrelInHIST.py:391
IdDictGroup::clear
void clear()
Definition: IdDictGroup.cxx:178
IdDictGroup::add_dictentry
void add_dictentry(IdDictDictEntry *entry)
Definition: IdDictGroup.cxx:71
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
IdDictGroup::IdDictRegionTreeNode::IdDictRegionTreeNode
IdDictRegionTreeNode(const IdDictFieldImplementation &impl)
Constructor, taking a reference to the implementation.
Definition: IdDictGroup.cxx:190
IdDictFieldImplementation::ored_field
const Range::field & ored_field() const
Definition: IdDictFieldImplementation.h:196
Debugger::debug
static bool debug()
Definition: Debugger.h:18
IdDictGroup::regions
const std::vector< IdDictRegion * > & regions()
Definition: IdDictGroup.cxx:46
IdentifierField::element_vector
std::vector< element_type > element_vector
Definition: IdentifierField.h:87
IdDictGroup::m_region_tree
std::vector< IdDictRegionTreeNode > m_region_tree
The list of region nodes.
Definition: IdDictGroup.h:215
IdDictGroup::IdDictRegionTreeNode::END
static constexpr unsigned END
Special value used to indicate that we've reached the end.
Definition: IdDictGroup.h:212
MultiRange
A MultiRange combines several Ranges.
Definition: MultiRange.h:17
master.dictionary
dictionary
Definition: master.py:47
Trk::index2
@ index2
Definition: BoundarySurfaceFace.h:49
IdentifierField::size_type
ExpandedIdentifier::size_type size_type
Definition: IdentifierField.h:86
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
RangeIterator.h
IdDictGroup::IdDictRegionTreeNode
Tree structure for fast unpacking.
Definition: IdDictGroup.h:184
IdDictGroup::IdDictRegionTreeNode::optimize
void optimize()
Compress the vector of node indices, if they are all the same.
Definition: IdDictGroup.cxx:199
IdentifierField::index_vector
std::vector< size_type > index_vector
Definition: IdentifierField.h:88
ReadLUTFromCool.maxidx
maxidx
Definition: ReadLUTFromCool.py:116
Range
A Range describes the possible ranges for the field values of an ExpandedIdentifier.
Definition: DetectorDescription/Identifier/Identifier/Range.h:29
MultiRange.h
IdDictDictionary
Definition: IdDictDictionary.h:30
IdDictFieldImplementation.h
RangeIterator::end
RangeIterator end() const
Definition: RangeIterator.cxx:24
python.PyAthena.v
v
Definition: PyAthena.py:154
impl
Definition: CaloGPUClusterAndCellDataMonitorOptions.h:46
IdDictGroup::name
const std::string & name()
Definition: IdDictGroup.cxx:36
DeMoScan.index
string index
Definition: DeMoScan.py:362
IdDictGroup::reset_implementation
void reset_implementation()
Definition: IdDictGroup.cxx:123
a
TList * a
Definition: liststreamerinfos.cxx:10
IdDictGroup::m_generated_implementation
bool m_generated_implementation
Definition: IdDictGroup.h:120
IdDictGroup::add_tree_field
void add_tree_field(const IdDictRegion &re, unsigned ifield, unsigned inode)
Recursively add new nodes to the tree structure.
Definition: IdDictGroup.cxx:339
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
DeMoScan.first
bool first
Definition: DeMoScan.py:534
re
const boost::regex re(r_e)
IdentifierField
This is the individual specification for the range of one ExpandedIdentifier IdentifierField.
Definition: IdentifierField.h:83
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
ExpandedIdentifier::clear
void clear()
Erase all fields.
python.DecayParser.children
children
Definition: DecayParser.py:31
IdDictGroup::entries
const std::vector< IdDictDictEntry * > & entries()
Definition: IdDictGroup.cxx:41
IdDictRegion.h
CaloCondBlobAlgs_fillNoiseFromASCII.tag
string tag
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:23
IdDictFieldImplementation
IdDictFieldImplementation is used to capture the specification of a single field of an Identifier.
Definition: IdDictFieldImplementation.h:58
IdDictRegion::is_empty
bool is_empty() const
Definition: IdDictRegion.h:287
IdDictGroup::~IdDictGroup
~IdDictGroup()
Definition: IdDictGroup.cxx:33
ExpandedIdentifier::element_type
int element_type
Definition: DetectorDescription/Identifier/Identifier/ExpandedIdentifier.h:106
IdDictGroup::dump_regions
void dump_regions() const
Dump the list of regions for this group.
Definition: IdDictGroup.cxx:521
python.compressB64.c
def c
Definition: compressB64.py:93
IdDictRegion::name
const std::string & name() const
Definition: IdDictRegion.h:154
inode
Definition: listroot.cxx:155
IdDictFieldImplementation::bits
size_type bits() const
Definition: IdDictFieldImplementation.h:202
IdDictGroup::dump
void dump() const
Dump regions and tree for this group.
Definition: IdDictGroup.cxx:510
PlotCalibFromCool.vals
vals
Definition: PlotCalibFromCool.py:474
Identifier
Definition: IdentifierFieldParser.cxx:14