17#include <FairLogger.h>
35 template <
typename... Types>
42 template <
typename Type,
typename>
45 template <
typename Type,
typename... BaseTypes>
48 template <
typename Type>
51 template <
typename RootType,
typename... Args>
55 return new RootType(std::forward<Args>(args)...);
61 template <
typename Hist,
typename... Args>
64 static_assert(std::is_base_of_v<TH1, Hist>,
"make_hist: not a histogram type!");
65 auto hist = std::make_unique<Hist>(std::forward<Args>(args)...);
66 hist->SetDirectory(
nullptr);
76 LOG(debug2) <<
"Closing file " << rootfile->GetName();
85 template <
typename... Args>
95 template <
typename DataType, std::
size_t size>
96 constexpr std::size_t
GetSize(
const DataType (&)[size])
131 template <
typename DataType>
142 auto left() -> DataType& {
return data_.first; }
143 auto right() -> DataType& {
return data_.second; }
144 auto left() const -> const DataType& {
return data_.first; }
145 auto right() const -> const DataType& {
return data_.second; }
146 auto get(
Side side)
const ->
const DataType& {
return (side ==
Side::left) ? data_.first : data_.second; }
148 void set_left(
const DataType& value) { data_.first = value; }
149 void set_right(
const DataType& value) { data_.second = value; }
152 std::pair<DataType, DataType> data_;
153 bool is_valid =
false;
162 template <u
int8_t iterations = DEFAULT_ITERATION>
165 auto exp = 1.F + val / (1U << iterations);
166 for (
auto i = 0; i < iterations; ++i)
175 namespace fs = std::filesystem;
178 auto path = fs::path{ filename };
179 auto parent_folder = path.parent_path();
180 if (parent_folder.empty())
185 if (not fs::exists(parent_folder))
189 fmt::format(R
"(Cannot get the parent folder of the regex path "{}"! Setting it to the current folder)",
194 return parent_folder;
199 if (filename_regex.empty())
203 auto regex_path = fs::path{ filename_regex };
205 const auto regex_string = regex_path.filename().string();
206 auto filelist = std::vector<std::string>{};
207 for (
const auto& dir_entry : fs::directory_iterator(parent_folder))
209 if (std::regex_match(dir_entry.path().filename().string(), std::regex{ regex_string }))
211 filelist.emplace_back(fs::absolute(dir_entry.path()));
214 if (filelist.empty())
216 R3BLOG(error, fmt::format(R
"(Cannot find any files with regex "{}")", regex_string));
218 std::sort(filelist.begin(), filelist.end());
#define R3BLOG(severity, x)
void set_left(const DataType &value)
auto right() const -> const DataType &
LRPair(const DataType &left, const DataType &right)
auto left() const -> const DataType &
auto get(Side side) const -> const DataType &
auto left() -> DataType &
void set_right(const DataType &value)
auto get(Side side) -> DataType &
auto right() -> DataType &
auto make_hist(Args &&... args)
auto make_rootfile(Args &&... args)
static const uint8_t DEFAULT_ITERATION
auto GetParentDir(std::string_view filename) -> fs::path
constexpr bool is_root_owned
constexpr std::size_t GetSize(const DataType(&)[size])
auto GetFilesFromRegex(std::string_view filename_regex) -> std::vector< std::string >
constexpr auto toIndex(Side side) -> size_t
auto FastExp(const float val) -> float
TypeCollection< TF1, TH1, TTree > RootTypes
constexpr bool is_based_on
auto root_owned(Args &&... args)
constexpr auto IndexToSide(size_t index) -> Side
std::unique_ptr< TFile, TFileDeleter > unique_rootfile
void operator()(TFile *rootfile)