Opened 21 months ago

Last modified 21 months ago

#14516 assigned enhancement

Marker "notes"

Reported by: Tristan Croll Owned by: Tom Goddard
Priority: normal Milestone:
Component: Structure Analysis Version:
Keywords: Cc: pett
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.7.1 (2024-01-23 01:58:08 UTC)
Description
RFE: "sticky note" extension to the Markers tool.

Context: when rebuilding and/or analysing an experimental structure, I often find it useful to add markers in sites of interest, with text labels explaining the point. But this approach is a bit limiting: each label can't be much longer than 10 words before becoming unwieldy (disappearing off the edge of the screen when zoomed in, and crowding the view when zoomed out). What I was imagining is an addition to the Markers panel adding a new right mouse mode: right-click on a marker to bring up a little text editor to add an arbitrary-length note, and add a little 2D label (perhaps the UniCode "Memo" emoji -📝, https://www.iemoji.com/view/emoji/398/objects/memo) to indicate its presence. Then the (first n characters of) that note could be used as the tooltip for that marker (if you wrap the text in <div></div> PyQt will treat the tooltip as HTML and do sensible word wrapping), and perhaps a simple `ToolWindow` could be used to browse through and read all current notes.

OpenGL version: 3.3.0 NVIDIA 529.19
OpenGL renderer: NVIDIA GeForce RTX 3070 Laptop GPU/PCIe/SSE2
OpenGL vendor: NVIDIA Corporation

Python: 3.11.2
Locale: en_GB.cp1252
Qt version: PyQt6 6.3.1, Qt 6.3.1
Qt runtime version: 6.3.2
Qt platform: windows

Manufacturer: HP
Model: HP ZBook Studio 15.6 inch G8 Mobile Workstation PC
OS: Microsoft Windows 11 Pro (Build 22631)
Memory: 34,007,068,672
MaxProcessMemory: 137,438,953,344
CPU: 16 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
OSLanguage: en-GB

Installed Packages:
    -himerax-clipper: 0.22.2
    alabaster: 0.7.16
    appdirs: 1.4.4
    asttokens: 2.4.1
    Babel: 2.14.0
    backcall: 0.2.0
    beautifulsoup4: 4.11.2
    blockdiag: 3.0.0
    blosc2: 2.0.0
    build: 0.10.0
    certifi: 2023.11.17
    cftime: 1.6.3
    charset-normalizer: 3.3.2
    ChimeraX-AddCharge: 1.5.13
    ChimeraX-AddH: 2.2.5
    ChimeraX-AlignmentAlgorithms: 2.0.1
    ChimeraX-AlignmentHdrs: 3.4.1
    ChimeraX-AlignmentMatrices: 2.1
    ChimeraX-Alignments: 2.12.2
    ChimeraX-AlphaFold: 1.0
    ChimeraX-AltlocExplorer: 1.1.1
    ChimeraX-AmberInfo: 1.0
    ChimeraX-Arrays: 1.1
    ChimeraX-Atomic: 1.49.1
    ChimeraX-AtomicLibrary: 12.1.5
    ChimeraX-AtomSearch: 2.0.1
    ChimeraX-AxesPlanes: 2.3.2
    ChimeraX-BasicActions: 1.1.2
    ChimeraX-BILD: 1.0
    ChimeraX-BlastProtein: 2.1.2
    ChimeraX-BondRot: 2.0.4
    ChimeraX-BugReporter: 1.0.1
    ChimeraX-BuildStructure: 2.10.5
    ChimeraX-Bumps: 1.0
    ChimeraX-BundleBuilder: 1.2.2
    ChimeraX-ButtonPanel: 1.0.1
    ChimeraX-CageBuilder: 1.0.1
    ChimeraX-CellPack: 1.0
    ChimeraX-Centroids: 1.3.2
    ChimeraX-ChangeChains: 1.1
    ChimeraX-CheckWaters: 1.3.2
    ChimeraX-ChemGroup: 2.0.1
    ChimeraX-Clashes: 2.2.4
    ChimeraX-Clipper: 0.22.4
    ChimeraX-ColorActions: 1.0.3
    ChimeraX-ColorGlobe: 1.0
    ChimeraX-ColorKey: 1.5.5
    ChimeraX-CommandLine: 1.2.5
    ChimeraX-ConnectStructure: 2.0.1
    ChimeraX-Contacts: 1.0.1
    ChimeraX-Core: 1.7.1
    ChimeraX-CoreFormats: 1.2
    ChimeraX-coulombic: 1.4.2
    ChimeraX-Crosslinks: 1.0
    ChimeraX-Crystal: 1.0
    ChimeraX-CrystalContacts: 1.0.1
    ChimeraX-DataFormats: 1.2.3
    ChimeraX-Dicom: 1.2
    ChimeraX-DistMonitor: 1.4
    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.1.1
    ChimeraX-Hbonds: 2.4
    ChimeraX-Help: 1.2.2
    ChimeraX-HKCage: 1.3
    ChimeraX-IHM: 1.1
    ChimeraX-ImageFormats: 1.2
    ChimeraX-IMOD: 1.0
    ChimeraX-IO: 1.0.1
    ChimeraX-ISOLDE: 1.7.1
    ChimeraX-ItemsInspection: 1.0.1
    ChimeraX-IUPAC: 1.0
    ChimeraX-Label: 1.1.8
    ChimeraX-ListInfo: 1.2.2
    ChimeraX-Log: 1.1.6
    ChimeraX-LookingGlass: 1.1
    ChimeraX-Maestro: 1.9.1
    ChimeraX-Map: 1.1.4
    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.2
    ChimeraX-MCopy: 1.0
    ChimeraX-MDcrds: 2.6.1
    ChimeraX-MedicalToolbar: 1.0.2
    ChimeraX-Meeting: 1.0.1
    ChimeraX-MLP: 1.1.1
    ChimeraX-mmCIF: 2.12.1
    ChimeraX-MMTF: 2.2
    ChimeraX-Modeller: 1.5.14
    ChimeraX-ModelPanel: 1.4
    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-Neuron: 1.0
    ChimeraX-Nifti: 1.1
    ChimeraX-NRRD: 1.1
    ChimeraX-Nucleotides: 2.0.3
    ChimeraX-OpenCommand: 1.13.1
    ChimeraX-PDB: 2.7.3
    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
    ChimeraX-PubChem: 2.1
    ChimeraX-QScore: 1.1
    ChimeraX-ReadPbonds: 1.0.1
    ChimeraX-Registration: 1.1.2
    ChimeraX-RemoteControl: 1.0
    ChimeraX-RenderByAttr: 1.1
    ChimeraX-RenumberResidues: 1.1
    ChimeraX-ResidueFit: 1.0.1
    ChimeraX-RestServer: 1.2
    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.2
    ChimeraX-Segger: 1.0
    ChimeraX-Segment: 1.0.1
    ChimeraX-SelInspector: 1.0
    ChimeraX-SeqView: 2.11
    ChimeraX-Shape: 1.0.1
    ChimeraX-Shell: 1.0.1
    ChimeraX-Shortcuts: 1.1.1
    ChimeraX-ShowSequences: 1.0.2
    ChimeraX-SideView: 1.0.1
    ChimeraX-Smiles: 2.1.2
    ChimeraX-SmoothLines: 1.0
    ChimeraX-SpaceNavigator: 1.0
    ChimeraX-StdCommands: 1.12.4
    ChimeraX-STL: 1.0.1
    ChimeraX-Storm: 1.0
    ChimeraX-StructMeasure: 1.1.2
    ChimeraX-Struts: 1.0.1
    ChimeraX-Surface: 1.0.1
    ChimeraX-SwapAA: 2.0.1
    ChimeraX-SwapRes: 2.2.2
    ChimeraX-TapeMeasure: 1.0
    ChimeraX-TaskManager: 1.0
    ChimeraX-Test: 1.0
    ChimeraX-Toolbar: 1.1.2
    ChimeraX-ToolshedUtils: 1.2.4
    ChimeraX-Topography: 1.0
    ChimeraX-ToQuest: 1.0
    ChimeraX-Tug: 1.0.1
    ChimeraX-UI: 1.33.3
    ChimeraX-uniprot: 2.3
    ChimeraX-UnitCell: 1.0.1
    ChimeraX-ViewDockX: 1.3.2
    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.3
    ChimeraX-XMAS: 1.1.2
    ChimeraX-Zone: 1.0.1
    colorama: 0.4.6
    comm: 0.2.1
    comtypes: 1.1.14
    contourpy: 1.2.0
    cxservices: 1.2.2
    cycler: 0.12.1
    Cython: 0.29.33
    debugpy: 1.8.0
    decorator: 5.1.1
    docutils: 0.19
    et-xmlfile: 1.1.0
    executing: 2.0.1
    filelock: 3.9.0
    fonttools: 4.47.2
    funcparserlib: 2.0.0a0
    glfw: 2.6.4
    grako: 3.16.5
    h5py: 3.10.0
    html2text: 2020.1.16
    idna: 3.6
    ihm: 0.38
    imagecodecs: 2023.9.18
    imagesize: 1.4.1
    ipykernel: 6.23.2
    ipython: 8.14.0
    ipython-genutils: 0.2.0
    ipywidgets: 8.1.1
    jedi: 0.18.2
    Jinja2: 3.1.2
    jupyter-client: 8.2.0
    jupyter-core: 5.7.1
    jupyterlab-widgets: 3.0.9
    kiwisolver: 1.4.5
    line-profiler: 4.0.2
    lxml: 4.9.2
    lz4: 4.3.2
    MarkupSafe: 2.1.4
    matplotlib: 3.7.2
    matplotlib-inline: 0.1.6
    msgpack: 1.0.4
    nest-asyncio: 1.6.0
    netCDF4: 1.6.2
    networkx: 3.1
    nibabel: 5.0.1
    nptyping: 2.5.0
    numexpr: 2.8.8
    numpy: 1.25.1
    openpyxl: 3.1.2
    openvr: 1.23.701
    packaging: 23.2
    pandas: 2.0.3
    ParmEd: 3.4.3
    parso: 0.8.3
    pep517: 0.13.0
    pickleshare: 0.7.5
    pillow: 10.2.0
    pip: 23.0
    pkginfo: 1.9.6
    platformdirs: 4.1.0
    pprintpp: 0.4.0
    prompt-toolkit: 3.0.43
    psutil: 5.9.5
    pure-eval: 0.2.2
    py-cpuinfo: 9.0.0
    pycollada: 0.7.2
    pydicom: 2.3.0
    Pygments: 2.16.1
    pynmrstar: 3.3.2
    pynrrd: 1.0.0
    PyOpenGL: 3.1.7
    PyOpenGL-accelerate: 3.1.7
    pyopenxr: 1.0.2801
    pyparsing: 3.0.9
    pyproject-hooks: 1.0.0
    PyQt6-commercial: 6.3.1
    PyQt6-Qt6: 6.3.2
    PyQt6-sip: 13.4.0
    PyQt6-WebEngine-commercial: 6.3.1
    PyQt6-WebEngine-Qt6: 6.3.2
    python-dateutil: 2.8.2
    pytz: 2023.3.post1
    pywin32: 305
    pyzmq: 25.1.2
    qtconsole: 5.4.3
    QtPy: 2.4.1
    QtRangeSlider: 0.1.5
    RandomWords: 0.4.0
    requests: 2.31.0
    scipy: 1.11.1
    seaborn: 0.12.2
    Send2Trash: 1.8.2
    SEQCROW: 1.7.3
    setuptools: 67.4.0
    sfftk-rw: 0.7.3
    six: 1.16.0
    snowballstemmer: 2.2.0
    sortedcontainers: 2.4.0
    soupsieve: 2.5
    sphinx: 6.1.3
    sphinx-autodoc-typehints: 1.22
    sphinxcontrib-applehelp: 1.0.8
    sphinxcontrib-blockdiag: 3.0.0
    sphinxcontrib-devhelp: 1.0.6
    sphinxcontrib-htmlhelp: 2.0.5
    sphinxcontrib-jsmath: 1.0.1
    sphinxcontrib-qthelp: 1.0.7
    sphinxcontrib-serializinghtml: 1.1.10
    stack-data: 0.6.3
    superqt: 0.5.0
    tables: 3.8.0
    tcia-utils: 1.5.1
    tifffile: 2023.7.18
    tinyarray: 1.2.4
    tomli: 2.0.1
    tornado: 6.4
    traitlets: 5.9.0
    typing-extensions: 4.9.0
    tzdata: 2023.4
    urllib3: 2.1.0
    wcwidth: 0.2.13
    webcolors: 1.12
    wheel: 0.38.4
    wheel-filename: 1.4.1
    widgetsnbextension: 4.0.9
    WMI: 1.5.1

Change History (6)

comment:1 by pett, 21 months ago

Cc: pett added
Component: UnassignedStructure Analysis
Owner: set to Tom Goddard
Platform: all
Project: ChimeraX
Status: newassigned
Summary: ChimeraX bug report submissionMarker "notes"
Type: defectenhancement

comment:2 by Tom Goddard, 21 months ago

There is a way to override what an atom or marker shows in the popup-balloon when you hover the mouse over it. Looking at the mouse hover code

https://github.com/RBVI/ChimeraX/blob/9f07bd376df88972e12aff042af6226739a2e276/src/bundles/mouse_modes/src/std_modes.py#L808

I see it uses the PickedAtom.description() method

https://github.com/RBVI/ChimeraX/blob/9f07bd376df88972e12aff042af6226739a2e276/src/bundles/atomic/src/structure.py#L2147

which uses str(atom)

https://github.com/RBVI/ChimeraX/blob/9f07bd376df88972e12aff042af6226739a2e276/src/bundles/atomic/atomic_cpp/cymol.pyx#L103

which calls Atom.string()

https://github.com/RBVI/ChimeraX/blob/9f07bd376df88972e12aff042af6226739a2e276/src/bundles/atomic/atomic_cpp/cymol.pyx#L741

so overriding a marker's string method can allow you to show any string you want.

Maybe newlines in strings could be made to wrap the popup balloon to show multiple lines.

That is some low-level support that seems pretty easy to adapt. But then you need a mouse mode so you can click and add these notes easily. Also you wanted a GUI to review all your notes. That is a lot more work.

I'd say there is at least a week of work to make such a tool production ready.

Unfortunately I'd also say it would have almost zero users. A small number of users could probably be had by spending another week making videos showing how useful it is.

So I'd say this is probably is useful to too few people for us to find the time to do it. But nothing would stop you or your Altos help from implementing this.

comment:3 by Tom Goddard, 21 months ago

I made marker note support in Chimera 20 years ago. I can't recall seeing a single person other than me ever use it.

comment:4 by Tristan Croll, 21 months ago

Sadly my Altos help hasn’t been quite as forthcoming as I first expected
when I joined. Part of that's my fault, for deciding to stay here in the UK
rather than moving to the Bay Area. Different cost centre, with fewer
people here who really understand the value of structural biology. My
personal time is almost completely taken up by applied projects lately, and
so far I haven’t had success convincing them it’s worth taking on a junior
developer. Still a work in progress...

That being said, thanks for the tips. Just had a quick play with that, and
I was indeed able to override the `string()` method for a single marker to
display a test string (although not particularly robustly - caused a
traceback when I attempted to select the marker atom because I hadn't
included any of the optional arguments in the method definition. Anyway,
when it comes to wrapping the text, it turns out all it takes is:

session.ui.main_window.graphics_window.popup.setWordWrap(True)

That of course would then cause *every* tooltip in the main graphics window
to wrap, but is there a scenario where that would be problematic?
Last edited 21 months ago by Tom Goddard (previous) (diff)

comment:5 by Tristan Croll, 21 months ago

For what it’s worth, I think a feature like this might find quite a bit
more uptake today than in the old “blobology” era. Judging by chatter at
the conference I was at earlier this week (Cryo-EM in Academia and
Industry) most of the big biotech/drug companies are jumping on cryo-EM as
a major workhorse. Lots of large structures filled with clearly-resolved
fine details that are important but easily lost/missed amongst the forest.
And these guys *really* care about the details.
Last edited 21 months ago by Tom Goddard (previous) (diff)

comment:6 by Tom Goddard, 21 months ago

The string() method override would of course need to handle all the arguments. Not sure how line wrapping would determine the size of the popup. The current heavy use of the popup is with short text and definitely it should not be wrapped as that would make it less useful.

While I agree marker notes could be useful to lots of people, my guess is almost no one will use it. That guess is based on seeing a hundred Chimera and ChimeraX features that almost no one uses over decades. That is just a guess, but I have to go on my guesses when I have hundreds of requested specialty features sitting in our ChimeraX Trac tickets.

Note: See TracTickets for help on using tickets.