{
  "filename": "plot_1.png",
  "iteration": 1,
  "description": "Create comprehensive visualization of C18orf21 vs RPP21 structural comparison with pLDDT profiles and summary table",
  "timestamp": "2026-06-22 02:42:17",
  "code": "\nimport requests\nimport numpy as np\nimport matplotlib\nmatplotlib.use('Agg')\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as mpatches\n\n# Download AlphaFold models for both proteins\ndef get_alphafold_pdb(accession):\n    api_url = f\"https://alphafold.ebi.ac.uk/api/prediction/{accession}\"\n    resp = requests.get(api_url, timeout=15)\n    api_data = resp.json()\n    pdb_url = api_data[0]['pdbUrl']\n    pdb_resp = requests.get(pdb_url, timeout=15)\n    return pdb_resp.text\n\ndef parse_ca_atoms(pdb_text):\n    atoms = []\n    for line in pdb_text.split('\\n'):\n        if line.startswith(\"ATOM\") and line[12:16].strip() == \"CA\":\n            resnum = int(line[22:26].strip())\n            resname = line[17:20].strip()\n            bfactor = float(line[60:66].strip())\n            atoms.append({'resnum': resnum, 'resname': resname, 'pLDDT': bfactor})\n    return atoms\n\nc18_pdb = get_alphafold_pdb('Q32NC0')\nrpp21_pdb = get_alphafold_pdb('Q9H633')\n\nc18_atoms = parse_ca_atoms(c18_pdb)\nrpp21_atoms = parse_ca_atoms(rpp21_pdb)\n\nc18_resnums = [a['resnum'] for a in c18_atoms]\nc18_plddt = [a['pLDDT'] for a in c18_atoms]\nrpp21_resnums = [a['resnum'] for a in rpp21_atoms]\nrpp21_plddt = [a['pLDDT'] for a in rpp21_atoms]\n\n# Create a multi-panel figure\nfig, axes = plt.subplots(3, 1, figsize=(14, 12), gridspec_kw={'height_ratios': [1.2, 1.2, 1.5]})\n\n# Panel 1: C18orf21/RMP24 pLDDT profile\nax1 = axes[0]\ncolors1 = []\nfor p in c18_plddt:\n    if p > 90: colors1.append('#0053D6')\n    elif p > 70: colors1.append('#65CBF3')\n    elif p > 50: colors1.append('#FFDB13')\n    else: colors1.append('#FF7D45')\nax1.bar(c18_resnums, c18_plddt, color=colors1, width=1.0, edgecolor='none')\nax1.axhline(y=70, color='gray', linestyle='--', alpha=0.5, linewidth=0.8)\nax1.axhline(y=90, color='gray', linestyle=':', alpha=0.5, linewidth=0.8)\nax1.set_ylabel('pLDDT', fontsize=11)\nax1.set_title('C18orf21/RMP24 (Q32NC0) \u2014 AlphaFold Confidence', fontsize=13, fontweight='bold')\nax1.set_xlim(0, 225)\nax1.set_ylim(0, 100)\n\n# Annotate structured core and disordered region\nax1.axvspan(2, 32, alpha=0.08, color='green')\nax1.axvspan(40, 125, alpha=0.08, color='green')\nax1.axvspan(126, 185, alpha=0.08, color='red')\nax1.text(60, 5, 'Structured core\\n(DUF4674 domain)', ha='center', fontsize=9, color='darkgreen')\nax1.text(155, 5, 'Disordered\\nlinker', ha='center', fontsize=9, color='darkred')\n\n# Mark CxxC motifs\nax1.annotate('CPYC\\n(res 43-46)', xy=(44, c18_plddt[43]), xytext=(44, 40),\n            arrowprops=dict(arrowstyle='->', color='purple'), fontsize=8, color='purple', ha='center')\nax1.annotate('CKTC\\n(res 104-107)', xy=(105, c18_plddt[104]), xytext=(105, 40),\n            arrowprops=dict(arrowstyle='->', color='purple'), fontsize=8, color='purple', ha='center')\n\n# Panel 2: RPP21 pLDDT profile  \nax2 = axes[1]\ncolors2 = []\nfor p in rpp21_plddt:\n    if p > 90: colors2.append('#0053D6')\n    elif p > 70: colors2.append('#65CBF3')\n    elif p > 50: colors2.append('#FFDB13')\n    else: colors2.append('#FF7D45')\nax2.bar(rpp21_resnums, rpp21_plddt, color=colors2, width=1.0, edgecolor='none')\nax2.axhline(y=70, color='gray', linestyle='--', alpha=0.5, linewidth=0.8)\nax2.axhline(y=90, color='gray', linestyle=':', alpha=0.5, linewidth=0.8)\nax2.set_ylabel('pLDDT', fontsize=11)\nax2.set_title('RPP21 (Q9H633) \u2014 AlphaFold Confidence (structural homolog)', fontsize=13, fontweight='bold')\nax2.set_xlim(0, 160)\nax2.set_ylim(0, 100)\n\nax2.axvspan(3, 117, alpha=0.08, color='green')\nax2.text(60, 5, 'Structured core\\n(Rpr2/Rpp21 domain)', ha='center', fontsize=9, color='darkgreen')\n\n# Mark CxxC motifs in RPP21\nax2.annotate('CRGC\\n(res 62-65)', xy=(63, rpp21_plddt[62]), xytext=(63, 35),\n            arrowprops=dict(arrowstyle='->', color='purple'), fontsize=8, color='purple', ha='center')\nax2.annotate('CLTC\\n(res 92-95)', xy=(93, rpp21_plddt[92]), xytext=(93, 35),\n            arrowprops=dict(arrowstyle='->', color='purple'), fontsize=8, color='purple', ha='center')\n\n# Panel 3: Comparative summary\nax3 = axes[2]\nax3.axis('off')\n\nsummary_text = \"\"\"\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                     STRUCTURAL COMPARISON SUMMARY                                          \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502  Feature            \u2502  C18orf21/RMP24          \u2502  RPP21                   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502  UniProt            \u2502  Q32NC0                  \u2502  Q9H633                  \u2502\n\u2502  Length             \u2502  220 aa                  \u2502  154 aa                  \u2502\n\u2502  Pfam               \u2502  PF15719 (Rmp24-like)    \u2502  PF04032 (Rpr2/Rpp21)    \u2502\n\u2502  Structured core    \u2502  ~120 aa (res 2-125)     \u2502  ~115 aa (res 3-117)     \u2502\n\u2502  Core mean pLDDT    \u2502  90.3                    \u2502  95.1                    \u2502\n\u2502  Core SS content    \u2502  H=62, E=32              \u2502  H=57, E=31             \u2502\n\u2502  CxxC motifs        \u2502  CPYC (43), CKTC (104)   \u2502  CRGC (62), CLTC (92)    \u2502\n\u2502  Basic residues     \u2502  22.7%                   \u2502  16.9%                   \u2502\n\u2502  Complex            \u2502  RNase MRP (specific)    \u2502  RNase P (specific)      \u2502\n\u2502  Foldseek E-value   \u2502  ~10\u207b\u2074 (structural homology)                       \u2502\n\u2502  Sequence identity  \u2502  <15% (undetectable by BLAST)                       \u2502\n\u2502  PDB structure      \u2502  9UH9 chain K (3.47\u00c5)    \u2502  No standalone PDB       \u2502\n\u2502  Function           \u2502  rRNA processing         \u2502  tRNA processing         \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\"\"\"\n\nax3.text(0.02, 0.98, summary_text, transform=ax3.transAxes, fontsize=9,\n         verticalalignment='top', fontfamily='monospace',\n         bbox=dict(boxstyle='round', facecolor='lightyellow', alpha=0.8))\n\nplt.tight_layout()\nplt.savefig('/tmp/c18orf21_structural_analysis.png', dpi=150, bbox_inches='tight')\nplt.show()\nprint(\"Figure saved!\")\n",
  "plot_number": 1
}