{
  "filename": "ceacam16_variant_map.png",
  "iteration": 4,
  "description": "Schematic map of reported dominant vs recessive CEACAM16 variants across the protein/domain architecture",
  "timestamp": "2026-09-14 21:09:40",
  "code": "\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as mpatches\n\n# CEACAM16 human (UniProt Q2WEN9), 425 aa. Domain architecture (approximate, from UniProt/InterPro):\n# signal peptide ~1-33; Ig-like V-type 1 (N1) ~34-159; Ig-like C2-type \"constant/A\" ~168-256;\n# Ig-like V-type 2 (N2, most conserved) ~330-420. Boundaries are approximate.\nL = 425\ndomains = [\n    (\"Signal peptide\", 1, 33, \"#cccccc\"),\n    (\"Ig V-type 1 (N1)\", 34, 159, \"#8ecae6\"),\n    (\"Ig C2-type (constant/A)\", 160, 256, \"#ffb703\"),\n    (\"linker\", 257, 329, \"#e0e0e0\"),\n    (\"Ig V-type 2 (N2, most conserved)\", 330, 420, \"#fb8500\"),\n]\n\n# Reported variants\ndom_missense = [(\"p.Thr140Ile\", 140), (\"p.Gly169Arg\", 169), (\"p.Arg255Gly\", 255), (\"p.Leu365Arg\", 365)]\nrec_variants = [(\"p.Arg146Ter (recessive nonsense)\", 146)]\n\nfig, ax = plt.subplots(figsize=(11,3.2))\nfor name,s,e,c in domains:\n    ax.add_patch(mpatches.Rectangle((s,0),e-s,1,facecolor=c,edgecolor=\"k\",lw=0.7))\n    if e-s>40:\n        ax.text((s+e)/2,0.5,name,ha=\"center\",va=\"center\",fontsize=8)\n\nfor name,pos in dom_missense:\n    ax.annotate(name,(pos,1),xytext=(pos,1.9),ha=\"center\",fontsize=8,color=\"darkred\",\n                arrowprops=dict(arrowstyle=\"->\",color=\"darkred\"))\nfor name,pos in rec_variants:\n    ax.annotate(name,(pos,0),xytext=(pos,-1.1),ha=\"center\",fontsize=8,color=\"navy\",\n                arrowprops=dict(arrowstyle=\"->\",color=\"navy\"))\n\nax.set_xlim(0,L+5); ax.set_ylim(-1.6,2.4); ax.set_yticks([])\nax.set_xlabel(\"Amino acid position (CEACAM16, 425 aa; Q2WEN9)\")\nax.set_title(\"Reported CEACAM16 variants: dominant missense (red, above) vs recessive LoF (blue, below)\")\nplt.tight_layout(); plt.savefig(\"ceacam16_variant_map.png\",dpi=140)\nprint(\"Dominant missense variant positions:\", [p for _,p in dom_missense])\nprint(\"Fraction of protein length for each:\", [round(p/L,2) for _,p in dom_missense])\nprint(\"Recessive nonsense position:\", rec_variants[0][1], \"-> truncates ~\", round((L-146)/L*100), \"% of protein\")\n"
}