ATLAS Offline Software
Loading...
Searching...
No Matches
ThinningDecisionBase.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
3 */
10
11
13#include <stdexcept>
14
15
16namespace SG {
17
18
27
28
34{
35 m_mask.resize (size);
36}
37
38
43{
44 return m_mask.size() - m_mask.count();
45}
46
47
52{
53 m_mask.set();
54}
55
56
61{
62 m_mask.reset();
63}
64
65
71{
72 if (ndx >= m_mask.size()) {
73 throw std::out_of_range ("ThinningDecisionBase::thin");
74 }
75 m_mask.set (ndx, true);
76}
77
78
85{
86 if (ndx >= m_mask.size()) {
87 throw std::out_of_range ("ThinningDecisionBase::thin");
88 }
89 m_mask.set (ndx, false);
90}
91
92
102void ThinningDecisionBase::thin (size_t ndx, bool flag, Op op /*= Op::Set*/)
103{
104 if (ndx >= m_mask.size()) {
105 throw std::out_of_range ("ThinningDecisionBase::thin");
106 }
107 if (op == Op::And)
108 flag &= m_mask[ndx];
109 else if (op == Op::Or)
110 flag |= m_mask[ndx];
111 m_mask.set (ndx, flag);
112}
113
114
124void ThinningDecisionBase::keep (size_t ndx, bool flag, Op op /*= Op::Set*/)
125{
126 if (ndx >= m_mask.size()) {
127 throw std::out_of_range ("ThinningDecisionBase::thin");
128 }
129 if (op == Op::And)
130 flag &= !m_mask[ndx];
131 else if (op == Op::Or)
132 flag |= !m_mask[ndx];
133 m_mask.set (ndx, !flag);
134}
135
136
146void ThinningDecisionBase::thin (const std::vector<bool>& v, Op op /*= Op::Set*/)
147{
148 size_t sz = m_mask.size();
149 if (sz != v.size()) {
150 throw std::out_of_range ("ThinningDecisionBase::thin(): inconsistent vector sizes.");
151 }
152 for (size_t i = 0; i < sz; i++) {
153 bool flag = v[i];
154 if (op == Op::And)
155 flag &= m_mask[i];
156 else if (op == Op::Or)
157 flag |= m_mask[i];
158 m_mask.set (i, flag);
159 }
160}
161
162
172void ThinningDecisionBase::keep (const std::vector<bool>& v, Op op /*= Op::Set*/)
173{
174 size_t sz = m_mask.size();
175 if (sz != v.size()) {
176 throw std::out_of_range ("ThinningDecisionBase::keep(): inconsistent vector sizes.");
177 }
178 for (size_t i = 0; i < sz; i++) {
179 bool flag = v[i];
180 if (op == Op::And)
181 flag &= !m_mask[i];
182 else if (op == Op::Or)
183 flag |= !m_mask[i];
184 m_mask.set (i, !flag);
185 }
186}
187
188
198void ThinningDecisionBase::thin (const ThinningDecisionBase& other, Op op /*= Op::Set*/)
199{
200 size_t sz = m_mask.size();
201 if (sz != other.size()) {
202 throw std::out_of_range ("ThinningDecisionBase::thin(): inconsistent vector sizes.");
203 }
204 if (op == Op::And)
205 m_mask &= other.m_mask;
206 else if (op == Op::Or)
207 m_mask |= other.m_mask;
208 else
209 m_mask = other.m_mask;
210}
211
212
222void ThinningDecisionBase::keep (const ThinningDecisionBase& other, Op op /*= Op::Set*/)
223{
224 size_t sz = m_mask.size();
225 if (sz != other.size()) {
226 throw std::out_of_range ("ThinningDecisionBase::keep(): inconsistent vector sizes.");
227 }
228 if (op == Op::And)
229 m_mask |= ~other.m_mask;
230 else if (op == Op::Or)
231 m_mask &= ~other.m_mask;
232 else
233 m_mask = ~other.m_mask;
234}
235
236
241{
242 assert (m_indexMap.empty());
243 size_t sz = m_mask.size();
244 m_indexMap.resize (sz);
245 size_t pos = 0;
246 for (size_t i = 0; i < sz; i++) {
247 m_indexMap[i] = thinned(i) ? RemovedIdx : pos++ ;
248 }
249}
250
251
252} // namespace SG
static Double_t sz
Hold thinning decisions for one container.
static const std::size_t RemovedIdx
Flag used to show that an index has been thinned away.
std::vector< size_t > m_indexMap
Mapping from original indices to thinned indices.
ThinningDecisionBase(size_t sz=0)
Constructor.
void thinAll()
Mark that all elements should be thinned away.
void keepAll()
Mark that all elements should be kept (not thinned).
void keep(size_t ndx)
Mark that index ndx in the container should be kept (not thinned away).
void thin(size_t ndx)
Mark that index ndx in the container should be thinned away.
bool thinned(size_t ndx) const
Return true if element ndx should be thinned.
void buildIndexMap()
Build the index map.
size_t size() const
Return the total size of the container being thinned.
size_t thinnedSize() const
Return the size of the container being thinned after thinning.
boost::dynamic_bitset m_mask
Thinning map. Set to 1 for thinned elements.
void resize(const size_t size)
Change the number of elements.
Forward declaration.