ATLAS Offline Software
IdDictRange.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3  */
4 #include "IdDict/IdDictRange.h"
5 #include "IdDict/IdDictField.h"
6 #include "IdDict/IdDictRegion.h"
7 #include "IdDict/IdDictMgr.h"
10 
11 #include "src/Debugger.h"
12 #include <iostream>
13 
14 
16 IdDictRange::IdDictRange (const std::string& field_name)
17  : m_field_name (field_name)
18 {
19 }
20 
21 
23 IdDictRange::IdDictRange (const std::string& field_name,
24  const std::string& label)
25  : m_field_name (field_name)
26 {
27  set_range (label);
28 }
29 
30 
32 IdDictRange::IdDictRange (const std::string& field_name,
33  int value)
34  : m_field_name (field_name)
35 {
36  set_range (value);
37 }
38 
39 
41 IdDictRange::IdDictRange (const std::string& field_name,
42  int minvalue, int maxvalue)
43  : m_field_name (field_name)
44 {
45  set_range (minvalue, maxvalue);
46 }
47 
48 
50 IdDictRange::IdDictRange (const std::string& field_name,
51  const std::vector<int>& values)
52  : m_field_name (field_name)
53 {
54  set_range (values);
55 }
56 
57 
59 IdDictRange::IdDictRange (const std::string& field_name,
60  const std::vector<std::string>& labels)
61  : m_field_name (field_name)
62 {
63  set_range (labels);
64 }
65 
66 
68 void IdDictRange::set_range (const std::string& label)
69 {
71  m_label = label;
72 }
73 
74 
77 {
79  m_value = value;
80 }
81 
82 
84 void IdDictRange::set_range (int minvalue, int maxvalue)
85 {
87  m_minvalue = minvalue;
88  m_maxvalue = maxvalue;
89 }
90 
91 
93 void IdDictRange::set_range (const std::vector<int>& values)
94 {
96  m_values = values;
97 }
98 
99 
101 void IdDictRange::set_range (const std::vector<std::string>& labels)
102 {
104  m_labels = labels;
105 }
106 
107 
109 void IdDictRange::set_prev(int prev)
110 {
111  m_prev_value = prev;
113 }
114 
115 
118 {
119  m_next_value = next;
121 }
122 
123 
126 {
128 }
129 
130 
131 void
133  IdDictDictionary& dictionary, IdDictRegion& /*region*/) {
134  if (!m_resolved_references) {
135  m_field = dictionary.find_field(m_field_name);
136  if (m_field == nullptr) {
138  dictionary.add_field(m_field);
139  }
140 
141  if (m_specification == unknown) {
151  unsigned int labels = m_field->get_label_number();
152  if (labels == 1) {
154  m_label = m_field->get_label(0);
155  } else if (labels > 1) {
157  for (size_t i = 0; i < labels; ++i) {
158  m_labels.push_back(m_field->get_label(i));
159  }
160  }
161  }
162 
163  if (m_specification == by_label) {
165  } else if (m_specification == by_labels) {
166  m_values.clear();
167  for (size_t i = 0; i < m_labels.size(); ++i) {
168  const std::string& label = m_labels[i];
170  m_values.push_back(value);
171  }
172  }
173  m_resolved_references = true;
174  }
175 }
176 
177 void
179  IdDictDictionary& dictionary, IdDictRegion& region, const std::string& /*tag*/) {
180  // Add IdDictFieldImplementation to this region
181 
182  // NOTE: we DO NOT protect this method with
183  // m_generated_implementation because the same object may be
184  // called more than once because there are IdDictRangeRef's which
185  // point to the same IdDictRange's.
186 
187  if (Debugger::debug()) {
188  std::cout << "IdDictRange::generate_implementation>" << std::endl;
189  }
190 
192  impl.set_range(this);
193  if (m_field->index() == 0) {
194  m_field->set_index(region.fieldSize() - 1);
195  } else if (m_field->index() != (region.fieldSize() - 1)) {
196  std::cout << "Bad field index for " << m_field_name
197  << " index " << m_field->index()
198  << " in dictionary " << dictionary.name()
199  << " region #" << region.index()
200  << " group " << region.group_name()
201  << " tag " << region.tag()
202  << " size " << (region.n_implementation() - 1)
203  << std::endl;
204  }
205 
206  size_t index = region.n_implementation() - 1;
207  if (region.n_implementation() <= index) {
208  std::cout << "IdDictRange::generate_implementation: index >= impl size - "
209  << index << " " << region.fieldSize()
210  << std::endl;
211  return;
212  }
213 
215  switch (m_specification) {
216  case by_value:
217  case by_label: {
218  impl.set_field(Range::field(m_value, m_value));
219  break;
220  }
221 
222  case by_values:
223  case by_labels: {
224  impl.set_field(Range::field(m_values));
225  }
226  break;
227 
228  case by_minmax:
229  impl.set_field(Range::field(m_minvalue, m_maxvalue));
230  break;
231 
232  case unknown:
233  break;
234  }
235 }
236 
237 Range
239  Range result;
240 
242  switch (m_specification) {
243  case by_value:
244  case by_label: {
245  field.set(m_value, m_value);
246  break;
247  }
248 
249  case by_values:
250  case by_labels: {
251  field.set(m_values);
252  break;
253  }
254 
255  case by_minmax: {
257  break;
258  }
259 
260  case unknown: {
261  break;
262  }
263  }
265  field.set(true);
266  } else if (has_previous == m_continuation_mode) {
267  field.set_previous(m_prev_value);
268  } else if (has_next == m_continuation_mode) {
269  field.set_next(m_next_value);
270  } else if (has_both == m_continuation_mode) {
271  field.set_previous(m_prev_value);
272  field.set_next(m_next_value);
273  }
274  result.add(std::move(field));
275  return(result);
276 }
IdDictRange::generate_implementation
virtual void generate_implementation(const IdDictMgr &idd, IdDictDictionary &dictionary, IdDictRegion &region, const std::string &tag="") override
Definition: IdDictRange.cxx:178
IdDictRange.h
IdDictMgr.h
IdDictField::set_index
void set_index(size_t index)
Definition: IdDictField.cxx:38
IdDictRange::set_prev
void set_prev(int prev)
Set previous value and adjust continuation mode.
Definition: IdDictRange.cxx:109
IdDictField::get_label
const std::string & get_label(size_t index) const
Definition: IdDictField.cxx:48
get_generator_info.result
result
Definition: get_generator_info.py:21
IdDictRange::resolve_references
virtual void resolve_references(const IdDictMgr &idd, IdDictDictionary &dictionary, IdDictRegion &region) override
Definition: IdDictRange.cxx:132
IdDictRange::by_minmax
@ by_minmax
Definition: IdDictRange.h:26
index
Definition: index.py:1
IdDictRange::by_label
@ by_label
Definition: IdDictRange.h:24
IdDictDictionary.h
IdDictRange::build_range
virtual Range build_range() const override
Definition: IdDictRange.cxx:238
IdDictRange::m_field_name
std::string m_field_name
Definition: IdDictRange.h:122
IdDictRange::by_labels
@ by_labels
Definition: IdDictRange.h:25
IdDictRange::set_wrap_around
void set_wrap_around()
Enable wraparound.
Definition: IdDictRange.cxx:125
athena.value
value
Definition: athena.py:124
Debugger.h
IdDictRange::set_next
void set_next(int next)
Set next value and adjust continuation mode.
Definition: IdDictRange.cxx:117
IdDictRange::m_specification
specification_type m_specification
Definition: IdDictRange.h:125
IdDictField::index
size_t index() const
Definition: IdDictField.h:67
IdDictRegion::tag
const std::string & tag() const
Definition: IdDictRegion.h:161
IdDictRange::field
const IdDictField * field() const
Definition: IdDictRange.h:156
IdDictRegion
Definition: IdDictRegion.h:20
IdDictRegion::new_implementation
IdDictFieldImplementation & new_implementation()
Add a new implementation object and return a reference to it.
Definition: IdDictRegion.cxx:65
python.Bindings.values
values
Definition: Control/AthenaPython/python/Bindings.py:808
IdDictRange::m_field
IdDictField * m_field
Definition: IdDictRange.h:123
IdDictRange::has_previous
@ has_previous
Definition: IdDictRange.h:31
IdDictMgr
Definition: IdDictMgr.h:14
beamspotnt.labels
list labels
Definition: bin/beamspotnt.py:1446
IdDictRange::m_maxvalue
int m_maxvalue
Definition: IdDictRange.h:130
fillPileUpNoiseLumi.next
next
Definition: fillPileUpNoiseLumi.py:52
lumiFormat.i
int i
Definition: lumiFormat.py:85
IdDictRange::values
const std::vector< int > & values() const
Definition: IdDictRange.h:170
IdDictRange::has_both
@ has_both
Definition: IdDictRange.h:32
IdDictRange::m_prev_value
int m_prev_value
Definition: IdDictRange.h:131
IdDictField::get_label_number
size_t get_label_number() const
Definition: IdDictField.cxx:43
add-xsec-uncert-quadrature-N.label
label
Definition: add-xsec-uncert-quadrature-N.py:104
IdDictRegion::fieldSize
size_t fieldSize() const
Definition: IdDictRegion.cxx:236
IdDictRange::unknown
@ unknown
Definition: IdDictRange.h:21
IdDictRange::m_value
int m_value
Definition: IdDictRange.h:128
IdDictRange::label
const std::string & label() const
Definition: IdDictRange.h:149
Debugger::debug
static bool debug()
Definition: Debugger.h:18
IdDictRegion::n_implementation
size_t n_implementation() const
Definition: IdDictRegion.cxx:28
IdDictField::get_label_value
ExpandedIdentifier::element_type get_label_value(const std::string &name) const
Definition: IdDictField.cxx:58
master.dictionary
dictionary
Definition: master.py:47
IdDictRange::m_labels
std::vector< std::string > m_labels
Definition: IdDictRange.h:134
IdDictRange::has_next
@ has_next
Definition: IdDictRange.h:30
Range
A Range describes the possible ranges for the field values of an ExpandedIdentifier.
Definition: DetectorDescription/Identifier/Identifier/Range.h:29
IdDictRange::m_continuation_mode
continuation_mode m_continuation_mode
Definition: IdDictRange.h:133
IdDictDictionary
Definition: IdDictDictionary.h:30
IdDictFieldImplementation.h
IdDictRange::set_range
void set_range(const std::string &label)
By label.
Definition: IdDictRange.cxx:68
impl
Definition: CaloGPUClusterAndCellDataMonitorOptions.h:46
IdDictRange::labels
const std::vector< std::string > & labels() const
Definition: IdDictRange.h:177
DeMoScan.index
string index
Definition: DeMoScan.py:362
IdDictRange::IdDictRange
IdDictRange(const std::string &field_name)
Set name only; no range information.
Definition: IdDictRange.cxx:16
IdDictField.h
IdDictRange::m_resolved_references
bool m_resolved_references
Definition: IdDictRange.h:137
IdentifierField
This is the individual specification for the range of one ExpandedIdentifier IdentifierField.
Definition: IdentifierField.h:83
IdDictRange::by_values
@ by_values
Definition: IdDictRange.h:23
IdDictRegion::index
size_t index() const
Definition: IdDictRegion.h:168
IdDictRange::m_label
std::string m_label
Definition: IdDictRange.h:127
IdDictRegion.h
IdDictRange::by_value
@ by_value
Definition: IdDictRange.h:22
IdDictField
Definition: IdDictField.h:15
IdDictRange::wrap_around
@ wrap_around
Definition: IdDictRange.h:33
IdDictFieldImplementation
IdDictFieldImplementation is used to capture the specification of a single field of an Identifier.
Definition: IdDictFieldImplementation.h:58
IdDictRange::m_minvalue
int m_minvalue
Definition: IdDictRange.h:129
IdDictRegion::group_name
virtual std::string group_name() const override
Definition: IdDictRegion.cxx:23
IdDictRange::m_next_value
int m_next_value
Definition: IdDictRange.h:132
IdDictRange::m_values
std::vector< int > m_values
Definition: IdDictRange.h:135