{
  "filename": "final_evidence_summary.png",
  "iteration": 3,
  "description": "Create final comprehensive evidence figure with genomic context, PANTHER tree structure, and failure mode assessment",
  "timestamp": "2026-06-23 22:39:02",
  "code": "\nimport matplotlib\nmatplotlib.use('Agg')\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as mpatches\nfrom matplotlib.patches import FancyArrowPatch\n\nfig, axes = plt.subplots(3, 1, figsize=(16, 14))\nfig.suptitle('Q72DT2 (aprA): Complete Evidence for Mis-annotation as Succinate Dehydrogenase', \n             fontsize=14, fontweight='bold', y=0.98)\n\n# Panel A: Genomic context\nax = axes[0]\nax.set_title('A. Genomic Context in D. vulgaris Hildenborough', fontweight='bold', fontsize=11)\n\n# aprBA-qmo operon\ny_apr = 0.7\ngenes_apr = [\n    (0.05, 0.15, 'aprB\\n(DVU_0846)\\nEC 1.8.99.2', '#81D4FA'),\n    (0.18, 0.33, 'aprA\\n(DVU_0847)\\nEC 1.8.99.2\\n\u2190 Q72DT2', '#F44336'),\n    (0.36, 0.48, 'qmoA\\n(DVU_0848)\\nElectron\\ndonor', '#FFE082'),\n]\nax.text(0.02, y_apr + 0.15, 'aprBA-qmo operon\\n(Sulfate reduction)\\nPosition: ~933 kb', \n        fontsize=8, fontweight='bold', va='center', color='#1565C0')\nfor x1, x2, label, color in genes_apr:\n    arrow = FancyArrowPatch((x1, y_apr), (x2, y_apr), arrowstyle='->', \n                            mutation_scale=20, lw=18, color=color, alpha=0.8)\n    ax.add_patch(arrow)\n    ax.text((x1+x2)/2, y_apr - 0.15, label, ha='center', va='center', fontsize=7)\n\n# frd operon\ny_frd = 0.3\ngenes_frd = [\n    (0.05, 0.12, 'frdC\\n(DVU_3261)\\nCyt b', '#CE93D8'),\n    (0.15, 0.30, 'fdrA\\n(DVU_3262)\\nEC 1.3.5.1\\n\u2190 Q726C9', '#4CAF50'),\n    (0.33, 0.43, 'frdB\\n(DVU_3263)\\nFe-S', '#FFB74D'),\n]\nax.text(0.02, y_frd + 0.15, 'frd operon\\n(Fumarate reduction)\\nPosition: ~3437 kb', \n        fontsize=8, fontweight='bold', va='center', color='#2E7D32')\nfor x1, x2, label, color in genes_frd:\n    arrow = FancyArrowPatch((x1, y_frd), (x2, y_frd), arrowstyle='->', \n                            mutation_scale=20, lw=18, color=color, alpha=0.8)\n    ax.add_patch(arrow)\n    ax.text((x1+x2)/2, y_frd - 0.15, label, ha='center', va='center', fontsize=7)\n\n# Annotations\nax.text(0.55, y_apr, 'APS + 2e\u207b \u2192 AMP + sulfite', fontsize=10, fontweight='bold', \n        va='center', color='#D32F2F',\n        bbox=dict(boxstyle='round,pad=0.3', facecolor='#FFCDD2', alpha=0.8))\nax.text(0.55, y_frd, 'Fumarate + 2H \u2192 Succinate', fontsize=10, fontweight='bold', \n        va='center', color='#1B5E20',\n        bbox=dict(boxstyle='round,pad=0.3', facecolor='#C8E6C9', alpha=0.8))\n\nax.text(0.85, 0.5, 'DIFFERENT\\noperons\\nDIFFERENT\\nenzymes\\nDIFFERENT\\nreactions', \n        fontsize=9, fontweight='bold', va='center', ha='center', color='#B71C1C',\n        bbox=dict(boxstyle='round,pad=0.5', facecolor='#FFEBEE', edgecolor='red', alpha=0.9))\n\nax.set_xlim(0, 1)\nax.set_ylim(0, 1)\nax.axis('off')\n\n# Panel B: PANTHER subfamily assignments comparison\nax = axes[1]\nax.set_title('B. PANTHER Subfamily Assignments: Correct vs. Incorrect', fontweight='bold', fontsize=11)\nax.axis('off')\n\n# Draw the tree-like structure\ntree_text = \"\"\"\nPANTHER Family PTHR11632: \"SUCCINATE DEHYDROGENASE 2 FLAVOPROTEIN SUBUNIT\"\n(Actually covers SdhA + FrdA + AprA superfamily)\n\u2502\n\u251c\u2500\u2500 SF51: \"SDH [UBIQUINONE] FLAVOPROTEIN, MITOCHONDRIAL\"\n\u2502   \u251c\u2500\u2500 Hs SDHA (P31040) \u2705 Correct placement\n\u2502   \u251c\u2500\u2500 Ec SdhA (P0AC41) \u2705 Correct placement\n\u2502   \u2514\u2500\u2500 Q72DT2 (aprA)    \u274c WRONG! AprA placed here by TreeGrafter\n\u2502       \u2514\u2500\u2500 \u2192 Propagates GO:0000104 (SDH activity) \u2190 ERROR\n\u2502\n\u251c\u2500\u2500 SF71: \"FUMARATE REDUCTASE FLAVOPROTEIN SUBUNIT\"\n\u2502   \u251c\u2500\u2500 Ec FrdA (P00363)  \u2705 Correct placement\n\u2502   \u2514\u2500\u2500 Q726C9 (fdrA)     \u2705 Correct placement (D. vulgaris actual FRD)\n\u2502\n\u2514\u2500\u2500 (No AprA-specific subfamily exists!)\n    \u2514\u2500\u2500 Q72DT2 should be here \u2192 with GO:0009973 (APS reductase activity)\n\"\"\"\nax.text(0.02, 0.98, tree_text, transform=ax.transAxes, fontsize=8.5,\n        fontfamily='monospace', verticalalignment='top',\n        bbox=dict(boxstyle='round', facecolor='#FFF3E0', alpha=0.9))\n\n# Panel C: Failure mode assessment summary\nax = axes[2]\nax.set_title('C. Three Failure Modes: Assessment Summary', fontweight='bold', fontsize=11)\nax.axis('off')\n\nsummary_text = \"\"\"\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  FAILURE MODE                      \u2502  ASSESSMENT   \u2502  KEY EVIDENCE                         \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n\u2502  1. Granularity (family vs subfam) \u2502  N/A          \u2502  Not a granularity issue; the term     \u2502\n\u2502                                    \u2502               \u2502  names a DIFFERENT activity entirely    \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n\u2502  2. Pseudo-enzyme / lost activity  \u2502  RULED OUT    \u2502  AprA-specific catalytic residues       \u2502\n\u2502                                    \u2502               \u2502  (Arg317, FAD N5) are conserved;        \u2502\n\u2502                                    \u2502               \u2502  active enzyme in D. vulgaris (PMID:    \u2502\n\u2502                                    \u2502               \u2502  23842468); Sp. activity 11-14 U/mg     \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n\u2502  3. Within-superfamily             \u2502  \u2605 CONFIRMED  \u2502  AprA placed in SdhA subfamily SF51.    \u2502\n\u2502     mis-placement                  \u2502  \u2605            \u2502  Covalent FAD His ABSENT. InterPro      \u2502\n\u2502                                    \u2502               \u2502  correctly calls IPR011803 (AprA).       \u2502\n\u2502                                    \u2502               \u2502  Reviewed ortholog has same error.        \u2502\n\u2502                                    \u2502               \u2502  Same organism has real FrdA (Q726C9)     \u2502\n\u2502                                    \u2502               \u2502  in different operon with correct SF71.   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\nVERDICT: WRONG SUBFAMILY (MIS-PLACED) \u2014 GO:0000104 should be REPLACED with GO:0009973\n\"\"\"\nax.text(0.02, 0.95, summary_text, transform=ax.transAxes, fontsize=8,\n        fontfamily='monospace', verticalalignment='top',\n        bbox=dict(boxstyle='round', facecolor='#E8F5E9', alpha=0.9))\n\nplt.tight_layout(rect=[0, 0, 1, 0.96])\nplt.savefig('final_evidence_summary.png', dpi=150, bbox_inches='tight')\nplt.show()\nprint(\"Figure saved: final_evidence_summary.png\")\n"
}