1 #ifndef ATCONTAINERMANIP_H
2 #define ATCONTAINERMANIP_H
4 #include <FairLogger.h>
12 #include <type_traits>
26 if (xMin == 0 && xMax == 0)
29 hist.SetBins(data.size(), xMin, xMax);
30 for (
int i = 0; i < hist.GetNbinsX(); ++i)
31 hist.SetBinContent(i + 1, data.at(i));
41 template <
typename Hist = TH1D,
typename T>
42 std::unique_ptr<Hist>
CreateHistFromData(
const std::string &name,
const T &data,
double xMin = 0,
double xMax = 0)
44 if (xMin == 0 && xMax == 0)
47 TH1::AddDirectory(
false);
48 auto ret = std::make_unique<Hist>(name.data(), name.data(), data.size(), 0, data.size());
49 for (
int i = 0; i < ret->GetNbinsX(); ++i)
50 ret->SetBinContent(i + 1, data.at(i));
52 TH1::AddDirectory(
true);
62 auto n = vec.size() / 2;
64 std::nth_element(vec.begin(), vec.begin() + n, vec.end());
66 if (vec.size() % 2 == 0) {
67 med = (*std::max_element(vec.begin(), vec.begin() + n) + med) / 2.0;
81 return const_cast<T *
>(&t);
87 LOG(debug) <<
"Transforming object -> pointer.";
88 std::vector<const T *> ret;
89 ret.resize(vec.size());
90 std::transform(vec.begin(), vec.end(), ret.begin(), [](
const T &a) { return GetPointer(a); });
97 LOG(debug) <<
"Transforming unique pointer -> pointer.";
98 std::vector<const T *> ret;
99 ret.resize(vec.size());
100 std::transform(vec.begin(), vec.end(), ret.begin(), [](
const std::unique_ptr<T> &a) { return a.get(); });
104 template <
typename T>
107 LOG(debug) <<
"Transforming object -> pointer.";
108 std::vector<T *> ret;
109 ret.resize(vec.size());
110 std::transform(vec.begin(), vec.end(), ret.begin(), [](
const T &a) { return GetPointer(a); });
114 template <
typename T>
117 LOG(debug) <<
"Transforming unique pointer -> pointer.";
118 std::vector<T *> ret;
119 ret.resize(vec.size());
120 std::transform(vec.begin(), vec.end(), ret.begin(), [](
const std::unique_ptr<T> &a) { return a.get(); });
124 template <
typename T>
127 LOG(debug) <<
"Transforming unique pointer -> object.";
129 ret.resize(vec.size());
130 std::transform(vec.begin(), vec.end(), ret.begin(), [](
const std::unique_ptr<T> &a) { return *a; });
134 template <
typename T>
137 LOG(debug) <<
"Transforming unique pointer -> object.";
138 std::vector<T &> ret;
139 ret.resize(vec.size());
140 std::transform(vec.begin(), vec.end(), ret.begin(), [](
const std::unique_ptr<T> &a) { return *a; });
150 template <
typename T,
typename Operator>
153 std::vector<T> retVec;
154 auto itStartEqualRange = vec.end();
156 for (
auto it = vec.begin(); it != vec.end(); ++it) {
158 bool isInPattern = op(*it);
161 if (isInPattern && itStartEqualRange == vec.end()) {
162 itStartEqualRange = it;
168 if (itStartEqualRange != vec.end() && !isInPattern) {
169 retVec.insert(retVec.end(), std::make_move_iterator(itStartEqualRange), std::make_move_iterator(it));
170 vec.erase(itStartEqualRange, it);
171 it = itStartEqualRange;
172 itStartEqualRange = vec.end();
178 if (itStartEqualRange != vec.end()) {
180 retVec.insert(retVec.end(), std::make_move_iterator(itStartEqualRange), std::make_move_iterator(it));
181 vec.erase(itStartEqualRange, it);
188 #endif //#ifndef ATCONTAINERMANIP_H