{
  "filename": "plot_1.png",
  "iteration": 1,
  "description": "Comprehensive visualization of RvY_17310 SOD domain analysis: pLDDT profile, residue conservation, and geometry comparison",
  "timestamp": "2026-06-22 00:37:21",
  "code": "\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as mpatches\nimport numpy as np\n\nfig, axes = plt.subplots(1, 3, figsize=(18, 6))\n\n# ---- Panel 1: pLDDT profile ----\nax1 = axes[0]\n# Regenerate pLDDT data\nimport requests\npdb_url = \"https://alphafold.ebi.ac.uk/files/AF-A0A1D1W3Y1-F1-model_v6.pdb\"\npdb_resp = requests.get(pdb_url)\nlines = pdb_resp.text.split('\\n')\npositions = []\nplddts = []\nfor line in lines:\n    if line.startswith('ATOM') and line[12:16].strip() == 'CA':\n        resnum = int(line[22:26].strip())\n        plddt = float(line[60:66].strip())\n        positions.append(resnum)\n        plddts.append(plddt)\n\ncolors = []\nfor p, v in zip(positions, plddts):\n    if p <= 20:\n        colors.append('#888888')  # signal\n    elif p <= 332:\n        colors.append('#FF6B6B')  # N-terminal extension\n    else:\n        colors.append('#4ECDC4')  # SOD domain\n\nax1.bar(positions, plddts, color=colors, width=1.0, edgecolor='none')\nax1.axhline(y=70, color='black', linestyle='--', alpha=0.5, linewidth=0.8)\nax1.axhline(y=90, color='black', linestyle=':', alpha=0.5, linewidth=0.8)\nax1.axvline(x=20, color='gray', linestyle='-', alpha=0.3)\nax1.axvline(x=332, color='gray', linestyle='-', alpha=0.3)\n\n# Mark active site residues\nkey_pos = [364, 366, 375, 381, 389, 400, 403, 442, 465, 468]\nfor p in key_pos:\n    idx = positions.index(p)\n    ax1.plot(p, plddts[idx], 'r*', markersize=8, zorder=5)\n\nax1.set_xlabel('Residue Position', fontsize=11)\nax1.set_ylabel('pLDDT Score', fontsize=11)\nax1.set_title('AlphaFold Confidence (pLDDT)', fontsize=12, fontweight='bold')\nax1.set_ylim(0, 105)\nax1.text(10, 102, 'SP', ha='center', fontsize=8, style='italic')\nax1.text(176, 102, 'N-terminal extension\\n(disordered)', ha='center', fontsize=8, style='italic', color='#FF6B6B')\nax1.text(404, 102, 'SOD domain', ha='center', fontsize=8, style='italic', color='#4ECDC4')\n\n# Legend\nlegend_elements = [\n    mpatches.Patch(facecolor='#888888', label='Signal peptide'),\n    mpatches.Patch(facecolor='#FF6B6B', label='N-terminal (disordered)'),\n    mpatches.Patch(facecolor='#4ECDC4', label='Cu/Zn-SOD domain'),\n    plt.Line2D([0], [0], marker='*', color='r', linestyle='None', markersize=8, label='Active site residues'),\n]\nax1.legend(handles=legend_elements, loc='lower right', fontsize=7)\n\n# ---- Panel 2: Residue conservation heatmap ----\nax2 = axes[1]\nresidue_labels = ['His364\\n(Cu)', 'His366\\n(Cu)', 'Cys375\\n(S-S)', 'His381\\n(Cu/Zn)', \n                  'His389\\n(Zn)', 'His400\\n(Zn)', 'Asp403\\n(Zn)', 'His442\\n(Cu)',\n                  'Arg465\\n(ESL)', 'Cys468\\n(S-S)']\nconservation = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]  # all conserved\nplddt_vals = [98.4, 98.7, 96.9, 98.1, 94.4, 95.1, 97.0, 98.2, 97.9, 98.4]\n\nbar_colors = ['#2ECC71' if c == 1 else '#E74C3C' for c in conservation]\nbars = ax2.barh(range(len(residue_labels)), plddt_vals, color=bar_colors, edgecolor='white', height=0.7)\nax2.set_yticks(range(len(residue_labels)))\nax2.set_yticklabels(residue_labels, fontsize=9)\nax2.set_xlabel('pLDDT Confidence', fontsize=11)\nax2.set_title('Active Site Residue Conservation\\n& AlphaFold Confidence', fontsize=12, fontweight='bold')\nax2.set_xlim(85, 100)\nax2.axvline(x=90, color='black', linestyle=':', alpha=0.5)\n\nfor i, (v, c) in enumerate(zip(plddt_vals, conservation)):\n    status = '\u2713 Conserved' if c == 1 else '\u2717 Missing'\n    ax2.text(v + 0.2, i, f'{v:.1f}', va='center', fontsize=8)\n\nax2.text(91, -1.2, 'All 10/10 key residues conserved', fontsize=10, fontweight='bold', color='#2ECC71')\n\n# ---- Panel 3: Geometry comparison ----\nax3 = axes[2]\nmeasurements = [\n    'Cu-lig1\u2194lig2', 'Cu-lig1\u2194bridge', 'Cu-lig1\u2194lig4',\n    'Cu-lig2\u2194bridge', 'Cu-lig2\u2194lig4', 'Bridge\u2194lig4'\n]\nhuman_dists = [5.80, 4.40, 4.91, 4.95, 3.37, 6.32]\nrvy_dists = [6.27, 4.14, 4.97, 5.18, 3.34, 6.04]\n\ny_pos = np.arange(len(measurements))\nwidth = 0.35\n\nbars1 = ax3.barh(y_pos - width/2, human_dists, width, label='Human SOD1 (2SOD)', color='#3498DB', edgecolor='white')\nbars2 = ax3.barh(y_pos + width/2, rvy_dists, width, label='RvY_17310 (AlphaFold)', color='#E67E22', edgecolor='white')\n\nax3.set_yticks(y_pos)\nax3.set_yticklabels(measurements, fontsize=9)\nax3.set_xlabel('Distance (\u00c5)', fontsize=11)\nax3.set_title('Cu-Site Ligand Geometry\\nCrystal vs AlphaFold', fontsize=12, fontweight='bold')\nax3.legend(fontsize=8, loc='lower right')\n\n# Add delta annotations\nfor i in range(len(measurements)):\n    delta = rvy_dists[i] - human_dists[i]\n    ax3.text(max(human_dists[i], rvy_dists[i]) + 0.15, i, f'\u0394={delta:+.2f}', \n             va='center', fontsize=8, color='gray')\n\nplt.tight_layout()\nplt.savefig('active_site_analysis.png', dpi=150, bbox_inches='tight')\nplt.show()\nprint(\"Figure saved: active_site_analysis.png\")\n",
  "plot_number": 1
}