1#ifndef ANALYSISTREE_INFRA_HELPER_FUNCTIONS_HPP
2#define ANALYSISTREE_INFRA_HELPER_FUNCTIONS_HPP
4#include "SimpleCut.hpp"
10namespace HelperFunctions {
13inline std::string ToStringWithPrecision(
const T a_value,
const int n) {
14 std::ostringstream out;
16 out << std::fixed << a_value;
21inline std::string ToStringWithSignificantFigures(
const T a_value,
const int n) {
22 if (a_value == 0)
return "0";
24 const double dMag = std::log10(std::abs(a_value));
25 const int iMag =
static_cast<int>(dMag - n + 1 > 0 ? dMag - n + 1 : dMag - n);
26 const T shifted_value = a_value / std::pow(10, iMag);
27 const T rounded_value =
static_cast<T
>(std::round(shifted_value));
28 const T reshifted_value = rounded_value * std::pow(10, iMag);
29 const int precision = iMag < 0 ? -iMag : 0;
30 return ToStringWithPrecision(reshifted_value, precision);
33inline std::vector<AnalysisTree::SimpleCut> CreateRangeCuts(
const std::vector<float>& ranges,
const std::string& cutNamePrefix,
const std::string& branchFieldName,
bool isAppendWithOpenCut =
false,
int precision = -1) {
34 auto checkHasFractionalPart = [](
float value) {
35 float fracPart = std::round(value) - value;
36 return std::abs(fracPart) > 1e-4;
39 auto countDigisAfterComma = [&](
float value) {
41 while (checkHasFractionalPart(value)) {
49 auto evaluateMaxDigisAfterComma = [&](
const std::vector<float>& vec) {
51 for (
const auto& v : vec) {
52 result = std::max(result, countDigisAfterComma(v));
58 if (precision < 0) precision = evaluateMaxDigisAfterComma(ranges);
60 std::vector<AnalysisTree::SimpleCut> sliceCuts;
61 for (
int iRange = 0; iRange < ranges.size() - 1; iRange++) {
62 const std::string cutName = cutNamePrefix + ToStringWithPrecision(ranges.at(iRange), precision) +
"_" + ToStringWithPrecision(ranges.at(iRange + 1), precision);
63 sliceCuts.emplace_back(
AnalysisTree::RangeCut(branchFieldName, ranges.at(iRange), ranges.at(iRange + 1), cutName));
66 if (isAppendWithOpenCut) sliceCuts.emplace_back(
AnalysisTree::OpenCut(branchFieldName.substr(0, branchFieldName.find(
'.'))));
71inline std::vector<AnalysisTree::SimpleCut> CreateEqualCuts(
const std::vector<int>& values,
const std::string& cutNamePrefix,
const std::string& branchFieldName) {
72 std::vector<AnalysisTree::SimpleCut> sliceCuts;
73 for (
const auto& value : values) {
74 const std::string cutName = cutNamePrefix + std::to_string(value);
81inline bool StringToBool(
const std::string& str) {
82 if (str ==
"true")
return true;
83 else if (str ==
"false")
86 throw std::runtime_error(
"HelperFunctions::StringToBool(): argument must be either true or false");
90inline std::vector<T> MergeVectors(
const std::vector<T>& vec1,
const std::vector<T>& vec2) {
91 std::vector<T> result;
92 result.reserve(vec1.size() + vec2.size());
93 result.insert(result.end(), vec1.begin(), vec1.end());
94 result.insert(result.end(), vec2.begin(), vec2.end());
99template<
typename T,
typename... Args>
100inline std::vector<T> MergeVectors(
const std::vector<T>& vec1,
const std::vector<T>& vec2,
const Args&... args) {
101 return MergeVectors(vec1, MergeVectors(vec2, args...));
SimpleCut EqualsCut(const std::string &variable_name, int value, const std::string &title)
Definition SimpleCut.cpp:36
SimpleCut RangeCut(const std::string &variable_name, double lo, double hi, const std::string &title)
Definition SimpleCut.cpp:32
SimpleCut OpenCut(const std::string &branchName, const std::string &title)
Definition SimpleCut.cpp:48