ATLAS Offline Software
Loading...
Searching...
No Matches
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 }
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.
bool treatAsInserted(typename std::vector< typename T_ModuleHelper::KEY_TYPE >::iterator begin_range_iter, typename T_ModuleHelper::KEY_TYPE defect_type_key_component)
T_ModuleHelper::KEY_TYPE makePrevKey(T_ModuleHelper &helper, typename T_ModuleHelper::KEY_TYPE key)

◆ 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 }
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)
void swap(ElementLinkVector< DOBJ > &lhs, ElementLinkVector< DOBJ > &rhs)

◆ 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 }