ATLAS Offline Software
Loading...
Searching...
No Matches
PrintHelpers.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5
6// System include(s):
7#include <cstdint>
8#include <iostream>
9
10// EDM include(s):
14
15// Local include(s):
17
18namespace PrintHelpers {
19
20template <class T> struct VecPrintType {
21 typedef T type;
22};
23
24template <> struct VecPrintType<char> {
25 using type = int;
26};
27
28template <> struct VecPrintType<int8_t> {
29 using type = int;
30};
31
32template <> struct VecPrintType<uint8_t> {
33 using type = unsigned int;
34};
35
36} // namespace PrintHelpers
37
38
39template< typename T, typename U >
40std::ostream& operator<< ( std::ostream& out, const std::pair< T, U >& p ) {
41 out << "(";
42 out << static_cast<typename PrintHelpers::VecPrintType<T>::type> (p.first);
43 out << ", ";
44 out << static_cast<typename PrintHelpers::VecPrintType<U>::type> (p.second);
45 out << ")";
46 return out;
47}
48
50template< typename T >
51std::ostream& operator<< ( std::ostream& out, const std::vector< T >& vec ) {
52
53 out << "[";
54 for( size_t i = 0; i < vec.size(); ++i ) {
55 out << static_cast<typename PrintHelpers::VecPrintType<T>::type> (vec[ i ]);
56 if( i < vec.size() - 1 ) {
57 out << ", ";
58 }
59 }
60 out << "]";
61
62 // Return the same stream:
63 return out;
64}
65
66std::ostream& operator<< ( std::ostream& out, const SG::AuxElement& obj ) {
67
68 // Start off with some basic information:
69 out << "SG::AuxElement\n";
70 out << " ";
71 if( obj.usingStandaloneStore() ) {
72 out << "using standalone store\n";
73 } else if( obj.usingPrivateStore() ) {
74 out << "using private store\n";
75 } else if( obj.container() ) {
76 out << "in container\n";
77 } else {
78 // If there's no auxiliary store, bail now:
79 out << "standalone object, without auxiliary store";
80 return out;
81 }
82
83 // If the container doesn't have an auxiliary store, bail now:
84 if( ! obj.container()->getConstStore() ) {
85 return out;
86 }
87
88 out << " Variables:";
89
90 // Get a convenience pointer to the aux type registry:
92
93 // Get the auxiliary IDs of the object:
94 const SG::auxid_set_t& auxids =
95 ( obj.container()->getConstStore() ?
96 obj.container()->getConstStore()->getAuxIDs() :
97 obj.getConstStore()->getAuxIDs() );
98
99 // Sort auxids to get predictable ordering.
100 std::vector<SG::auxid_t> auxids_v (auxids.begin(), auxids.end());
101 std::sort (auxids_v.begin(), auxids_v.end());
102
103 for( SG::auxid_t auxid : auxids_v ) {
104
105 out << "\n - type: " << reg.getTypeName( auxid )
106 << ", \tname: \"" << reg.getName( auxid );
107 out << "\", \tvalue: ";
108
110#define PRINTER( TYPE ) \
111 do { \
112 SG::ConstAccessor< TYPE > acc( auxid ); \
113 if( acc.isAvailable( obj ) ) { \
114 out << acc( obj ); \
115 } \
116 } while( 0 )
117
118 // The type of the variable:
119 const std::type_info* ti = reg.getType( auxid );
120 if( reg.getFlags( auxid ) & SG::AuxVarFlags::Atomic ) {
121 if( *ti == typeid( unsigned int ) ) {
122 SG::AtomicConstAccessor<unsigned int> acc( reg.getName( auxid ) );
123 if ( acc.isAvailable( obj )) {
124 out << acc (obj);
125 }
126 }
127 else {
128 out << "(Unsupported atomic type)\n";
129 }
130 } else if( *ti == typeid( int8_t ) ) {
131 SG::ConstAccessor< int8_t > acc( auxid );
132 if( acc.isAvailable( obj ) ) {
133 out << static_cast< int >( acc( obj ) );
134 }
135 } else if( *ti == typeid( uint8_t ) ) {
136 SG::ConstAccessor< uint8_t > acc( auxid );
137 if( acc.isAvailable( obj ) ) {
138 out << static_cast< int >( acc( obj ) );
139 }
140 } else if( *ti == typeid( int16_t ) ) {
141 PRINTER( int16_t );
142 } else if( *ti == typeid( uint16_t ) ) {
143 PRINTER( uint16_t );
144 } else if( *ti == typeid( int32_t ) ) {
145 PRINTER( int32_t );
146 } else if( *ti == typeid( uint32_t ) ) {
147 PRINTER( uint32_t );
148 } else if( *ti == typeid( int64_t ) ) {
149 PRINTER( int64_t );
150 } else if( *ti == typeid( uint64_t ) ) {
151 PRINTER( uint64_t );
152 } else if( *ti == typeid( long ) ) {
153 PRINTER( long );
154 } else if( *ti == typeid( unsigned long ) ) {
155 PRINTER( unsigned long );
156 } else if( *ti == typeid( unsigned long long ) ) {
157 PRINTER( unsigned long long );
158 } else if( *ti == typeid( float ) ) {
159 PRINTER( float );
160 } else if( *ti == typeid( double ) ) {
161 PRINTER( double );
162 } else if( *ti == typeid( std::vector< float > ) ) {
163 PRINTER( std::vector< float > );
164 } else if( *ti == typeid( std::vector< double > ) ) {
165 PRINTER( std::vector< double > );
166 } else if( *ti == typeid( std::vector< char > ) ) {
167 PRINTER( std::vector< char > );
168 } else if( *ti == typeid( std::vector< int8_t > ) ) {
169 PRINTER( std::vector< int8_t > );
170 } else if( *ti == typeid( std::vector< uint8_t > ) ) {
171 PRINTER( std::vector< uint8_t > );
172 } else if( *ti == typeid( std::vector< int16_t > ) ) {
173 PRINTER( std::vector< int16_t > );
174 } else if( *ti == typeid( std::vector< uint16_t > ) ) {
175 PRINTER( std::vector< uint16_t > );
176 } else if( *ti == typeid( std::vector< int32_t > ) ) {
177 PRINTER( std::vector< int32_t > );
178 } else if( *ti == typeid( std::vector< uint32_t > ) ) {
179 PRINTER( std::vector< uint32_t > );
180 } else if( *ti == typeid( std::vector< int64_t > ) ) {
181 PRINTER( std::vector< int64_t > );
182 } else if( *ti == typeid( std::vector< uint64_t > ) ) {
183 PRINTER( std::vector< uint64_t > );
184 } else if( *ti == typeid( std::vector< std::string > ) ) {
185 PRINTER( std::vector< std::string > );
186 } else if( *ti == typeid( std::vector< std::pair<std::string, std::string> > ) ) {
187 using Stringpair_t = std::pair<std::string, std::string>;
188 PRINTER( std::vector< Stringpair_t > );
189 } else {
190 out << "N/A";
191 }
192
193// Get rid of the temporary macro...
194#undef PRINTER
195 }
196
197 // Return the same stream:
198 return out;
199}
200
201namespace xAOD {
202
203 void dump( const SG::AuxElement& obj ) {
204
205 // Do the printout simply using the operator:
206 std::cout << obj << std::endl;
207 return;
208 }
209
210} // namespace xAOD
Access an auxiliary variable atomically.
Base class for elements of a container that can have aux data.
Handle mappings between names and auxid_t.
std::vector< size_t > vec
std::ostream & operator<<(std::ostream &out, const std::pair< T, U > &p)
#define PRINTER(TYPE)
const_iterator end() const
Return an end iterator.
const_iterator begin() const
Return a begin iterator.
Access an auxiliary variable atomically.
Base class for elements of a container that can have aux data.
Definition AuxElement.h:483
Handle mappings between names and auxid_t.
static AuxTypeRegistry & instance()
Return the singleton registry instance.
Helper class to provide constant type-safe access to aux data.
A set of aux data identifiers.
Definition AuxTypes.h:47
@ Atomic
Mark that this variable should only be accessed atomically.
Definition AuxTypes.h:70
size_t auxid_t
Identifier for a particular aux data item.
Definition AuxTypes.h:27
-event-from-file
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
ICaloAffectedTool is abstract interface for tools checking if 4 mom is in calo affected region.