Opened 8 months ago
Closed 8 months ago
#16959 closed enhancement (fixed)
Segmentations should not import VR at startup
| Reported by: | 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 , 8 months ago
| Component: | Unassigned → Volume Data |
|---|---|
| Owner: | set to |
| Platform: | → all |
| Project: | → ChimeraX |
| Status: | new → assigned |
| Summary: | ChimeraX bug report submission → Segmentations should not import VR at startup |
| Type: | defect → enhancement |
comment:2 by , 8 months ago
| Cc: | 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 , 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 , 8 months ago
I'll have to check out pyinstrument the next time I need to do profiling!
comment:5 by , 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 , 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 , 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 , 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:10 by , 8 months ago
No, not including init, unless you are somehow creating an instance at startup.
comment:11 by , 8 months ago
Maybe traceback.print_stack() in the init would help you figure it out.
comment:12 by , 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 , 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 , 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 , 8 months ago
| Resolution: | → fixed |
|---|---|
| Status: | assigned → closed |
As of this commit segmentations no longer imports VR out in the open.
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.