Thanks a lot Tristan!


In case anyone else needs this, here is a ChatGPT-polished version of that that can be saved locally and executed in the command line with
runscript path/to/select_incomplete_residues.py atom-spec.

 

Best wishes,

Matthias

#!/usr/bin/env python

"""

Incomplete-residue finder

========================

 

Select **all amino‑acid residues missing one or more heavy template atoms**.

Optionally limit the search to a user‑specified atom selection.

 

Selection priority (highest → lowest)

-------------------------------------

1. **Command‑line spec** following the script name (quoted if it has spaces). 

   Example inside ChimeraX:

   ```

   runscript /path/to/select_incomplete_residues.py #1/A

   ```

2. **Current GUI selection** if no command‑line spec is given.

3. **Whole model** – ISOLDE‑selected model → first atomic model in the session.

 

import sys

from chimerax.atomic import (

    Residue,

    concise_residue_spec,

    selected_atoms,   # ← ChimeraX convenience to get currently selected atoms

)

from chimerax.core.commands import run

from chimerax.core.errors import UserError

 

# -----------------------------------------------------------------------------

# Helper functions

# -----------------------------------------------------------------------------

 

def _pick_model(sess):

    """Return an atomic model if none is implied by user selection."""

    isolde = getattr(sess, "isolde", None)

    if isolde and isolde.selected_model is not None:

        return isolde.selected_model

    for m in sess.models.list():

        if hasattr(m, "residues"):

            return m

    raise UserError("No atomic model with residues found in the session.")

 

def _atoms_from_spec(sess, spec: str):

    """Return atoms matching *spec* (empty collection if spec is invalid/empty)."""

    if not spec:

        return None

    try:

        # Use ChimeraX commands to create the selection, then read it back.

        run(sess, "select clear")

        run(sess, f"select {spec}")

        return selected_atoms(sess)

    except Exception as err:

        sess.logger.warning(f"Failed to apply selection '{spec}': {err}")

        run(sess, "select clear")

        return None

 

def _candidate_residues(sess, sel_spec):

    """Determine which residues to analyse based on the priority rules."""

    # 1 – explicit selection string

    atoms = _atoms_from_spec(sess, sel_spec)

    if atoms and len(atoms):

        return atoms.unique_residues

 

    # 2 – current GUI selection

    atoms = selected_atoms(sess)

    if atoms and len(atoms):

        return atoms.unique_residues

 

    # 3 – fall back to whole model

    mdl = _pick_model(sess)

    return mdl.residues

 

# -----------------------------------------------------------------------------

# Main logic

# -----------------------------------------------------------------------------

 

def main(sess):

    # Merge all argv tokens into a single selection spec (may contain spaces)

    sel_spec = " ".join(sys.argv[1:]) if len(sys.argv) > 1 else None

 

    residues = _candidate_residues(sess, sel_spec)

 

    protein_res = residues[residues.polymer_types == Residue.PT_AMINO]

    incomplete = [r for r in protein_res if r.is_missing_heavy_template_atoms()]

 

    if not incomplete:

        sess.logger.info(" No incomplete residues found in the chosen target set.")

        run(sess, "select clear")

        return

 

    spec = concise_residue_spec(sess, incomplete)

    run(sess, f"select {spec}")

    sess.logger.info(f"⚠️  Selected {len(incomplete)} incomplete protein residues.")

 

# -----------------------------------------------------------------------------

# Script entry point (ChimeraX injects 'session')

# -----------------------------------------------------------------------------

try:

    session  # noqa: F401  – provided by ChimeraX

except NameError as exc:

    raise RuntimeError("This script must be run inside UCSF ChimeraX.") from exc

else:

    main(session)

 

 

 

 

 

From: Tristan Croll <tcroll@altoslabs.com>
Date: Thursday, June 5, 2025 at 13:57
To: Vorländer,Matthias Kopano <matthias.vorlaender@imp.ac.at>
Cc: Alexis Rohou via ChimeraX-users <chimerax-users@cgl.ucsf.edu>
Subject: Re: [chimerax-users] Select all truncated amino acids in model (though ISOLDE?)

Hi Matthias,

 

I don't believe there's a way to do this via the command interface at present, but it's pretty easy in Python:

 

from chimerax.atomic import Residue

m = session.isolde.selected_model #if using ISOLDE

protein = m.residues[m.residues.polymer_types==Residue.PT_AMINO]

incomplete = [r for r in protein if r.is_missing_heavy_template_atoms()]

 

... and then do with them what you will. One approach:

 

from chimerax.core.commands import run
from chimerax.atomic import concise_residue_spec
incomplete = iter(incomplete)
run(session, f'view {concise_residue_spec(session, [next(incomplete)])} pad 0.5')

 

... and then repeat that last line as needed until you hit `StopIteration`.