{
  "filename": "dnajc28_jdomain_analysis.png",
  "iteration": 1,
  "description": "Creating comprehensive figure showing DNAJC28 domain architecture, J-domain alignment, and functional scorecard",
  "timestamp": "2026-06-22 04:55:13",
  "code": "\nimport matplotlib\nmatplotlib.use('Agg')\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as mpatches\nimport numpy as np\n\nfig, axes = plt.subplots(3, 1, figsize=(16, 14), gridspec_kw={'height_ratios': [1.5, 2, 1.5]})\n\n# ---- Panel 1: DNAJC28 Domain Architecture ----\nax1 = axes[0]\nax1.set_xlim(0, 400)\nax1.set_ylim(0, 3)\n\n# Full protein bar\nax1.barh(1.5, 388, height=0.6, left=1, color='lightgray', edgecolor='black', linewidth=1)\nax1.text(194, 1.5, 'DNAJC28 (388 aa)', ha='center', va='center', fontsize=11, fontweight='bold')\n\n# J-domain\nax1.barh(1.5, 65, height=0.6, left=51, color='#4CAF50', edgecolor='black', linewidth=1.5, alpha=0.8)\nax1.text(83, 1.5, 'J-domain\\n(51-115)', ha='center', va='center', fontsize=9, fontweight='bold', color='white')\n\n# HPD motif within J-domain\nax1.barh(1.5, 3, height=0.6, left=79, color='red', edgecolor='darkred', linewidth=1.5)\nax1.annotate('HPD\\n79-81', xy=(80, 1.2), xytext=(80, 0.5), fontsize=9, ha='center',\n            fontweight='bold', color='red', arrowprops=dict(arrowstyle='->', color='red'))\n\n# DJC28-specific C-terminal domain (PF09350)\nax1.barh(1.5, 69, height=0.6, left=203, color='#2196F3', edgecolor='black', linewidth=1.5, alpha=0.8)\nax1.text(237, 1.5, 'DJC28_CD\\n(203-271)', ha='center', va='center', fontsize=9, fontweight='bold', color='white')\n\nax1.set_title('DNAJC28 Domain Architecture', fontsize=14, fontweight='bold')\nax1.set_xlabel('Residue Position')\nax1.set_yticks([])\n\n# ---- Panel 2: J-domain Alignment ----\nax2 = axes[1]\n\n# Aligned sequences centered on HPD\nalignment_data = [\n    ('DNAJC28', 'SADEVRESFHKLAKQY', 'HPD', 'SGSNTADSATFIRIEKAYRKVLS', True),\n    ('DNAJA1',  'NATQEELKKAYRKLALKY', 'HPD', 'KNPNEGEKFKQISQAYEVLSD', False),\n    ('DNAJA2',  'GASENELKKAYRKLAKEY', 'HPD', 'KNPNAGDKFKEISFAYEVLSN', False),\n    ('DNAJB1',  'ASDEEIKRAYRRQALRY', 'HPD', 'KNKEPGAEEKFKEIAEAYDVLS', False),\n    ('DNAJC5',  'ATSDDIKKSYRKLALKY', 'HPD', 'KNPDNPEAADKFKEINNAHAI', False),\n    ('DNAJC10', 'TASSREIRQAFKKLALKL', 'HPD', 'KNPNNPNAHGDFLKINRAYEV', False),\n    ('E.coli DnaJ','AEEREIRKAYKRLAMKY','HPD', 'RNQGDKEAEAKFKEIKEAYEV', False),\n]\n\ny_positions = list(range(len(alignment_data), 0, -1))\n\nfor idx, (name, helix2, hpd, post, is_target) in enumerate(alignment_data):\n    y = y_positions[idx]\n    \n    # Color scheme\n    bg_color = '#FFF9C4' if is_target else 'white'\n    name_weight = 'bold' if is_target else 'normal'\n    name_color = 'red' if is_target else 'black'\n    \n    ax2.text(-0.5, y, name, ha='right', va='center', fontsize=10, fontweight=name_weight, \n             color=name_color, family='monospace')\n    \n    # Helix II residues\n    for j, aa in enumerate(helix2):\n        x = j - len(helix2)\n        color = '#81C784' if aa in 'KR' else '#64B5F6' if aa in 'LIVFYWM' else '#EEEEEE'\n        ax2.text(x, y, aa, ha='center', va='center', fontsize=9, family='monospace',\n                bbox=dict(boxstyle='round,pad=0.15', facecolor=color, alpha=0.6))\n    \n    # HPD motif\n    for j, aa in enumerate(hpd):\n        color = '#FF5252'\n        ax2.text(j, y, aa, ha='center', va='center', fontsize=11, family='monospace',\n                fontweight='bold', color='white',\n                bbox=dict(boxstyle='round,pad=0.15', facecolor=color, alpha=0.9))\n    \n    # Post-HPD\n    for j, aa in enumerate(post[:8]):\n        x = j + 3\n        # Highlight conserved K/R at +1 (canonical) vs S/G (DNAJC28)\n        if j == 0:\n            color = '#FFB74D' if aa in 'SG' else '#81C784' if aa in 'KR' else '#EEEEEE'\n        else:\n            color = '#EEEEEE'\n        ax2.text(x, y, aa, ha='center', va='center', fontsize=9, family='monospace',\n                bbox=dict(boxstyle='round,pad=0.15', facecolor=color, alpha=0.6))\n\n# Labels\nax2.text(-9, len(alignment_data)+0.7, '\u2190 Helix II', fontsize=10, fontstyle='italic', color='gray')\nax2.text(0.5, len(alignment_data)+0.7, 'HPD', fontsize=10, fontstyle='italic', color='red', fontweight='bold')\nax2.text(4, len(alignment_data)+0.7, 'Post-HPD loop \u2192', fontsize=10, fontstyle='italic', color='gray')\n\nax2.set_xlim(-19, 12)\nax2.set_ylim(0.3, len(alignment_data)+1.2)\nax2.set_title('J-domain Alignment (HPD-centered)', fontsize=14, fontweight='bold')\nax2.axis('off')\n\n# Legend\nlegend_elements = [\n    mpatches.Patch(facecolor='#81C784', label='Charged (K/R)'),\n    mpatches.Patch(facecolor='#64B5F6', label='Hydrophobic (L/I/V/F/W/Y/M)'),\n    mpatches.Patch(facecolor='#FF5252', label='HPD motif'),\n    mpatches.Patch(facecolor='#FFB74D', label='DNAJC28-specific (S/G at +1)'),\n]\nax2.legend(handles=legend_elements, loc='lower right', fontsize=8)\n\n# ---- Panel 3: Functional Scorecard ----\nax3 = axes[2]\nax3.axis('off')\n\ncriteria = [\n    (\"HPD motif intact\", \"\u2713\", \"Essential\", \"#4CAF50\"),\n    (\"Helix II amphipathic\", \"\u2713\", \"Essential\", \"#4CAF50\"),\n    (\"HPD in inter-helix loop\", \"\u2713\", \"Essential\", \"#4CAF50\"),\n    (\"Helix III present\", \"\u2713\", \"Important\", \"#4CAF50\"),\n    (\"Conserved Y at HPD-1\", \"\u2713\", \"Important\", \"#4CAF50\"),\n    (\"J-domain length (65 aa)\", \"\u2713\", \"Important\", \"#4CAF50\"),\n    (\"High AlphaFold pLDDT (87.3)\", \"\u2713\", \"Supporting\", \"#4CAF50\"),\n    (\"K/R at HPD+1\", \"S\", \"Moderate\", \"#FF9800\"),\n    (\"Conserved N at HPD+2\", \"G\", \"Minor\", \"#FF9800\"),\n]\n\nheader = \"Functional J-domain Assessment\"\nax3.text(0.5, 0.95, header, transform=ax3.transAxes, fontsize=14, fontweight='bold',\n        ha='center', va='top')\n\nfor i, (crit, status, imp, color) in enumerate(criteria):\n    y = 0.85 - i * 0.09\n    marker = '\u25cf' if status == '\u2713' else '\u25d0'\n    ax3.text(0.1, y, marker, transform=ax3.transAxes, fontsize=14, color=color, \n            ha='center', va='center', fontweight='bold')\n    ax3.text(0.15, y, f\"{crit}\", transform=ax3.transAxes, fontsize=10, \n            ha='left', va='center')\n    ax3.text(0.75, y, f\"[{imp}]\", transform=ax3.transAxes, fontsize=9, \n            ha='center', va='center', color='gray')\n    ax3.text(0.9, y, status, transform=ax3.transAxes, fontsize=10, \n            ha='center', va='center', fontweight='bold', color=color)\n\nverdict_y = 0.85 - len(criteria) * 0.09 - 0.02\nax3.text(0.5, verdict_y, 'VERDICT: Bona fide functional J-domain \u2014 NOT degenerate', \n        transform=ax3.transAxes, fontsize=12, fontweight='bold', ha='center', va='center',\n        color='#2E7D32', bbox=dict(boxstyle='round,pad=0.4', facecolor='#E8F5E9', edgecolor='#4CAF50'))\n\nplt.tight_layout()\nplt.savefig('dnajc28_jdomain_analysis.png', dpi=150, bbox_inches='tight')\nprint(\"Comprehensive figure saved: dnajc28_jdomain_analysis.png\")\n"
}