Belle II Software  release-05-02-19
Algorithms.h
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2014 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Oliver Frost *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 #pragma once
11 
12 #include <tracking/trackFindingCDC/utilities/Range.h>
13 
14 #include <vector>
15 #include <iterator>
16 #include <algorithm>
17 
18 namespace Belle2 {
23  namespace TrackFindingCDC {
24 
29  template <class Ts, class ACategoryFunction, class ACategory>
30  ACategory common(const Ts& items, const ACategoryFunction& catFunc, const ACategory defaultCat)
31  {
32  auto it = std::begin(items);
33  auto itEnd = std::end(items);
34  return common(it, itEnd, catFunc, defaultCat);
35  }
36 
41  template <class It, class ACategoryFunction, class ACategory>
42  ACategory common(It itBegin, It itEnd, const ACategoryFunction& catFunc, const ACategory defaultCat)
43  {
44  if (itBegin == itEnd) return defaultCat; // empty case
45  const ACategory cat = catFunc(*itBegin);
46  for (It it = itBegin; it != itEnd; ++it) {
47  if (cat != catFunc(*it)) {
48  return defaultCat;
49  };
50  }
51  return cat;
52  }
53 
57  template <class Ts, class APredicate>
58  void erase_remove_if(Ts& ts, const APredicate& predicate)
59  {
60  ts.erase(std::remove_if(std::begin(ts), std::end(ts), predicate), std::end(ts));
61  }
62 
63  template<class Ts>
64  void only_best_N(Ts& ts, const size_t N)
65  {
66  auto newEnd = std::next(ts.begin(), std::min(N, ts.size()));
67  ts.erase(newEnd, ts.end());
68  }
69 
73  template <class Ts>
74  void erase_unique(Ts& ts)
75  {
76  ts.erase(std::unique(std::begin(ts), std::end(ts)), std::end(ts));
77  }
78 
82  template <class Ts, class AEqual>
83  void erase_unique(Ts& ts, const AEqual& equal)
84  {
85  ts.erase(std::unique(std::begin(ts), std::end(ts), equal), std::end(ts));
86  }
87 
91  template <class It>
92  std::vector<std::pair<It, int> > unique_count(It itBegin, It itEnd)
93  {
94  std::vector<std::pair<It, int> > result;
95  if (itBegin == itEnd) return result;
96  It it = itBegin;
97  result.emplace_back(it, 1);
98  ++it;
99  for (; it != itEnd; ++it) {
100  if (*it == *result.back().first) {
101  ++result.back().second;
102  } else {
103  result.emplace_back(it, 1);
104  }
105  }
106  return result;
107  }
108 
112  template <class It, class AEqual>
113  std::vector<std::pair<It, int> > unique_count(It itBegin, It itEnd, const AEqual& equal)
114  {
115  std::vector<std::pair<It, int> > result;
116  if (itBegin == itEnd) return result;
117  It it = itBegin;
118  result.emplace_back(it, 1);
119  ++it;
120  for (; it != itEnd; ++it) {
121  if (equal(*it, *result.back().first)) {
122  ++result.back().second;
123  } else {
124  result.emplace_back(it, 1);
125  }
126  }
127  return result;
128  }
129 
133  template <class It>
134  std::vector<Range<It> > unique_ranges(It itBegin, It itEnd)
135  {
136  std::vector<std::pair<It, It> > result;
137  if (itBegin == itEnd) return result;
138  It it1 = itBegin;
139  It it2 = itBegin + 1;
140  result.emplace_back(it1, it2);
141  for (; it2 != itEnd; ++it1, ++it2) {
142  if (not(*it1 == *it2)) {
143  result.emplace_back(it2, it2);
144  }
145  ++result.back().second;
146  }
147  return result;
148  }
149 
153  template <class It, class AEqual>
154  std::vector<Range<It> > unique_ranges(It itBegin, It itEnd, const AEqual& equal)
155  {
156  std::vector<Range<It> > result;
157  if (itBegin == itEnd) return result;
158  It it1 = itBegin;
159  It it2 = itBegin + 1;
160  result.emplace_back(it1, it2);
161  for (; it2 != itEnd; ++it1, ++it2) {
162  if (not equal(*it1, *it2)) {
163  result.emplace_back(it2, it2);
164  }
165  ++result.back().second;
166  }
167  return result;
168  }
169 
173  template <class It, class ACategoryFunction>
174  std::vector<Range<It>> adjacent_groupby(It itBegin, It itEnd, const ACategoryFunction& catFunc)
175  {
176  std::vector<Range<It>> result;
177  if (itBegin == itEnd) return result; // empty case
178 
179  It itFirstOfGroup = itBegin;
180  auto catOfGroup = catFunc(*itBegin);
181 
182  for (It it = itBegin; it != itEnd; ++it) {
183  auto cat = catFunc(*it);
184  if (catOfGroup != cat) {
185  result.emplace_back(itFirstOfGroup, it);
186  itFirstOfGroup = it;
187  catOfGroup = cat;
188  }
189  }
190  result.emplace_back(itFirstOfGroup, itEnd);
191  return result;
192  }
193 
198  template <class AInputIterator, class AOutputIterator, class ABinaryOperation>
199  AOutputIterator transform_adjacent_pairs(AInputIterator itBegin,
200  AInputIterator itEnd,
201  AOutputIterator result,
202  const ABinaryOperation& map)
203  {
204  if (itBegin == itEnd) return result;
205 
206  AInputIterator second = itBegin;
207  ++second;
208  while (second != itEnd) {
209  *result = map(*itBegin, *second);
210  ++result;
211  ++itBegin;
212  ++second;
213  }
214  return result;
215  }
216 
221  template <class AInputIterator, class AOutputIterator, class ATrinaryOperation>
222  AOutputIterator transform_adjacent_triples(AInputIterator itBegin,
223  AInputIterator itEnd,
224  AOutputIterator result,
225  const ATrinaryOperation& map)
226  {
227  if (not(itBegin != itEnd)) return result;
228 
229  AInputIterator second = itBegin;
230  ++second;
231  if (not(second != itEnd)) return result;
232 
233  AInputIterator third = second;
234  ++third;
235  while (third != itEnd) {
236  *result = map(*itBegin, *second, *third);
237  ++result;
238  ++itBegin;
239  ++second;
240  ++third;
241  }
242  return result;
243  }
244 
249  template <class Ts, class TCopyIfPredicate>
250  Ts copy_if(Ts const& inputContainer, TCopyIfPredicate pred)
251  {
252  Ts outputContainer;
253 
254  // copy only if predicate is true
255  std::copy_if(inputContainer.begin(), inputContainer.end(), std::back_inserter(outputContainer), pred);
256  return outputContainer;
257  }
258 
259 
263  template <class Ts, class AUnaryPredicate>
264  bool any(const Ts& ts, const AUnaryPredicate& comparator)
265  {
266  return std::any_of(std::begin(ts), std::end(ts), comparator);
267  }
268 
272  template <class Ts, class AItem>
273  bool is_in(const AItem& item, const Ts& ts)
274  {
275  return std::find(std::begin(ts), std::end(ts), item) != std::end(ts);
276  };
277 
281  template <class T, class Ts>
282  std::vector<T*> as_pointers(Ts& ts)
283  {
284  using std::begin;
285  using std::end;
286  std::size_t vsize = end(ts) - begin(ts);
287  std::vector<T*> result(vsize, nullptr);
288  std::transform(begin(ts), end(ts), result.begin(), [](T & t) { return std::addressof<T>(t);});
289  return result;
290  }
291  }
293 }
scripts.bitstring.equal
def equal(a, b)
Definition: bitstring.py:291
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19