-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTreeUtilities.h
66 lines (55 loc) · 1.97 KB
/
TreeUtilities.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#pragma once
#include "TTree.h"
namespace tree_utils
{
template <typename T> class ManagedPointer : public std::unique_ptr<T>
{
public:
ManagedPointer() : std::unique_ptr<T>( new T ) {}
T*& get_bare_ptr()
{
bare_ptr_ = this->get();
return bare_ptr_;
}
protected:
T* bare_ptr_ = nullptr;
};
template <typename T> void set_object_input_branch_address( TTree& in_tree,
const std::string& branch_name, T*& address )
{
in_tree.SetBranchAddress( branch_name.c_str(), &address );
}
template <typename T> void set_object_input_branch_address( TTree& in_tree,
const std::string& branch_name, ManagedPointer<T>& u_ptr )
{
T*& address = u_ptr.get_bare_ptr();
set_object_input_branch_address( in_tree, branch_name, address );
}
void set_output_branch_address( TTree& out_tree, const std::string& branch_name,
void* address, bool create = false, const std::string& leaf_spec = "" )
{
if ( create ) {
if ( leaf_spec != "" ) {
out_tree.Branch( branch_name.c_str(), address, leaf_spec.c_str() );
}
else {
out_tree.Branch( branch_name.c_str(), address );
}
}
else {
out_tree.SetBranchAddress( branch_name.c_str(), address );
}
}
template <typename T> void set_object_output_branch_address( TTree& out_tree,
const std::string& branch_name, T*& address, bool create = false )
{
if ( create ) out_tree.Branch( branch_name.c_str(), &address );
else out_tree.SetBranchAddress( branch_name.c_str(), &address );
}
template <typename T> void set_object_output_branch_address( TTree& out_tree,
const std::string& branch_name, ManagedPointer<T>& u_ptr, bool create = false )
{
T*& address = u_ptr.get_bare_ptr();
set_object_output_branch_address( out_tree, branch_name, address, create );
}
}