A publication-grade figure of the bacterial tRNA life cycle, built from PDB structures with UCSF ChimeraX: the folded tRNA, its charging by an aminoacyl-tRNA synthetase, delivery by EF-Tu, and decoding on the 70S ribosome with tRNAs in all three sites.
python stage_structures.py # fetch PDB entries, orient them, write staged/*.cif
./render_panels.sh # ChimeraX offscreen -> renders/*.png
python compose_figure.py # -> figures/trna_lifecycle.{png,pdf} + panel_*.png
stage_structures.py needs gemmi and numpy; compose_figure.py needs
matplotlib and pillow. Rendering needs ChimeraX 1.12 (any platform with a
working GL context; see the offscreen notes below for headless Linux).
| panel | script | PDB | contents |
|---|---|---|---|
| a | scripts/panel1_trna.cxc |
6UGG (1.95 Å) | E. coli tRNAAsp, free |
| b | scripts/panel1_side.cxc |
6UGG | same molecule, rotated 90° about the vertical axis |
| c | scripts/panel2_synthetase.cxc |
1C0A (2.4 Å) | E. coli AspRS · tRNAAsp · Asp-AMP |
| d | scripts/panel3_eftu.cxc |
1B23 (2.6 Å) | EF-Tu · GDPNP · Cys-tRNACys |
| e | scripts/panel4_epa_gold.cxc |
1VY5 (2.55 Å) | 70S with tRNAs in the E, P and A sites + mRNA |
Species caveats, stated on the figure itself: the tRNAs are E. coli in every panel, but EF-Tu in 1B23 is T. aquaticus and the 70S in 1VY5 is T. thermophilus. No E. coli 70S entry models a complete E-site tRNA — in 7K00, the 2 Å E. coli ribosome, the E-site chain is two nucleotides — which is why the three-site panel is not E. coli.
Panels a–d share one tRNA reference frame so the molecule reads as the same object across the cycle:
- 6UGG chain A is placed in the textbook L orientation by a frame built from three landmark centroids (elbow, acceptor end, anticodon loop).
- Each complex is then superposed onto it by least squares on the P atoms of the four conserved helical stems (acceptor 1–7/66–72, D 10–13/22–25, anticodon 27–31/39–43, T 49–53/61–65). Fit residuals: 1C0A 3.4 Å, 1B23 4.8 Å over 42 atoms — species and conformational differences, not a numbering error (the numbering offset per entry was checked by scanning candidate shifts).
Panel e gets its own frame: the plane through its three tRNA centroids, E→A along +x, with the 30S forced to the bottom of the image. The second 70S copy in the asymmetric unit is discarded, and ribosome residues whose centroid lies in front of z = +8 Å are deleted, which opens the intersubunit space without the artefacts a clip plane produces.
CU palette. tRNA #CFB87C (gold) in every panel; partner protein and ribosome
surfaces in light greys (#d3d3d3, #d4d4d4, #ebebeb); amino-acid cargo and
adenylate #ee8d3e; mRNA #565A5C. The three tRNAs in panel e are the same
gold — their identity is carried by the E/P/A labels, not by a colour ramp.
Styling follows the publication-silhouette look of
meganstumpf/chimeraX-PDB-domains:
preset "overall look" "publication 1 (silhouettes)", soft lighting, no
shadows, thin black silhouettes, 1400 px square, supersample 3, transparent
background.
camera ortho— andcameragenerally — crashes the offscreen rendering context. Frame withview <spec>followed byzoom <factor>instead.nucleotides ... ladderdraws nothing unless the residues' atoms are displayed.show <spec> atomsfirst, then apply the style.view <spec>requires displayed atoms in the spec; a spec with only ribbon shown raisesNo displayed objects specified.- On the CU AMC cluster: OSMesa is not installed, so
mesa-libOSMesa-24.2.8-2.el9_6(versioned vault path, matching the nodes' mesa build) is unpacked under$CXDIR/mesa; ChimeraX's bundled_sslneedsOPENSSL_3.3.0, soopenssl-libs-3.5.5is unpacked under$CXDIR/ssl. Both go onLD_LIBRARY_PATH(render_panels.shdoes this). The login node lackslibGLU.so.1and is not a valid smoke test.
If the figure is used in a publication, cite the original PDB entries: 6UGG, 1C0A, 1B23, 1VY5.
A second composite runs the cycle straight across:
tRNA → aaRS → EF-Tu → ribosome (figures/trna_row.png).
Two things differ from the 2×3 version. First, panels a–c hold one tRNA
orientation: the 150° turn used in the stacked layout is removed from the EF-Tu
panel (scripts/row_eftu58.cxc), so EF-Tu now sits in front of the acceptor
end, and its surface plus AspRS's are at 58% transparency (up from 20% and 30%)
so the tRNA reads through them. Second, a–c are resampled to a common scale:
row_figure.py calibrates px/Å per render from the content bbox against the
model's own extent (12.8, 10.4 and 9.0 px/Å as rendered), downsamples each to
the smallest, and aligns the panels on the tRNA's gold-mask centroid. The
ribosome cannot share that scale — at 4.6 px/Å it is half the size — so it
carries its own scale bar and the ratio is stated in the caption.
./render_panels.sh # then, for the row panels:
python -c "import row_figure as rf; rf.build(paths, px_per_A, 'figures/trna_row.png')"
row_figure.build() takes the four render paths and their measured px/Å
(keys a,b,c,d = tRNA, aaRS, EF-Tu, ribosome).

