This tutorial shows how to implement a custom action. As an example, we build a helper for filling THns.
template <typename T, unsigned int NDIM>
public:
using Result_t = THn_t;
private:
std::vector<std::shared_ptr<THn_t>> fHistos;
public:
THnHelper(std::string_view
name, std::string_view title, std::array<int, NDIM> nbins, std::array<double, NDIM> xmins,
std::array<double, NDIM>
xmax)
{
fHistos.emplace_back(std::make_shared<THn_t>(std::string(
name).c_str(), std::string(title).c_str(),
NDIM, nbins.data(), xmins.data(),
xmax.data()));
(void)i;
}
}
THnHelper(THnHelper &&) = default;
THnHelper(const THnHelper &) = delete;
std::shared_ptr<THn_t> GetResultPtr() const { return fHistos[0]; }
void InitTask(TTreeReader *, unsigned int) {}
template <typename... ColumnTypes>
void Exec(
unsigned int slot, ColumnTypes... values)
{
std::array<double, sizeof...(ColumnTypes)> valuesArr{static_cast<double>(values)...};
fHistos[slot]->Fill(valuesArr.data());
}
void Finalize()
{
auto &res = fHistos[0];
res->Add(fHistos[slot].
get());
}
}
std::string GetActionName(){
return "THnHelper";
}
};
void df018_customActions()
{
auto genD = []() {
return gRandom->Uniform(-5, 5); };
auto genF = [&genD]() { return (float)genD(); };
auto genI = [&genD]() { return (int)genD(); };
auto dd =
d.Define(
"x0", genD).Define(
"x1", genD).Define(
"x2", genF).Define(
"x3", genI);
using Helper_t = THnHelper<float, 4>;
Helper_t helper{"myThN",
"A THn with 4 dimensions",
{4, 4, 8, 2},
{-10., -10, -4., -6.},
{10., 10, 5., 7.}};
auto myTHnT = dd.Book<
double,
double, float,
int>(std::move(helper), {
"x0",
"x1",
"x2",
"x3"});
myTHnT->Print();
}
Base class for action helpers, see RInterface::Book() for more information.
ROOT's RDataFrame offers a modern, high-level interface for analysis of data stored in TTree ,...
Templated implementation of the abstract base THn.
CPYCPPYY_EXTERN bool Exec(const std::string &cmd)
CoordSystem::Scalar get(DisplacementVector2D< CoordSystem, Tag > const &p)
void EnableImplicitMT(UInt_t numthreads=0)
Enable ROOT's implicit multi-threading for all objects and methods that provide an internal paralleli...
Bool_t IsImplicitMTEnabled()
Returns true if the implicit multi-threading in ROOT is enabled.
UInt_t GetThreadPoolSize()
Returns the size of ROOT's thread pool.
TSeq< unsigned int > TSeqU
void Initialize(Bool_t useTMVAStyle=kTRUE)