Geometry/PyROOT/ TGeoVolume::Draw / problem in C++; program state has been reset

Hi,

I am trying to develop an interface for my python program and i face the problem below :

*** Break *** segmentation violation
 Generating stack trace...
 0x00007f8aa2fbc3c6 in TGeoPainter::PaintVolume(TGeoVolume*, char const*, TGeoMatrix*) + 0x456 from /usr/lib/root/libGeomPainter.so
 0x00007f8aa2fba5f3 in TGeoPainter::Paint(char const*) + 0xd3 from /usr/lib/root/libGeomPainter.so
 0x00007f8aa2fb7863 in TGeoPainter::DrawVolume(TGeoVolume*, char const*) + 0x143 from /usr/lib/root/libGeomPainter.so
 0x00007f8ab4105fe3 in FastCall(long, void*, void*, void*) + 0xa73 from /usr/lib/root/libPyROOT.so
 0x00007f8ab4109541 in PyROOT::TVoidExecutor::Execute(long, void*, PyROOT::TCallContext*) + 0x71 from /usr/lib/root/libPyROOT.so
 0x00007f8ab412cb76 in PyROOT::TMethodHolder::CallSafe(void*, long, PyROOT::TCallContext*) + 0x86 from /usr/lib/root/libPyROOT.so
 0x00007f8ab412c6ea in PyROOT::TMethodHolder::Execute(void*, long, PyROOT::TCallContext*) + 0x3a from /usr/lib/root/libPyROOT.so
 0x00007f8ab412aab2 in PyROOT::TMethodHolder::Call(PyROOT::ObjectProxy*&, _object*, _object*, PyROOT::TCallContext*) + 0x102 from /usr/lib/root/libPyROOT.so
 0x00007f8ab410fa10 in <unknown> from /usr/lib/root/libPyROOT.so
 0x00007f8ab517cbf4 in _PyObject_FastCallDict + 0x94 from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab51b995d in <unknown> from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab51572ea in _PyEval_EvalFrameDefault + 0x2fa from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab51b934a in <unknown> from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab51b98ee in <unknown> from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab51572ea in _PyEval_EvalFrameDefault + 0x2fa from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab51b9da7 in PyEval_EvalCodeEx + 0x2e7 from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab5156feb in PyEval_EvalCode + 0x1b from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab5228682 in <unknown> from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab522acdd in PyRun_FileExFlags + 0x9d from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab522aec7 in PyRun_SimpleFileExFlags + 0x1b7 from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab5220e3c in Py_Main + 0x67c from /usr/lib/libpython3.6m.so.1.0
 0x0000560bc9eabcb8 in main + 0x1e8 from /usr/bin/python3.6
 0x00007f8ab55bef6a in __libc_start_main + 0xea from /usr/lib/libc.so.6
 0x0000560bc9eabe2a in _start + 0x2a from /usr/bin/python3.6

 *** Break *** segmentation violation
 Generating stack trace...
 0x00007f8aa2fbc3c6 in TGeoPainter::PaintVolume(TGeoVolume*, char const*, TGeoMatrix*) + 0x456 from /usr/lib/root/libGeomPainter.so
 0x00007f8aa2fba5f3 in TGeoPainter::Paint(char const*) + 0xd3 from /usr/lib/root/libGeomPainter.so
 0x00007f8aa2a93e2c in TPad::PaintModified() + 0x23c from /usr/lib/root/libGpad.so
 0x00007f8aa2a4f226 in TCanvas::Update() + 0x126 from /usr/lib/root/libGpad.so
 0x00007f8a9baf8d48 in TRootCanvas::HandleContainerConfigure(Event_t*) + 0x38 from /usr/lib/root/libGui.so
 0x00007f8a9ba1cb34 in TGFrame::HandleEvent(Event_t*) + 0xf4 from /usr/lib/root/libGui.so
 0x00007f8a9b9c791a in TGClient::HandleEvent(Event_t*) + 0x4a from /usr/lib/root/libGui.so
 0x00007f8a9b9c7c46 in TGClient::ProcessOneEvent() + 0xc6 from /usr/lib/root/libGui.so
 0x00007f8a9b9c7cab in TGClient::HandleInput() + 0x1b from /usr/lib/root/libGui.so
 0x00007f8ab3564b38 in TUnixSystem::DispatchOneEvent(bool) + 0x58 from /usr/lib/root/libCore.so
 0x00007f8ab34a3d72 in TSystem::ProcessEvents() + 0x72 from /usr/lib/root/libCore.so
 0x00007f8ab5d78012 in <unknown function>
 0x00007f8ab4105fe3 in FastCall(long, void*, void*, void*) + 0xa73 from /usr/lib/root/libPyROOT.so
 0x00007f8ab410688d in Cppyy::CallB(long, void*, void*) + 0x2d from /usr/lib/root/libPyROOT.so
 0x00007f8ab4109de9 in PyROOT::TBoolExecutor::Execute(long, void*, PyROOT::TCallContext*) + 0x79 from /usr/lib/root/libPyROOT.so
 0x00007f8ab412cb76 in PyROOT::TMethodHolder::CallSafe(void*, long, PyROOT::TCallContext*) + 0x86 from /usr/lib/root/libPyROOT.so
 0x00007f8ab412c6ea in PyROOT::TMethodHolder::Execute(void*, long, PyROOT::TCallContext*) + 0x3a from /usr/lib/root/libPyROOT.so
 0x00007f8ab412aab2 in PyROOT::TMethodHolder::Call(PyROOT::ObjectProxy*&, _object*, _object*, PyROOT::TCallContext*) + 0x102 from /usr/lib/root/libPyROOT.so
 0x00007f8ab410fa10 in <unknown> from /usr/lib/root/libPyROOT.so
 0x00007f8ab517cbf4 in _PyObject_FastCallDict + 0x94 from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab51b995d in <unknown> from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab51572ea in _PyEval_EvalFrameDefault + 0x2fa from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab51b9da7 in PyEval_EvalCodeEx + 0x2e7 from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab51f0d96 in <unknown> from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab517dabb in PyObject_Call + 0x4b from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab5158891 in _PyEval_EvalFrameDefault + 0x18a1 from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab51b934a in <unknown> from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab51b98ee in <unknown> from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab51572ea in _PyEval_EvalFrameDefault + 0x2fa from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab51b934a in <unknown> from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab51b98ee in <unknown> from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab51572ea in _PyEval_EvalFrameDefault + 0x2fa from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab51b8dba in _PyFunction_FastCallDict + 0x11a from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab517cdce in _PyObject_FastCallDict + 0x26e from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab517d9d1 in _PyObject_Call_Prepend + 0x61 from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab517dabb in PyObject_Call + 0x4b from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab521f862 in <unknown> from /usr/lib/libpython3.6m.so.1.0
 0x00007f8ab595c08a in <unknown> from /usr/lib/libpthread.so.0
 0x00007f8ab56941bf in clone at :? from /usr/lib/libc.so.6
Traceback (most recent call last):
  File "/home/johann/home-these/SVN-LPSC/Geometry/src/msfr/jm/geometry/runtest/PyrootToto.py", line 33, in <module>
    pygeom.draw(world)
  File "/home/johann/home-these/SVN-LPSC/Geometry/src/msfr/jm/geometry/runtest/PyrootToto.py", line 26, in draw
    world.Draw()
SystemError: void TGeoVolume::Draw(const char* option = "") =>
    problem in C++; program state has been reset

When the canvas is created i got this kind of message :

Info in <TGeoManager::TGeoManager>: Geometry geoManager, Geometry created
Info in <TGeoManager::SetTopVolume>: Top volume is toto. Master volume is toto
Info in <TGeoNavigator::BuildCache>: --- Maximum geometry depth set to 100
Info in <TGeoManager::CheckGeometry>: Fixing runtime shapes...
Info in <TGeoManager::CheckGeometry>: ...Nothing to fix
TGeoManager::CheckGeometry:0: RuntimeWarning: Volume "toto" has no medium: assigned dummy medium and material
Info in <TGeoManager::CloseGeometry>: Counting nodes...
Info in <TGeoManager::Voxelize>: Voxelizing...
Error in <TGeoVolume::SortNodes>: Bounding box not valid
Error in <TGeoVolume::Voxelize>: Bounding box not valid
Error in <TGeoVolume::FindOverlaps>: Bounding box not valid
Info in <TGeoManager::CloseGeometry>: Building cache...
Info in <TGeoManager::CountLevels>: max level = 1, max placements = 0
Info in <TGeoManager::CloseGeometry>: 1 nodes/ 1 volume UID's in Geometry
Info in <TGeoManager::CloseGeometry>: ----------------modeler ready----------------
Info in <TGeoManager::SetVisLevel>: Automatic visible depth disabled
Info in <TCanvas::MakeDefCanvas>:  created default TCanvas with name c1

It seems there is a problem with bounding box.

I put a minimal working example of my program :

import time
import ROOT 
class PyrootGeometry():

    def __init__(self):
        self.geoManager = ROOT.TGeoManager("geoManager","Geometry")

    def createWorld(self):
        cylinderName = "toto"
        cylinderHalfLength = 2.5
        cylinderRadius = 2.0
        worldShape = ROOT.TGeoTube(0.,cylinderRadius, cylinderHalfLength)
        world = ROOT.TGeoVolume(cylinderName, worldShape)
        return world

    def configureGeoManager(self,world):
        self.geoManager.SetTopVolume(world)
        self.geoManager.CloseGeometry()
        world.SetLineColor(8)
        self.geoManager.SetVisLevel(3)
        self.geoManager.SetVisOption(0)
        self.geoManager.SetTopVisible()

    def draw(self,world):
        world.Draw()
        time.sleep(1000)

if __name__ =='__main__':
    pygeom = PyrootGeometry()
    world = pygeom.createWorld()
    pygeom.configureGeoManager(world)
    pygeom.draw(world)

Can you help me figure out where i did a mistake ?
Thanks
Regards
Johann

Hi Johann,
I can reproduce the problem but I have no clue yet, will let you know…

Best, Andrei

Hi Andrei,
Thank you for your help
Regards
Johann

Hi Johann,

we found a solution for your problem, i.e. the garbage collector of Python deleting your tube.

import time
import ROOT
class PyrootGeometry():
    def __init__(self):
        self.geoManager = ROOT.TGeoManager("geoManager","Geometry")
        self.tube = None

    def createWorld(self):
        cylinderName = "toto"
        cylinderHalfLength = 2.5
        cylinderRadius = 2.0
        self.tube = ROOT.TGeoTube(0.,cylinderRadius, cylinderHalfLength)
        world = ROOT.TGeoVolume(cylinderName, self.tube)
        return world

    def configureGeoManager(self,world):
        self.geoManager.SetTopVolume(world)
        self.geoManager.CloseGeometry()
        world.SetLineColor(8)
        self.geoManager.SetVisLevel(3)
        self.geoManager.SetVisOption(0)
        self.geoManager.SetTopVisible()

    def draw(self,world):
        world.Draw()
        time.sleep(1000)


if __name__ =='__main__':
    pygeom = PyrootGeometry()
    world = pygeom.createWorld()
    pygeom.configureGeoManager(world)
    pygeom.draw(world)

Cheers,
D

Hi,
Thank you very much and sorry for this silly error!
Cheers,
Johann