Jpp  master_rocky-40-g5f0272dcd
the software that should make you happy
Public Member Functions | Private Attributes | List of all members
JROOT::JTreeWriter< T, true > Class Template Reference

Template specialisation for flat template TTree writing. More...

#include <JTreeWriter.hh>

Inheritance diagram for JROOT::JTreeWriter< T, true >:

Public Member Functions

 JTreeWriter (const JTreeParameters &parameters)
 Constructor. More...
 
Int_t Write (const T &object)
 Data object output equivalent of TTree::Fill(). More...
 

Private Attributes

std::vector< TBranch * > branches_
 
std::vector< Long_t > offsets_
 

Detailed Description

template<class T>
class JROOT::JTreeWriter< T, true >

Template specialisation for flat template TTree writing.

Definition at line 101 of file JTreeWriter.hh.

Constructor & Destructor Documentation

◆ JTreeWriter()

template<class T >
JROOT::JTreeWriter< T, true >::JTreeWriter ( const JTreeParameters parameters)
inline

Constructor.

Parameters
parametersparameters of TTree

Definition at line 109 of file JTreeWriter.hh.

110  {
111  SetNameTitle(parameters.getTreeName(), parameters.getTreeTitle());
112 
113  // if more than one branch, check those are the data members of T
114 
115  TClass* t_class = TClass::GetClass<T>();
116 
117  if (t_class == nullptr) {
118  THROW(JException, "Could not get class " << typeid(T).name());
119  }
120 
121  TIter next(t_class->GetListOfRealData());
122  TRealData* data{nullptr};
123  T object;
124 
125  auto* base = reinterpret_cast<uint8_t*>(&object);
126 
127  while ((data = dynamic_cast<TRealData*>(next())) != nullptr) {
128 
129  if (!JRootClass::is_tobject_member(data->GetName())) {
130 
131  auto* member = data->GetDataMember();
132  auto* address = reinterpret_cast<uint8_t*>(base + member->GetOffset());
133  std::string type_name = data->GetDataMember()->GetTypeName();
134 
135  if (member->GetArrayDim() > 0) {
136  type_name += "[]";
137  }
138 
139  std::string type_code = JRootPrimitiveTypes::getTypeCode(type_name);
140 
141  if (type_code.empty()) {
142  THROW(JException, "unknown type " << type_name);
143  }
144 
145  std::string leaf = data->GetName();
146  leaf += "/" + type_code;
147  auto branch = Branch(data->GetName(), address, leaf.c_str());
148 
149  branches_.push_back(branch);
150  offsets_ .push_back(member->GetOffset());
151  }
152  }
153  }
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
Definition: JException.hh:712
const TString & getTreeName() const
Get TTree name.
const TString & getTreeTitle() const
Get TTree title.
std::vector< TBranch * > branches_
Definition: JTreeWriter.hh:176
std::vector< Long_t > offsets_
Definition: JTreeWriter.hh:178
static bool is_tobject_member(const char *name)
Check if name is one of TObject own data members (fBits or fUniqueID, for Root <= 6....
Definition: JRootClass.hh:138
static std::string getTypeCode(const std::string &type_name)
Return the type code (used to create primitive leaves in basic Root tree branches) corresponding to t...

Member Function Documentation

◆ Write()

template<class T >
Int_t JROOT::JTreeWriter< T, true >::Write ( const T &  object)
inline

Data object output equivalent of TTree::Fill().

Parameters
objectdata object
Returns
as TTree::Fill

Definition at line 161 of file JTreeWriter.hh.

162  {
163  auto* base = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&object));
164 
165  for (size_t i = 0; i < branches_.size(); i++) {
166  branches_[i]->SetAddress(reinterpret_cast<uint8_t*>(base + offsets_[i]));
167  }
168 
169  return this->Fill();
170  }

Member Data Documentation

◆ branches_

template<class T >
std::vector<TBranch*> JROOT::JTreeWriter< T, true >::branches_
private

Definition at line 176 of file JTreeWriter.hh.

◆ offsets_

template<class T >
std::vector<Long_t> JROOT::JTreeWriter< T, true >::offsets_
private

Definition at line 178 of file JTreeWriter.hh.


The documentation for this class was generated from the following file: