Opened 4 years ago

Last modified 4 years ago

#5039 assigned enhancement

"sticky" cartoon settings

Reported by: Tristan Croll Owned by: Tom Goddard
Priority: normal Milestone:
Component: Depiction Version:
Keywords: Cc: Elaine Meng
Blocked By: Blocking:
Notify when closed: Platform: all
Project: ChimeraX

Description

The following bug report has been submitted:
Platform:        Linux-3.10.0-1160.25.1.el7.x86_64-x86_64-with-glibc2.17
ChimeraX Version: 1.3.dev202108040454 (2021-08-04 04:54:51 UTC)
Description
The Clipper plugin uses the method at https://github.com/tristanic/chimerax-clipper/blob/5abc693ea0755ef0395ecd02de507a43a6f9018b/src/util.py#L59 to set its standard style for the cartoon. If this is run on a model with no beta strands defined and then a subsequent `dssp` command causes beta strands to appear, they still come out at the ChimeraX-standard width. I think this should be modified so that the cartoon remembers the setting for different secondary structure types even if none currently exist in the model.

Where this commonly comes up is when a model is saved from ChimeraX, run through phenix.refine and loaded back into ChimeraX. I *think* the problem there is that phenix.refine only looks for SHEET records (or the mmCIF equivalent) in its input file, and ChimeraX doesn't write those - so no beta-strand information gets passed through to the phenix.refine output.

OpenGL version: 3.3.0 NVIDIA 465.19.01
OpenGL renderer: NVIDIA TITAN Xp/PCIe/SSE2
OpenGL vendor: NVIDIA Corporation
Manufacturer: Dell Inc.
Model: Precision T5600
OS: CentOS Linux 7 Core
Architecture: 64bit ELF
Virutal Machine: none
CPU: 32 Intel(R) Xeon(R) CPU E5-2687W 0 @ 3.10GHz
Cache Size: 20480 KB
Memory:
	              total        used        free      shared  buff/cache   available
	Mem:            62G        8.7G         41G        396M         12G         53G
	Swap:          4.9G          0B        4.9G

Graphics:
	03:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP102 [TITAN Xp] [10de:1b02] (rev a1)	
	Subsystem: NVIDIA Corporation Device [10de:11df]	
	Kernel driver in use: nvidia
Locale: ('en_GB', 'UTF-8')
PyQt5 5.15.2, Qt 5.15.2
Installed Packages:
    alabaster: 0.7.12
    appdirs: 1.4.4
    Babel: 2.9.1
    backcall: 0.2.0
    blockdiag: 2.0.1
    certifi: 2021.5.30
    cftime: 1.5.0
    chardet: 4.0.0
    ChimeraX-AddCharge: 1.1.4
    ChimeraX-AddH: 2.1.10
    ChimeraX-AlignmentAlgorithms: 2.0
    ChimeraX-AlignmentHdrs: 3.2
    ChimeraX-AlignmentMatrices: 2.0
    ChimeraX-Alignments: 2.1
    ChimeraX-AlphaFold: 1.0
    ChimeraX-AltlocExplorer: 1.0
    ChimeraX-AmberInfo: 1.0
    ChimeraX-Arrays: 1.0
    ChimeraX-Atomic: 1.28
    ChimeraX-AtomicLibrary: 4.1
    ChimeraX-AtomSearch: 2.0
    ChimeraX-AtomSearchLibrary: 1.0
    ChimeraX-AxesPlanes: 2.0
    ChimeraX-BasicActions: 1.1
    ChimeraX-BILD: 1.0
    ChimeraX-BlastProtein: 1.1.1
    ChimeraX-BondRot: 2.0
    ChimeraX-BugReporter: 1.0
    ChimeraX-BuildStructure: 2.5.3
    ChimeraX-Bumps: 1.0
    ChimeraX-BundleBuilder: 1.1
    ChimeraX-ButtonPanel: 1.0
    ChimeraX-CageBuilder: 1.0
    ChimeraX-CellPack: 1.0
    ChimeraX-Centroids: 1.1
    ChimeraX-ChemGroup: 2.0
    ChimeraX-Clashes: 2.1
    ChimeraX-Clipper: 0.17.0
    ChimeraX-ColorActions: 1.0
    ChimeraX-ColorGlobe: 1.0
    ChimeraX-ColorKey: 1.3.2
    ChimeraX-CommandLine: 1.1.4
    ChimeraX-ConnectStructure: 2.0
    ChimeraX-Contacts: 1.0
    ChimeraX-Core: 1.3.dev202108040454
    ChimeraX-CoreFormats: 1.1
    ChimeraX-coulombic: 1.3
    ChimeraX-Crosslinks: 1.0
    ChimeraX-Crystal: 1.0
    ChimeraX-CrystalContacts: 1.0
    ChimeraX-DataFormats: 1.2
    ChimeraX-Dicom: 1.0
    ChimeraX-DistMonitor: 1.1.4
    ChimeraX-DistUI: 1.0
    ChimeraX-Dssp: 2.0
    ChimeraX-EMDB-SFF: 1.0
    ChimeraX-ExperimentalCommands: 1.0
    ChimeraX-FileHistory: 1.0
    ChimeraX-FunctionKey: 1.0
    ChimeraX-Geometry: 1.1
    ChimeraX-gltf: 1.0
    ChimeraX-Graphics: 1.1
    ChimeraX-Hbonds: 2.1
    ChimeraX-Help: 1.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.3.dev32
    ChimeraX-ItemsInspection: 1.0
    ChimeraX-Label: 1.1
    ChimeraX-LinuxSupport: 1.0
    ChimeraX-ListInfo: 1.1.1
    ChimeraX-Log: 1.1.4
    ChimeraX-LookingGlass: 1.1
    ChimeraX-Maestro: 1.8.1
    ChimeraX-Map: 1.1
    ChimeraX-MapData: 2.0
    ChimeraX-MapEraser: 1.0
    ChimeraX-MapFilter: 2.0
    ChimeraX-MapFit: 2.0
    ChimeraX-MapSeries: 2.1
    ChimeraX-Markers: 1.0
    ChimeraX-Mask: 1.0
    ChimeraX-MatchMaker: 1.2.1
    ChimeraX-MDcrds: 2.4
    ChimeraX-MedicalToolbar: 1.0.1
    ChimeraX-Meeting: 1.0
    ChimeraX-MLP: 1.1
    ChimeraX-mmCIF: 2.3
    ChimeraX-MMTF: 2.1
    ChimeraX-Modeller: 1.0.2
    ChimeraX-ModelPanel: 1.1
    ChimeraX-ModelSeries: 1.0
    ChimeraX-Mol2: 2.0
    ChimeraX-Morph: 1.0
    ChimeraX-MouseModes: 1.1
    ChimeraX-Movie: 1.0
    ChimeraX-Neuron: 1.0
    ChimeraX-Nucleotides: 2.0.2
    ChimeraX-OpenCommand: 1.7
    ChimeraX-PDB: 2.5.1
    ChimeraX-PDBBio: 1.0
    ChimeraX-PDBLibrary: 1.0.1
    ChimeraX-PDBMatrices: 1.0
    ChimeraX-Phenix: 0.3
    ChimeraX-PickBlobs: 1.0
    ChimeraX-Positions: 1.0
    ChimeraX-PresetMgr: 1.0.1
    ChimeraX-PubChem: 2.1
    ChimeraX-ReadPbonds: 1.0
    ChimeraX-Registration: 1.1
    ChimeraX-RemoteControl: 1.0
    ChimeraX-ResidueFit: 1.0
    ChimeraX-RestServer: 1.1
    ChimeraX-RNALayout: 1.0
    ChimeraX-RotamerLibMgr: 2.0
    ChimeraX-RotamerLibsDunbrack: 2.0
    ChimeraX-RotamerLibsDynameomics: 2.0
    ChimeraX-RotamerLibsRichardson: 2.0
    ChimeraX-Sample: 0.1
    ChimeraX-SaveCommand: 1.5
    ChimeraX-SchemeMgr: 1.0
    ChimeraX-SDF: 2.0
    ChimeraX-Segger: 1.0
    ChimeraX-Segment: 1.0
    ChimeraX-SelInspector: 1.0
    ChimeraX-SeqView: 2.4.1
    ChimeraX-Shape: 1.0.1
    ChimeraX-Shell: 1.0
    ChimeraX-Shortcuts: 1.1
    ChimeraX-ShowAttr: 1.0
    ChimeraX-ShowSequences: 1.0
    ChimeraX-SideView: 1.0
    ChimeraX-Smiles: 2.1
    ChimeraX-SmoothLines: 1.0
    ChimeraX-SpaceNavigator: 1.0
    ChimeraX-StdCommands: 1.6
    ChimeraX-STL: 1.0
    ChimeraX-Storm: 1.0
    ChimeraX-Struts: 1.0
    ChimeraX-Surface: 1.0
    ChimeraX-SwapAA: 2.0
    ChimeraX-SwapRes: 2.1
    ChimeraX-TapeMeasure: 1.0
    ChimeraX-Test: 1.0
    ChimeraX-Toolbar: 1.1
    ChimeraX-ToolshedUtils: 1.2
    ChimeraX-Tug: 1.0
    ChimeraX-UI: 1.11
    ChimeraX-uniprot: 2.1
    ChimeraX-UnitCell: 1.0
    ChimeraX-ViewDockX: 1.0.1
    ChimeraX-Vive: 1.1
    ChimeraX-VolumeMenu: 1.0
    ChimeraX-Voyager: 0.1
    ChimeraX-VTK: 1.0
    ChimeraX-WavefrontOBJ: 1.0
    ChimeraX-WebCam: 1.0
    ChimeraX-WebServices: 1.0
    ChimeraX-Zone: 1.0
    colorama: 0.4.4
    comtypes: 1.1.10
    cxservices: 1.0
    cycler: 0.10.0
    Cython: 0.29.23
    decorator: 5.0.9
    distlib: 0.3.1
    distro: 1.5.0
    docutils: 0.17.1
    filelock: 3.0.12
    funcparserlib: 0.3.6
    grako: 3.16.5
    h5py: 3.3.0
    html2text: 2020.1.16
    idna: 2.10
    ihm: 0.20
    imagecodecs: 2021.4.28
    imagesize: 1.2.0
    ipykernel: 5.5.5
    ipython: 7.23.1
    ipython-genutils: 0.2.0
    jedi: 0.18.0
    Jinja2: 2.11.3
    jupyter-client: 6.1.12
    jupyter-core: 4.7.1
    kiwisolver: 1.3.1
    line-profiler: 3.3.0
    lxml: 4.6.3
    lz4: 3.1.3
    MarkupSafe: 1.1.1
    matplotlib: 3.4.2
    matplotlib-inline: 0.1.2
    msgpack: 1.0.2
    netCDF4: 1.5.6
    networkx: 2.6.2
    numexpr: 2.7.3
    numpy: 1.21.0
    numpydoc: 1.1.0
    OpenMM: 7.6.0
    openvr: 1.16.801
    packaging: 21.0
    ParmEd: 3.2.0
    parso: 0.8.2
    pexpect: 4.8.0
    pickleshare: 0.7.5
    Pillow: 8.2.0
    pip: 21.1.1
    pkginfo: 1.7.0
    prompt-toolkit: 3.0.19
    psutil: 5.8.0
    ptyprocess: 0.7.0
    pycollada: 0.7.1
    pydicom: 2.1.2
    Pygments: 2.9.0
    PyOpenGL: 3.1.5
    PyOpenGL-accelerate: 3.1.5
    pyparsing: 2.4.7
    PyQt5-commercial: 5.15.2
    PyQt5-sip: 12.8.1
    PyQtWebEngine-commercial: 5.15.2
    python-dateutil: 2.8.1
    pytz: 2021.1
    pyzmq: 22.1.0
    qtconsole: 5.1.0
    QtPy: 1.9.0
    RandomWords: 0.3.0
    requests: 2.25.1
    scipy: 1.6.3
    setuptools: 57.0.0
    sfftk-rw: 0.7.0.post1
    six: 1.16.0
    snowballstemmer: 2.1.0
    sortedcontainers: 2.4.0
    Sphinx: 4.0.1
    sphinxcontrib-applehelp: 1.0.2
    sphinxcontrib-blockdiag: 2.0.0
    sphinxcontrib-devhelp: 1.0.2
    sphinxcontrib-htmlhelp: 2.0.0
    sphinxcontrib-jsmath: 1.0.1
    sphinxcontrib-qthelp: 1.0.3
    sphinxcontrib-serializinghtml: 1.1.5
    suds-jurko: 0.6
    tables: 3.6.1
    tifffile: 2021.4.8
    tinyarray: 1.2.3
    tornado: 6.1
    traitlets: 5.0.5
    urllib3: 1.26.6
    wcwidth: 0.2.5
    webcolors: 1.11.1
    wheel: 0.36.2
    wheel-filename: 1.3.0

Change History (9)

comment:1 by Eric Pettersen, 4 years ago

Component: UnassignedDepiction
Owner: set to Tom Goddard
Platform: all
Project: ChimeraX
Status: newassigned
Summary: ChimeraX bug report submission"sticky" cartoon settings
Type: defectenhancement

comment:2 by Tom Goddard, 4 years ago

Cc: Elaine Meng added

A sensible request. The problem is the "cartoon style" command as it is currently defined cannot set the ribbon display parameters for strands if no strands exist (same for helices or coils). This is bad as the case Tristan describes illustrates.

The trouble is "cartoon style" takes an atom specifier as its first argument "cartoon style <atom-spec> [width w] [height h] ...". And the settings only apply to the secondary structure types present in that atom specifier. For instance,

cartoon style helix width 5

Here "helix" is a general ChimeraX atom selector. If there are no helix residues this command will do nothing.

The ribbon settings for helix are remembered whether or not any helices exist. So the deficiency is in the command which does not offer a way to set the helix parameters unless you specify a helix residue.

I am not sure how to remedy this and suggestions are welcome. One ugly way to handle it would be to add a new keyword "type", for example,

cartoon style #1 type helix width 5

Another idea is that the first argument could be the word "helix" or "sheet" or "coil" or an atom spec, and if the word helix is used then it applies settings even if there are no helices. But then there is the problem of how to I set the helix width of just model #1 and not model #2 -- currently that would be "cartoon style #1 & helix width 1".

Elaine, how do you think the command syntax should be changed to handle this?

comment:3 by Elaine Meng, 4 years ago

Your premise is semi-correct. If I open a structure with no helix and use command "cartoon style modeh tube" and then change some resides to helix they are shown as tubes. The atom-spec is our usual atom-spec that can be blank to mean "everything" and the parameter is set per model. Example:
open 1c2a
cartoon style modeh tube
setattr :4-12 r ss_type 1

HOWEVER, width, thickness, and xsection are different because they are allowed to be different for strand, helix, coil, and nucleic within a model even though they are per-model settings. To avoid making the command too messy, Conrad and I chose to make them single parameters in the command although you could specify them separately using the atomspec (e.g. helix, strand, coil, or nucleic) and under the hood, they were really each 4 separate per-model settings. We didn't think about this situation of the secondary structure being redefined to include a type that wasn't in the structure when the cartoon style was applied. Another simplification we made was that "width" did not apply to coil and its thickness value would also be used as its width.

So your choices are to:
(1) hook directly into the python and change the per-model per-ss-type parameter.
(2) change the command syntax. I feel that the simplest way to do the latter is to have 4 separate keywords instead of (or in addition to?) the original keyword. E.g. instead of (or in addition to) "width" it would be "widthNucleic" "widthStrand" "widthHelix" or something along those lines.

comment:4 by Tom Goddard, 4 years ago

Thanks for the suggestions Elaine. So you propose adding 11 new options widthHelix, widthStrand, widthCoil, widthNucleic, thicknessHelix, thicknessStrand, thicknessNucleic, xsectionHelix, xsectionStrand, xsectionCoil, xsectionNucleic. Seems pretty ugly and the command usage output will be very long. Also I see in the code that options arrowsHelix and arrowScale only work for helices if there are helix residues specified, and arrowScale and arrows only work on strands if a strand residue is specified. So the arrow options also need a way to be set. Could add arrowsHelix, arrowsStrand, arrowsScaleHelix, arrowsScaleStrand. Likewise the ssEnds option saves different values for helix and strand, so ssEndsHelix, ssEndsStrand.

Do we really want to add all those (17) new options? I think my one new option "type helix|strand|coil|nucleic" is simpler, albeit also ugly.

comment:5 by Tom Goddard, 4 years ago

Actually arrows only applies to strands so don't need arrowsHelix (already exists) and arrowsStrand. So this approach would require 15 new options, not 17.

in reply to:  6 ; comment:6 by Elaine Meng, 4 years ago

Personally I'd rather not have any of these extra parameters. You were asking me that if we were to change syntax, how to change it.  (By the way, we chose not to put ssEnds in the user documentation because there were some problematic situations in which it didn't work right, and also because it was confusing.) 

Whether to actually change the syntax depends on Tristan's need and the pros/cons of changing the command versus the other possibilities (hook into python directly, or possibly define a preset to be applied after secondary structure changes).

Also just because we expand one of them doesn't mean we have to expand them ALL, especially not ssEnds which isn't even documented.

in reply to:  7 ; comment:7 by Tristan Croll, 4 years ago

Actually, that's a point. When the secondary structure is updated, I take it that goes into the model's 'changes' trigger... I suppose for my purposes I could just define a callback to reimpose the cartoon settings - although that could be a pain if there's anybody out there who's decided they like a different look when using Clipper.
________________________________
From: ChimeraX <ChimeraX-bugs-admin@cgl.ucsf.edu>
Sent: 11 August 2021 19:54
To: goddard@cgl.ucsf.edu <goddard@cgl.ucsf.edu>; Tristan Croll <tic20@cam.ac.uk>
Cc: meng@cgl.ucsf.edu <meng@cgl.ucsf.edu>
Subject: Re: [ChimeraX] #5039: "sticky" cartoon settings

#5039: "sticky" cartoon settings
------------------------------------+-------------------------
          Reporter:  Tristan Croll  |      Owner:  Tom Goddard
              Type:  enhancement    |     Status:  assigned
          Priority:  normal         |  Milestone:
         Component:  Depiction      |    Version:
        Resolution:                 |   Keywords:
        Blocked By:                 |   Blocking:
Notify when closed:                 |   Platform:  all
           Project:  ChimeraX       |
------------------------------------+-------------------------

Comment (by Elaine Meng):

 {{{
 Personally I'd rather not have any of these extra parameters. You were
 asking me that if we were to change syntax, how to change it.  (By the
 way, we chose not to put ssEnds in the user documentation because there
 were some problematic situations in which it didn't work right, and also
 because it was confusing.)

 Whether to actually change the syntax depends on Tristan's need and the
 pros/cons of changing the command versus the other possibilities (hook
 into python directly, or possibly define a preset to be applied after
 secondary structure changes).

 Also just because we expand one of them doesn't mean we have to expand
 them ALL, especially not ssEnds which isn't even documented.
 }}}

--
Ticket URL: <https://www.rbvi.ucsf.edu/trac/ChimeraX/ticket/5039#comment:6>
ChimeraX <https://www.rbvi.ucsf.edu/chimerax/>
ChimeraX Issue Tracker

in reply to:  8 ; comment:8 by Elaine Meng, 4 years ago

I realize you just want to do it the way you came up with, but I'm not crazy about that either... having to explain why anybody would ever want to use  "cartoon style type strand width N" instead of  "cartoon style strand width N"  when it is an extremely rare situation.  There is also having to explain the concept of stickiness in the current structure vs. a setting that persists independent of any structures being open.   Bringing in the "type" option may make people think it is the latter kind of setting.

comment:9 by Tom Goddard, 4 years ago

I guess I agree with Elaine that this is a very rare use case. Since you are making these ribbon settings with Python code you can easily use slightly different Python code to make the settings work even when no strands or helices are present. To see how to do this look at the cartoon_style() code

https://github.com/RBVI/ChimeraX/blob/bb2b30853b60caf1698b520aef5692d9827a1555/src/bundles/std_commands/src/cartoon.py#L157

The code you need would look like

structure.ribbon_xs_mgr.set_sheet_scale(width, thickness)

where structure is an AtomicStructure instance.

Note: See TracTickets for help on using tickets.