ATLAS Offline Software
Loading...
Searching...
No Matches
NtupleVars.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef _VrtSecInclusive_NtupleVars_H
6#define _VrtSecInclusive_NtupleVars_H
7
8
9// Normal STL and physical vectors
10
12
13
14#include <memory>
15#include <string>
16#include <vector>
17#include <map>
18#include <iostream>
19#include <cassert>
20#include <cxxabi.h>
21
22#include <TTree.h>
23
24namespace VKalVrtAthena {
25 //____________________________________________________________________________________________________
26 // This base holder allows for NtupleVars to hold any type of variable.
27 class BaseHolder {
28 public:
30 virtual ~BaseHolder() throw() {}
31
32 // This get_typename() function gives back the type of the variable
33 // stored in the derived class varHolder<T>.
34 // This ensures to check the type of a given variable name.
35 virtual std::string& get_typename() = 0;
36 virtual void* get_var() = 0;
37 virtual void clear() = 0;
38 virtual void branch_tree( const std::string&, TTree* ) = 0;
39 };
40
41
42 //____________________________________________________________________________________________________
43 // This is a class template which holds a variable m_var.
44 // This class is a BaseHolder, then can be stored in
45 // std::map<string, BaseHoder*> variable list
46
47 namespace varHolder_detail {
48 template<typename T> void clear( T& var ) { var = 0; }
49 template<typename T> void clear( std::vector<T>& var ) { var.clear(); }
50 template<typename T> void clear( std::vector< std::vector<T> >& var ) {
51 for( auto & v : var ) v.clear();
52 var.clear();
53 }
54
55 static std::map<const std::string, const std::string> create_tree_str() {
56 std::map<const std::string, const std::string> m;
57 int stat(0);
58 m.insert( std::make_pair( std::string(abi::__cxa_demangle(typeid( char ) .name(), 0, 0, &stat)), std::string("/B") ) );
59 m.insert( std::make_pair( std::string(abi::__cxa_demangle(typeid( unsigned char ) .name(), 0, 0, &stat)), std::string("/b") ) );
60 m.insert( std::make_pair( std::string(abi::__cxa_demangle(typeid( short ) .name(), 0, 0, &stat)), std::string("/S") ) );
61 m.insert( std::make_pair( std::string(abi::__cxa_demangle(typeid( unsigned short ) .name(), 0, 0, &stat)), std::string("/s") ) );
62 m.insert( std::make_pair( std::string(abi::__cxa_demangle(typeid( int ) .name(), 0, 0, &stat)), std::string("/I") ) );
63 m.insert( std::make_pair( std::string(abi::__cxa_demangle(typeid( unsigned int ) .name(), 0, 0, &stat)), std::string("/i") ) );
64 m.insert( std::make_pair( std::string(abi::__cxa_demangle(typeid( long long int ) .name(), 0, 0, &stat)), std::string("/L") ) );
65 m.insert( std::make_pair( std::string(abi::__cxa_demangle(typeid( unsigned long long int ) .name(), 0, 0, &stat)), std::string("/l") ) );
66 m.insert( std::make_pair( std::string(abi::__cxa_demangle(typeid( float ) .name(), 0, 0, &stat)), std::string("/F") ) );
67 m.insert( std::make_pair( std::string(abi::__cxa_demangle(typeid( double ) .name(), 0, 0, &stat)), std::string("/D") ) );
68
69 return m;
70 }
71
72 static const std::map<const std::string, const std::string> tree_str_map = create_tree_str();
73
74 template<typename T>
75 void branch_tree( const std::string& name, const std::string& type_name, TTree *tree, T* var )
76 { tree->Branch( name.c_str(), var, ( name+tree_str_map.at(type_name) ).c_str() ); }
77
78 template<typename T>
79 void branch_tree( const std::string& name, const std::string& type_name, TTree *tree, std::vector<T>* var )
80 { tree->Branch( name.c_str(), type_name.c_str(), var ); }
81 }
82
83
84 //____________________________________________________________________________________________________
85 template<class T>
86 class varHolder : public BaseHolder {
87 private:
88 std::string m_typename;
89 public:
90 std::shared_ptr<T> m_var;
91
92 varHolder() : m_var( new T ){
93 int stat(0);
94 char* name = abi::__cxa_demangle(typeid( T ).name(), 0, 0, &stat);
95 m_typename = name;
96 delete name;
97 }
98 virtual ~varHolder() {}
99 T& get() { return (*m_var); }
100 void* get_var() { return (void*)( m_var.get() ); }
101 std::string& get_typename() { return m_typename; }
102
103 // Partial template specialization for member functions are not allowed in C++.
104 // --> defined a set of detailed functions, and call it.
105 void clear() { varHolder_detail::clear( this->get() ); }
106
107 void branch_tree( const std::string& name, TTree *tree ) {
109 //tree->Branch(name.c_str(), m_typename.c_str(), m_var.get() );
110 }
111
112
113 };
114
115
116 //____________________________________________________________________________________________________
118 private:
119 std::map<std::string, BaseHolder*> m_varHolder;
120
121 public:
122
123 std::vector<IntersectionPos*> m_RecoTrk_Int;
124 std::vector<IntersectionPos*> m_SVTrk_Int;
125
128
130 void branchNtuple( TTree *tree );
132
133
134 template<class T> void addNewVar(const std::string& varname) {
135 m_varHolder.insert( make_pair(std::string(varname), new varHolder<T>) );
136 }
137
138 template<class T> bool isAvailable(const std::string& varname) {
139 if( m_varHolder.find(varname) == m_varHolder.end() ) {
140 std::cerr << "Warning<TImprovedTree::isAvailable>: "
141 << "couldn't find the variable name " << varname
142 << std::endl;
143 return false;
144 } else {
145 BaseHolder* var = m_varHolder.at( varname );
146 int stat;
147 char* name = abi::__cxa_demangle(typeid( T ).name(), 0, 0, &stat);
148
149 if( var->get_typename() == name ) {
150 delete name;
151 return true;
152 } else {
153 delete name;
154 std::cerr << "Info<TImprovedTree::isAvailable>: " << "typeid didn't match." << std::endl;
155 std::cerr << "Possible candidates are..." << std::endl;
156 std::cerr << "========" << std::endl;
157 std::cerr << varname << " (" << var->get_typename() << ")" << std::endl;
158 std::cerr << "========" << std::endl;
159 return false;
160 }
161
162 }
163 }
164
165 template<class T> T& get(const std::string& varname) {
166 try{
167 if( !isAvailable<T>(varname) ) {
168 throw( varname );
169 }
170
171 varHolder<T>* holder = static_cast< varHolder<T>* >( m_varHolder.at( varname ) );
172 return holder->get();
173
174 } catch( std::string& varname ) {
175 std::cerr << "Variable " << varname << " is not found in the list!" << std::endl;
176 std::cerr << "Candidates are..." << std::endl;
177 int stat(0);
178 for( auto pair : m_varHolder ) {
179 char* name = abi::__cxa_demangle(typeid( T ).name(), 0, 0, &stat);
180 if( pair.second->get_typename() == name ) {
181 std::cerr << " " << pair.second->get_typename() << " : " << pair.first << std::endl;
182 }
183 delete name;
184 }
185
186 }
187
188 std::abort();
189 }
190
191 void clear();
192
193
194 };
195
196
197} // end of namespace bracket
198
199
200#endif /* _VrtSecInclusive_NtupleVars_H */
virtual std::string & get_typename()=0
virtual void * get_var()=0
virtual void branch_tree(const std::string &, TTree *)=0
virtual void clear()=0
std::vector< IntersectionPos * > m_SVTrk_Int
Definition NtupleVars.h:124
std::map< std::string, BaseHolder * > m_varHolder
Definition NtupleVars.h:119
T & get(const std::string &varname)
Definition NtupleVars.h:165
void addNewVar(const std::string &varname)
Definition NtupleVars.h:134
bool isAvailable(const std::string &varname)
Definition NtupleVars.h:138
void branchNtuple(TTree *tree)
std::vector< IntersectionPos * > m_RecoTrk_Int
Definition NtupleVars.h:123
std::shared_ptr< T > m_var
Definition NtupleVars.h:90
std::string & get_typename()
Definition NtupleVars.h:101
void branch_tree(const std::string &name, TTree *tree)
Definition NtupleVars.h:107
void branch_tree(const std::string &name, const std::string &type_name, TTree *tree, T *var)
Definition NtupleVars.h:75
static const std::map< const std::string, const std::string > tree_str_map
Definition NtupleVars.h:72
static std::map< const std::string, const std::string > create_tree_str()
Definition NtupleVars.h:55
TChain * tree