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 462 of file PyROOTInspector.cxx.

464{
465 // handle non-pyroot objects
466 if (!TPython::CPPInstance_Check(pyobj)) {
467 Py_XINCREF(pyobj);
468 return pyobj;
469 }
470
471 TClass *tcls = RootUtils::objectIsA(pyobj);
472 if (0 == tcls) {
473 Py_INCREF(Py_None);
474 return Py_None;
475 }
476 void *obj = TPython::CPPInstance_AsVoidPtr(pyobj);
477
478 if (!strcmp(tcls->GetName(), "string")) {
479 std::string *str = (std::string*)obj;
480 return PyUnicode_FromString(str->c_str());
481 }
482
483 TString tstring = tcls->GetName();
484 if (tstring.BeginsWith("pair<") ||
485 tstring.BeginsWith("std::pair<")) {
486 PyObject *val = PyTuple_New(2);
487 PyObject *v0 = PyObject_GetAttrString(pyobj, "first");
488 PyObject *v1 = PyObject_GetAttrString(pyobj, "second");
489 PyTuple_SET_ITEM(val, 0, pyroot_inspect(v0, persistentOnly));
490 PyTuple_SET_ITEM(val, 1, pyroot_inspect(v1, persistentOnly));
491 Py_DECREF(v0);
492 Py_DECREF(v1);
493 return val;
494 }
495
496 Int_t hdr = 0;
497#ifdef ATLAS_HAVE_CPYCPPYY
498 if (CPyCppyy::Sequence_Check(pyobj)) {
499 if (!strcmp(tcls->GetName(), "CLHEP::Hep3Vector")) {
500 hdr = 0;
501 } else {
502 hdr = 1;
503 }
504 } else {
505 hdr = 0;
506 }
507#endif // ATLAS_HAVE_CPYCPPYY
508#ifdef ATLAS_HAVE_CPYCRT
509 if (cppjit::cpyrt::Sequence_Check(pyobj)) {
510 if (!strcmp(tcls->GetName(), "CLHEP::Hep3Vector")) {
511 hdr = 0;
512 } else {
513 hdr = 1;
514 }
515 } else {
516 hdr = 0;
517 }
518#endif // ATLAS_HAVE_CPYRT
519
520 TList *members = tcls->GetListOfDataMembers();
521 const Int_t nmembers = members->GetEntries();
522
523 PyObject *py_members = PyList_New(nmembers+hdr);
524#if PYROOT_INSPECTOR_DBG
525 std::println (std::cerr, "==[{}]== (#mbrs:{} #stl:{} #py-sz:{})...",
526 tcls->GetName(), nmembers, hdr, PyList_Size(py_members));
527#endif
528
529 if (hdr) {
530 // handle collection
531 const Py_ssize_t nelems = PySequence_Size(pyobj);
532#if PYROOT_INSPECTOR_DBG
533 std::println (std::cerr, "== sequence ({})...", nelems);
534#endif
535 PyObject *py_elems = PyList_New(nelems);
536 for (Py_ssize_t i = 0; i < nelems; ++i) {
537 PyObject *itr = PySequence_GetItem(pyobj, i);
538 PyObject *itr_pyroot = pyroot_inspect(itr, persistentOnly);
539 PyList_SET_ITEM(py_elems, i, itr_pyroot);
540 Py_DECREF(itr);
541 //Py_DECREF(itr_pyroot);
542 }
543 // add the elements to the "members" list
544 PyList_SET_ITEM(py_members, 0, py_elems);
545#if PYROOT_INSPECTOR_DBG
546 std::println (std::cerr, "== sequence ({})... content:\n{}",
547 nelems, ::to_str(py_elems));
548 std::println (std::cerr, "== sequence ({})... [done]", nelems);
549#endif
550 }
551
552
553 for (Int_t j = 0; j<nmembers; ++j) {
554 TDataMember *mbr = (TDataMember*)(members->At(j));
555 Int_t offset = mbr->GetOffset();
556 char *ptr = (char*)obj + offset;
557
558#if PYROOT_INSPECTOR_DBG
559 TClass *mbr_cls = TClass::GetClass(mbr->GetTypeName());
560 std::println (std::cerr, "==[{}] - [{}] [{}][{}]",
561 j, mbr->GetTypeName(), mbr->GetName(),
562 (mbr_cls ? mbr_cls->GetName() : "N/A"));
563#endif
564
565 PyObject *py_mbr = 0;
566
567 if (persistentOnly && !mbr->IsPersistent())
568 continue;
569 if (mbr->IsaPointer())
570 continue;
571 if (mbr->IsBasic()) {
572 TDataType * mbr_type = mbr->GetDataType();
573 EDataType mbr_dtype = (EDataType)mbr_type->GetType();
574 py_mbr = to_pyobj(ptr, mbr_dtype);
575 } else if (mbr->IsEnum()) {
576#if PYROOT_INSPECTOR_DBG
577 std::println (std::cerr, "==[{}][{}][val=][{}] is an enum !!",
578 mbr->GetTypeName(), mbr->GetDataType()->GetType(),
579 *reinterpret_cast<int*>(ptr), mbr->GetName());
580#endif
581 py_mbr = to_pyobj(ptr, kInt_t);
582 } else {
583 PyObject *pyroot_obj = TPython::CPPInstance_FromVoidPtr
584 ((void*)ptr,
585 mbr->GetTypeName());
586 if (pyroot_obj) {
587 py_mbr = pyroot_inspect(pyroot_obj, persistentOnly);
588 }
589 Py_XDECREF(pyroot_obj);
590 }
591 if (!py_mbr) {
592 std::println (std::cerr, "could not create py-object of type [{}] !",
593 mbr->GetTypeName());
594 Py_DECREF(py_members);
595 throw RootUtils::PyException();
596 }
597
598 PyObject *py_item = PyTuple_New(2);
599 PyTuple_SET_ITEM(py_item, 0,
600 PyUnicode_FromString(mbr->GetName()));
601 PyTuple_SET_ITEM(py_item, 1, py_mbr);
602 PyList_SET_ITEM(py_members, j+hdr, py_item);
603 }
604#if PYROOT_INSPECTOR_DBG
605 std::println (std::cerr, "==[{}]== (#mbrs:{})... [done]",
606 tcls->GetName(), nmembers);
607#endif
608 return py_members;
609}
_object PyObject
static PyObject * pyroot_inspect(PyObject *obj, bool persistentOnly=false)
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:75

◆ pyroot_inspect2()

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

Definition at line 612 of file PyROOTInspector.cxx.

616{
617 PyObject *pystack = PyList_New(0);
618 ::recurse_pyinspect(pyobj, pyobj_name, pystack, persistentOnly, retvecs);
619 return pystack;
620}

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