RDFAnalysis  0.1.1
Physics analysis with ROOT::RDataFrame
NodeBase.h
Go to the documentation of this file.
1 #ifndef RDFAnalysis_NodeBase_H
2 #define RDFAnalysis_NodeBase_H
3 
4 // Package includes
6 #include "RDFAnalysis/Helpers.h"
8 #include "RDFAnalysis/SysVar.h"
10 
11 // ROOT includes
12 #include "ROOT/RDataFrame.hxx"
13 #include <TObject.h>
14 
15 // STL includes
16 #include <string>
17 #include <map>
18 #include <memory>
19 #include <array>
20 
26 namespace RDFAnalysis {
31 
41  class NodeBase
42  {
43  public:
54  template <typename F>
56  const std::string& name,
57  F f,
58  const ColumnNames_t& columns = {});
59 
70  const std::string& name,
71  const std::string& expression);
72 
86  const std::string& name,
87  const std::string& expression,
88  const ColumnNames_t& columns);
89 
107  template <
108  std::size_t N,
109  typename F,
110  typename Ret_t = typename ROOT::TTraits::CallableTraits<F>::ret_type>
111  std::enable_if_t<N==std::tuple_size<Ret_t>::value, NodeBase*> Define(
112  const std::array<std::string, N>& names,
113  F f,
114  const ColumnNames_t& columns);
115 
123  const std::string& getWeight() const { return m_weight; }
124 
140  template <typename T>
142  const T& model,
143  const ColumnNames_t& columns,
144  const std::string& weight = "",
146 
158  template <typename AccFun, typename MergeFun,
159  typename ArgTypes=typename ROOT::TTraits::CallableTraits<AccFun>::arg_types,
160  typename U=ROOT::TTraits::TakeFirstParameter_t<ArgTypes>>
162  AccFun aggregator,
163  MergeFun merger,
164  const std::string& columnName,
165  const U& aggIdentity)
166  {
167  return ActResult<ROOT::RDF::RResultPtr<U>, AccFun, MergeFun, std::string_view, const U&>(
168  &RNode::Aggregate,
169  ColumnNames_t{columnName},
170  aggregator, merger, SysVarBranch(columnName), aggIdentity);
171  }
172 
183  template <typename AccFun, typename MergeFun,
184  typename ArgTypes=typename ROOT::TTraits::CallableTraits<AccFun>::arg_types,
185  typename U=ROOT::TTraits::TakeFirstParameter_t<ArgTypes>>
187  AccFun aggregator,
188  MergeFun merger,
189  const std::string& columnName)
190  {
191  return ActResult<ROOT::RDF::RResultPtr<U>, AccFun, MergeFun, std::string_view>(
192  &RNode::Aggregate,
193  ColumnNames_t{columnName},
194  aggregator, merger, SysVarBranch(columnName) );
195  }
196 
202  {
203  return ActResult<ROOT::RDF::RResultPtr<ULong64_t>>(
204  &RNode::Count,
205  ColumnNames_t{});
206  }
207 
235  template <typename... TrArgs, typename T, typename... Args>
236  std::map<std::string, T> Act(
237  std::function<T(RNode&, TrArgs...)> f,
238  const ColumnNames_t& columns,
239  Args&&... args);
240 
255  template <typename F, typename... Args,
256  typename T=typename ROOT::TTraits::CallableTraits<F>::ret_type>
257  std::enable_if_t<!is_std_function<F>::value, std::map<std::string, T>> Act(
258  F&& f,
259  const ColumnNames_t& columns,
260  Args&&... args)
261  {
262  return Act(
263  std::function<T(RNode&, typename sysvar_traits<Args&&>::value_type...)>(f),
264  columns,
265  std::forward<Args>(args)...);
266  }
267 
295  template <typename T, typename... TrArgs, typename... Args>
296  std::map<std::string, T> Act(
297  T (RNode::*f)(TrArgs...),
298  const ColumnNames_t& columns,
299  Args&&... args);
300 
318  template <typename... TrArgs, typename T, typename... Args,
319  typename U=typename T::Value_t>
321  std::function<T(RNode&, TrArgs...)> f,
322  const ColumnNames_t& columns,
323  Args&&... args)
324  {
325  return SysResultPtr<U>(
326  namer().nominalName(),
327  Act(f, columns, std::forward<Args>(args)...) );
328  }
329 
347  template <typename F, typename... Args,
348  typename T=typename ROOT::TTraits::CallableTraits<F>::ret_type,
349  typename U=typename T::Value_t>
350  std::enable_if_t<!is_std_function<F>::value, SysResultPtr<U>> ActResult(
351  F&& f,
352  const ColumnNames_t& columns,
353  Args&&... args)
354  {
355  return ActResult(
356  std::function<T(RNode&, typename sysvar_traits<Args&&>::value_type...)>(f),
357  columns,
358  std::forward<Args>(args)...);
359  }
360 
379  template <typename T, typename... TrArgs, typename... Args,
380  typename U=typename T::Value_t>
382  T (RNode::*f)(TrArgs...),
383  const ColumnNames_t& columns,
384  Args&&... args)
385  {
386  return SysResultPtr<U>(
387  namer().nominalName(),
388  Act(f, columns, std::forward<Args>(args)...) );
389  }
390 
392  const std::string& name() const { return m_name; }
393 
395  const std::string& cutflowName() const { return m_cutflowName; }
396 
398  bool isAnonymous() const { return m_name.empty(); }
399 
401  bool isMC() const { return m_isMC; }
402 
404  const std::map<std::string, RNode>& rnodes() const { return m_rnodes; }
406  std::map<std::string, RNode>& rnodes() { return m_rnodes; }
407 
409  const IBranchNamer& namer() const { return *m_namer; }
410 
412  auto objects() { return as_range(m_objects); }
414  auto objects() const { return as_range(m_objects); }
415 
417  virtual bool isRoot() const = 0;
418 
419  protected:
422  NamerInitialiser() {} //> no-op
426  const std::map<std::string, ROOT::RDF::RNode>& rnodes) {
427  namer.readBranchList(rnodes);
428  }
429  };
430 
432  template <std::size_t I, std::size_t N, typename... Elements>
433  std::enable_if_t<I!=0, void> unwindDefine(
434  const std::array<std::string, N>& names,
435  const std::string& fullName,
436  const std::tuple<Elements...>*);
437 
439  template <std::size_t I, std::size_t N, typename... Elements>
440  std::enable_if_t<I == 0, void> unwindDefine(
441  const std::array<std::string, N>& names,
442  const std::string& fullName,
443  const std::tuple<Elements...>*);
444 
445 
453  template <typename F>
455  F f,
456  const ColumnNames_t& columns = {},
457  const std::string& cutflowName = "");
458 
464  std::map<std::string, RNode> makeChildRNodes(
465  const std::string& expression,
466  const std::string& cutflowName = "");
467 
478  std::map<std::string, RNode> makeChildRNodes(
479  const std::string& expression,
480  const ColumnNames_t& columns,
481  const std::string& cutflowName = "");
482 
493  NodeBase(
494  const RNode& rnode,
495  std::unique_ptr<IBranchNamer>&& namer,
496  bool isMC,
497  const std::string& name = "ROOT",
498  const std::string& cutflowName = "Number of events",
499  const std::string& weight = "",
501 
514  template <typename W>
515  NodeBase(
516  const RNode& rnode,
517  std::unique_ptr<IBranchNamer>&& namer,
518  bool isMC,
519  const std::string& name,
520  const std::string& cutflowName,
521  W w,
522  const ColumnNames_t& columns,
524 
534  NodeBase(
535  NodeBase& parent,
536  std::map<std::string, RNode>&& rnodes,
537  const std::string& name,
538  const std::string& cutflowName,
539  const std::string& weight,
552  template <typename W>
553  NodeBase(
554  NodeBase& parent,
555  std::map<std::string, RNode>&& rnodes,
556  const std::string& name,
557  const std::string& cutflowName,
558  W w,
559  const ColumnNames_t& columns,
561 
572  template <typename F>
574  F f,
575  const ColumnNames_t& columns,
576  NodeBase* parent,
577  WeightStrategy strategy);
578 
587  std::string setWeight(
588  const std::string& expression,
589  NodeBase* parent,
590  WeightStrategy strategy);
591 
593  std::string nameWeight();
594 
596  std::map<std::string, RNode> m_rnodes;
597 
599  std::unique_ptr<IBranchNamer> m_namer;
600 
603 
605  bool m_isMC;
606 
608  std::string m_name;
609 
611  std::string m_cutflowName;
612 
614  RNode* m_rootRNode = nullptr;
615 
617  std::string m_weight;
618 
620  std::vector<SysResultPtr<TObject>> m_objects;
621  }; //> end class NodeBase
622 } //> end namespace RDFAnalysis
623 #include "RDFAnalysis/NodeBase.icc"
624 #endif //> !RDFAnalysis_NodeBase_H
std::map< std::string, RNode > m_rnodes
The RNode objects, keyed by systematic.
Definition: NodeBase.h:596
std::vector< SysResultPtr< TObject > > m_objects
Any TObject pointers declared on this.
Definition: NodeBase.h:620
bool m_isMC
Whether or not &#39;MC&#39; mode was activated.
Definition: NodeBase.h:605
SysResultPtr< T > Fill(const T &model, const ColumnNames_t &columns, const std::string &weight="", WeightStrategy strategy=WeightStrategy::Default)
Fill an object on each event.
std::string m_cutflowName
The name in the cutflow.
Definition: NodeBase.h:611
Abstract base class that describes how a Node should name its branches internally.
Definition: IBranchNamer.h:33
std::string m_weight
The weight on this node.
Definition: NodeBase.h:617
const std::string & cutflowName() const
Get the name in a cutflow.
Definition: NodeBase.h:395
Base class for the Node classes.
Definition: NodeBase.h:41
enable_ifn_string_t< F, std::map< std::string, RNode > > makeChildRNodes(F f, const ColumnNames_t &columns={}, const std::string &cutflowName="")
Create child RNodes to be used for a filter from this node.
const std::string & getWeight() const
Get the name of the weight branch.
Definition: NodeBase.h:123
RNode * m_rootRNode
Keep a pointer to the ROOT RNode of the whole chain.
Definition: NodeBase.h:614
const std::map< std::string, RNode > & rnodes() const
Get the RNode objects.
Definition: NodeBase.h:404
Class to wrap systematic variations of RResultPtrs.
bool isMC() const
Was &#39;MC&#39; mode activated?
Definition: NodeBase.h:401
virtual void readBranchList(const std::map< std::string, ROOT::RDF::RNode > &rnodes)=0
Read branch lists from a set of rnodes.
ROOT::RDataFrame::ColumnNames_t ColumnNames_t
Helper typedef.
Definition: NodeBase.h:30
auto objects() const
(Const) iterate over all the objects defined on this
Definition: NodeBase.h:414
virtual const std::string & nominalName() const =0
Get the name of the nominal variation.
NamerInitialiser m_namerInit
Helper struct to force early initialisation of the namer.
Definition: NodeBase.h:602
NodeBase(const RNode &rnode, std::unique_ptr< IBranchNamer > &&namer, bool isMC, const std::string &name="ROOT", const std::string &cutflowName="Number of events", const std::string &weight="", WeightStrategy strategy=WeightStrategy::Default)
Create the root node of the tree.
Definition: NodeBase.cxx:85
std::enable_if_t<!is_std_function< F >::value, SysResultPtr< U > > ActResult(F &&f, const ColumnNames_t &columns, Args &&...args)
Specialised version of Node::Act for functions returning a ROOT::RDF::RResultPtr. ...
Definition: NodeBase.h:350
SysResultPtr< ULong64_t > Count()
Count the number of entries processed by this node.
Definition: NodeBase.h:201
const std::string & name() const
Get the name.
Definition: NodeBase.h:392
NamerInitialiser(IBranchNamer &namer, const std::map< std::string, ROOT::RDF::RNode > &rnodes)
Initialise the name as part of the node&#39;s initialisation list.
Definition: NodeBase.h:424
std::enable_if_t<!std::is_convertible< F, std::string >{}, T > enable_ifn_string_t
Reduce size of enable_if statements.
Definition: Helpers.h:114
T value_type
The translated value type.
Definition: SysVar.h:51
auto objects()
Iterate over the objects defined on this.
Definition: NodeBase.h:412
virtual bool isRoot() const =0
Is the node the root?
Helper functions and classes for adapting function arguments that depend on the systematic being eval...
Definition: CutflowDetail.h:11
SysResultPtr< U > ActResult(std::function< T(RNode &, TrArgs...)> f, const ColumnNames_t &columns, Args &&...args)
Specialised version of Node::Act for functions returning a ROOT::RDF::RResultPtr. ...
Definition: NodeBase.h:320
SysResultPtr< U > ActResult(T(RNode::*f)(TrArgs...), const ColumnNames_t &columns, Args &&...args)
Specialised version of Node::Act for functions returning a ROOT::RDF::RResultPtr. ...
Definition: NodeBase.h:381
auto as_range(Container &container)
Make a range_t from a container.
Definition: Helpers.h:44
SysResultPtr< U > Aggregate(AccFun aggregator, MergeFun merger, const std::string &columnName, const U &aggIdentity)
Execute a user-defined accumulation function.
Definition: NodeBase.h:161
WeightStrategy
enum class to describe how weights are applied.
Definition: WeightStrategy.h:33
std::map< std::string, T > Act(std::function< T(RNode &, TrArgs...)> f, const ColumnNames_t &columns, Args &&...args)
Transmit a systematically varied action to the underlying ROOT::RNodes.
const IBranchNamer & namer() const
The namer.
Definition: NodeBase.h:409
Class to wrap together RResultPtrs for different systematic variations.
Definition: SysResultPtr.h:24
The branch naming interface.
NamerInitialiser()
Definition: NodeBase.h:422
std::unique_ptr< IBranchNamer > m_namer
The branch namer.
Definition: NodeBase.h:599
Helper struct that forces the initialisation of the branch namer.
Definition: NodeBase.h:421
std::enable_if_t<!is_std_function< F >::value, std::map< std::string, T > > Act(F &&f, const ColumnNames_t &columns, Args &&...args)
Transmit a systematically varied action to the underlying ROOT::RNodes.
Definition: NodeBase.h:257
enable_ifn_string_t< F, std::string > setWeight(F f, const ColumnNames_t &columns, NodeBase *parent, WeightStrategy strategy)
Set the weight on this node.
std::string nameWeight()
Internal function to name the weight branch.
Definition: NodeBase.cxx:121
enable_ifn_string_t< F, NodeBase * > Define(const std::string &name, F f, const ColumnNames_t &columns={})
Define a new variable on this node.
std::string m_name
The Node&#39;s name.
Definition: NodeBase.h:608
std::map< std::string, RNode > & rnodes()
Get the RNode objects.
Definition: NodeBase.h:406
File containing the WeightStrategy enum class.
SysResultPtr< U > Aggregate(AccFun aggregator, MergeFun merger, const std::string &columnName)
Execute a user-defined accumulation function.
Definition: NodeBase.h:186
ROOT::RDF::RNode RNode
Helper typedef.
Definition: NodeBase.h:28
std::enable_if_t< I!=0, void > unwindDefine(const std::array< std::string, N > &names, const std::string &fullName, const std::tuple< Elements... > *)
Base case for unwinding multiple define calls.
Class to trigger translation of a single branch name.
Definition: SysVar.h:97
bool isAnonymous() const
Is this anonymous?
Definition: NodeBase.h:398