Jpp master_rocky-44-g75b7c4f75
the software that should make you happy
Loading...
Searching...
No Matches
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.
 
Int_t Write (const T &object)
 Data object output equivalent of TTree::Fill().
 

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.
std::vector< TBranch * > branches_
std::vector< Long_t > offsets_
static bool is_tobject_member(const char *name)
Check if name is one of TObject own data members (fBits or fUniqueID, for Root <= 6....
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: