Opened 8 months ago

Closed 8 months ago

#16959 closed enhancement (fixed)

Segmentations should not import VR at startup

Reported by: goddard@… Owned by: Zach Pearson
Priority: normal Milestone:
Component: Volume Data Version:
Keywords: Cc: Eric Pettersen
Blocked By: Blocking:
Notify when closed: Platform: all
Project: ChimeraX

Description

The following bug report has been submitted:
Platform:        Windows-10-10.0.22631
ChimeraX Version: 1.10.dev202502220014 (2025-02-22 00:14:16 UTC)
Description
It appears segmentations is importing the vive vr module at startup.  We should not to import these extremely rarely used modules at startup.

Log:
Startup Errors  
---  
error | Bundle 'ChimeraX-Segmentations' custom initialization failed  
warning | Traceback (most recent call last):  
File "C:\cygwin64\home\goddard\ucsf\chimerax\ChimeraX.app\bin\Lib\site-
packages\chimerax\core\toolshed\info.py", line 376, in initialize  
api._api_caller.initialize(api, session, self)  
File "C:\cygwin64\home\goddard\ucsf\chimerax\ChimeraX.app\bin\Lib\site-
packages\chimerax\core\toolshed\\__init__.py", line 1411, in initialize  
return cls._get_func(api, "initialize")(session, bi)  
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
File "C:\cygwin64\home\goddard\ucsf\chimerax\ChimeraX.app\bin\Lib\site-
packages\chimerax\segmentations\bundle.py", line 14, in initialize  
from chimerax.segmentations.view.cmd import register_view_triggers  
File "C:\cygwin64\home\goddard\ucsf\chimerax\ChimeraX.app\bin\Lib\site-
packages\chimerax\segmentations\view\cmd.py", line 12, in <module>  
from chimerax.segmentations.settings import get_settings  
File "C:\cygwin64\home\goddard\ucsf\chimerax\ChimeraX.app\bin\Lib\site-
packages\chimerax\segmentations\settings.py", line 3, in <module>  
from chimerax.segmentations.actions import (  
File "C:\cygwin64\home\goddard\ucsf\chimerax\ChimeraX.app\bin\Lib\site-
packages\chimerax\segmentations\actions\\__init__.py", line 15, in <module>  
from chimerax.segmentations.ui.segmentation_mouse_mode import (  
File "C:\cygwin64\home\goddard\ucsf\chimerax\ChimeraX.app\bin\Lib\site-
packages\chimerax\segmentations\ui\segmentation_mouse_mode.py", line 25, in
<module>  
from chimerax.vive.xr import vr_camera as openxr_camera  
File "C:\cygwin64\home\goddard\ucsf\chimerax\ChimeraX.app\bin\Lib\site-
packages\chimerax\vive\xr.py", line 668  
):  
^  
SyntaxError: unmatched ')'  
note | available bundle cache has not been initialized yet  
  
UCSF ChimeraX version: 1.10.dev202502220014 (2025-02-22)  
© 2016-2025 Regents of the University of California. All rights reserved.  
How to cite UCSF ChimeraX  




OpenGL version: 3.3.0 NVIDIA 560.94
OpenGL renderer: NVIDIA GeForce RTX 3070/PCIe/SSE2
OpenGL vendor: NVIDIA Corporation

Python: 3.11.4
Locale: en_US.cp1252
Qt version: PyQt6 6.8.1, Qt 6.8.2
Qt runtime version: 6.8.2
Qt platform: windows

Manufacturer: Dell Inc.
Model: OptiPlex 7000
OS: Microsoft Windows 11 Pro (Build 22631)
Memory: 68,393,086,976
MaxProcessMemory: 137,438,953,344
CPU: 20 12th Gen Intel(R) Core(TM) i7-12700K
OSLanguage: en-US

Installed Packages:
    alabaster: 1.0.0
    anyio: 4.8.0
    appdirs: 1.4.4
    asttokens: 3.0.0
    auditwheel: 6.2.0
    babel: 2.17.0
    beautifulsoup4: 4.13.3
    blockdiag: 3.0.0
    blosc2: 3.1.1
    build: 1.2.1
    certifi: 2025.1.31
    cftime: 1.6.4.post1
    charset-normalizer: 3.4.1
    ChimeraX-AddCharge: 1.5.18
    ChimeraX-AddH: 2.2.6
    ChimeraX-AlignmentAlgorithms: 2.0.2
    ChimeraX-AlignmentHdrs: 3.6
    ChimeraX-AlignmentMatrices: 2.1
    ChimeraX-Alignments: 2.19.1
    ChimeraX-AlphaFold: 1.0.1
    ChimeraX-AltlocExplorer: 1.1.2
    ChimeraX-AmberInfo: 1.0
    ChimeraX-Aniso: 1.0.1
    ChimeraX-Arrays: 1.1
    ChimeraX-Atomic: 1.60.5
    ChimeraX-AtomicLibrary: 14.1.13
    ChimeraX-AtomSearch: 2.0.1
    ChimeraX-AxesPlanes: 2.4
    ChimeraX-BasicActions: 1.1.3
    ChimeraX-BILD: 1.0
    ChimeraX-BlastProtein: 3.0.0
    ChimeraX-BondRot: 2.0.4
    ChimeraX-BugReporter: 1.0.2
    ChimeraX-BuildStructure: 2.13.1
    ChimeraX-Bumps: 1.0
    ChimeraX-BundleBuilder: 1.4.0
    ChimeraX-ButtonPanel: 1.0.1
    ChimeraX-CageBuilder: 1.0.1
    ChimeraX-CellPack: 1.0
    ChimeraX-Centroids: 1.4
    ChimeraX-ChangeChains: 1.1
    ChimeraX-CheckWaters: 1.4
    ChimeraX-ChemGroup: 2.0.1
    ChimeraX-Clashes: 2.3
    ChimeraX-ColorActions: 1.0.5
    ChimeraX-ColorGlobe: 1.0
    ChimeraX-ColorKey: 1.5.8
    ChimeraX-CommandLine: 1.2.5
    ChimeraX-ConnectStructure: 2.0.1
    ChimeraX-Contacts: 1.0.1
    ChimeraX-Core: 1.10.dev202502220014
    ChimeraX-CoreFormats: 1.2
    ChimeraX-coulombic: 1.4.4
    ChimeraX-Crosslinks: 1.0
    ChimeraX-Crystal: 1.0
    ChimeraX-CrystalContacts: 1.0.1
    ChimeraX-DataFormats: 1.2.3
    ChimeraX-Dicom: 1.2.7
    ChimeraX-DistMonitor: 1.4.2
    ChimeraX-DockPrep: 1.1.3
    ChimeraX-Dssp: 2.0
    ChimeraX-EMDB-SFF: 1.0
    ChimeraX-ESMFold: 1.0
    ChimeraX-FileHistory: 1.0.1
    ChimeraX-FunctionKey: 1.0.1
    ChimeraX-Geometry: 1.3
    ChimeraX-gltf: 1.0
    ChimeraX-Graphics: 1.4.1
    ChimeraX-Hbonds: 2.5
    ChimeraX-Help: 1.3
    ChimeraX-HKCage: 1.3
    ChimeraX-ImageFormats: 1.2
    ChimeraX-IMOD: 1.0
    ChimeraX-IO: 1.0.3
    ChimeraX-ItemsInspection: 1.0.1
    ChimeraX-IUPAC: 1.0
    ChimeraX-KVFinder: 1.5.1
    ChimeraX-Label: 1.1.14
    ChimeraX-ListInfo: 1.2.2
    ChimeraX-Log: 1.2
    ChimeraX-LookingGlass: 1.1
    ChimeraX-Maestro: 1.9.1
    ChimeraX-Map: 1.3
    ChimeraX-MapData: 2.0
    ChimeraX-MapEraser: 1.0.1
    ChimeraX-MapFilter: 2.0.1
    ChimeraX-MapFit: 2.0
    ChimeraX-MapSeries: 2.1.1
    ChimeraX-Markers: 1.0.1
    ChimeraX-Mask: 1.0.2
    ChimeraX-MatchMaker: 2.1.7
    ChimeraX-MCopy: 1.0
    ChimeraX-MedicalToolbar: 1.1
    ChimeraX-Meeting: 1.0.1
    ChimeraX-MLP: 1.1.1
    ChimeraX-mmCIF: 2.14.2
    ChimeraX-MMTF: 2.2
    ChimeraX-ModelArchive: 1.0
    ChimeraX-Modeller: 1.5.18
    ChimeraX-ModelPanel: 1.5
    ChimeraX-ModelSeries: 1.0.1
    ChimeraX-Mol2: 2.0.3
    ChimeraX-Mole: 1.0
    ChimeraX-Morph: 1.0.2
    ChimeraX-MouseModes: 1.2
    ChimeraX-Movie: 1.0
    ChimeraX-MutationScores: 1.0
    ChimeraX-Neuron: 1.0
    ChimeraX-Nifti: 1.2
    ChimeraX-NMRSTAR: 1.0.2
    ChimeraX-NRRD: 1.2
    ChimeraX-Nucleotides: 2.0.3
    ChimeraX-OpenCommand: 1.14.1
    ChimeraX-OrthoPick: 1.0.1
    ChimeraX-PDB: 2.7.7
    ChimeraX-PDBBio: 1.0.1
    ChimeraX-PDBLibrary: 1.0.4
    ChimeraX-PDBMatrices: 1.0
    ChimeraX-PickBlobs: 1.0.1
    ChimeraX-Positions: 1.0
    ChimeraX-PresetMgr: 1.1.2
    ChimeraX-ProfileGrids: 1.0.1
    ChimeraX-PubChem: 2.2
    ChimeraX-ReadPbonds: 1.0.1
    ChimeraX-Registration: 1.1.2
    ChimeraX-RemoteControl: 1.0
    ChimeraX-RenderByAttr: 1.6.3
    ChimeraX-RenumberResidues: 1.1
    ChimeraX-ResidueFit: 1.0.1
    ChimeraX-RestServer: 1.3.1
    ChimeraX-RNALayout: 1.0
    ChimeraX-RotamerLibMgr: 4.0
    ChimeraX-RotamerLibsDunbrack: 2.0
    ChimeraX-RotamerLibsDynameomics: 2.0
    ChimeraX-RotamerLibsRichardson: 2.0
    ChimeraX-SaveCommand: 1.5.1
    ChimeraX-SchemeMgr: 1.0
    ChimeraX-SDF: 2.0.3
    ChimeraX-Segger: 1.0
    ChimeraX-Segment: 1.0.1
    ChimeraX-Segmentations: 3.5.7
    ChimeraX-SelInspector: 1.0
    ChimeraX-SeqView: 2.17
    ChimeraX-Shape: 1.1
    ChimeraX-Shell: 1.0.1
    ChimeraX-Shortcuts: 1.2.0
    ChimeraX-ShowSequences: 1.0.3
    ChimeraX-SideView: 1.0.1
    ChimeraX-SimilarStructures: 1.0.1
    ChimeraX-Smiles: 2.1.2
    ChimeraX-SmoothLines: 1.0
    ChimeraX-SpaceNavigator: 1.0
    ChimeraX-StdCommands: 1.19.1
    ChimeraX-STL: 1.0.1
    ChimeraX-Storm: 1.0
    ChimeraX-StructMeasure: 1.2.1
    ChimeraX-Struts: 1.0.1
    ChimeraX-Surface: 1.0.1
    ChimeraX-SwapAA: 2.0.1
    ChimeraX-SwapRes: 2.5.2
    ChimeraX-TapeMeasure: 1.0
    ChimeraX-TaskManager: 1.0
    ChimeraX-Test: 1.0
    ChimeraX-Toolbar: 1.2.3
    ChimeraX-ToolshedUtils: 1.2.4
    ChimeraX-Topography: 1.0
    ChimeraX-ToQuest: 1.0
    ChimeraX-Tug: 1.0.1
    ChimeraX-UI: 1.44
    ChimeraX-Umap: 1.0
    ChimeraX-uniprot: 2.3.1
    ChimeraX-UnitCell: 1.0.1
    ChimeraX-ViewDockX: 1.4.4
    ChimeraX-VIPERdb: 1.0
    ChimeraX-Vive: 1.1
    ChimeraX-VolumeMenu: 1.0.1
    ChimeraX-vrml: 1.0
    ChimeraX-VTK: 1.0
    ChimeraX-WavefrontOBJ: 1.0
    ChimeraX-WebCam: 1.0.2
    ChimeraX-WebServices: 1.1.4
    ChimeraX-Zone: 1.0.1
    colorama: 0.4.6
    comm: 0.2.2
    comtypes: 1.4.5
    contourpy: 1.3.1
    cxservices: 1.2.3
    cycler: 0.12.1
    Cython: 3.0.12
    debugpy: 1.8.12
    decorator: 5.2.1
    docutils: 0.21.2
    executing: 2.2.0
    filelock: 3.17.0
    fonttools: 4.56.0
    funcparserlib: 2.0.0a0
    glfw: 2.8.0
    grako: 3.16.5
    h11: 0.14.0
    h5py: 3.13.0
    html2text: 2024.2.26
    httpcore: 1.0.7
    httpx: 0.28.1
    idna: 3.10
    ihm: 1.3
    imagecodecs: 2024.6.1
    imagesize: 1.4.1
    ipykernel: 6.29.5
    ipython: 8.26.0
    ipywidgets: 8.1.5
    jedi: 0.19.1
    Jinja2: 3.1.5
    jupyter_client: 8.6.2
    jupyter_core: 5.7.2
    jupyterlab_widgets: 3.0.13
    kiwisolver: 1.4.8
    line_profiler: 4.2.0
    lxml: 5.2.2
    lz4: 4.4.3
    MarkupSafe: 3.0.2
    matplotlib: 3.9.2
    matplotlib-inline: 0.1.7
    msgpack: 1.1.0
    ndindex: 1.9.2
    nest-asyncio: 1.6.0
    netCDF4: 1.6.5
    networkx: 3.3
    nibabel: 5.2.0
    nptyping: 2.5.0
    numexpr: 2.10.2
    numpy: 1.26.4
    OpenMM: 8.2.0
    openvr: 1.26.701
    packaging: 23.2
    ParmEd: 4.2.2
    parso: 0.8.4
    pep517: 0.13.1
    pickleshare: 0.7.5
    pillow: 10.4.0
    pip: 25.0.1
    pkginfo: 1.11.1
    platformdirs: 4.3.6
    prompt_toolkit: 3.0.50
    psutil: 6.0.0
    pure_eval: 0.2.3
    py-cpuinfo: 9.0.0
    pycollada: 0.8
    pydicom: 2.4.4
    pyelftools: 0.32
    Pygments: 2.18.0
    pynmrstar: 3.3.5
    pynrrd: 1.0.0
    PyOpenGL: 3.1.9
    PyOpenGL-accelerate: 3.1.9
    pyopenxr: 1.0.3401
    pyparsing: 3.2.1
    pyproject_hooks: 1.2.0
    PyQt6-commercial: 6.8.1
    PyQt6-Qt6: 6.8.2
    PyQt6-WebEngine-commercial: 6.8.0
    PyQt6-WebEngine-Qt6: 6.8.2
    PyQt6_sip: 13.10.0
    python-dateutil: 2.9.0.post0
    pytz: 2025.1
    pywin32: 306
    pyzmq: 26.2.1
    qtconsole: 5.5.2
    QtPy: 2.4.3
    qtshim: 1.1
    RandomWords: 0.4.0
    requests: 2.32.3
    scipy: 1.14.0
    setuptools: 72.1.0
    sfftk-rw: 0.8.1
    six: 1.16.0
    sniffio: 1.3.1
    snowballstemmer: 2.2.0
    sortedcontainers: 2.4.0
    soupsieve: 2.6
    Sphinx: 8.1.3
    sphinx-autodoc-typehints: 3.0.1
    sphinxcontrib-applehelp: 2.0.0
    sphinxcontrib-blockdiag: 3.0.0
    sphinxcontrib-devhelp: 2.0.0
    sphinxcontrib-htmlhelp: 2.1.0
    sphinxcontrib-jsmath: 1.0.1
    sphinxcontrib-qthelp: 2.0.0
    sphinxcontrib-serializinghtml: 2.0.0
    stack-data: 0.6.3
    superqt: 0.7.1
    tables: 3.10.2
    tcia_utils: 1.5.1
    tifffile: 2024.7.24
    tinyarray: 1.2.4
    tornado: 6.4.2
    traitlets: 5.14.3
    typing_extensions: 4.12.2
    tzdata: 2025.1
    urllib3: 2.3.0
    wcwidth: 0.2.13
    webcolors: 24.11.1
    wheel: 0.45.1
    wheel-filename: 1.4.2
    widgetsnbextension: 4.0.13
    WMI: 1.5.1

Change History (15)

comment:1 by Tom Goddard, 8 months ago

Component: UnassignedVolume Data
Owner: set to Zach Pearson
Platform: all
Project: ChimeraX
Status: newassigned
Summary: ChimeraX bug report submissionSegmentations should not import VR at startup
Type: defectenhancement

The traceback in this report happened at startup and was due to a typo I added. But it revealed that VR was being imported at startup. Unused modules should not be imported at startup because it slows the application start.

comment:2 by Eric Pettersen, 8 months ago

Cc: Eric Pettersen added

I guess I'd add that since every user pays the cost for bundles with custom inits, those bundles should strive to make the footprint of their init as light as possible.

comment:3 by Zach Pearson, 8 months ago

Sorry to make you wait for a reply, I was experimenting with different ways of profiling this and came across the excellent pyinstrument project, which gives you an easy-to-read, wall-clock-time flamegraph or call tree (your choice). I can see that segmentations.initialize takes 340ms on my computer, which is a bit slow. I'll come up with a refactor.

comment:4 by Eric Pettersen, 8 months ago

I'll have to check out pyinstrument the next time I need to do profiling!

comment:5 by Zach Pearson, 8 months ago

That VR import wasn't actually the bottleneck (it took 1ms) it was importing (unused!!) DICOM types. I've reduced the time for segmentations to initialize from ~340ms to ~50ms.

comment:6 by Tom Goddard, 8 months ago

That is a big improvement. Can it be faster? We have probably 30 tools that do initialization at startup so 50 msec each would be 1.5 seconds which would be a very slow startup. So I think we really want tools that most users will never touch to initialize in just a millisecond. Ideally it should just be registering a function or two.

I'd say fast start-up time (e.g. a few tenths of a second, 200 msec total) is greatly appreciated by users.

comment:7 by Zach Pearson, 8 months ago

I've been able to get it down to 30ms. I'm confused because I should be able to shave off a few more, but when one of my modules is imported Python goes to chimerax.ui.widgets and loads the color button even though that specific import (unlike many others) is nested inside the class that needs it and so I didn't think it would be loaded.

comment:8 by Eric Pettersen, 8 months ago

I found out the other day that class definitions execute at module load time, so if your import is:

class A:

import x

Then that import happens when the module is loaded. If instead it's:

class A:

def f(self):

import x

Then the import happens when A.f() is called.

comment:9 by Zach Pearson, 8 months ago

Including the init?

comment:10 by Eric Pettersen, 8 months ago

No, not including init, unless you are somehow creating an instance at startup.

comment:11 by Eric Pettersen, 8 months ago

Maybe traceback.print_stack() in the init would help you figure it out.

comment:12 by Zach Pearson, 8 months ago

OK. I just temporarily lost literacy and read the wrong import (there are two from chimerax.ui, one protected and one not), the one that's guarded isn't loaded.

comment:13 by Zach Pearson, 8 months ago

OK, between changes to segmentations and dicom I've shaved Toolshed.bootstrap_bundles from 710ms down to 216ms on my machine.

comment:14 by Zach Pearson, 8 months ago

Imports import other things, so on my machine that translated to this command going from 3.36 seconds (UI.build at 2.05) to hovering around 2 (UI.build at 1.15):

./ChimeraX.app/Contents/bin/python3.11 -m pyinstrument -r html -m chimerax.core --exit

comment:15 by Zach Pearson, 8 months ago

Resolution: fixed
Status: assignedclosed

As of this commit segmentations no longer imports VR out in the open.

Note: See TracTickets for help on using tickets.