{
  "filename": "crmp_active_site_conservation.png",
  "iteration": 1,
  "description": "Provenance heatmap of catalytic residue conservation across DPYS and CRMPs",
  "timestamp": "2026-07-07 00:21:37",
  "code": "\nimport matplotlib.pyplot as plt\nimport numpy as np\n\nresidues = [\"H67\\nZn1-His\",\"H69\\nZn1-His\",\"K159\\nZn-bridge\\ncarboxyLys\",\"Y164\\nsubstrate\",\n            \"H192\\nZn2-His\",\"H248\\nZn2-His\",\"D326\\nZn1-Asp\",\"N347\\nsubstrate\"]\n# rows: DPYS(ref), CRMP2, CRMP4, CRMP5\ndata = {\n \"DPYS (enzyme)\": [1,1,1,1,1,1,1,1],\n \"DPYSL2/CRMP2\":  [1,0,0,0,1,0,0,0],\n \"DPYSL3/CRMP4\":  [1,1,0,1,1,0,0,0],\n \"DPYSL5/CRMP5\":  [0,1,0,1,1,0,1,0],\n}\nlabels_sub = {\n \"DPYSL2/CRMP2\": [\"H\",\"R\",\"L\",\"F\",\"H\",\"K\",\"A\",\"E\"],\n \"DPYSL3/CRMP4\": [\"H\",\"H\",\"M\",\"Y\",\"H\",\"K\",\"A\",\"E\"],\n \"DPYSL5/CRMP5\": [\"S\",\"H\",\"Q\",\"Y\",\"H\",\"N\",\"D\",\"H\"],\n \"DPYS (enzyme)\":[\"H\",\"H\",\"K\",\"Y\",\"H\",\"H\",\"D\",\"N\"],\n}\nM=np.array([data[k] for k in data])\nfig,ax=plt.subplots(figsize=(11,3.6))\nax.imshow(M,cmap=\"RdYlGn\",vmin=0,vmax=1,aspect=\"auto\")\nax.set_xticks(range(len(residues))); ax.set_xticklabels(residues,fontsize=8)\nax.set_yticks(range(len(data))); ax.set_yticklabels(list(data.keys()),fontsize=10)\nfor i,k in enumerate(data):\n    for j in range(len(residues)):\n        ax.text(j,i,labels_sub[k][j],ha=\"center\",va=\"center\",fontweight=\"bold\")\nax.set_title(\"Dihydropyrimidinase (DPYS) catalytic/metal residues conserved (green) vs lost (red) in CRMPs\\n\"\n             \"DPYSL2/CRMP2 retains only 2/8 \u2014 the essential Zn-bridging carboxy-Lys K159 is Leu\",fontsize=9)\nplt.tight_layout(); plt.savefig(\"crmp_active_site_conservation.png\",dpi=130)\nprint(\"saved figure\")\nprint(\"DPYSL2/CRMP2 catalytic residues conserved: 2/8 (H67, H192 only)\")\nprint(\"Lost: Zn1-His(H69>R), Zn-bridge carboxyLys(K159>L), Zn2-His(H248>K), Zn1-Asp(D326>A)\")\nprint(\"=> binuclear Zn center cannot assemble; no amidohydrolase catalysis possible\")\n"
}