464{
465
466 if (!TPython::CPPInstance_Check(pyobj)) {
467 Py_XINCREF(pyobj);
468 return pyobj;
469 }
470
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<")) {
487 PyObject *
v0 = PyObject_GetAttrString(pyobj,
"first");
488 PyObject *v1 = PyObject_GetAttrString(pyobj,
"second");
491 Py_DECREF(v0);
492 Py_DECREF(v1);
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
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
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
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);
539 PyList_SET_ITEM(py_elems, i, itr_pyroot);
540 Py_DECREF(itr);
541
542 }
543
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
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) {
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
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}
static PyObject * pyroot_inspect(PyObject *obj, bool persistentOnly=false)
TClass * objectIsA(PyObject *obj)
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)