ATLAS Offline Software
Loading...
Searching...
No Matches
RootUtils::PyROOTInspector Class Reference

#include <PyROOTInspector.h>

Collaboration diagram for RootUtils::PyROOTInspector:

Static Public Member Functions

static PyObject * pyroot_inspect (PyObject *obj, bool persistentOnly=false)
static PyObject * pyroot_inspect2 (PyObject *obj, PyObject *obj_name, bool persistentOnly=false, bool retvecs=false)

Detailed Description

Definition at line 21 of file PyROOTInspector.h.

Member Function Documentation

◆ pyroot_inspect()

PyObject * RootUtils::PyROOTInspector::pyroot_inspect ( PyObject * obj,
bool persistentOnly = false )
static

Definition at line 441 of file PyROOTInspector.cxx.

443{
444 // handle non-pyroot objects
445 if (!TPython::CPPInstance_Check(pyobj)) {
446 Py_XINCREF(pyobj);
447 return pyobj;
448 }
449
450 TClass *tcls = RootUtils::objectIsA(pyobj);
451 if (0 == tcls) {
452 Py_INCREF(Py_None);
453 return Py_None;
454 }
455 void *obj = TPython::CPPInstance_AsVoidPtr(pyobj);
456
457 if (!strcmp(tcls->GetName(), "string")) {
458 std::string *str = (std::string*)obj;
459 return PyUnicode_FromString(str->c_str());
460 }
461
462 TString tstring = tcls->GetName();
463 if (tstring.BeginsWith("pair<") ||
464 tstring.BeginsWith("std::pair<")) {
465 PyObject *val = PyTuple_New(2);
466 PyObject *v0 = PyObject_GetAttrString(pyobj, "first");
467 PyObject *v1 = PyObject_GetAttrString(pyobj, "second");
468 PyTuple_SET_ITEM(val, 0, pyroot_inspect(v0, persistentOnly));
469 PyTuple_SET_ITEM(val, 1, pyroot_inspect(v1, persistentOnly));
470 Py_DECREF(v0);
471 Py_DECREF(v1);
472 return val;
473 }
474
475 Int_t hdr = 0;
476 if (CPyCppyy::Sequence_Check(pyobj)) {
477 if (!strcmp(tcls->GetName(), "CLHEP::Hep3Vector")) {
478 hdr = 0;
479 } else {
480 hdr = 1;
481 }
482 } else {
483 hdr = 0;
484 }
485
486 TList *members = tcls->GetListOfDataMembers();
487 const Int_t nmembers = members->GetEntries();
488
489 PyObject *py_members = PyList_New(nmembers+hdr);
490#if PYROOT_INSPECTOR_DBG
491 std::println (std::cerr, "==[{}]== (#mbrs:{} #stl:{} #py-sz:{})...",
492 tcls->GetName(), nmembers, hdr, PyList_Size(py_members));
493#endif
494
495 if (hdr) {
496 // handle collection
497 const Py_ssize_t nelems = PySequence_Size(pyobj);
498#if PYROOT_INSPECTOR_DBG
499 std::println (std::cerr, "== sequence ({})...", nelems);
500#endif
501 PyObject *py_elems = PyList_New(nelems);
502 for (Py_ssize_t i = 0; i < nelems; ++i) {
503 PyObject *itr = PySequence_GetItem(pyobj, i);
504 PyObject *itr_pyroot = pyroot_inspect(itr, persistentOnly);
505 PyList_SET_ITEM(py_elems, i, itr_pyroot);
506 Py_DECREF(itr);
507 //Py_DECREF(itr_pyroot);
508 }
509 // add the elements to the "members" list
510 PyList_SET_ITEM(py_members, 0, py_elems);
511#if PYROOT_INSPECTOR_DBG
512 std::println (std::cerr, "== sequence ({})... content:\n{}",
513 nelems, ::to_str(py_elems));
514 std::println (std::cerr, "== sequence ({})... [done]", nelems);
515#endif
516 }
517
518
519 for (Int_t j = 0; j<nmembers; ++j) {
520 TDataMember *mbr = (TDataMember*)(members->At(j));
521 Int_t offset = mbr->GetOffset();
522 char *ptr = (char*)obj + offset;
523
524#if PYROOT_INSPECTOR_DBG
525 TClass *mbr_cls = TClass::GetClass(mbr->GetTypeName());
526 std::println (std::cerr, "==[{}] - [{}] [{}][{}]",
527 j, mbr->GetTypeName(), mbr->GetName(),
528 (mbr_cls ? mbr_cls->GetName() : "N/A"));
529#endif
530
531 PyObject *py_mbr = 0;
532
533 if (persistentOnly && !mbr->IsPersistent())
534 continue;
535 if (mbr->IsaPointer())
536 continue;
537 if (mbr->IsBasic()) {
538 TDataType * mbr_type = mbr->GetDataType();
539 EDataType mbr_dtype = (EDataType)mbr_type->GetType();
540 py_mbr = to_pyobj(ptr, mbr_dtype);
541 } else if (mbr->IsEnum()) {
542#if PYROOT_INSPECTOR_DBG
543 std::println (std::cerr, "==[{}][{}][val=][{}] is an enum !!",
544 mbr->GetTypeName(), mbr->GetDataType()->GetType(),
545 *reinterpret_cast<int*>(ptr), mbr->GetName());
546#endif
547 py_mbr = to_pyobj(ptr, kInt_t);
548 } else {
549 PyObject *pyroot_obj = TPython::CPPInstance_FromVoidPtr
550 ((void*)ptr,
551 mbr->GetTypeName());
552 if (pyroot_obj) {
553 py_mbr = pyroot_inspect(pyroot_obj, persistentOnly);
554 }
555 Py_XDECREF(pyroot_obj);
556 }
557 if (!py_mbr) {
558 std::println (std::cerr, "could not create py-object of type [{}] !",
559 mbr->GetTypeName());
560 Py_DECREF(py_members);
562 }
563
564 PyObject *py_item = PyTuple_New(2);
565 PyTuple_SET_ITEM(py_item, 0,
566 PyUnicode_FromString(mbr->GetName()));
567 PyTuple_SET_ITEM(py_item, 1, py_mbr);
568 PyList_SET_ITEM(py_members, j+hdr, py_item);
569 }
570#if PYROOT_INSPECTOR_DBG
571 std::println (std::cerr, "==[{}]== (#mbrs:{})... [done]",
572 tcls->GetName(), nmembers);
573#endif
574 return py_members;
575}
_object PyObject
static PyObject * pyroot_inspect(PyObject *obj, bool persistentOnly=false)
CPyCppyy::PyException PyException
Definition Utility.h:24
TClass * objectIsA(PyObject *obj)
Definition Utility.cxx:103
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)
void * ptr(T *p)
Definition SGImplSvc.cxx:76

◆ pyroot_inspect2()

PyObject * RootUtils::PyROOTInspector::pyroot_inspect2 ( PyObject * obj,
PyObject * obj_name,
bool persistentOnly = false,
bool retvecs = false )
static

Definition at line 578 of file PyROOTInspector.cxx.

582{
583 PyObject *pystack = PyList_New(0);
584 ::recurse_pyinspect(pyobj, pyobj_name, pystack, persistentOnly, retvecs);
585 return pystack;
586}

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