ATLAS Offline Software
Functions
EmulatedDefectsBuilder Namespace Reference

Functions

template<typename T_ModuleHelper >
bool treatAsInserted (typename std::vector< typename T_ModuleHelper::KEY_TYPE >::iterator begin_range_iter, typename T_ModuleHelper::KEY_TYPE defect_type_key_component)
 
template<typename T_ModuleHelper >
T_ModuleHelper::KEY_TYPE makeNextKey (typename T_ModuleHelper::KEY_TYPE key)
 
template<typename T_ModuleHelper >
T_ModuleHelper::KEY_TYPE makePrevKey (T_ModuleHelper &helper, typename T_ModuleHelper::KEY_TYPE key)
 
template<typename T_ModuleHelper >
bool insertKey (const T_ModuleHelper &helper, std::vector< typename T_ModuleHelper::KEY_TYPE > &module_defects, typename T_ModuleHelper::KEY_TYPE key, typename T_ModuleHelper::KEY_TYPE defect_type_key_component)
 
template<typename T_ModuleHelper >
bool insertKeyRange (const T_ModuleHelper &helper, std::vector< typename T_ModuleHelper::KEY_TYPE > &module_defects, const std::pair< typename T_ModuleHelper::KEY_TYPE, typename T_ModuleHelper::KEY_TYPE > &key_range, typename T_ModuleHelper::KEY_TYPE defect_type_key_component)
 

Function Documentation

◆ insertKey()

template<typename T_ModuleHelper >
bool EmulatedDefectsBuilder::insertKey ( const T_ModuleHelper &  helper,
std::vector< typename T_ModuleHelper::KEY_TYPE > &  module_defects,
typename T_ModuleHelper::KEY_TYPE  key,
typename T_ModuleHelper::KEY_TYPE  defect_type_key_component 
)

Definition at line 71 of file EmulatedDefectsBuilder.h.

74  {
75  auto [iter, end_iter] = InDet::EmulatedDefects<T_ModuleHelper>::lower_bound(module_defects, key);
76  if (iter != module_defects.end() ) {
77  // if lower_bound is a range or is identical to key, then
78  // this key is already covered by the existing module_defects
79  // just test whether it should be treated as a newly inserted key or as a collision
80  if ((T_ModuleHelper::isRangeKey(*iter) || T_ModuleHelper::makeBaseKey(*iter)==key)) return treatAsInserted<T_ModuleHelper>(iter,defect_type_key_component);
81 
82  // if this key and lower bound are connected then turn lower_bound into a range
83  // since iter is not a range but there may still be a defect type which is part of this key.
84  typename T_ModuleHelper::KEY_TYPE prev_key = makePrevKey(helper,key);
85  // the iter is <= key however prev_key may be < iter if extended to row end
86  // and iter extended to just before the next column
87  if (T_ModuleHelper::makeBaseKey(*iter)>=prev_key) {
88  auto next =iter;
89  ++next;
90  if (next != module_defects.end() && T_ModuleHelper::isRangeKey(*next)) {
91  // extend existing range
92  iter = module_defects.erase( iter);
93  }
94  else {
95  *iter = T_ModuleHelper::makeRangeKey(*iter) ;
96  }
97  }
98  }
99  // if there is a larger key ( iterator --)
100  // then check if this key and the larger key are connected
101  // if this key is connected to the lower bound then do not insert
102  // otherwise insert and turn into range
103  if (iter != module_defects.begin()) {
104  auto prev = iter;
105  --prev;
106  typename T_ModuleHelper::KEY_TYPE prev_key = makePrevKey(helper,*prev);
107  if (T_ModuleHelper::makeBaseKey(prev_key) == key) {
108  // if the larger key is a range, remove it because the new range
109  // starting with this key or the range of iter will coover it.
110  if (T_ModuleHelper::isRangeKey(*prev)) {
111  if (iter == module_defects.end() || !T_ModuleHelper::isRangeKey(*iter)) {
112  // if this key is to be inserted
113  // just extent the existing range
114  *prev = T_ModuleHelper::makeRangeKey(key) | T_ModuleHelper::getDefectTypeComponent(*prev);
115  return true;
116  }
117  else {
118  // otherwise remove the larger key, since it will become part of
119  // the extended range.
120  module_defects.erase(prev);
121  }
122  return true;
123  }
124  else if (iter != module_defects.end() && T_ModuleHelper::isRangeKey(*iter)) {
125  // the key is in between iter and prev nothing new needs to be isnerted
126  return true;
127  }
128  // otherwise turn this key into a range
129  key=T_ModuleHelper::makeRangeKey(key) | T_ModuleHelper::getDefectTypeComponent(*prev);
130  }
131  }
132  if constexpr(T_ModuleHelper::TYPE_BITS>0) {
133  // if no defect type has been inherited from a connected larger key
134  // set the defect type
135  if (!T_ModuleHelper::getDefectTypeComponent(key)) {
136  key |= defect_type_key_component;
137  }
138  }
139  // the key is inserted if it is not connected to iter
140  // either as single key or a range if connected to the key which is larger than this key.
141  // or if it is not connected to the larger key as a single key
142  iter = module_defects.insert(iter,key);
143  return true;
144  }

◆ insertKeyRange()

template<typename T_ModuleHelper >
bool EmulatedDefectsBuilder::insertKeyRange ( const T_ModuleHelper &  helper,
std::vector< typename T_ModuleHelper::KEY_TYPE > &  module_defects,
const std::pair< typename T_ModuleHelper::KEY_TYPE, typename T_ModuleHelper::KEY_TYPE > &  key_range,
typename T_ModuleHelper::KEY_TYPE  defect_type_key_component 
)

Definition at line 147 of file EmulatedDefectsBuilder.h.

150  {
151  if (key_range.first == key_range.second) {
152  return insertKey<T_ModuleHelper>(helper, module_defects, key_range.first, defect_type_key_component);
153  }
154 
155  auto [key_start,key_end ] = key_range;
156  if (key_end < key_start) {
157  std::swap(key_start,key_end);
158  }
159  if (helper.getRow(key_end)+1u==helper.rowsPerCircuit()) {
160  // if the and is the last row extend to the maximum value, to allow for merging
161  // adjacent columns
162  key_end = helper.makeKey(false, helper.getChip(key_end), helper.getColumn(key_end), helper.getLimitRowMax());
163  }
164  if (helper.getRow(key_start)==0u && helper.getColumn(key_start)>0) {
165  key_start = helper.makeKey(false, helper.getChip(key_start), helper.getColumn(key_start)-1, helper.rowsPerCircuit());
166  }
167 
168  // cases
169  // no lower bound for end and start
170  // add range at end
171  // no lower bounds for end but lower bounds for start
172  // add range start at end
173  //
174  // is lower bound range
175  //
176  // lower bound for end and start
177 
178  auto [iter, end_iter] = InDet::EmulatedDefects<T_ModuleHelper>::lower_bound(module_defects, key_start);
179  bool is_range = (iter != end_iter && T_ModuleHelper::isRangeKey(*iter));
180  bool inserted_something=false;
181  if (!is_range) {
182  // the prev key could be before *iter if *iter marks the end of a row which is extended just before the first row of the next column
183  if (iter != end_iter && ( T_ModuleHelper::makeBaseKey(*iter) == key_start
184  || T_ModuleHelper::makeBaseKey(*iter) >= makePrevKey(helper,key_start))) {
185  auto next=iter;
186  ++next;
187  if (next != end_iter && T_ModuleHelper::isRangeKey(*next)) {
188  // the smaller key is a range
189  // so remove the range and since it will be replaced by a new range end
190  iter = module_defects.erase(iter);
191  }
192  else {
193  if (T_ModuleHelper::makeBaseKey(*iter) == key_start) {
194  if ( defect_type_key_component > helper.getDefectTypeComponent(*iter)) {
195  *iter = (*iter & (~T_ModuleHelper::TYPE_MASK)) | defect_type_key_component;
196  }
197  }
198  // the small key is connected, so this will become the range start
199  if (helper.getRow(*iter)==0u && helper.getColumn(*iter)>0) {
200  // if at the bottom row extend range to above the last row of the previous column
201  *iter = helper.makeKey(true, helper.getChip(*iter), helper.getColumn(*iter)-1, helper.rowsPerCircuit()) | helper.getDefectTypeComponent(*iter);
202  }
203  else {
204  *iter = T_ModuleHelper::makeRangeKey(*iter);
205  }
206  }
207  }
208  else {
209  iter = module_defects.insert(iter,T_ModuleHelper::makeRangeKey(key_start) | defect_type_key_component);
210  }
211  inserted_something=true;
212  }
213 
214  // remove all keys which are included in the range up to end_key
215  // if end_key is included in a range, then do not insert
216  while (iter != module_defects.begin()) {
217  --iter; // go to the key which is larger than key_start
218 
219  // if that key is larger or equal to key_end then stop.
220  if (T_ModuleHelper::makeBaseKey(*iter) >= key_end) {
221 
222  // if key_end is included in a range or connected or equal to iter
223  // then iter marks already an extended range, otherwise key_end needs to be inserted.
224  // (prev key can be smaller than key_end if key_end is extended towards the beginning of the next column
225  // and/or prev key extend to above the last r
226  if (is_range || T_ModuleHelper::makeBaseKey(*iter) == key_end || makePrevKey(helper,*iter) <= key_end) {
227  // if the end key and iter are connected but not the same, and the end key not included in a range with
228  // a higher defect type, then treat as inserted.
229  inserted_something |= ( T_ModuleHelper::makeBaseKey(*iter) > key_end ) && (!is_range || defect_type_key_component > helper.getDefectTypeComponent(*iter)) ;
230  // if iter is the start of a range than it is replaced by a new range start, so needs to be erased
231  if (T_ModuleHelper::isRangeKey(*iter)) {
232  module_defects.erase(iter);
233  }
234  else {
235  if (T_ModuleHelper::makeBaseKey(*iter) == key_end) {
236  if ( defect_type_key_component > helper.getDefectTypeComponent(*iter)) {
237  *iter = (*iter & (~T_ModuleHelper::TYPE_MASK)) | defect_type_key_component;
238  }
239  }
240  }
241  return inserted_something;
242  }
243  ++iter;
244  break;
245  }
246  // remember whether iter is a range start (--iter will be the range end)
247  is_range=T_ModuleHelper::isRangeKey(*iter);
248  // iter is includes in the new range key_start - key_end, so remove it
249  iter=module_defects.erase(iter);
250  }
251  module_defects.insert(iter,key_end | defect_type_key_component );
252  return true;
253  }

◆ makeNextKey()

template<typename T_ModuleHelper >
T_ModuleHelper::KEY_TYPE EmulatedDefectsBuilder::makeNextKey ( typename T_ModuleHelper::KEY_TYPE  key)

Definition at line 33 of file EmulatedDefectsBuilder.h.

33  {
34  return T_ModuleHelper::makeBaseKey(key)+1;
35  }

◆ makePrevKey()

template<typename T_ModuleHelper >
T_ModuleHelper::KEY_TYPE EmulatedDefectsBuilder::makePrevKey ( T_ModuleHelper &  helper,
typename T_ModuleHelper::KEY_TYPE  key 
)

Definition at line 37 of file EmulatedDefectsBuilder.h.

37  {
38  unsigned int row = helper.getRow(key);
39  if (row==0u) {
40  if (helper.getColumn(key)>0) {
41  return helper.makeKey(false, helper.getChip(key), helper.getColumn(key)-1, helper.rowsPerCircuit()-1);
42  }
43  else if (helper.getChip(key)>0) {
44  return helper.makeKey(false, helper.getChip(key)-1, helper.columnsPerCircuit()-1, helper.rowsPerCircuit()-1);
45  }
46  else {
47  return key;
48  }
49  }
50  else {
51  if (row >= helper.rowsPerCircuit()) {
52  return helper.makeKey(false, helper.getChip(key), helper.getColumn(key), helper.rowsPerCircuit()-1);
53  }
54  else {
55  return T_ModuleHelper::makeBaseKey(key)-1;
56  }
57  }
58  }

◆ treatAsInserted()

template<typename T_ModuleHelper >
bool EmulatedDefectsBuilder::treatAsInserted ( typename std::vector< typename T_ModuleHelper::KEY_TYPE >::iterator  begin_range_iter,
typename T_ModuleHelper::KEY_TYPE  defect_type_key_component 
)

Definition at line 12 of file EmulatedDefectsBuilder.h.

13  {
14  // collision_mask=(~collision_mask) & (T_ModuleHelper::CHIP_MASK|T_ModuleHelper::COL_MASK|T_ModuleHelper::ROW_MASK);
15  // if (T_ModuleHelper::isRangeKey(*begin_range_iter) && collision_mask>1) {
16  // auto prev=begin_range_iter;
17  // --prev;
18  // if (*prev - T_ModuleHelper::makeBaseKey(*begin_range_iter) > collision_mask) return true;
19  // }
20 
21  // treat as inserted when attempting to insert a lower tier defect but is ovlapping with a higher tier defect;
22  if (defect_type_key_component < T_ModuleHelper::getDefectTypeComponent(*begin_range_iter)) {
23  return true;
24  }
25  else {
26  // update defect type
27  *begin_range_iter = (*begin_range_iter & (~T_ModuleHelper::TYPE_MASK)) | defect_type_key_component;
28  return false;
29  }
30  }
createLinkingScheme.iter
iter
Definition: createLinkingScheme.py:62
keylayer_zslicemap.row
row
Definition: keylayer_zslicemap.py:155
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:77
runBeamSpotCalibration.helper
helper
Definition: runBeamSpotCalibration.py:115
InDet::EmulatedDefects::lower_bound
static std::pair< typename std::vector< KEY_TYPE >::iterator, typename std::vector< KEY_TYPE >::iterator > lower_bound(std::vector< KEY_TYPE > &module_defects, KEY_TYPE key)
Convenience method to find the preceding defect.
Definition: EmulatedDefects.h:59
fillPileUpNoiseLumi.next
next
Definition: fillPileUpNoiseLumi.py:52
EmulatedDefectsBuilder::makePrevKey
T_ModuleHelper::KEY_TYPE makePrevKey(T_ModuleHelper &helper, typename T_ModuleHelper::KEY_TYPE key)
Definition: EmulatedDefectsBuilder.h:37
WriteCalibToCool.swap
swap
Definition: WriteCalibToCool.py:94
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37