Jpp test-rotations-new
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 104 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 112 of file JTreeWriter.hh.

113 {
114 SetNameTitle(parameters.getTreeName(), parameters.getTreeTitle());
115
116 // if more than one branch, check those are the data members of T
117
118 TClass* t_class = TClass::GetClass<T>();
119
120 if (t_class == nullptr) {
121 THROW(JException, "Could not get class " << typeid(T).name());
122 }
123
124 TIter next(t_class->GetListOfRealData());
125 TRealData* data{nullptr};
126 T object;
127
128 auto* base = reinterpret_cast<uint8_t*>(&object);
129
130 while ((data = dynamic_cast<TRealData*>(next())) != nullptr) {
131
132 if (!JRoot::is_tobject_member(data->GetName())) {
133
134 auto* member = data->GetDataMember();
135 auto* address = reinterpret_cast<uint8_t*>(base + member->GetOffset());
136 std::string type_name = data->GetDataMember()->GetTypeName();
137
138 if (member->GetArrayDim() > 0) {
139 type_name += "[]";
140 }
141
142 std::string type_code = JRootPrimitiveTypes::getTypeCode(type_name);
143
144 if (type_code.empty()) {
145 THROW(JException, "unknown type " << type_name);
146 }
147
148 std::string leaf = data->GetName();
149 leaf += "/" + type_code;
150 auto branch = Branch(data->GetName(), address, leaf.c_str());
151
152 branches_.push_back(branch);
153 offsets_ .push_back(member->GetOffset());
154 }
155 }
156 }
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
std::vector< TBranch * > branches_
std::vector< Long_t > offsets_
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...
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 JRoot.hh:122

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 164 of file JTreeWriter.hh.

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

Member Data Documentation

◆ branches_

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

Definition at line 179 of file JTreeWriter.hh.

◆ offsets_

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

Definition at line 181 of file JTreeWriter.hh.


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