1 #ifndef __JTREE_BRANCH_ADDRESSES_H__
2 #define __JTREE_BRANCH_ADDRESSES_H__
11 #include "TDataMember.h"
25 while ((
object = next()) !=
nullptr) {
26 names.emplace_back(object->GetName());
55 TObjArray* branches = tree.GetListOfBranches();
57 if (branches->GetEntries() == 1) {
58 tree.SetBranchAddress(branches->First()->GetName(), &this->address);
63 TClass* t_class = TClass::GetClass<T>();
64 if (t_class ==
nullptr) {
68 auto branch_names =
to_vector(tree.GetListOfBranches());
69 auto all_member_names =
to_vector(t_class->GetListOfRealData());
74 std::copy_if(all_member_names.begin(), all_member_names.end(), std::back_inserter(member_names),
75 [](
const std::string& member_name)
76 { return !JRootClass::is_tobject_member(member_name.c_str()); });
78 std::sort(branch_names.begin(), branch_names.end());
79 std::sort(member_names.begin(), member_names.end());
83 if (std::includes(branch_names.begin(), branch_names.end(), member_names.begin(),
84 member_names.end())) {
88 auto* base =
reinterpret_cast<uint8_t*
>(this->
address);
90 for (
const auto& member_name : member_names) {
91 auto* member =
static_cast<TDataMember*
>(t_class->GetDataMember(member_name.c_str()));
92 tree.SetBranchAddress(member_name.c_str(),
93 reinterpret_cast<void*
>(base + member->GetOffset()));
101 <<
JEEP::JEEPZ() << member_names <<
"\nBranches in tree\n"
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
I/O formatting auxiliaries.
Class responsible to setup TTree branch addresses for reading objects of type T.
void setBranchAddress(TTree &tree)
Auxiliary classes and methods for ROOT I/O.
std::vector< std::string > to_vector(TCollection *col)
Auxiliary data structure for streaming of STL containers.
Auxiliary classd for address handling within TTree or TChain.