ATLAS Offline Software
Loading...
Searching...
No Matches
Control/AthContainers/Root/debug.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
11
12
13#include "AthContainers/debug.h"
19#include "AthLinks/DataLinkBase.h"
20#ifndef XAOD_STANDALONE
21# include "SGTools/DataProxy.h"
22#endif
23#include "CxxUtils/StrFormat.h"
24#include <format>
25#include <vector>
26#include <sstream>
27#include <iostream>
28#include <cstring>
29
30
31namespace SGdebug {
32
33
38std::string aux_var_name (SG::auxid_t id)
39{
41 return reg.getClassName(id) + "::" + reg.getName(id);
42}
43
44
50{
51 std::cout << aux_var_name(id) << "\n";
52}
53
54
55/******************************************************************************
56 * Print the list of aux variables given some object.
57 */
58
59
66void print_aux_vars (const SG::auxid_set_t& auxids,
67 const SG::auxid_set_t& decors,
68 std::ostream& os)
69{
71 std::vector<SG::auxid_t> ids (auxids.begin(), auxids.end());
72 std::sort (ids.begin(), ids.end());
73
74 for (SG::auxid_t id : ids) {
75 os << id << " "
76 << reg.getClassName(id) << "::" << reg.getName(id) << " "
77 << "[" << reg.getTypeName(id);
78
79 SG::AuxVarFlags flags = reg.getFlags(id);
80 if (flags & SG::AuxVarFlags::Atomic) {
81 os << " (atomic)";
82 }
83 if (flags & SG::AuxVarFlags::Linked) {
84 os << " (linked)";
85 }
86 if (decors.test (id)) {
87 os << " (decor)";
88 }
89
90 os << "]\n";
91 }
92}
93
94
99void print_aux_vars (const SG::auxid_set_t& auxids)
100{
101 print_aux_vars (auxids, SG::auxid_set_t(), std::cout);
102}
103
104
110void print_aux_vars (const SG::IConstAuxStore& store, std::ostream& os)
111{
112 print_aux_vars (store.getAuxIDs(), store.getDecorIDs(), os);
113}
114
115
120void print_aux_vars (const SG::IConstAuxStore& store)
121{
122 print_aux_vars (store, std::cout);
123}
124
125
130void print_aux_vars (const SG::IConstAuxStore* store)
131{
132 print_aux_vars (*store);
133}
134
135
141void print_aux_vars (const SG::AuxVectorData& vec, std::ostream& os)
142{
143 print_aux_vars (vec.getAuxIDs(), vec.getDecorIDs(), os);
144}
145
146
152{
153 print_aux_vars (vec, std::cout);
154}
155
156
162{
164}
165
166
172{
173 print_aux_vars (elt.getAuxIDs(), elt.getDecorIDs(), std::cout);
174}
175
176
182{
183 print_aux_vars (*elt);
184}
185
186
187/******************************************************************************
188 * Dump out aux variables.
189 */
190
191
192namespace {
193
194
195template <class T>
196void convert (std::ostream& os, const T& x)
197{
198 os << x;
199}
200
201
202void convert (std::ostream& os, const char x)
203{
204 os << static_cast<int > (x);
205}
206
207
208void convert (std::ostream& os, const unsigned char x)
209{
210 os << static_cast<unsigned > (x);
211}
212
213
214void convert (std::ostream& os, const float x)
215{
216 os << CxxUtils::strformat ("%.3f", x);
217}
218
219
220void convert (std::ostream& os, const double x)
221{
222 os << CxxUtils::strformat ("%.3f", x);
223}
224
225
226void convert (std::ostream& os, const SG::JaggedVecEltBase& x, size_t i)
227{
228 os << std::format ("[{},{}]", x.begin(i), x.end());
229}
230
231
232void convert (std::ostream& os, const DataLinkBase& x)
233{
234#ifdef XAOD_STANDALONE
235 os << std::format ("DataLink[{}]", x.persKey());
236#else
237 os << std::format ("DataLink[{}/{}]", x.proxy() ? x.proxy()->clID() : CLID_NULL, x.dataID());
238#endif
239}
240
241
242void convert (std::ostream& os, const SG::PackedLinkBase& x)
243{
244 os << std::format ("PackedLink[{}/{}]", x.collection(), x.index());
245}
246
247
248template <class T>
249void convert (std::ostream& os, const std::vector<T>& x)
250{
251 os << "[";
252 bool first = true;
253 // using `decltype(auto)` in case T=bool
254 // cppcheck-suppress internalAstError
255 for (decltype(auto) elt : x) {
256 if (first)
257 first = false;
258 else
259 os << ", ";
260 convert (os, elt);
261 }
262 os << "]";
263}
264
265
266struct AuxVarSort
267{
268 AuxVarSort (SG::auxid_t the_id)
269 : id(the_id),
270 name(aux_var_name(the_id))
271 {}
272
273 SG::auxid_t id;
274 std::string name;
275};
276
277
278bool operator< (const AuxVarSort& a, const AuxVarSort& b )
279{
280 return a.name < b.name;
281}
282
283
284} // anonymous namespace
285
286
293std::string aux_var_as_string (SG::auxid_t auxid, const void* p, size_t i)
294{
295 if (!p) {
296 return "(null)";
297 }
298
299 std::ostringstream os;
300
302 const std::type_info* ti = r.getType(auxid);
303#define CONVERT(T) if (ti == &typeid(T) || strcmp(ti->name(), typeid(T).name())==0) convert (os, *reinterpret_cast<const T*>(p)); else
304#define CONVERT1(T) CONVERT(T) CONVERT(std::vector<T>)
305 CONVERT1 (int)
306 CONVERT1 (unsigned int)
307 CONVERT1 (short)
308 CONVERT1 (unsigned short)
309 CONVERT1 (char)
310 CONVERT1 (unsigned char)
311 CONVERT1 (long)
312 CONVERT1 (unsigned long)
313 CONVERT1 (long long)
314 CONVERT1 (unsigned long long)
315 CONVERT1 (float)
316 CONVERT1 (double)
317 CONVERT1 (bool)
318 CONVERT1 (std::string)
319 //else
320 {
321 std::string tiname = AthContainers_detail::typeinfoName(*ti);
322 if (tiname.starts_with ("SG::JaggedVecElt<")) {
323 convert (os, *reinterpret_cast<const SG::JaggedVecEltBase*>(p), i);
324 }
325 else if (tiname.starts_with ("DataLink<")) {
326 convert (os, *reinterpret_cast<const DataLinkBase*>(p));
327 }
328 else if (tiname.starts_with ("SG::PackedLink<")) {
329 convert (os, *reinterpret_cast<const SG::PackedLinkBase*>(p));
330 }
331 else if (tiname.starts_with ("std::vector<SG::PackedLink<")) {
332 convert (os, *reinterpret_cast<const std::vector<SG::PackedLinkBase>*>(p));
333 }
334 else {
335 os << "<??? " << tiname << ">";
336 }
337 }
338 return os.str();
339}
340
341
348void dump_aux_vars (std::ostream& os, const SG::IConstAuxStore& store, size_t i)
349{
350 if (i >= store.size()) return;
352 const SG::auxid_set_t& ids = store.getAuxIDs();
353 std::vector<AuxVarSort> vars (ids.begin(), ids.end());
354 std::sort (vars.begin(), vars.end());
355 for (const AuxVarSort& v : vars) {
356 if (reg.isLinked (v.id)) continue;
357 const void* pbeg = store.getData (v.id);
358 size_t eltsz = reg.getEltSize (v.id);
359 const char* p = reinterpret_cast<const char*>(pbeg) + eltsz*i;
360 os << v.name << " " << aux_var_as_string (v.id, p, i) << "\n";
361 SG::auxid_t linked_id = reg.linkedVariable (v.id);
362 if (linked_id != SG::null_auxid) {
363 os << " linked: " << aux_var_name (linked_id) << " ";
364 const SG::IAuxTypeVector* lv = store.linkedVector (v.id);
365 if (!lv) {
366 os << "(missing linkedVector)\n";
367 continue;
368 }
369 size_t sz = lv->size();
370 const char* lbeg = reinterpret_cast<const char*>(lv->toPtr());
371 size_t leltsz = reg.getEltSize (linked_id);
372 os << "[";
373 bool first = true;
374 for (size_t j = 0; j < sz; j++) {
375 if (first)
376 first = false;
377 else
378 os << ", ";
379 const char* p = reinterpret_cast<const char*>(lbeg) + leltsz*j;
380 os << aux_var_as_string (linked_id, p, i);
381 }
382 os << "]\n";
383 }
384 }
385}
386
387
393void dump_aux_vars (const SG::IConstAuxStore& store, size_t i)
394{
395 dump_aux_vars (std::cout, store, i);
396}
397
398
404void dump_aux_vars (const SG::IConstAuxStore* store, size_t i)
405{
406 dump_aux_vars (*store, i);
407}
408
409
414void dump_aux_vars (const SG::IConstAuxStore& store)
415{
416 size_t sz = store.size();
417 for (size_t i = 0; i < sz; i++) {
418 std::cout << "=== Element " << i << "\n";
419 dump_aux_vars (store, i);
420 }
421}
422
423
428void dump_aux_vars (const SG::IConstAuxStore* store)
429{
430 dump_aux_vars (*store);
431}
432
433
439void dump_aux_vars (const SG::AuxVectorData& vec, size_t i)
440{
441 const SG::IConstAuxStore* store = vec.getConstStore();
442 if (store)
443 dump_aux_vars (*store, i);
444}
445
446
452void dump_aux_vars (const SG::AuxVectorData* vec, size_t i)
453{
454 dump_aux_vars (*vec, i);
455}
456
457
463{
464 const SG::IConstAuxStore* store = vec.getConstStore();
465 if (store)
466 dump_aux_vars (*store);
467}
468
469
475{
477}
478
479
485{
486 const SG::AuxVectorData* cont = elt.container();
487 if (cont)
488 dump_aux_vars (*cont, elt.index());
489}
490
491
497{
498 dump_aux_vars (*elt);
499}
500
501
502} // namespace SG
Handle mappings between names and auxid_t.
std::vector< size_t > vec
Helper functions intended to be called from the debugger.
#define CONVERT1(T)
bool operator<(const DataVector< T > &a, const DataVector< T > &b)
Vector ordering relation.
Interface for const operations on an auxiliary store.
Definition of JaggedVecElt.
static Double_t sz
static Double_t a
Definition of PackedLink type.
Provide helper functions to create formatted strings.
#define x
Type-independent part of DataLink; holds the persistent state.
Handle mappings between names and auxid_t.
static AuxTypeRegistry & instance()
Return the singleton registry instance.
Manage lookup of vectors of auxiliary data.
Abstract interface for manipulating vectors of arbitrary types.
virtual void * toPtr()=0
Return a pointer to the start of the vector's data.
virtual size_t size() const =0
Return the size of the vector.
Describe one element of a jagged vector (base class).
A set of aux data identifiers.
Definition AuxTypes.h:47
Helper for emitting error messages.
int r
Definition globals.cxx:22
std::string strformat(const char *fmt,...)
return a std::string according to a format fmt and varargs
Definition StrFormat.cxx:49
bool first
Definition DeMoScan.py:534
AuxVarFlags
Additional flags to qualify an auxiliary variable.
Definition AuxTypes.h:58
@ Atomic
Mark that this variable should only be accessed atomically.
Definition AuxTypes.h:70
static const auxid_t null_auxid
To signal no aux data item.
Definition AuxTypes.h:30
AuxElement(SG::AuxVectorData *container, size_t index)
Base class for elements of a container that can have aux data.
size_t auxid_t
Identifier for a particular aux data item.
Definition AuxTypes.h:27
void dump_aux_vars(std::ostream &os, const SG::IConstAuxStore &store, size_t i)
Dump aux variables from a store for a single element.
void print_aux_vars(const SG::auxid_set_t &auxids, const SG::auxid_set_t &decors, std::ostream &os)
Print the list of aux variables in a set.
std::string aux_var_name(SG::auxid_t id)
Return the name corresponding to a given aux id.
std::string aux_var_as_string(SG::auxid_t auxid, const void *p, size_t i)
Convert an aux variable to a string.
void print_aux_var_name(SG::auxid_t id)
Print the name corresponding to a given aux id.
std::unique_ptr< MVAUtils::BDT > convert(TMVA::MethodBDT *bdt, bool isRegression=true, bool useYesNoLeaf=false)
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
A packed version of ElementLink.