{
  "filename": "ssz1_active_site_comparison.png",
  "iteration": 1,
  "description": "Create visualization comparing SSZ1 active site residues and domain architecture to canonical Hsp70 ATPases",
  "timestamp": "2026-07-05 21:05:23",
  "code": "\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as mpatches\nimport numpy as np\n\nfig, axes = plt.subplots(2, 1, figsize=(14, 10), gridspec_kw={'height_ratios': [1.5, 1]})\n\n# === Panel A: Active site residue comparison ===\nax = axes[0]\nax.set_title(\"A. Hsp70 ATPase Active Site: SSZ1 vs Canonical Hsp70s\", fontsize=13, fontweight='bold', pad=10)\n\n# Data: critical residues comparison\nproteins = ['DnaK\\n(E. coli)', 'SSA1\\n(yeast)', 'SSB1\\n(yeast)', 'SSZ1\\n(yeast)']\n# Key positions: DLGTT loop, catalytic elements\nmotifs = {\n    'Phosphate loop\\n(DLGTT)': ['IDLGTT', 'IDLGTT', 'IDLGTT', 'ITFGNT'],\n    'Catalytic loop\\n(xFDLGGG)': ['IFDLGGGT', 'IFDLGGGT', 'IFDLGGGT', 'ADFGGIRS'],\n    'ATPase\\nactivity': ['YES', 'YES', 'YES', 'NO'],\n    'ATP binding': ['YES', 'YES', 'YES', 'YES\\n(weak)'],\n}\n\n# Create a table-like visualization\ncell_colors = []\ncell_text = []\nfor motif_name, values in motifs.items():\n    row_colors = []\n    for i, val in enumerate(values):\n        if i < 3:  # canonical\n            if 'YES' in str(val):\n                row_colors.append('#90EE90')  # light green\n            else:\n                row_colors.append('#E8F5E9')  # very light green\n        else:  # SSZ1\n            if 'NO' in str(val) or val != values[0]:\n                row_colors.append('#FFCDD2')  # light red\n            else:\n                row_colors.append('#90EE90')\n    cell_colors.append(row_colors)\n    cell_text.append(values)\n\ntable = ax.table(cellText=cell_text,\n                 rowLabels=list(motifs.keys()),\n                 colLabels=proteins,\n                 cellColours=cell_colors,\n                 rowColours=['#E3F2FD']*4,\n                 colColours=['#E3F2FD']*4,\n                 loc='center',\n                 cellLoc='center')\n\ntable.auto_set_font_size(False)\ntable.set_fontsize(11)\ntable.scale(1, 2.2)\n\n# Style header cells\nfor (row, col), cell in table.get_celld().items():\n    if row == 0 or col == -1:\n        cell.set_text_props(fontweight='bold')\n    cell.set_edgecolor('#BDBDBD')\n\nax.axis('off')\n\n# === Panel B: Domain architecture comparison ===\nax2 = axes[1]\nax2.set_title(\"B. Domain Architecture Comparison\", fontsize=13, fontweight='bold', pad=10)\n\n# Draw domain diagrams\ny_positions = [3.5, 2.5, 1.5, 0.5]\nlabels = ['DnaK (638 aa)', 'SSA1 (642 aa)', 'SSB1 (613 aa)', 'SSZ1 (537 aa)']\n# NBD (ATPase domain), Linker, SBD\u03b2, SBD\u03b1 (lid)\n# Canonical Hsp70: NBD ~1-385, Linker ~386-393, SBD\u03b2 ~394-507, SBD\u03b1 ~508-end\ndomains_canonical = [\n    {'NBD': (0, 385), 'Linker': (385, 393), 'SBD\u03b2': (393, 507), 'SBD\u03b1': (507, 638)},\n    {'NBD': (0, 382), 'Linker': (382, 393), 'SBD\u03b2': (393, 520), 'SBD\u03b1': (520, 642)},\n    {'NBD': (0, 388), 'Linker': (388, 399), 'SBD\u03b2': (399, 513), 'SBD\u03b1': (513, 613)},\n    {'NBD': (0, 399), 'Linker': None, 'SBD\u03b2': (399, 537), 'SBD\u03b1': None},  # SSZ1: truncated SBD, no lid\n]\n\ndomain_colors = {'NBD': '#4FC3F7', 'Linker': '#FFE082', 'SBD\u03b2': '#81C784', 'SBD\u03b1': '#E57373'}\nmax_len = 650\nscale = 12.0 / max_len\n\nfor i, (y, label, domains) in enumerate(zip(y_positions, labels, domains_canonical)):\n    ax2.text(-0.5, y, label, ha='right', va='center', fontsize=10, fontweight='bold')\n    for dname, coords in domains.items():\n        if coords is None:\n            continue\n        start, end = coords\n        width = (end - start) * scale\n        x = start * scale\n        color = domain_colors[dname]\n        if i == 3:  # SSZ1\n            if dname == 'NBD':\n                # Striped pattern for \"ATPase-dead\" NBD\n                rect = mpatches.FancyBboxPatch((x, y-0.2), width, 0.4, \n                    boxstyle=\"round,pad=0.02\", facecolor=color, edgecolor='red', \n                    linewidth=2, linestyle='--', alpha=0.7)\n            elif dname == 'SBD\u03b2':\n                rect = mpatches.FancyBboxPatch((x, y-0.2), width, 0.4,\n                    boxstyle=\"round,pad=0.02\", facecolor=color, edgecolor='red',\n                    linewidth=2, linestyle='--', alpha=0.7)\n            else:\n                rect = mpatches.FancyBboxPatch((x, y-0.2), width, 0.4,\n                    boxstyle=\"round,pad=0.02\", facecolor=color, edgecolor='gray',\n                    linewidth=1, alpha=0.8)\n        else:\n            rect = mpatches.FancyBboxPatch((x, y-0.2), width, 0.4,\n                boxstyle=\"round,pad=0.02\", facecolor=color, edgecolor='gray',\n                linewidth=1, alpha=0.8)\n        ax2.add_patch(rect)\n        # Add domain label\n        mid_x = x + width/2\n        if width > 0.5:\n            ax2.text(mid_x, y, dname, ha='center', va='center', fontsize=8, fontweight='bold')\n\n# Add annotations for SSZ1\nax2.annotate('ATPase-dead\\n(D\u2192T in DLGTT)', xy=(2, 0.5), xytext=(3, -0.5),\n            fontsize=9, color='red', fontweight='bold',\n            arrowprops=dict(arrowstyle='->', color='red', lw=1.5),\n            ha='center')\nax2.annotate('Truncated\\n(no SBD\u03b1 lid)', xy=(9, 0.5), xytext=(10.5, -0.5),\n            fontsize=9, color='red', fontweight='bold',\n            arrowprops=dict(arrowstyle='->', color='red', lw=1.5),\n            ha='center')\n\n# Legend\nlegend_elements = [\n    mpatches.Patch(facecolor='#4FC3F7', edgecolor='gray', label='NBD (ATPase domain)'),\n    mpatches.Patch(facecolor='#FFE082', edgecolor='gray', label='Linker'),\n    mpatches.Patch(facecolor='#81C784', edgecolor='gray', label='SBD\u03b2 (substrate binding)'),\n    mpatches.Patch(facecolor='#E57373', edgecolor='gray', label='SBD\u03b1 (lid)'),\n]\nax2.legend(handles=legend_elements, loc='upper right', fontsize=8, framealpha=0.9)\n\nax2.set_xlim(-4, 13)\nax2.set_ylim(-1.2, 4.5)\nax2.axis('off')\n\nplt.tight_layout()\nplt.savefig('ssz1_active_site_comparison.png', dpi=150, bbox_inches='tight')\nplt.show()\nprint(\"Figure saved: ssz1_active_site_comparison.png\")\n"
}