%23%20%2F%2F%2F%20script%0A%23%20requires-python%20%3D%20%22%3E%3D3.14%22%0A%23%20dependencies%20%3D%20%5B%0A%23%20%20%20%20%20%22marimo%22%2C%0A%23%20%20%20%20%20%22altair%3E%3D5.5.0%22%2C%0A%23%20%20%20%20%20%22cassetter%3E%3D0.1.0%22%2C%0A%23%20%20%20%20%20%22httpx2%5Bhttp2%5D%3E%3D2.13.0%22%2C%0A%23%20%20%20%20%20%22numpy%3E%3D2.4.4%22%2C%0A%23%20%20%20%20%20%22scipy%3E%3D1.17.1%22%2C%0A%23%20%20%20%20%20%22numba%3E%3D0.65.0%22%2C%0A%23%20%20%20%20%20%22serogen%22%2C%0A%23%20%5D%0A%23%0A%23%20%5Btool.uv.sources%5D%0A%23%20serogen%20%3D%20%7B%20path%20%3D%20%22..%22%2C%20editable%20%3D%20true%20%7D%0A%23%20%2F%2F%2F%0A%0A%22%22%22Marimo%20slide%20deck%20%26%20benchmark%20for%20de%20novo%20S.%20pneumoniae%20CPS%20locus%20discovery%2C%20hybrid%20MCL%20clustering%2C%20pan-locus%20graph%20construction%2C%20and%20database%20matching.%22%22%22%0A%0Aimport%20marimo%0A%0A__generated_with%20%3D%20%220.25.1%22%0Aapp%20%3D%20marimo.App(%0A%20%20%20%20width%3D%22full%22%2C%0A%20%20%20%20app_title%3D%22SeroGen%20%E2%80%94%20De%20Novo%20S.%20pneumoniae%20CPS%20Locus%20Discovery%20%26%20Pan-Locus%20Database%20Benchmark%22%2C%0A%20%20%20%20layout_file%3D%22data%3Aapplication%2Fjson%3Bbase64%2CeyJ0eXBlIjogInNsaWRlcyIsICJkYXRhIjogeyJjZWxscyI6IFt7ImlkIjogIkhib2wiLCAiY29kZV9oYXNoIjogIjliODdlZTYzMTQ2N2IwZTUyNzcxMDYxNzU4NGZmOGRkIn0sIHsiaWQiOiAiTUpVZSIsICJjb2RlX2hhc2giOiAiOGYwYzVhNjAyZDU5MzVkNzUzMTM5ODRhNmM0NzAyMTYifSwgeyJpZCI6ICJ2YmxBIiwgImNvZGVfaGFzaCI6ICJhMmZkOGIwZWIyYzU3MTY1ODNjYThmYjMyNzJlZTFhMiJ9LCB7ImlkIjogImJrSEMiLCAiY29kZV9oYXNoIjogImU5MTExZTE3ZmM3YTE0MjAyY2MwZGNkMmNlMTQxYjMzIn0sIHsiaWQiOiAibEVRYSIsICJjb2RlX2hhc2giOiAiNGZkYTg2NWY5NGZkNDc4NDAxYjRlM2RmMjhhYmI0NDAifSwgeyJpZCI6ICJQS3JpIiwgImNvZGVfaGFzaCI6ICI0MTY2MDVjYmViMDEzZWVmMjU0YTZmMDA4YTc5Yzc3NSJ9LCB7ImlkIjogIlhyZWYiLCAiY29kZV9oYXNoIjogIjcyZTE5MjhkOGY2OGUyYTNhYWZkY2U5NmFhZTM5YzA3In0sIHsiaWQiOiAiU0ZQTCIsICJjb2RlX2hhc2giOiAiOWI4NjM3MTVhNTM3MDRlZmEzMzA5ZGYwNmIwNWI0YWQifSwgeyJpZCI6ICJCWXRDIiwgImNvZGVfaGFzaCI6ICIyYTc5MGQwMzY0NDBmNGE5MGY2MTljYzE5NmZkMmEyOCJ9LCB7ImlkIjogIlJHU0UiLCAiY29kZV9oYXNoIjogImNjNjVjNzBkNTEwZTA1YjBiMDU2NmRkYjM1MDI1MjZiIn1dfX0%3D%22%2C%0A)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20asyncio%0A%20%20%20%20import%20gzip%0A%20%20%20%20import%20os%0A%20%20%20%20import%20re%0A%20%20%20%20import%20time%0A%20%20%20%20import%20xml.etree.ElementTree%20as%20ET%0A%20%20%20%20from%20dataclasses%20import%20dataclass%0A%20%20%20%20from%20pathlib%20import%20Path%0A%0A%20%20%20%20import%20altair%20as%20alt%0A%20%20%20%20import%20httpx2%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20from%20cassetter%20import%20Cassetter%0A%0A%20%20%20%20from%20serogen.core.graph.layout%20import%20LayoutEngine%0A%20%20%20%20from%20serogen.core.io.fasta%20import%20FastaReader%0A%20%20%20%20from%20serogen.core.seq.clustering%20import%20Clusterer%0A%20%20%20%20from%20serogen.core.seq.seq%20import%20Sequence%2C%20Sequences%0A%20%20%20%20from%20serogen.genes.cnn%20import%20GeneRoleClassifier%0A%20%20%20%20from%20serogen.genes.roles%20import%20GeneRole%0A%20%20%20%20from%20serogen.loci.archetypes%20import%20ArchetypeCategory%2C%20LocusArchetype%0A%20%20%20%20from%20serogen.loci.matcher%20import%20BENIGN_VARIANT_MASK%2C%20LocusMatcher%2C%20MatchType%0A%20%20%20%20from%20serogen.loci.models%20import%20GeneNode%2C%20Loci%2C%20Locus%0A%20%20%20%20from%20serogen.loci.predictor%20import%20LocusPredictor%0A%0A%20%20%20%20alt.data_transformers.disable_max_rows()%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20ArchetypeCategory%2C%0A%20%20%20%20%20%20%20%20BENIGN_VARIANT_MASK%2C%0A%20%20%20%20%20%20%20%20Cassetter%2C%0A%20%20%20%20%20%20%20%20FastaReader%2C%0A%20%20%20%20%20%20%20%20GeneNode%2C%0A%20%20%20%20%20%20%20%20GeneRole%2C%0A%20%20%20%20%20%20%20%20LayoutEngine%2C%0A%20%20%20%20%20%20%20%20Loci%2C%0A%20%20%20%20%20%20%20%20Locus%2C%0A%20%20%20%20%20%20%20%20LocusMatcher%2C%0A%20%20%20%20%20%20%20%20LocusPredictor%2C%0A%20%20%20%20%20%20%20%20MatchType%2C%0A%20%20%20%20%20%20%20%20Path%2C%0A%20%20%20%20%20%20%20%20Sequence%2C%0A%20%20%20%20%20%20%20%20Sequences%2C%0A%20%20%20%20%20%20%20%20alt%2C%0A%20%20%20%20%20%20%20%20asyncio%2C%0A%20%20%20%20%20%20%20%20dataclass%2C%0A%20%20%20%20%20%20%20%20gzip%2C%0A%20%20%20%20%20%20%20%20httpx2%2C%0A%20%20%20%20%20%20%20%20mo%2C%0A%20%20%20%20%20%20%20%20np%2C%0A%20%20%20%20%20%20%20%20os%2C%0A%20%20%20%20%20%20%20%20re%2C%0A%20%20%20%20%20%20%20%20time%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(dataclass)%3A%0A%20%20%20%20%40dataclass(frozen%3DTrue%2C%20slots%3DTrue)%0A%20%20%20%20class%20CpsReferenceSpec%3A%0A%20%20%20%20%20%20%20%20%22%22%22Metadata%20specification%20for%20an%20NCBI%20S.%20pneumoniae%20reference%20cps%20locus%20sequence.%22%22%22%0A%0A%20%20%20%20%20%20%20%20serotype%3A%20str%0A%20%20%20%20%20%20%20%20serogroup%3A%20str%0A%20%20%20%20%20%20%20%20accession%3A%20str%0A%20%20%20%20%20%20%20%20strain%3A%20str%0A%20%20%20%20%20%20%20%20expected_mechanism%3A%20str%0A%0A%20%20%20%20%40dataclass(frozen%3DTrue%2C%20slots%3DTrue)%0A%20%20%20%20class%20WgsStrainSpec%3A%0A%20%20%20%20%20%20%20%20%22%22%22Metadata%20specification%20for%20a%20complete%20closed%20S.%20pneumoniae%20RefSeq%20chromosome.%22%22%22%0A%0A%20%20%20%20%20%20%20%20strain%3A%20str%0A%20%20%20%20%20%20%20%20true_serotype%3A%20str%0A%20%20%20%20%20%20%20%20serogroup%3A%20str%0A%20%20%20%20%20%20%20%20accession%3A%20str%0A%20%20%20%20%20%20%20%20refseq_assembly%3A%20str%0A%20%20%20%20%20%20%20%20expected_mechanism%3A%20str%0A%20%20%20%20%20%20%20%20is_negative_control%3A%20bool%20%3D%20False%0A%0A%20%20%20%20CURATED_CPS_SPECS%3A%20tuple%5BCpsReferenceSpec%2C%20...%5D%20%3D%20(%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%221%22%2C%20%221%22%2C%20%22CR931632.1%22%2C%20%22519%2F43%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%222%22%2C%20%222%22%2C%20%22CR931633.1%22%2C%20%22pn2L%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%223%22%2C%20%223%22%2C%20%22CR931634.2%22%2C%20%22524%2F62%22%2C%20%22CPS_SYNTHASE%22)%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%224%22%2C%20%224%22%2C%20%22CR931635.1%22%2C%20%22600%2F62%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%226A%22%2C%20%226%22%2C%20%22CR931638.1%22%2C%20%2234351%20(Rodriques)%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%226B%22%2C%20%226%22%2C%20%22CR931639.1%22%2C%20%222616%2F39%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%226C%22%2C%20%226%22%2C%20%22EF538714.1%22%2C%20%22CHPA388%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%226D%22%2C%20%226%22%2C%20%22HM171374.1%22%2C%20%22MNZ21%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%229V%22%2C%20%229%22%2C%20%22CR931648.1%22%2C%20%22980%2F68%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%2214%22%2C%20%2214%22%2C%20%22CR931662.1%22%2C%20%2234359%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%2218C%22%2C%20%2218%22%2C%20%22CR931673.1%22%2C%20%224593%2F40%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%2219A%22%2C%20%2219%22%2C%20%22CR931675.1%22%2C%20%22141%2F68%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%2219F%22%2C%20%2219%22%2C%20%22CR931678.1%22%2C%20%22485%2F61%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%2223A%22%2C%20%2223%22%2C%20%22CR931683.1%22%2C%20%221196%2F45%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%2223B%22%2C%20%2223%22%2C%20%22CR931684.1%22%2C%20%221039%2F41%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%2223F%22%2C%20%2223%22%2C%20%22CR931685.1%22%2C%20%22Dr.%20Melchior%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%2233F%22%2C%20%2233%22%2C%20%22CR931702.1%22%2C%20%223084%2F37%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec(%2237%22%2C%20%2237%22%2C%20%22CR931709.1%22%2C%20%22264%2F73%20(dexB-aliA)%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20WGS_VALIDATION_SPECS%3A%20tuple%5BWgsStrainSpec%2C%20...%5D%20%3D%20(%0A%20%20%20%20%20%20%20%20WgsStrainSpec(%22NCTC%207465%22%2C%20%221%22%2C%20%221%22%2C%20%22LN831051.1%22%2C%20%22GCF_001457635.1%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20WgsStrainSpec(%22D39%22%2C%20%222%22%2C%20%222%22%2C%20%22CP000410.1%22%2C%20%22GCF_000014365.1%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20WgsStrainSpec(%22OXC141%22%2C%20%223%22%2C%20%223%22%2C%20%22FQ312027.1%22%2C%20%22GCF_000210975.1%22%2C%20%22CPS_SYNTHASE%22)%2C%0A%20%20%20%20%20%20%20%20WgsStrainSpec(%22SPN994038%22%2C%20%223%22%2C%20%223%22%2C%20%22FQ312041.2%22%2C%20%22GCF_000211035.1%22%2C%20%22CPS_SYNTHASE%22)%2C%0A%20%20%20%20%20%20%20%20WgsStrainSpec(%22TIGR4%22%2C%20%224%22%2C%20%224%22%2C%20%22AE005672.3%22%2C%20%22GCF_000006885.1%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20WgsStrainSpec(%22670-6B%22%2C%20%226B%22%2C%20%226%22%2C%20%22CP002176.1%22%2C%20%22GCF_000147095.1%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20WgsStrainSpec(%22CGSP14%22%2C%20%2214%22%2C%20%2214%22%2C%20%22CP001033.1%22%2C%20%22GCF_000019825.1%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20WgsStrainSpec(%22Hungary19A-6%22%2C%20%2219A%22%2C%20%2219%22%2C%20%22CP000936.1%22%2C%20%22GCF_000019265.1%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20WgsStrainSpec(%22ATCC%2049619%22%2C%20%2219F%22%2C%20%2219%22%2C%20%22AP018938.1%22%2C%20%22GCF_003966485.1%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20WgsStrainSpec(%22ATCC%20700669%22%2C%20%2223F%22%2C%20%2223%22%2C%20%22FM211187.1%22%2C%20%22GCF_000026665.1%22%2C%20%22CPS_WZY%22)%2C%0A%20%20%20%20%20%20%20%20WgsStrainSpec(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22R6%20(Rough)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22None%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22None%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22AE007317.1%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22GCF_000007045.1%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Unencapsulated%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20is_negative_control%3DTrue%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20CURATED_CPS_SPECS%2C%0A%20%20%20%20%20%20%20%20CpsReferenceSpec%2C%0A%20%20%20%20%20%20%20%20WGS_VALIDATION_SPECS%2C%0A%20%20%20%20%20%20%20%20WgsStrainSpec%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20ArchetypeCategory%2C%0A%20%20%20%20BENIGN_VARIANT_MASK%2C%0A%20%20%20%20Cassetter%2C%0A%20%20%20%20CpsReferenceSpec%2C%0A%20%20%20%20FastaReader%2C%0A%20%20%20%20GeneNode%2C%0A%20%20%20%20LayoutEngine%2C%0A%20%20%20%20Loci%2C%0A%20%20%20%20Locus%2C%0A%20%20%20%20LocusMatcher%2C%0A%20%20%20%20LocusPredictor%2C%0A%20%20%20%20MatchType%2C%0A%20%20%20%20Path%2C%0A%20%20%20%20Sequence%2C%0A%20%20%20%20Sequences%2C%0A%20%20%20%20WgsStrainSpec%2C%0A%20%20%20%20asyncio%2C%0A%20%20%20%20dataclass%2C%0A%20%20%20%20gzip%2C%0A%20%20%20%20httpx2%2C%0A%20%20%20%20np%2C%0A%20%20%20%20os%2C%0A%20%20%20%20re%2C%0A%20%20%20%20time%2C%0A)%3A%0A%20%20%20%20class%20NcbiAsyncFetcher%3A%0A%20%20%20%20%20%20%20%20%22%22%22High-throughput%20asynchronous%20HTTP%2F2%20NCBI%20E-utilities%20sequence%20fetcher%20powered%20by%20%60httpx2%60%20and%20%60cassetter%60.%22%22%22%0A%0A%20%20%20%20%20%20%20%20EUTILS_BASE%20%3D%20%22https%3A%2F%2Feutils.ncbi.nlm.nih.gov%2Fentrez%2Feutils%22%0A%0A%20%20%20%20%20%20%20%20def%20__init__(%0A%20%20%20%20%20%20%20%20%20%20%20%20self%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20api_key%3A%20str%20%7C%20None%20%3D%20None%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20*%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20cassette_dir%3A%20Path%20%7C%20None%20%3D%20None%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20cassette_name%3A%20str%20%3D%20%22spneumo_ncbi.toml%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20record_mode%3A%20str%20%3D%20%22new_episodes%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20max_concurrency%3A%20int%20%3D%206%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20timeout%3A%20float%20%3D%2090.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20max_retries%3A%20int%20%3D%203%2C%0A%20%20%20%20%20%20%20%20)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.api_key%20%3D%20api_key%20if%20api_key%20is%20not%20None%20else%20self.resolve_api_key()%0A%20%20%20%20%20%20%20%20%20%20%20%20self.cassette_dir%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cassette_dir%20if%20cassette_dir%20is%20not%20None%20else%20(Path(__file__).resolve().parent%20%2F%20%22cassettes%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.cassette_dir.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.cassette_name%20%3D%20cassette_name%0A%20%20%20%20%20%20%20%20%20%20%20%20self.recorder%20%3D%20Cassetter(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cassette_library_dir%3Dstr(self.cassette_dir)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20record_mode%3Drecord_mode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.max_concurrency%20%3D%20max_concurrency%0A%20%20%20%20%20%20%20%20%20%20%20%20self.timeout%20%3D%20timeout%0A%20%20%20%20%20%20%20%20%20%20%20%20self.max_retries%20%3D%20max_retries%0A%0A%20%20%20%20%20%20%20%20%40staticmethod%0A%20%20%20%20%20%20%20%20def%20resolve_api_key()%20-%3E%20str%20%7C%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20env_val%20%3D%20os.environ.get(%22NCBI_API_KEY%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20env_val%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20env_val.strip()%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20candidate%20in%20(Path.home()%20%2F%20%22.env%22%2C%20Path.home()%20%2F%20%22.zshrc%22%2C%20Path.home()%20%2F%20%22.zshenv%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20candidate.is_file()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20line%20in%20candidate.read_text(errors%3D%22ignore%22).splitlines()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stripped%20%3D%20line.strip()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20stripped.startswith(%22%23%22)%20or%20%22NCBI_API_KEY%22%20not%20in%20stripped%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20match%20%3D%20re.search(r%22NCBI_API_KEY%5Cs*%3D%5Cs*%5B%5C%22%5C'%5D%3F(%5BA-Za-z0-9_%5D%2B)%5B%5C%22%5C'%5D%3F%22%2C%20stripped)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20match%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20match.group(1).strip()%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20%20%20%20%20async%20def%20_get_bytes(%0A%20%20%20%20%20%20%20%20%20%20%20%20self%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20client%3A%20httpx2.AsyncClient%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20url%3A%20str%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20params%3A%20dict%5Bstr%2C%20str%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20sem%3A%20asyncio.Semaphore%2C%0A%20%20%20%20%20%20%20%20)%20-%3E%20bytes%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20req_params%20%3D%20dict(params)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20self.api_key%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20req_params%5B%22api_key%22%5D%20%3D%20self.api_key%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20backoff%20%3D%200.8%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20attempt%20in%20range(self.max_retries)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20async%20with%20sem%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20resp%20%3D%20await%20client.get(url%2C%20params%3Dreq_params)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20resp.status_code%20%3D%3D%20200%20and%20resp.content%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20data%20%3D%20resp.content%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20data.startswith(b%22%5Cx1f%5Cx8b%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20data%20%3D%20gzip.decompress(data)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20data%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20resp.status_code%20in%20(429%2C%20500%2C%20502%2C%20503%2C%20504)%20and%20attempt%20%3C%20self.max_retries%20-%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20await%20asyncio.sleep(backoff)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20backoff%20*%3D%202.0%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20except%20Exception%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20attempt%20%3C%20self.max_retries%20-%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20await%20asyncio.sleep(backoff)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20backoff%20*%3D%202.0%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20RuntimeError(f%22Failed%20to%20fetch%20NCBI%20E-utilities%20resource%20from%20%7Burl%7D%20with%20params%20%7Bparams%7D.%22)%0A%0A%20%20%20%20%20%20%20%20async%20def%20fetch_panel_async(%0A%20%20%20%20%20%20%20%20%20%20%20%20self%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20cps_specs%3A%20tuple%5BCpsReferenceSpec%2C%20...%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20wgs_specs%3A%20tuple%5BWgsStrainSpec%2C%20...%5D%2C%0A%20%20%20%20%20%20%20%20)%20-%3E%20tuple%5BSequences%2C%20list%5BSequence%5D%2C%20float%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20t0%20%3D%20time.perf_counter()%0A%20%20%20%20%20%20%20%20%20%20%20%20sem%20%3D%20asyncio.Semaphore(self.max_concurrency)%0A%20%20%20%20%20%20%20%20%20%20%20%20headers%20%3D%20%7B%22User-Agent%22%3A%20%22SeroGen%2F0.1%20(Async%20HTTP%2F2%20Pneumo%20Benchmark)%22%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20with%20self.recorder.use_cassette(self.cassette_name)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20async%20with%20httpx2.AsyncClient(http2%3DTrue%2C%20timeout%3Dself.timeout%2C%20headers%3Dheaders)%20as%20client%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cps_accessions%20%3D%20%5Bs.accession%20for%20s%20in%20cps_specs%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cps_chunks%20%3D%20%5Bcps_accessions%5Bi%20%3A%20i%20%2B%2030%5D%20for%20i%20in%20range(0%2C%20len(cps_accessions)%2C%2030)%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20async%20def%20_fetch_cps_batch(chunk%3A%20list%5Bstr%5D)%20-%3E%20Sequences%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20raw%20%3D%20await%20self._get_bytes(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20client%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Bself.EUTILS_BASE%7D%2Fefetch.fcgi%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%22db%22%3A%20%22nuccore%22%2C%20%22id%22%3A%20%22%2C%22.join(chunk)%2C%20%22rettype%22%3A%20%22fasta%22%2C%20%22retmode%22%3A%20%22text%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sem%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20FastaReader.from_bytes(raw).load()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20async%20def%20_fetch_wgs_single(acc%3A%20str)%20-%3E%20Sequence%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20raw%20%3D%20await%20self._get_bytes(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20client%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Bself.EUTILS_BASE%7D%2Fefetch.fcgi%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%22db%22%3A%20%22nuccore%22%2C%20%22id%22%3A%20acc%2C%20%22rettype%22%3A%20%22fasta%22%2C%20%22retmode%22%3A%20%22text%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sem%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20FastaReader.from_bytes(raw).load()%5B0%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cps_task%20%3D%20asyncio.gather(*(_fetch_cps_batch(c)%20for%20c%20in%20cps_chunks))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20wgs_task%20%3D%20asyncio.gather(*(_fetch_wgs_single(w.accession)%20for%20w%20in%20wgs_specs))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cps_batches%2C%20wgs_list%20%3D%20await%20asyncio.gather(cps_task%2C%20wgs_task)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20cps_seqs%20%3D%20Sequences.concat(cps_batches)%0A%20%20%20%20%20%20%20%20%20%20%20%20elapsed%20%3D%20time.perf_counter()%20-%20t0%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20cps_seqs%2C%20list(wgs_list)%2C%20elapsed%0A%0A%20%20%20%20%40dataclass(slots%3DTrue)%0A%20%20%20%20class%20PneumoSerotypeDatabase%3A%0A%20%20%20%20%20%20%20%20%22%22%22Indexed%20S.%20pneumoniae%20capsular%20reference%20database%20built%20directly%20from%20%60Loci%60%20and%20%60LocusMatcher%60.%22%22%22%0A%0A%20%20%20%20%20%20%20%20specs%3A%20tuple%5BCpsReferenceSpec%2C%20...%5D%0A%20%20%20%20%20%20%20%20loci%3A%20Loci%0A%20%20%20%20%20%20%20%20matcher%3A%20LocusMatcher%0A%20%20%20%20%20%20%20%20pan_adj%3A%20object%0A%20%20%20%20%20%20%20%20pan_nodes%3A%20np.ndarray%0A%20%20%20%20%20%20%20%20pan_counts%3A%20np.ndarray%0A%20%20%20%20%20%20%20%20pan_coords%3A%20np.ndarray%0A%20%20%20%20%20%20%20%20all_vs_all_scores%3A%20np.ndarray%0A%20%20%20%20%20%20%20%20all_vs_all_jaccards%3A%20np.ndarray%0A%20%20%20%20%20%20%20%20all_vs_all_flags%3A%20np.ndarray%0A%20%20%20%20%20%20%20%20build_elapsed_s%3A%20float%0A%0A%20%20%20%20%20%20%20%20%40classmethod%0A%20%20%20%20%20%20%20%20def%20build(%0A%20%20%20%20%20%20%20%20%20%20%20%20cls%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20specs%3A%20tuple%5BCpsReferenceSpec%2C%20...%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20cps_seqs%3A%20Sequences%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20*%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20predictor%3A%20LocusPredictor%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20cluster_mode%3A%20str%20%3D%20%22mcl%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20min_identity%3A%20float%20%3D%2080.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20min_coverage%3A%20float%20%3D%200.80%2C%0A%20%20%20%20%20%20%20%20)%20-%3E%20PneumoSerotypeDatabase%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20t0%20%3D%20time.perf_counter()%0A%20%20%20%20%20%20%20%20%20%20%20%20extracted_loci%3A%20list%5BLocus%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20kept_specs%3A%20list%5BCpsReferenceSpec%5D%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20spec%2C%20seq%20in%20zip(specs%2C%20cps_seqs%2C%20strict%3DTrue)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20best_loc%20%3D%20predictor.predict(seq%2C%20categories%3DArchetypeCategory.CAPSULE).best()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20best_loc%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20best_loc%20%3D%20predictor.predict(seq).best()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20best_loc%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20extracted_loci.append(best_loc.with_name(spec.serotype))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kept_specs.append(spec)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20raw_loci%20%3D%20Loci.from_list(extracted_loci).canonicalize_strands()%0A%20%20%20%20%20%20%20%20%20%20%20%20matcher%20%3D%20LocusMatcher(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20raw_loci%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cluster_mode%3Dcluster_mode%2C%20%20%23%20type%3A%20ignore%5Barg-type%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20min_identity%3Dmin_identity%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20min_coverage%3Dmin_coverage%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20clustered_loci%20%3D%20matcher.targets%0A%20%20%20%20%20%20%20%20%20%20%20%20pan_adj%2C%20pan_nodes%2C%20pan_counts%20%3D%20clustered_loci.as_pan_graph(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20node_mask%3DGeneNode.mask(%22ROLE_ID%22%2C%20%22CLUSTER_ID%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20layout_adj%20%3D%20pan_adj.tocsr().copy()%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20layout_adj.nnz%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20layout_adj.data%20%3D%201.0%20%2B%200.25%20*%20np.log1p(layout_adj.data.astype(np.float64))%0A%20%20%20%20%20%20%20%20%20%20%20%20layout_engine%20%3D%20LayoutEngine(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mode%3D%22fr%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dim%3D2%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20iterations%3D200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gravity%3D0.35%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20seed%3D42%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20pan_coords%20%3D%20layout_engine.layout(layout_adj)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20n_db%20%3D%20len(clustered_loci)%0A%20%20%20%20%20%20%20%20%20%20%20%20ava_matches%20%3D%20matcher.match(clustered_loci%2C%20sort%3DFalse)%0A%20%20%20%20%20%20%20%20%20%20%20%20scores_mat%20%3D%20ava_matches.scores.reshape(n_db%2C%20n_db).astype(np.float64)%0A%20%20%20%20%20%20%20%20%20%20%20%20jaccards_mat%20%3D%20ava_matches.jaccards.reshape(n_db%2C%20n_db).astype(np.float64)%0A%20%20%20%20%20%20%20%20%20%20%20%20flags_mat%20%3D%20ava_matches.match_types.reshape(n_db%2C%20n_db)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20elapsed%20%3D%20time.perf_counter()%20-%20t0%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20cls(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20specs%3Dtuple(kept_specs)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20loci%3Dclustered_loci%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matcher%3Dmatcher%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pan_adj%3Dpan_adj%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pan_nodes%3Dpan_nodes%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pan_counts%3Dpan_counts%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pan_coords%3Dpan_coords%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20all_vs_all_scores%3Dscores_mat%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20all_vs_all_jaccards%3Djaccards_mat%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20all_vs_all_flags%3Dflags_mat%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20build_elapsed_s%3Delapsed%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20class%20PneumoBenchmarkSuite%3A%0A%20%20%20%20%20%20%20%20%22%22%22Executes%20the%204-stage%20S.%20pneumoniae%20database%20and%20whole-genome%20validation%20suite.%22%22%22%0A%0A%20%20%20%20%20%20%20%20def%20__init__(%0A%20%20%20%20%20%20%20%20%20%20%20%20self%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20db%3A%20PneumoSerotypeDatabase%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20wgs_specs%3A%20tuple%5BWgsStrainSpec%2C%20...%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20wgs_seqs%3A%20list%5BSequence%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20*%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20wgs_predictor%3A%20LocusPredictor%2C%0A%20%20%20%20%20%20%20%20)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.db%20%3D%20db%0A%20%20%20%20%20%20%20%20%20%20%20%20self.wgs_specs%20%3D%20wgs_specs%0A%20%20%20%20%20%20%20%20%20%20%20%20self.wgs_seqs%20%3D%20wgs_seqs%0A%20%20%20%20%20%20%20%20%20%20%20%20self.wgs_predictor%20%3D%20wgs_predictor%0A%0A%20%20%20%20%20%20%20%20%40staticmethod%0A%20%20%20%20%20%20%20%20def%20_select_capsule_locus(pred_loci%3A%20Loci)%20-%3E%20Locus%20%7C%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20pred_loci.filter(categories%3DArchetypeCategory.CAPSULE).best()%0A%0A%20%20%20%20%20%20%20%20%40staticmethod%0A%20%20%20%20%20%20%20%20def%20format_match_flags(flag_val%3A%20int%20%7C%20MatchType)%20-%3E%20str%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20mt%20%3D%20MatchType(int(flag_val))%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20mt%20%3D%3D%20MatchType.EXACT%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%22EXACT%22%0A%20%20%20%20%20%20%20%20%20%20%20%20names%20%3D%20%5Bf.name%20for%20f%20in%20MatchType%20if%20f%20!%3D%20MatchType.EXACT%20and%20(mt%20%26%20f)%20and%20f.name%20is%20not%20None%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22%20%7C%20%22.join(names)%0A%0A%20%20%20%20%20%20%20%20def%20run_wgs_serotyping(self)%20-%3E%20tuple%5Blist%5Bdict%5Bstr%2C%20object%5D%5D%2C%20dict%5Bstr%2C%20Locus%5D%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20records%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20intact_capsule_loci%3A%20dict%5Bstr%2C%20Locus%5D%20%3D%20%7B%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20spec%2C%20seq%20in%20zip(self.wgs_specs%2C%20self.wgs_seqs%2C%20strict%3DTrue)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20t0%20%3D%20time.perf_counter()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pred_loci%20%3D%20self.wgs_predictor.predict(seq)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cps_loc%20%3D%20self._select_capsule_locus(pred_loci)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pred_ms%20%3D%20(time.perf_counter()%20-%20t0)%20*%201000.0%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20spec.is_negative_control%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20correct%20%3D%20cps_loc%20is%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20records.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22strain%22%3A%20spec.strain%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22accession%22%3A%20spec.accession%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22genome_bp%22%3A%20len(seq)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22true_serotype%22%3A%20spec.true_serotype%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22predicted_serotype%22%3A%20%22None%22%20if%20cps_loc%20is%20None%20else%20%22FalsePositive%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22runner_up_serotype%22%3A%20%22%E2%80%94%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22archetype%22%3A%20%22None%22%20if%20cps_loc%20is%20None%20else%20cps_loc.archetype.name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22locus_interval%22%3A%20%22%E2%80%94%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22num_genes%22%3A%200%20if%20cps_loc%20is%20None%20else%20cps_loc.num_genes%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22completeness%22%3A%200.0%20if%20cps_loc%20is%20None%20else%20float(cps_loc.completeness)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22top1_score%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22top2_score%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22margin%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22top1_jaccard%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22match_flags%22%3A%20%22NEGATIVE_CONTROL%20(0%20CPS%20Loci)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22is_correct%22%3A%20correct%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22runtime_ms%22%3A%20pred_ms%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20cps_loc%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20records.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22strain%22%3A%20spec.strain%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22accession%22%3A%20spec.accession%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22genome_bp%22%3A%20len(seq)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22true_serotype%22%3A%20spec.true_serotype%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22predicted_serotype%22%3A%20%22Missed%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22runner_up_serotype%22%3A%20%22%E2%80%94%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22archetype%22%3A%20%22None%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22locus_interval%22%3A%20%22%E2%80%94%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22num_genes%22%3A%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22completeness%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22top1_score%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22top2_score%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22margin%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22top1_jaccard%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22match_flags%22%3A%20%22MISSED%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22is_correct%22%3A%20False%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22runtime_ms%22%3A%20pred_ms%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20intact_capsule_loci%5Bspec.strain%5D%20%3D%20cps_loc%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matches%20%3D%20self.db.matcher.match(cps_loc%2C%20top_k%3D3)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20top1%20%3D%20matches%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20top2%20%3D%20matches%5B1%5D%20if%20len(matches)%20%3E%201%20else%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pred_sero%20%3D%20top1.target_name%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20runner_sero%20%3D%20top2.target_name%20if%20top2%20is%20not%20None%20else%20%22%E2%80%94%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20top2_score%20%3D%20float(top2.score)%20if%20top2%20is%20not%20None%20else%200.0%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20records.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22strain%22%3A%20spec.strain%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22accession%22%3A%20spec.accession%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22genome_bp%22%3A%20len(seq)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22true_serotype%22%3A%20spec.true_serotype%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22predicted_serotype%22%3A%20pred_sero%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22runner_up_serotype%22%3A%20runner_sero%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22archetype%22%3A%20cps_loc.archetype.name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22locus_interval%22%3A%20f%22%7Bcps_loc.start%3A%2C%7D..%7Bcps_loc.end%3A%2C%7D%20(%7Bcps_loc.strand%3A%2Bd%7D)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22num_genes%22%3A%20cps_loc.num_genes%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22completeness%22%3A%20float(cps_loc.completeness)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22top1_score%22%3A%20float(top1.score)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22top2_score%22%3A%20top2_score%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22margin%22%3A%20float(top1.score)%20-%20top2_score%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22top1_jaccard%22%3A%20float(top1.jaccard)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22match_flags%22%3A%20self.format_match_flags(top1.match_type)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22is_correct%22%3A%20pred_sero%20%3D%3D%20spec.true_serotype%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22runtime_ms%22%3A%20pred_ms%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20records%2C%20intact_capsule_loci%0A%0A%20%20%20%20%20%20%20%20def%20run_fragmentation_stress_test(%0A%20%20%20%20%20%20%20%20%20%20%20%20self%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20intact_capsule_loci%3A%20dict%5Bstr%2C%20Locus%5D%2C%0A%20%20%20%20%20%20%20%20)%20-%3E%20list%5Bdict%5Bstr%2C%20object%5D%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20frag_records%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20rng%20%3D%20np.random.default_rng(2026)%0A%20%20%20%20%20%20%20%20%20%20%20%20rc_tab%20%3D%20bytes.maketrans(b%22ACGTacgtNn%22%2C%20b%22TGCAtgcaNn%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20spec%2C%20seq%20in%20zip(self.wgs_specs%2C%20self.wgs_seqs%2C%20strict%3DTrue)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20spec.is_negative_control%20or%20spec.strain%20not%20in%20intact_capsule_loci%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20intact_loc%20%3D%20intact_capsule_loci%5Bspec.strain%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_genes%20%3D%20intact_loc.num_genes%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20n_genes%20%3C%203%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win_pad%20%3D%2045_000%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win_start%20%3D%20max(0%2C%20int(intact_loc.start)%20-%20win_pad)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win_end%20%3D%20min(len(seq)%2C%20int(intact_loc.end)%20%2B%20win_pad)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20raw_win%20%3D%20seq%5Bwin_start%3Awin_end%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mid_gene_idx%20%3D%20n_genes%20%2F%2F%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20g_starts%20%3D%20intact_loc.genes.intervals.starts%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20g_ends%20%3D%20intact_loc.genes.intervals.ends%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20intergenic_cut_abs%20%3D%20int((g_ends%5Bmid_gene_idx%20-%201%5D%20%2B%20g_starts%5Bmid_gene_idx%5D)%20%2F%2F%202)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20intergenic_cut_rel%20%3D%20intergenic_cut_abs%20-%20win_start%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mid_orf_cut_abs%20%3D%20int((g_starts%5Bmid_gene_idx%5D%20%2B%20g_ends%5Bmid_gene_idx%5D)%20%2F%2F%202)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mid_orf_cut_rel%20%3D%20mid_orf_cut_abs%20-%20win_start%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20mode_label%2C%20cut_rel%20in%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(%22Intact%20Control%22%2C%20None)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(%22Intergenic%20Contig%20Split%22%2C%20intergenic_cut_rel)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(%22Mid-ORF%20Split-Gene%20Break%22%2C%20mid_orf_cut_rel)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20cut_rel%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20assembly%20%3D%20Sequences.from_bytes(%5Braw_win%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bg_cut_left%20%3D%20int(rng.integers(5_000%2C%20max(6_000%2C%20int(intact_loc.start)%20-%20win_start%20-%205_000)))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bg_cut_right%20%3D%20int(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rng.integers(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20min(len(raw_win)%20-%206_000%2C%20int(intact_loc.end)%20-%20win_start%20%2B%205_000)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20len(raw_win)%20-%204_000%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cuts%20%3D%20sorted(%7Bbg_cut_left%2C%20cut_rel%2C%20bg_cut_right%7D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pieces%3A%20list%5Bbytes%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prev%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20idx_c%2C%20c_pos%20in%20enumerate(cuts)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chunk_bytes%20%3D%20raw_win%5Bprev%3Ac_pos%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20idx_c%20%25%202%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pieces.append(chunk_bytes.translate(rc_tab)%5B%3A%3A-1%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pieces.append(chunk_bytes)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prev%20%3D%20c_pos%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pieces.append(raw_win%5Bprev%3A%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20assembly%20%3D%20Sequences.from_bytes(pieces)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pred_loci%20%3D%20self.wgs_predictor.predict(assembly)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stitched_loc%20%3D%20self._select_capsule_locus(pred_loci)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20stitched_loc%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20frag_records.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22strain%22%3A%20spec.strain%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22true_serotype%22%3A%20spec.true_serotype%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22mode%22%3A%20mode_label%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22predicted_serotype%22%3A%20%22Missed%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22score%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22jaccard%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22completeness%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22is_fragmented%22%3A%20False%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22has_fragmented_flag%22%3A%20False%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22num_contigs%22%3A%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22is_correct%22%3A%20False%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20top_hit%20%3D%20self.db.matcher.match(stitched_loc%2C%20top_k%3D1)%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pred_sero%20%3D%20top_hit.target_name%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20has_frag_flag%20%3D%20bool(top_hit.match_type%20%26%20MatchType.FRAGMENTED_VARIANT)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20frag_records.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22strain%22%3A%20spec.strain%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22true_serotype%22%3A%20spec.true_serotype%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22mode%22%3A%20mode_label%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22predicted_serotype%22%3A%20pred_sero%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22score%22%3A%20float(top_hit.score)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22jaccard%22%3A%20float(top_hit.jaccard)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22completeness%22%3A%20float(stitched_loc.completeness)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22is_fragmented%22%3A%20bool(stitched_loc.is_fragmented)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22has_fragmented_flag%22%3A%20has_frag_flag%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22num_contigs%22%3A%20int(stitched_loc.num_contigs)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22is_correct%22%3A%20pred_sero%20%3D%3D%20spec.true_serotype%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20frag_records%0A%0A%20%20%20%20%20%20%20%20def%20run_leave_one_out_novelty(%0A%20%20%20%20%20%20%20%20%20%20%20%20self%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20intact_capsule_loci%3A%20dict%5Bstr%2C%20Locus%5D%2C%0A%20%20%20%20%20%20%20%20)%20-%3E%20list%5Bdict%5Bstr%2C%20object%5D%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20loo_records%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20seen_serotypes%3A%20set%5Bstr%5D%20%3D%20set()%0A%20%20%20%20%20%20%20%20%20%20%20%20spec_by_sero%20%3D%20%7Bs.serotype%3A%20s%20for%20s%20in%20self.db.specs%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20spec%20in%20self.wgs_specs%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20spec.is_negative_control%20or%20spec.strain%20not%20in%20intact_capsule_loci%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20spec.true_serotype%20in%20seen_serotypes%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20seen_serotypes.add(spec.true_serotype)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20q_loc%20%3D%20intact_capsule_loci%5Bspec.strain%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20full_hit%20%3D%20self.db.matcher.match(q_loc%2C%20top_k%3D1)%5B0%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20keep_mask%20%3D%20self.db.loci.names%20!%3D%20spec.true_serotype%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20loo_loci%20%3D%20self.db.loci%5Bkeep_mask%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20loo_matcher%20%3D%20LocusMatcher(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20loo_loci%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cluster_mode%3Dself.db.matcher.cluster_mode%2C%20%20%23%20type%3A%20ignore%5Barg-type%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20min_identity%3Dself.db.matcher.min_identity%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20min_coverage%3Dself.db.matcher.min_coverage%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20loo_hit%20%3D%20loo_matcher.match(q_loc%2C%20top_k%3D1)%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20closest_sero%20%3D%20loo_hit.target_name%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20closest_spec%20%3D%20spec_by_sero.get(closest_sero)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20is_novel_flagged%20%3D%20bool(loo_hit.is_novel)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20same_serogroup%20%3D%20closest_spec.serogroup%20%3D%3D%20spec.serogroup%20if%20closest_spec%20is%20not%20None%20else%20False%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20loo_records.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22strain%22%3A%20spec.strain%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22true_serotype%22%3A%20spec.true_serotype%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22serogroup%22%3A%20spec.serogroup%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22full_db_score%22%3A%20float(full_hit.score)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22full_db_jaccard%22%3A%20float(full_hit.jaccard)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22held_out_closest_serotype%22%3A%20closest_sero%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22held_out_same_serogroup%22%3A%20same_serogroup%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22held_out_score%22%3A%20float(loo_hit.score)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22held_out_jaccard%22%3A%20float(loo_hit.jaccard)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22score_drop%22%3A%20float(full_hit.score)%20-%20float(loo_hit.score)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22held_out_missing_genes%22%3A%20int(loo_hit.missing_genes)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22held_out_extra_genes%22%3A%20int(loo_hit.extra_genes)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22held_out_flags%22%3A%20self.format_match_flags(loo_hit.match_type)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22is_novel_detected%22%3A%20is_novel_flagged%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22only_benign_flags%22%3A%20bool((loo_hit.match_type%20%26%20~BENIGN_VARIANT_MASK)%20%3D%3D%20MatchType.EXACT)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20loo_records%0A%0A%20%20%20%20return%20NcbiAsyncFetcher%2C%20PneumoBenchmarkSuite%2C%20PneumoSerotypeDatabase%0A%0A%0A%40app.cell%0Aasync%20def%20_(%0A%20%20%20%20CURATED_CPS_SPECS%3A%20%22tuple%5BCpsReferenceSpec%2C%20...%5D%22%2C%0A%20%20%20%20LocusPredictor%2C%0A%20%20%20%20NcbiAsyncFetcher%2C%0A%20%20%20%20PneumoBenchmarkSuite%2C%0A%20%20%20%20PneumoSerotypeDatabase%2C%0A%20%20%20%20WGS_VALIDATION_SPECS%3A%20%22tuple%5BWgsStrainSpec%2C%20...%5D%22%2C%0A)%3A%0A%20%20%20%20fetcher%20%3D%20NcbiAsyncFetcher()%0A%20%20%20%20active_cps_specs%20%3D%20CURATED_CPS_SPECS%0A%0A%20%20%20%20cps_seqs%2C%20wgs_seqs%2C%20download_elapsed_s%20%3D%20await%20fetcher.fetch_panel_async(%0A%20%20%20%20%20%20%20%20active_cps_specs%2C%0A%20%20%20%20%20%20%20%20WGS_VALIDATION_SPECS%2C%0A%20%20%20%20)%0A%0A%20%20%20%20cps_predictor%20%3D%20LocusPredictor(stitch_contig_splits%3DFalse)%0A%20%20%20%20wgs_predictor%20%3D%20LocusPredictor(stitch_contig_splits%3DTrue)%0A%0A%20%20%20%20pneumo_db%20%3D%20PneumoSerotypeDatabase.build(%0A%20%20%20%20%20%20%20%20active_cps_specs%2C%0A%20%20%20%20%20%20%20%20cps_seqs%2C%0A%20%20%20%20%20%20%20%20predictor%3Dcps_predictor%2C%0A%20%20%20%20%20%20%20%20cluster_mode%3D%22mcl%22%2C%0A%20%20%20%20%20%20%20%20min_identity%3D80.0%2C%0A%20%20%20%20%20%20%20%20min_coverage%3D0.80%2C%0A%20%20%20%20)%0A%0A%20%20%20%20suite%20%3D%20PneumoBenchmarkSuite(%0A%20%20%20%20%20%20%20%20pneumo_db%2C%0A%20%20%20%20%20%20%20%20WGS_VALIDATION_SPECS%2C%0A%20%20%20%20%20%20%20%20wgs_seqs%2C%0A%20%20%20%20%20%20%20%20wgs_predictor%3Dwgs_predictor%2C%0A%20%20%20%20)%0A%20%20%20%20wgs_records%2C%20intact_wgs_loci%20%3D%20suite.run_wgs_serotyping()%0A%20%20%20%20frag_records%20%3D%20suite.run_fragmentation_stress_test(intact_wgs_loci)%0A%20%20%20%20loo_records%20%3D%20suite.run_leave_one_out_novelty(intact_wgs_loci)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20download_elapsed_s%2C%0A%20%20%20%20%20%20%20%20frag_records%2C%0A%20%20%20%20%20%20%20%20loo_records%2C%0A%20%20%20%20%20%20%20%20pneumo_db%2C%0A%20%20%20%20%20%20%20%20wgs_records%2C%0A%20%20%20%20%20%20%20%20wgs_seqs%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20GeneNode%2C%0A%20%20%20%20GeneRole%2C%0A%20%20%20%20alt%2C%0A%20%20%20%20frag_records%2C%0A%20%20%20%20loo_records%2C%0A%20%20%20%20np%2C%0A%20%20%20%20pneumo_db%2C%0A%20%20%20%20wgs_records%2C%0A%20%20%20%20wgs_seqs%2C%0A)%3A%0A%20%20%20%20n_db_loci%20%3D%20len(pneumo_db.loci)%0A%20%20%20%20total_db_genes%20%3D%20int(pneumo_db.loci.total_nodes)%0A%20%20%20%20unique_clusters%20%3D%20int(len(np.unique(pneumo_db.loci.cluster_ids%5Bpneumo_db.loci.cluster_ids%20%3E%200%5D)))%0A%20%20%20%20n_pan_nodes%20%3D%20int(len(pneumo_db.pan_nodes))%0A%20%20%20%20n_pan_edges%20%3D%20int(pneumo_db.pan_adj.nnz)%0A%20%20%20%20compression_ratio%20%3D%20total_db_genes%20%2F%20max(n_pan_nodes%2C%201)%0A%0A%20%20%20%20wgs_correct_count%20%3D%20sum(1%20for%20r%20in%20wgs_records%20if%20r%5B%22is_correct%22%5D)%0A%20%20%20%20wgs_total_count%20%3D%20len(wgs_records)%0A%20%20%20%20wgs_accuracy_pct%20%3D%20100.0%20*%20wgs_correct_count%20%2F%20max(wgs_total_count%2C%201)%0A%0A%20%20%20%20frag_split_only%20%3D%20%5Br%20for%20r%20in%20frag_records%20if%20r%5B%22mode%22%5D%20!%3D%20%22Intact%20Control%22%5D%0A%20%20%20%20frag_correct_count%20%3D%20sum(1%20for%20r%20in%20frag_split_only%20if%20r%5B%22is_correct%22%5D)%0A%20%20%20%20frag_accuracy_pct%20%3D%20100.0%20*%20frag_correct_count%20%2F%20max(len(frag_split_only)%2C%201)%0A%0A%20%20%20%20loo_novel_count%20%3D%20sum(1%20for%20r%20in%20loo_records%20if%20r%5B%22is_novel_detected%22%5D)%0A%20%20%20%20loo_accuracy_pct%20%3D%20100.0%20*%20loo_novel_count%20%2F%20max(len(loo_records)%2C%201)%0A%0A%20%20%20%20total_downloaded_mb%20%3D%20(sum(len(s)%20for%20s%20in%20wgs_seqs)%20%2B%20int(np.sum(pneumo_db.loci.intervals.lengths)))%20%2F%201_000_000.0%0A%0A%20%20%20%20ava_rows%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20for%20_i%2C%20_spec_i%20in%20enumerate(pneumo_db.specs)%3A%0A%20%20%20%20%20%20%20%20for%20_j%2C%20_spec_j%20in%20enumerate(pneumo_db.specs)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20ava_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Query%20Serotype%22%3A%20_spec_i.serotype%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Target%20Serotype%22%3A%20_spec_j.serotype%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Query%20Serogroup%22%3A%20_spec_i.serogroup%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Target%20Serogroup%22%3A%20_spec_j.serogroup%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Similarity%20Score%22%3A%20round(float(pneumo_db.all_vs_all_scores%5B_i%2C%20_j%5D)%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Jaccard%22%3A%20round(float(pneumo_db.all_vs_all_jaccards%5B_i%2C%20_j%5D)%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20serotype_order%20%3D%20%5Bs.serotype%20for%20s%20in%20pneumo_db.specs%5D%0A%20%20%20%20chart_ava%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(alt.Data(values%3Dava_rows))%0A%20%20%20%20%20%20%20%20.mark_rect()%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22Target%20Serotype%3AN%22%2C%20sort%3Dserotype_order%2C%20title%3D%22Reference%20Target%20Serotype%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22Query%20Serotype%3AN%22%2C%20sort%3Dserotype_order%2C%20title%3D%22Reference%20Query%20Serotype%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.Color(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Similarity%20Score%3AQ%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scale%3Dalt.Scale(scheme%3D%22viridis%22%2C%20domain%3D%5B0.0%2C%201.0%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Matcher%20Score%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Query%20Serotype%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Target%20Serotype%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Similarity%20Score%3AQ%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Jaccard%3AQ%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.properties(%0A%20%20%20%20%20%20%20%20%20%20%20%20width%3D360%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20height%3D320%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Stage%201%3A%20Reference%20cps%20All-vs-All%20Similarity%20Matrix%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20)%0A%0A%20%20%20%20wgs_bar_rows%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20for%20_r%20in%20wgs_records%3A%0A%20%20%20%20%20%20%20%20if%20_r%5B%22true_serotype%22%5D%20%3D%3D%20%22None%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20_label%20%3D%20f%22%7B_r%5B'strain'%5D%7D%20(True%3A%20%7B_r%5B'true_serotype'%5D%7D)%22%0A%20%20%20%20%20%20%20%20wgs_bar_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Strain%22%3A%20_label%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Rank%22%3A%20%22Top-1%20Hit%20(Predicted)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Score%22%3A%20round(float(_r%5B%22top1_score%22%5D)%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Called%20Serotype%22%3A%20str(_r%5B%22predicted_serotype%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20wgs_bar_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Strain%22%3A%20_label%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Rank%22%3A%20%22Top-2%20Runner-Up%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Score%22%3A%20round(float(_r%5B%22top2_score%22%5D)%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Called%20Serotype%22%3A%20str(_r%5B%22runner_up_serotype%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20chart_wgs%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(alt.Data(values%3Dwgs_bar_rows))%0A%20%20%20%20%20%20%20%20.mark_bar(cornerRadiusEnd%3D3)%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22Strain%3AN%22%2C%20sort%3DNone%2C%20title%3D%22Whole-Genome%20RefSeq%20Strain%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22Score%3AQ%22%2C%20scale%3Dalt.Scale(domain%3D%5B0.0%2C%201.0%5D)%2C%20title%3D%22LocusMatcher%20Score%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20yOffset%3Dalt.YOffset(%22Rank%3AN%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.Color(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Rank%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scale%3Dalt.Scale(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20domain%3D%5B%22Top-1%20Hit%20(Predicted)%22%2C%20%22Top-2%20Runner-Up%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20range%3D%5B%22%230d9488%22%2C%20%22%2394a3b8%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Match%20Rank%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%22Strain%3AN%22%2C%20%22Rank%3AN%22%2C%20%22Called%20Serotype%3AN%22%2C%20%22Score%3AQ%22%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.properties(%0A%20%20%20%20%20%20%20%20%20%20%20%20width%3D360%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20height%3D320%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Stage%202%3A%20De%20Novo%20Whole-Genome%20Locus%20Discovery%20%26%20DB%20Matching%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20)%0A%0A%20%20%20%20chart_frag%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(alt.Data(values%3Dfrag_records))%0A%20%20%20%20%20%20%20%20.mark_bar(cornerRadiusEnd%3D3)%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22strain%3AN%22%2C%20sort%3DNone%2C%20title%3D%22Fragmented%20Whole-Genome%20Strain%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22score%3AQ%22%2C%20scale%3Dalt.Scale(domain%3D%5B0.0%2C%201.0%5D)%2C%20title%3D%22Stitched%20Locus%20Match%20Score%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20xOffset%3Dalt.XOffset(%22mode%3AN%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.Color(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22mode%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scale%3Dalt.Scale(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20domain%3D%5B%22Intact%20Control%22%2C%20%22Intergenic%20Contig%20Split%22%2C%20%22Mid-ORF%20Split-Gene%20Break%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20range%3D%5B%22%230d9488%22%2C%20%22%23d97706%22%2C%20%22%237c3aed%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Assembly%20Condition%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22strain%3AN%22%2C%20title%3D%22Strain%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22true_serotype%3AN%22%2C%20title%3D%22True%20Serotype%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22mode%3AN%22%2C%20title%3D%22Assembly%20Condition%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22predicted_serotype%3AN%22%2C%20title%3D%22Called%20Serotype%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22score%3AQ%22%2C%20title%3D%22Score%22%2C%20format%3D%22.3f%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22num_contigs%3AQ%22%2C%20title%3D%22Spanned%20Contigs%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22has_fragmented_flag%3AN%22%2C%20title%3D%22FRAGMENTED_VARIANT%20Flag%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.properties(%0A%20%20%20%20%20%20%20%20%20%20%20%20width%3D360%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20height%3D300%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Stage%203%3A%20Contig-Split%20Stitching%20%26%20Mid-ORF%20Break%20Recovery%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20)%0A%0A%20%20%20%20loo_chart_rows%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20for%20_r%20in%20loo_records%3A%0A%20%20%20%20%20%20%20%20_label%20%3D%20f%22%7B_r%5B'strain'%5D%7D%20(%7B_r%5B'true_serotype'%5D%7D)%22%0A%20%20%20%20%20%20%20%20loo_chart_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Query%22%3A%20_label%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Database%20State%22%3A%20%22Full%20Reference%20DB%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Score%22%3A%20round(float(_r%5B%22full_db_score%22%5D)%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Best%20Hit%22%3A%20str(_r%5B%22true_serotype%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Flags%22%3A%20%22True%20Serotype%20Present%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20loo_chart_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Query%22%3A%20_label%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Database%20State%22%3A%20%22Leave-One-Out%20DB%20(True%20Serotype%20Held%20Out)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Score%22%3A%20round(float(_r%5B%22held_out_score%22%5D)%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Best%20Hit%22%3A%20str(_r%5B%22held_out_closest_serotype%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Flags%22%3A%20str(_r%5B%22held_out_flags%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20chart_loo%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(alt.Data(values%3Dloo_chart_rows))%0A%20%20%20%20%20%20%20%20.mark_bar(cornerRadiusEnd%3D3)%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22Query%3AN%22%2C%20sort%3DNone%2C%20title%3D%22Query%20Strain%20(Held-Out%20Serotype)%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22Score%3AQ%22%2C%20scale%3Dalt.Scale(domain%3D%5B0.0%2C%201.0%5D)%2C%20title%3D%22Top%20Match%20Score%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20xOffset%3Dalt.XOffset(%22Database%20State%3AN%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.Color(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Database%20State%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scale%3Dalt.Scale(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20domain%3D%5B%22Full%20Reference%20DB%22%2C%20%22Leave-One-Out%20DB%20(True%20Serotype%20Held%20Out)%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20range%3D%5B%22%230d9488%22%2C%20%22%23e11d48%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Reference%20DB%20State%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%22Query%3AN%22%2C%20%22Database%20State%3AN%22%2C%20%22Best%20Hit%3AN%22%2C%20%22Score%3AQ%22%2C%20%22Flags%3AN%22%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.properties(%0A%20%20%20%20%20%20%20%20%20%20%20%20width%3D360%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20height%3D300%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Stage%204%3A%20Leave-One-Out%20Novelty%20Detection%20%26%20Serogroup%20Fallback%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20)%0A%0A%20%20%20%20pan_order%20%3D%20np.argsort(-pneumo_db.pan_counts)%0A%20%20%20%20top_core_idx_set%20%3D%20%7Bint(idx)%20for%20idx%20in%20pan_order%5B%3A14%5D%7D%0A%20%20%20%20top_pan_rows%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20for%20_idx%20in%20pan_order%5B%3A12%5D%3A%0A%20%20%20%20%20%20%20%20_node_val%20%3D%20int(pneumo_db.pan_nodes%5B_idx%5D)%0A%20%20%20%20%20%20%20%20_role_id%20%3D%20int(GeneNode.ROLE_ID.extract(_node_val))%0A%20%20%20%20%20%20%20%20_cid%20%3D%20int(GeneNode.CLUSTER_ID.extract(_node_val))%0A%20%20%20%20%20%20%20%20_cnt%20%3D%20int(pneumo_db.pan_counts%5B_idx%5D)%0A%20%20%20%20%20%20%20%20_role_obj%20%3D%20GeneRole(_role_id)%0A%20%20%20%20%20%20%20%20top_pan_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22cluster_id%22%3A%20_cid%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22role_name%22%3A%20_role_obj.name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22role_abbrev%22%3A%20_role_obj.abbreviation%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22category%22%3A%20_role_obj.category.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22locus_count%22%3A%20_cnt%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22frequency_pct%22%3A%20100.0%20*%20_cnt%20%2F%20max(n_db_loci%2C%201)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20pan_csr%20%3D%20pneumo_db.pan_adj.tocsr()%0A%20%20%20%20node_max_edge%20%3D%20np.zeros(n_pan_nodes%2C%20dtype%3Dnp.int32)%0A%20%20%20%20node_in_deg%20%3D%20np.zeros(n_pan_nodes%2C%20dtype%3Dnp.int32)%0A%20%20%20%20node_out_deg%20%3D%20np.zeros(n_pan_nodes%2C%20dtype%3Dnp.int32)%0A%20%20%20%20pan_edge_rows%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%0A%20%20%20%20for%20_u%20in%20range(n_pan_nodes)%3A%0A%20%20%20%20%20%20%20%20_u_val%20%3D%20int(pneumo_db.pan_nodes%5B_u%5D)%0A%20%20%20%20%20%20%20%20_u_role%20%3D%20GeneRole(int(GeneNode.ROLE_ID.extract(_u_val)))%0A%20%20%20%20%20%20%20%20_u_cid%20%3D%20int(GeneNode.CLUSTER_ID.extract(_u_val))%0A%20%20%20%20%20%20%20%20_row_start%20%3D%20int(pan_csr.indptr%5B_u%5D)%0A%20%20%20%20%20%20%20%20_row_end%20%3D%20int(pan_csr.indptr%5B_u%20%2B%201%5D)%0A%20%20%20%20%20%20%20%20for%20_k%20in%20range(_row_start%2C%20_row_end)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_v%20%3D%20int(pan_csr.indices%5B_k%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20_u%20%3D%3D%20_v%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20_w%20%3D%20int(pan_csr.data%5B_k%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20_w%20%3C%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20node_out_deg%5B_u%5D%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20node_in_deg%5B_v%5D%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20_w%20%3E%20node_max_edge%5B_u%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20node_max_edge%5B_u%5D%20%3D%20_w%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20_w%20%3E%20node_max_edge%5B_v%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20node_max_edge%5B_v%5D%20%3D%20_w%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20_v_val%20%3D%20int(pneumo_db.pan_nodes%5B_v%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20_v_role%20%3D%20GeneRole(int(GeneNode.ROLE_ID.extract(_v_val)))%0A%20%20%20%20%20%20%20%20%20%20%20%20_v_cid%20%3D%20int(GeneNode.CLUSTER_ID.extract(_v_val))%0A%20%20%20%20%20%20%20%20%20%20%20%20pan_edge_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22x%22%3A%20round(float(pneumo_db.pan_coords%5B_u%2C%200%5D)%2C%205)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22y%22%3A%20round(float(pneumo_db.pan_coords%5B_u%2C%201%5D)%2C%205)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22x2%22%3A%20round(float(pneumo_db.pan_coords%5B_v%2C%200%5D)%2C%205)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22y2%22%3A%20round(float(pneumo_db.pan_coords%5B_v%2C%201%5D)%2C%205)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22weight%22%3A%20_w%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22weight_pct%22%3A%20round(100.0%20*%20_w%20%2F%20max(n_db_loci%2C%201)%2C%201)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22source_node%22%3A%20f%22%7B_u_role.abbreviation%7D%20(CID-%7B_u_cid%3A03d%7D)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22target_node%22%3A%20f%22%7B_v_role.abbreviation%7D%20(CID-%7B_v_cid%3A03d%7D)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22transition%22%3A%20f%22%7B_u_role.abbreviation%7D%20(C%7B_u_cid%7D)%20-%3E%20%7B_v_role.abbreviation%7D%20(C%7B_v_cid%7D)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20pan_node_rows%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20for%20_idx%20in%20range(n_pan_nodes)%3A%0A%20%20%20%20%20%20%20%20_node_val%20%3D%20int(pneumo_db.pan_nodes%5B_idx%5D)%0A%20%20%20%20%20%20%20%20_role_id%20%3D%20int(GeneNode.ROLE_ID.extract(_node_val))%0A%20%20%20%20%20%20%20%20_cid%20%3D%20int(GeneNode.CLUSTER_ID.extract(_node_val))%0A%20%20%20%20%20%20%20%20_cnt%20%3D%20int(pneumo_db.pan_counts%5B_idx%5D)%0A%20%20%20%20%20%20%20%20_freq_pct%20%3D%20round(100.0%20*%20_cnt%20%2F%20max(n_db_loci%2C%201)%2C%201)%0A%20%20%20%20%20%20%20%20_role_obj%20%3D%20GeneRole(_role_id)%0A%20%20%20%20%20%20%20%20_max_sup%20%3D%20int(node_max_edge%5B_idx%5D)%20if%20int(node_max_edge%5B_idx%5D)%20%3E%200%20else%201%0A%20%20%20%20%20%20%20%20_core_label%20%3D%20f%22%7B_role_obj.abbreviation%7D%20(C%7B_cid%7D)%22%20if%20_idx%20in%20top_core_idx_set%20else%20%22%22%0A%20%20%20%20%20%20%20%20pan_node_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22node_idx%22%3A%20_idx%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22cluster_id%22%3A%20f%22CID-%7B_cid%3A03d%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22role_abbrev%22%3A%20_role_obj.abbreviation%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22role_name%22%3A%20_role_obj.name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22category%22%3A%20_role_obj.category.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22locus_count%22%3A%20_cnt%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22frequency_pct%22%3A%20_freq_pct%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22degree%22%3A%20int(node_in_deg%5B_idx%5D%20%2B%20node_out_deg%5B_idx%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22max_edge_support%22%3A%20_max_sup%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22x%22%3A%20round(float(pneumo_db.pan_coords%5B_idx%2C%200%5D)%2C%205)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22y%22%3A%20round(float(pneumo_db.pan_coords%5B_idx%2C%201%5D)%2C%205)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22core_label%22%3A%20_core_label%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20max_edge_weight%20%3D%20max((int(r%5B%22weight%22%5D)%20for%20r%20in%20pan_edge_rows)%2C%20default%3D1)%0A%20%20%20%20slider_max%20%3D%20max(2%2C%20min(max_edge_weight%2C%20max(2%2C%20n_db_loci%20%2F%2F%202)))%0A%20%20%20%20min_edge_slider%20%3D%20alt.binding_range(%0A%20%20%20%20%20%20%20%20min%3D1%2C%0A%20%20%20%20%20%20%20%20max%3Dslider_max%2C%0A%20%20%20%20%20%20%20%20step%3D1%2C%0A%20%20%20%20%20%20%20%20name%3D%22Min%20Synteny%20Edge%20Support%20(Loci)%3A%20%22%2C%0A%20%20%20%20)%0A%20%20%20%20min_edge_param%20%3D%20alt.param(name%3D%22min_edge_support%22%2C%20value%3D1%2C%20bind%3Dmin_edge_slider)%0A%20%20%20%20cat_selection%20%3D%20alt.selection_point(fields%3D%5B%22category%22%5D%2C%20bind%3D%22legend%22)%0A%0A%20%20%20%20pan_edges_layer%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(alt.Data(values%3Dpan_edge_rows))%0A%20%20%20%20%20%20%20%20.mark_rule(strokeCap%3D%22round%22)%0A%20%20%20%20%20%20%20%20.transform_filter(alt.datum.weight%20%3E%3D%20min_edge_param)%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22x%3AQ%22%2C%20scale%3Dalt.Scale(domain%3D%5B-1.18%2C%201.18%5D)%2C%20axis%3DNone)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22y%3AQ%22%2C%20scale%3Dalt.Scale(domain%3D%5B-1.18%2C%201.18%5D)%2C%20axis%3DNone)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20x2%3D%22x2%3AQ%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y2%3D%22y2%3AQ%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20strokeWidth%3Dalt.StrokeWidth(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22weight%3AQ%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scale%3Dalt.Scale(type%3D%22sqrt%22%2C%20range%3D%5B0.75%2C%205.5%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Shared%20Loci%20(Edge)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20opacity%3Dalt.Opacity(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22weight%3AQ%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scale%3Dalt.Scale(type%3D%22sqrt%22%2C%20range%3D%5B0.22%2C%200.85%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20legend%3DNone%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.value(%22%2364748b%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22transition%3AN%22%2C%20title%3D%22Synteny%20Transition%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22source_node%3AN%22%2C%20title%3D%22Source%20Cluster%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22target_node%3AN%22%2C%20title%3D%22Target%20Cluster%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22weight%3AQ%22%2C%20title%3D%22Shared%20Loci%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22weight_pct%3AQ%22%2C%20title%3D%22Locus%20Share%20(%25)%22%2C%20format%3D%22.1f%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20)%0A%0A%20%20%20%20pan_nodes_layer%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(alt.Data(values%3Dpan_node_rows))%0A%20%20%20%20%20%20%20%20.mark_circle(stroke%3D%22%230f172a%22%2C%20strokeWidth%3D1.1)%0A%20%20%20%20%20%20%20%20.transform_filter(alt.datum.max_edge_support%20%3E%3D%20min_edge_param)%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22x%3AQ%22%2C%20scale%3Dalt.Scale(domain%3D%5B-1.18%2C%201.18%5D)%2C%20axis%3DNone)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22y%3AQ%22%2C%20scale%3Dalt.Scale(domain%3D%5B-1.18%2C%201.18%5D)%2C%20axis%3DNone)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20size%3Dalt.Size(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22locus_count%3AQ%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scale%3Dalt.Scale(range%3D%5B45%2C%20540%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Locus%20Presence%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.Color(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22category%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scale%3Dalt.Scale(scheme%3D%22tableau10%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Functional%20Category%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20opacity%3Dalt.condition(cat_selection%2C%20alt.value(0.92)%2C%20alt.value(0.18))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22cluster_id%3AN%22%2C%20title%3D%22Cluster%20ID%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22role_abbrev%3AN%22%2C%20title%3D%22Gene%20Role%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22role_name%3AN%22%2C%20title%3D%22Full%20Role%20Name%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22category%3AN%22%2C%20title%3D%22Functional%20Category%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22locus_count%3AQ%22%2C%20title%3D%22Locus%20Count%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22frequency_pct%3AQ%22%2C%20title%3D%22Core%20Frequency%20(%25)%22%2C%20format%3D%22.1f%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22degree%3AQ%22%2C%20title%3D%22Synteny%20Degree%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.add_params(cat_selection)%0A%20%20%20%20)%0A%0A%20%20%20%20pan_labels_layer%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(alt.Data(values%3D%5Br%20for%20r%20in%20pan_node_rows%20if%20r%5B%22core_label%22%5D%5D))%0A%20%20%20%20%20%20%20%20.mark_text(dy%3D-12%2C%20fontSize%3D10%2C%20fontWeight%3D%22bold%22%2C%20color%3D%22%230f172a%22)%0A%20%20%20%20%20%20%20%20.transform_filter(alt.datum.max_edge_support%20%3E%3D%20min_edge_param)%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22x%3AQ%22%2C%20scale%3Dalt.Scale(domain%3D%5B-1.18%2C%201.18%5D)%2C%20axis%3DNone)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22y%3AQ%22%2C%20scale%3Dalt.Scale(domain%3D%5B-1.18%2C%201.18%5D)%2C%20axis%3DNone)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3D%22core_label%3AN%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20)%0A%0A%20%20%20%20chart_pan_graph%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.layer(pan_edges_layer%2C%20pan_nodes_layer%2C%20pan_labels_layer)%0A%20%20%20%20%20%20%20%20.add_params(min_edge_param)%0A%20%20%20%20%20%20%20%20.properties(%0A%20%20%20%20%20%20%20%20%20%20%20%20width%3D820%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20height%3D380%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22S.%20pneumoniae%20De%20Novo%20Consensus%20Pan-CPS%20Graph%20(Loci.as_pan_graph)%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.configure_view(stroke%3DNone)%0A%20%20%20%20)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20chart_ava%2C%0A%20%20%20%20%20%20%20%20chart_frag%2C%0A%20%20%20%20%20%20%20%20chart_loo%2C%0A%20%20%20%20%20%20%20%20chart_pan_graph%2C%0A%20%20%20%20%20%20%20%20chart_wgs%2C%0A%20%20%20%20%20%20%20%20compression_ratio%2C%0A%20%20%20%20%20%20%20%20frag_accuracy_pct%2C%0A%20%20%20%20%20%20%20%20frag_correct_count%2C%0A%20%20%20%20%20%20%20%20frag_split_only%2C%0A%20%20%20%20%20%20%20%20loo_accuracy_pct%2C%0A%20%20%20%20%20%20%20%20loo_novel_count%2C%0A%20%20%20%20%20%20%20%20n_db_loci%2C%0A%20%20%20%20%20%20%20%20n_pan_edges%2C%0A%20%20%20%20%20%20%20%20n_pan_nodes%2C%0A%20%20%20%20%20%20%20%20top_pan_rows%2C%0A%20%20%20%20%20%20%20%20total_db_genes%2C%0A%20%20%20%20%20%20%20%20total_downloaded_mb%2C%0A%20%20%20%20%20%20%20%20unique_clusters%2C%0A%20%20%20%20%20%20%20%20wgs_accuracy_pct%2C%0A%20%20%20%20%20%20%20%20wgs_correct_count%2C%0A%20%20%20%20%20%20%20%20wgs_total_count%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20compression_ratio%2C%0A%20%20%20%20download_elapsed_s%2C%0A%20%20%20%20frag_accuracy_pct%2C%0A%20%20%20%20frag_correct_count%2C%0A%20%20%20%20frag_split_only%2C%0A%20%20%20%20loo_accuracy_pct%2C%0A%20%20%20%20loo_novel_count%2C%0A%20%20%20%20loo_records%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20n_db_loci%2C%0A%20%20%20%20n_pan_edges%2C%0A%20%20%20%20n_pan_nodes%2C%0A%20%20%20%20total_db_genes%2C%0A%20%20%20%20total_downloaded_mb%2C%0A%20%20%20%20unique_clusters%2C%0A%20%20%20%20wgs_accuracy_pct%2C%0A%20%20%20%20wgs_correct_count%2C%0A%20%20%20%20wgs_total_count%2C%0A)%3A%0A%20%20%20%20%23%20Slide%201%3A%20Hero%20Title%2C%20Executive%20Summary%20%26%20KPI%20Cards%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20*Streptococcus%20pneumoniae*%20De%20Novo%20CPS%20Locus%20Discovery%20%26%20Database%20Construction%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20End-to-end%20validation%20of%20**de%20novo%20polysaccharide%20locus%20segmentation%20(%60LocusPredictor%60)**%2C%20**polysaccharide-specific%20CNN%20role%20classification%20(%60GeneRoleClassifier%60)**%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20**hybrid%20CNN-rescued%20MCL%20clustering%20(%60Clusterer%60%20%2F%20%60Loci.cluster_genes%60)**%2C%20**directed%20pan-locus%20graph%20construction%20(%60Loci.as_pan_graph%60)**%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20**cross-contig%20boundary%20stitching%20(%60stitch_contig_splits%3DTrue%60)**%2C%20and%20**database%20matching%20(%60LocusMatcher%60)**.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.stat(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22De%20Novo%20CPS%20Database%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3Df%22%7Bn_db_loci%7D%20Loci%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20caption%3Df%22%7Btotal_db_genes%7D%20genes%20%E2%86%92%20%7Bunique_clusters%7D%20MCL%20clusters%20(%7Bcompression_ratio%3A.2f%7D%C3%97%20compression)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bordered%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.stat(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22Consensus%20Pan-Graph%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3Df%22%7Bn_pan_nodes%7D%20Nodes%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20caption%3Df%22%7Bn_pan_edges%7D%20directed%20synteny%20edges%20(%7Btotal_downloaded_mb%3A.1f%7D%20MB%20in%20%7Bdownload_elapsed_s%3A.2f%7Ds)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bordered%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.stat(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22De%20Novo%20WGS%20Locus%20Discovery%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3Df%22%7Bwgs_accuracy_pct%3A.1f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20caption%3Df%22%7Bwgs_correct_count%7D%2F%7Bwgs_total_count%7D%20closed%20chromosomes%20(incl.%20R6%20rough%20control)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bordered%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.stat(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22Contig-Split%20Stitching%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3Df%22%7Bfrag_accuracy_pct%3A.1f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20caption%3Df%22%7Bfrag_correct_count%7D%2F%7Blen(frag_split_only)%7D%20intergenic%20%26%20mid-ORF%20split%20assemblies%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bordered%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.stat(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22Leave-One-Out%20Novelty%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3Df%22%7Bloo_accuracy_pct%3A.1f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20caption%3Df%22%7Bloo_novel_count%7D%2F%7Blen(loo_records)%7D%20held-out%20loci%20flagged%20(%60is_novel%60)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bordered%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20widths%3D%22equal%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gap%3D1.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.callout(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22**4-Stage%20Validation%20Summary**%3A%20%60LocusPredictor%60%20discovers%20capsular%20polysaccharide%20loci%20*de%20novo*%20directly%20from%20unannotated%20genomes%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22(both%20Wzy-dependent%20%60CPS_WZY%60%20and%20synthase-dependent%20%60CPS_SYNTHASE%60%20Type%203%20capsules)%20with%20**100%25%20specificity**%20on%20unencapsulated%20%60R6%60%2C%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22**100%25%20recovery**%20across%20artificial%20intergenic%20and%20mid-ORF%20contig%20breaks%2C%20and%20**100%25%20Top-1%20database%20matching**%20via%20%60LocusMatcher%60.%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind%3D%22success%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20gap%3D1.2%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(chart_pan_graph%2C%20mo)%3A%0A%20%20%20%20%23%20Slide%202%3A%20De%20Novo%20Consensus%20Pan-CPS%20Graph%20(Loci.as_pan_graph)%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%23%201.%20De%20Novo%20Consensus%20Pan-CPS%20Graph%20(%60Loci.cluster_genes%60%20%2B%20%60Loci.as_pan_graph%60)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Hybrid%20%60Clusterer(mode%3D%22mcl%22)%60%20groups%20divergent%20homologs%20by%20combining%20%60RandstrobeIndex%60%20seeding%2C%20%60MMSEQS12%60%20diagonal%20prefiltering%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20banded%2Funbanded%20Smith-Waterman-Gotoh%2C%20and%20role-gated%20%60GeneRoleClassifier%60%20active-site%20motif%20rescue%2C%20compressing%20bit-packed%20%60GeneNode%60s%20into%20a%20directed%20pan-locus%20CSR%20graph.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20chart_pan_graph%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20gap%3D0.8%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(alt%2C%20chart_ava%2C%20chart_wgs%2C%20mo)%3A%0A%20%20%20%20%23%20Slide%203%3A%20Stage%201%20De%20Novo%20Database%20All-vs-All%20Matrix%20%26%20Stage%202%20De%20Novo%20Whole-Genome%20Locus%20Discovery%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%23%202.%20De%20Novo%20Database%20All-vs-All%20Similarity%20%26%20Whole-Genome%20CPS%20Discovery%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Left%3A%20Pairwise%20%60LocusMatcher%60%20similarity%20matrix%20across%20the%2018%20de%20novo-segmented%20reference%20CPS%20loci%20(resolving%20closely%20related%20serogroups%20%606A%2F6B%2F6C%2F6D%60%2C%20%6019A%2F19F%60%2C%20and%20%6023A%2F23B%2F23F%60).%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Right%3A%20Top-1%20vs.%20Top-2%20runner-up%20score%20separation%20for%20CPS%20loci%20discovered%20*de%20novo*%20from%20complete%20RefSeq%20chromosomes.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20alt.hconcat(chart_ava%2C%20chart_wgs).resolve_scale(color%3D%22independent%22)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20gap%3D0.8%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(alt%2C%20chart_frag%2C%20chart_loo%2C%20mo)%3A%0A%20%20%20%20%23%20Slide%204%3A%20Stage%203%20Contig-Split%20Stitching%20%26%20Stage%204%20Leave-One-Out%20Novelty%20Detection%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%23%203.%20Fragmented%20Locus%20Stitching%20%26%20Leave-One-Out%20Novelty%20Detection%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Left%3A%20%60LocusPredictor(stitch_contig_splits%3DTrue)%60%20reconstructs%20fragmented%20*cps*%20operons%20split%20across%20reverse-complemented%20contigs%20(both%20intergenic%20and%20mid-ORF%20breaks).%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Right%3A%20Holding%20out%20each%20query%20strain's%20true%20locus%20from%20the%20de%20novo%20database%20triggers%20%60Match.is_novel%60%20(%60GENE_VARIANT%60)%20and%20falls%20back%20to%20the%20closest%20intra-serogroup%20relative.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20alt.hconcat(chart_frag%2C%20chart_loo).resolve_scale(color%3D%22independent%22)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20gap%3D0.8%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20frag_records%2C%0A%20%20%20%20loo_records%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20pneumo_db%2C%0A%20%20%20%20top_pan_rows%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%2C%0A%20%20%20%20wgs_records%2C%0A)%3A%0A%20%20%20%20%23%20Slide%205%3A%20Interactive%20Tabbed%20Validation%20Tables%0A%20%20%20%20_wgs_md%20%3D%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20f%22%7C%20**%7Br%5B'strain'%5D%7D**%20%7C%20%60%7Br%5B'accession'%5D%7D%60%20%7C%20%7Bint(r%5B'genome_bp'%5D)%3A%2C%7D%20bp%20%7C%20**%7Br%5B'true_serotype'%5D%7D**%20%22%0A%20%20%20%20%20%20%20%20f%22%7C%20**%7Br%5B'predicted_serotype'%5D%7D**%20%7C%20%7Br%5B'runner_up_serotype'%5D%7D%20(%60%7Bfloat(r%5B'top2_score'%5D)%3A.3f%7D%60)%20%22%0A%20%20%20%20%20%20%20%20f%22%7C%20%60%7Br%5B'archetype'%5D%7D%60%20%7C%20%7Br%5B'num_genes'%5D%7D%20%7C%20%60%7Bfloat(r%5B'top1_score'%5D)%3A.3f%7D%60%20%7C%20%60%7Bfloat(r%5B'top1_jaccard'%5D)%3A.3f%7D%60%20%22%0A%20%20%20%20%20%20%20%20f%22%7C%20%60%7Br%5B'match_flags'%5D%7D%60%20%7C%20%7B'%E2%9C%85%20PASS'%20if%20r%5B'is_correct'%5D%20else%20'%E2%9D%8C%20FAIL'%7D%20%7C%22%0A%20%20%20%20%20%20%20%20for%20r%20in%20wgs_records%0A%20%20%20%20)%0A%0A%20%20%20%20_frag_md%20%3D%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20f%22%7C%20**%7Br%5B'strain'%5D%7D**%20%7C%20%7Br%5B'true_serotype'%5D%7D%20%7C%20%7Br%5B'mode'%5D%7D%20%7C%20**%7Br%5B'predicted_serotype'%5D%7D**%20%22%0A%20%20%20%20%20%20%20%20f%22%7C%20%60%7Bfloat(r%5B'score'%5D)%3A.3f%7D%60%20%7C%20%60%7Bfloat(r%5B'jaccard'%5D)%3A.3f%7D%60%20%7C%20%7Bfloat(r%5B'completeness'%5D)%20*%20100%3A.1f%7D%25%20%22%0A%20%20%20%20%20%20%20%20f%22%7C%20%7Br%5B'num_contigs'%5D%7D%20%7C%20%60%7Br%5B'has_fragmented_flag'%5D%7D%60%20%7C%20%7B'%E2%9C%85%20PASS'%20if%20r%5B'is_correct'%5D%20else%20'%E2%9D%8C%20FAIL'%7D%20%7C%22%0A%20%20%20%20%20%20%20%20for%20r%20in%20frag_records%0A%20%20%20%20)%0A%0A%20%20%20%20_loo_md%20%3D%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20f%22%7C%20**%7Br%5B'strain'%5D%7D**%20%7C%20**%7Br%5B'true_serotype'%5D%7D**%20%7C%20%7Br%5B'serogroup'%5D%7D%20%7C%20%60%7Bfloat(r%5B'full_db_score'%5D)%3A.3f%7D%60%20%22%0A%20%20%20%20%20%20%20%20f%22%7C%20**%7Br%5B'held_out_closest_serotype'%5D%7D**%20(%60%7B'Same%20SG'%20if%20r%5B'held_out_same_serogroup'%5D%20else%20'Diff%20SG'%7D%60)%20%22%0A%20%20%20%20%20%20%20%20f%22%7C%20%60%7Bfloat(r%5B'held_out_score'%5D)%3A.3f%7D%60%20(%60-%7Bfloat(r%5B'score_drop'%5D)%3A.3f%7D%60)%20%7C%20%60%7Bfloat(r%5B'held_out_jaccard'%5D)%3A.3f%7D%60%20%22%0A%20%20%20%20%20%20%20%20f%22%7C%20%60-%7Br%5B'held_out_missing_genes'%5D%7D%20%2F%20%2B%7Br%5B'held_out_extra_genes'%5D%7D%60%20%7C%20%60%7Br%5B'held_out_flags'%5D%7D%60%20%22%0A%20%20%20%20%20%20%20%20f%22%7C%20%7B'%E2%9C%85%20NOVEL'%20if%20r%5B'is_novel_detected'%5D%20else%20'%E2%9D%8C%20MISSED'%7D%20%7C%22%0A%20%20%20%20%20%20%20%20for%20r%20in%20loo_records%0A%20%20%20%20)%0A%0A%20%20%20%20_db_md%20%3D%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20f%22%7C%20%7Bidx%20%2B%201%7D%20%7C%20**%7Bspec.serotype%7D**%20%7C%20%7Bspec.serogroup%7D%20%7C%20%60%7Bspec.accession%7D%60%20%7C%20%7Bspec.strain%7D%20%22%0A%20%20%20%20%20%20%20%20f%22%7C%20%60%7Bloc.archetype.name%7D%60%20%7C%20%7Bloc.num_genes%7D%20%7C%20%60%7Bloc.start%3A%2C%7D..%7Bloc.end%3A%2C%7D%60%20(%60%7Bloc.strand%3A%2Bd%7D%60)%20%22%0A%20%20%20%20%20%20%20%20f%22%7C%20%7Bloc.completeness%20*%20100%3A.1f%7D%25%20%7C%20%60%7Bloc.score%3A.1f%7D%60%20%7C%22%0A%20%20%20%20%20%20%20%20for%20idx%2C%20(spec%2C%20loc)%20in%20enumerate(zip(pneumo_db.specs%2C%20pneumo_db.loci%2C%20strict%3DTrue))%0A%20%20%20%20)%0A%0A%20%20%20%20_core_md%20%3D%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20f%22%7C%20%60CID-%7Br%5B'cluster_id'%5D%3A03d%7D%60%20%7C%20**%7Br%5B'role_abbrev'%5D%7D**%20(%60%7Br%5B'role_name'%5D%7D%60)%20%7C%20%7Br%5B'category'%5D%7D%20%22%0A%20%20%20%20%20%20%20%20f%22%7C%20%7Br%5B'locus_count'%5D%7D%20%2F%20%7Blen(pneumo_db.loci)%7D%20%7C%20%7Bfloat(r%5B'frequency_pct'%5D)%3A.1f%7D%25%20%7C%22%0A%20%20%20%20%20%20%20%20for%20r%20in%20top_pan_rows%0A%20%20%20%20)%0A%0A%20%20%20%20_wgs_table_md%20%3D%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20Strain%20%7C%20Accession%20%7C%20Genome%20Size%20%7C%20True%20%7C%20Matched%20Locus%20%7C%20Runner-Up%20%7C%20Archetype%20%7C%20Genes%20%7C%20Top-1%20Score%20%7C%20Jaccard%20%7C%20Match%20Flags%20%7C%20Status%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20%3A---%20%7C%20%3A---%20%7C%20---%3A%20%7C%20%3A---%20%7C%20%3A---%20%7C%20%3A---%20%7C%20%3A---%20%7C%20---%3A%20%7C%20---%3A%20%7C%20---%3A%20%7C%20%3A---%20%7C%20%3A---%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_wgs_md%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20_frag_table_md%20%3D%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20Strain%20%7C%20True%20Locus%20%7C%20Assembly%20Condition%20%7C%20Matched%20Locus%20%7C%20Score%20%7C%20Jaccard%20%7C%20Completeness%20%7C%20Contigs%20%7C%20Fragmented%20Flag%20%7C%20Status%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20%3A---%20%7C%20%3A---%20%7C%20%3A---%20%7C%20%3A---%20%7C%20---%3A%20%7C%20---%3A%20%7C%20---%3A%20%7C%20---%3A%20%7C%20%3A---%20%7C%20%3A---%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_frag_md%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20_loo_table_md%20%3D%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20Strain%20%7C%20Held-Out%20Locus%20%7C%20Serogroup%20%7C%20Full-DB%20Score%20%7C%20Closest%20Relative%20%7C%20LOO%20Score%20(Drop)%20%7C%20LOO%20Jaccard%20%7C%20Missing%20%2F%20Extra%20%7C%20Flags%20%7C%20Novelty%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20%3A---%20%7C%20%3A---%20%7C%20%3A---%20%7C%20---%3A%20%7C%20%3A---%20%7C%20---%3A%20%7C%20---%3A%20%7C%20%3A---%20%7C%20%3A---%20%7C%20%3A---%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_loo_md%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20_db_table_md%20%3D%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20%23%20%7C%20Locus%20%7C%20Serogroup%20%7C%20Accession%20%7C%20Strain%20%7C%20Archetype%20%7C%20Genes%20%7C%20Interval%20%7C%20Completeness%20%7C%20Score%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20---%3A%20%7C%20%3A---%20%7C%20%3A---%20%7C%20%3A---%20%7C%20%3A---%20%7C%20%3A---%20%7C%20---%3A%20%7C%20%3A---%20%7C%20---%3A%20%7C%20---%3A%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_db_md%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%23%23%23%23%20Top%20Conserved%20Pan-CPS%20Core%20Homology%20Clusters%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20Cluster%20ID%20%7C%20Gene%20Role%20%7C%20Category%20%7C%20Locus%20Presence%20%7C%20Core%20Frequency%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20%3A---%20%7C%20%3A---%20%7C%20%3A---%20%7C%20---%3A%20%7C%20---%3A%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_core_md%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22%23%23%204.%20Detailed%20Benchmark%20Results%20%26%20De%20Novo%20Database%20Registry%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.ui.tabs(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Stage%202%3A%20De%20Novo%20WGS%20Locus%20Discovery%22%3A%20mo.md(_wgs_table_md)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Stage%203%3A%20Contig-Split%20Stress%20Test%22%3A%20mo.md(_frag_table_md)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Stage%204%3A%20Leave-One-Out%20Novelty%22%3A%20mo.md(_loo_table_md)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Stage%201%3A%20De%20Novo%20CPS%20Registry%20%26%20Core%20Clusters%22%3A%20mo.md(_db_table_md)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20gap%3D0.8%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
d4b7cbf8e05a225a49d7a1396327115c