From 7f92a37277e8e4525f74912f02ef8a8ee024a995 Mon Sep 17 00:00:00 2001 From: Jason Stajich Date: Thu, 29 Oct 2026 20:39:41 -0700 Subject: [PATCH 1/6] Cross-family calls: decide the family once per genome by mean identity, no near-tie margin, family_ambiguous on every unscoped cross-call (replaces the 3-point rule) Evaluation, pair table and a 354-genome replay in results/2026-10-29_near_tie/. Co-Authored-By: Claude Sonnet 5.5 --- results/2026-10-29_near_tie/README.md | 42 +++++ results/2026-10-29_near_tie/compare_v5_v8.py | 38 +++++ results/2026-10-29_near_tie/compare_v5_v8.txt | 22 +++ .../2026-10-29_near_tie/cross_call_pairs.tsv | 157 ++++++++++++++++++ src/MATPredict/detect/family_status.py | 73 ++++---- src/MATPredict/detect/pipeline.py | 4 + src/MATPredict/detect/report.py | 3 + tests/detect/test_family_status.py | 51 +++++- 8 files changed, 353 insertions(+), 37 deletions(-) create mode 100644 results/2026-10-29_near_tie/README.md create mode 100644 results/2026-10-29_near_tie/compare_v5_v8.py create mode 100644 results/2026-10-29_near_tie/compare_v5_v8.txt create mode 100644 results/2026-10-29_near_tie/cross_call_pairs.tsv diff --git a/results/2026-10-29_near_tie/README.md b/results/2026-10-29_near_tie/README.md new file mode 100644 index 00000000..3a2d1c10 --- /dev/null +++ b/results/2026-10-29_near_tie/README.md @@ -0,0 +1,42 @@ +# The near-tie margin: replaced by a genome-level decision (curator decision of 2026-10-29) + +`--cross-family-policy on` (PR #214) kept, for two families calling one locus where neither is scoped to the genome, the call with the higher best core-gene identity, except that within `NEAR_TIE_POINTS` = 3 points the family without a `confirm_outside_scope` rule (MATsc) was kept and flagged `family_unconfirmed`. The 3 was a draft value, never validated. The curator asked for it to be evaluated. + +## Evidence + +`cross_call_pairs.tsv`: the 156 cross-called locus pairs of the 354-genome replay (v5), 140 genomes, all MATsc against MTL; identity gap = kept minus other best core-gene identity. An independent evaluation (a second model, read-only, 23 tool calls, from this table and the full reports) found: + +- **No natural break at 3 points.** Per species the gaps run continuously from -3.3 to +1.7. The cutoff splits congeners: *Ambrosiozyma oregonensis* (-2.6) is kept as MATsc, *A. angophorae*, *A. neoplatypodis* and *A. ambrosiae* (-3.2 to -3.3) as MTL. +- **The score is too coarse for a 3-point rule.** The kept call's best alignment has a median 59 aa at 38% coverage, so one residue is about 1.7 points and the standard error of one identity is about 6.5 points. The two identities come from different reference proteins, often different genes (41 of 105 kept MATsc calls take their best identity from MATA2 or MATALPHA2, which the registry marks `idiomorph_informative: false`). +- **The MATsc tie-break is biased.** `sla2` is searched only by MATsc and PAP1/OBP1/PIK1 only by MTL, so gene counts and flank evidence are not comparable; no MTL call reached two flank genes. In 4 near ties the two families call different idiomorphs, so the tie-break silently sets MATa against alpha. +- **Per-locus decisions give genomes with two families** (4 genomes in v5), which cannot be right for one genome. +- **The flag measured "MTL was involved", not uncertainty**: every MTL call outside Serinales is flagged by the flank rule anyway, and every margin option flags 65-108 calls. + +The evaluation's counts for 156 pairs: margin 0: 5 near ties; 1: 19; 2: 34; 3: 42; 5: 72; genome-level mean with no margin: 0 mixed genomes and 1 lower-identity call kept, against 4 and 12 at 3 points. + +## Decision (option A) + +1. No margin and no preference for either family. +2. For every group of overlapping cross-family calls with no family scoped to the genome, the family is decided once for the genome: the higher mean, over those groups, of each family's best core-gene identity (equal means: the smaller family name). +3. Every such kept call carries `family_ambiguous` (identities of both families, their gap, the genome means and locus counts): GFF3 attribute `family_ambiguous=` and a YAML block. `family_unconfirmed` is now only the PAP1/OBP1/PIK1 flank rule for MTL outside Serinales. +4. The set-aside call's gene evidence (gene, role, identity, coverage, status) is kept in its `cross_call` note, so the two families can be compared gene for gene after a run. + +## Replay with the new rule (job 31429403; `compare_v5_v8.py`, `compare_v5_v8.txt`) + +354 genomes, `--preset v0.8`, the database of `main` (no MATpk): + +| | v5 (3-point margin) | v8 (genome-level) | +|---|---|---| +| genomes whose cross-called loci keep two families | 4 | 0 | +| `cross_call_near_tie` flags | 42 | 0 | +| `family_ambiguous` loci | - | 156 in 140 genomes (MATsc kept 91, MTL 65) | +| kept call has the lower identity | 12 | 1 (gap -1.5) | +| `mtl_outside_scope` unconfirmed / confirmed | 75 / 5 | 89 / 5 | +| genomes whose calls change | | 14 | + +The 14 genomes change family (and so idiomorph names, MATa against A and so on); for most the per-locus rule had kept MATsc where the genus leans to MTL. The extra 14 `mtl_outside_scope` flags are those MTL calls, which have no PAP1/OBP1/PIK1 support. + +## Open + +- There is still no ground truth: the family is a choice between two reference systems by best-hit identity. The evaluation suggests per-genus curator rulings (Ambrosiozyma, Saccharomycopsis, Pichia, the Wickerhamomycetaceae, as for MATkp, MATog and MATpk), HMG/alpha-box profile scoring against both reference sets, and synteny of a sample per genus. +- With the genome-level rule a genome with only one cross-called locus is decided by that locus alone (as before). diff --git a/results/2026-10-29_near_tie/compare_v5_v8.py b/results/2026-10-29_near_tie/compare_v5_v8.py new file mode 100644 index 00000000..8052ef3b --- /dev/null +++ b/results/2026-10-29_near_tie/compare_v5_v8.py @@ -0,0 +1,38 @@ +"""Before (v5: per-locus rule with a 3-point near-tie margin) and after (v8: the family decided once per genome by mean identity, +`family_ambiguous` on every unscoped cross-call) on the 354 yeast genomes. usage: python3 compare_v5_v8.py """ +import collections, glob, os, sys +import yaml + +R = sys.argv[1] + +def load(run): + out = {} + for d in sorted(glob.glob(f"{R}/{run}/runs/*")): + f = d + "/detection_report.yaml" + if os.path.exists(f): + out[os.path.basename(d)] = yaml.safe_load(open(f)).get("detected") or [] + return out + +v5, v8 = load("out_v5"), load("out_v8") +fam = lambda loci: sorted({l["family"].split(":")[1] for l in loci}) +print("genomes", len(v5), len(v8)) +mixed = lambda d: sum(1 for loci in d.values() if len(fam([l for l in loci if l.get("cross_call")])) > 1) +print("genomes whose cross-called loci keep two different families: v5", mixed(v5), "v8", mixed(v8)) +amb = [(g, l) for g, loci in v8.items() for l in loci if l.get("family_ambiguous")] +print("v8 loci with family_ambiguous:", len(amb), "in", len({g for g, _ in amb}), "genomes; kept family", collections.Counter(l["family"].split(":")[1] for g, l in amb)) +lower = sum(1 for g, l in amb if (l["family_ambiguous"]["gap"] or 0) < 0) +print("kept call has the lower identity:", lower) +gaps = [l["family_ambiguous"]["gap"] for g, l in amb if l["family_ambiguous"]["gap"] is not None] +print("gap (kept minus other), min/median/max:", min(gaps), sorted(gaps)[len(gaps) // 2], max(gaps)) +st = collections.Counter((l.get("family_status") or {}).get("status", "") + ":" + (l.get("family_status") or {}).get("reason", "") for loci in v8.values() for l in loci) +print("family_status v8:", dict(st)) +st5 = collections.Counter((l.get("family_status") or {}).get("status", "") + ":" + (l.get("family_status") or {}).get("reason", "") for loci in v5.values() for l in loci) +print("family_status v5:", dict(st5)) +changed = [] +for g in v5: + a = sorted((l["contig"], l["start"], l["family"].split(":")[1], l.get("idiomorph")) for l in v5[g]) + b = sorted((l["contig"], l["start"], l["family"].split(":")[1], l.get("idiomorph")) for l in v8.get(g, [])) + if a != b: changed.append((g, a, b)) +print("genomes whose calls differ:", len(changed)) +for g, a, b in changed[:40]: + print(" ", g, [x[2:] for x in a], "=>", [x[2:] for x in b]) diff --git a/results/2026-10-29_near_tie/compare_v5_v8.txt b/results/2026-10-29_near_tie/compare_v5_v8.txt new file mode 100644 index 00000000..c83d91e1 --- /dev/null +++ b/results/2026-10-29_near_tie/compare_v5_v8.txt @@ -0,0 +1,22 @@ +genomes 354 354 +genomes whose cross-called loci keep two different families: v5 4 v8 0 +v8 loci with family_ambiguous: 156 in 140 genomes; kept family Counter({'MATsc': 91, 'MTL': 65}) +kept call has the lower identity: 1 +gap (kept minus other), min/median/max: -1.5 5.29 64.41 +family_status v8: {':': 345, 'family_unconfirmed:mtl_outside_scope': 89, 'family_confirmed:mtl_outside_scope': 5} +family_status v5: {':': 317, 'family_unconfirmed:cross_call_near_tie': 42, 'family_unconfirmed:mtl_outside_scope': 75, 'family_confirmed:mtl_outside_scope': 5} +genomes whose calls differ: 14 + GCA_001936135.1_KJJ81 [('MTL', 'alpha'), ('MATsc', 'MATalpha')] => [('MTL', 'alpha'), ('MTL', 'alpha')] + GCA_003706315.3_ASM370631v3 [('MATsc', 'MATalpha'), ('MTL', 'A')] => [('MTL', 'alpha'), ('MTL', 'A')] + GCA_030557395.1_ASM3055739v1 [('MTL', 'A'), ('MATsc', 'MATalpha')] => [('MTL', 'A'), ('MTL', 'alpha')] + GCA_030567455.1_ASM3056745v1 [('MATsc', 'MATa')] => [('MTL', 'A')] + GCA_030570795.1_ASM3057079v1 [('MATsc', 'MATa')] => [('MTL', 'alpha')] + GCA_030574715.1_ASM3057471v1 [('MATsc', 'MATa'), ('MATsc', 'MATalpha')] => [('MTL', 'A'), ('MATsc', 'MATalpha')] + GCA_030579955.1_ASM3057995v1 [('MTL', 'A'), ('MATsc', 'MATalpha')] => [('MTL', 'A'), ('MTL', 'alpha')] + GCA_030580455.1_ASM3058045v1 [('MATsc', 'MATa')] => [('MTL', 'A')] + GCA_037355565.1_Ssch_CD502 [('MATsc', 'MATalpha')] => [('MTL', 'alpha')] + GCA_041498895.1_ASM4149889v1 [('MATsc', 'MATa')] => [('MTL', 'A')] + GCA_054085685.1_DORT_Sapseu_12645 [('MATsc', 'MATalpha')] => [('MTL', 'alpha')] + GCA_054085705.1_DORT_Sapseu_12643 [('MATsc', 'MATalpha')] => [('MTL', 'alpha')] + GCA_054953955.1_ASM5495395v1 [('MTL', 'alpha'), ('MTL', 'alpha'), ('MTL', 'alpha'), ('MTL', 'alpha'), ('MTL', 'A'), ('MATsc', 'MATalpha'), ('MTL', 'alpha')] => [('MTL', 'alpha'), ('MTL', 'alpha'), ('MTL', 'alpha'), ('MTL', 'alpha'), ('MTL', 'A'), ('MTL', 'alpha'), ('MTL', 'alpha')] + GCF_020623625.1_UHD_SCDLUD_16 [('MATsc', 'MATalpha')] => [('MTL', 'alpha')] diff --git a/results/2026-10-29_near_tie/cross_call_pairs.tsv b/results/2026-10-29_near_tie/cross_call_pairs.tsv new file mode 100644 index 00000000..4b0dc0df --- /dev/null +++ b/results/2026-10-29_near_tie/cross_call_pairs.tsv @@ -0,0 +1,157 @@ +genome species order family kept kept_idio kept_conf kept_class kept_best kept_genes other other_idio other_conf other_class other_best other_genes gap near status reason +GCA_001599195.1_JCM_3601_assembly_v001 Petasospora fabianii Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 58.18 MATA1|MATA2|sla2 MTL A medium mat_locus 57.14 MTLA1|MTLA2|PIK1 1.04 True family_unconfirmed cross_call_near_tie +GCA_001599295.1_JCM_9486_assembly_v001 Sporopachydermia quercuum Sporopachydermiales Sporopachydermiaceae MATsc MATa high mat_locus 50.94 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 MTL alpha high idiomorph_gene_only 42.67 MTLA1|MTLA2|MTLalpha1|MTLalpha2 8.27 False +GCA_001599995.1_JCM_7599_assembly_v001 Ambrosiozyma monospora Pichiales Pichiaceae MTL A high idiomorph_gene_only 49.15 MTLA1|MTLA2 MATsc MATa medium partial_locus 39.76 MATA1|sla2 9.39 False family_unconfirmed mtl_outside_scope +GCA_001661245.1_Pacta1_2 Pachysolen tannophilus Alaninales Pachysolenaceae MTL alpha medium mat_locus 53.45 MTLA1|MTLA2|MTLalpha1|MTLalpha2|PIK1 MATsc MATa medium mat_locus 44.21 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 9.24 False family_unconfirmed mtl_outside_scope +GCA_001936135.1_KJJ81 Saccharomycopsis fibuligera x Saccharomycopsis cf. fibuligera Ascoideales Saccharomycopsidaceae MATsc MATalpha medium mat_locus 47.222 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 MTL alpha medium idiomorph_gene_only 47.22 MTLA1|MTLA2|MTLalpha1|MTLalpha2 0.0 True family_unconfirmed cross_call_near_tie +GCA_001936135.1_KJJ81 Saccharomycopsis fibuligera x Saccharomycopsis cf. fibuligera Ascoideales Saccharomycopsidaceae MTL alpha medium idiomorph_gene_only 50.0 MTLA1|MTLA2|MTLalpha1|MTLalpha2 MATsc MATalpha medium mat_locus 37.33 MATALPHA1|MATA1|MATA2|sla2 12.67 False family_unconfirmed mtl_outside_scope +GCA_001936155.1_KPH12 Saccharomycopsis fibuligera Ascoideales Saccharomycopsidaceae MTL alpha medium idiomorph_gene_only 50.0 MTLA1|MTLA2|MTLalpha1|MTLalpha2 MATsc MATalpha medium mat_locus 37.33 MATALPHA1|MATA1|MATA2|sla2 12.67 False family_unconfirmed mtl_outside_scope +GCA_001936275.1_ATCC36309 Saccharomycopsis fibuligera Ascoideales Saccharomycopsidaceae MTL alpha medium idiomorph_gene_only 47.54 MTLA1|MTLA2|MTLalpha1|MTLalpha2 MATsc MATalpha medium mat_locus 37.33 MATALPHA1|MATA1|MATA2|sla2 10.21 False family_unconfirmed mtl_outside_scope +GCA_003123585.1_ASM312358v1 Barnettozyma californica Phaffomycetales Phaffomycetaceae MTL A high mat_locus 51.72 MTLA1|MTLA2|MTLalpha1|OBP1 MATsc MATa high mat_locus 42.53 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 9.19 False family_unconfirmed mtl_outside_scope +GCA_003123885.1_ASM312388v1 Barnettozyma californica Phaffomycetales Phaffomycetaceae MTL A high mat_locus 51.72 MTLA1|MTLA2|MTLalpha1|OBP1 MATsc MATa high mat_locus 42.53 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 9.19 False family_unconfirmed mtl_outside_scope +GCA_003243015.1_ASM324301v1 Saccharomycopsis capsularis Ascoideales Saccharomycopsidaceae MATsc MATalpha medium partial_locus 39.44 MATALPHA1|MATA2|sla2 MTL alpha medium idiomorph_gene_only 29.14 MTLalpha1|MTLalpha2 10.3 False +GCA_003327685.1_ASM332768v1 Pichia kluyveri Pichiales Pichiaceae MATsc MATalpha high mat_locus 51.85 MATALPHA1|MATALPHA2|sla2 MTL alpha high idiomorph_gene_only 35.71 MTLalpha1|MTLalpha2 16.14 False +GCA_003339355.1_UCD_Pferm_PL1 Pichia fermentans Pichiales Pichiaceae MATsc MATalpha high idiomorph_gene_only 46.55 MATALPHA1|MATALPHA2 MTL alpha high idiomorph_gene_only 40.0 MTLalpha1|MTLalpha2 6.55 False +GCA_003339405.1_UCD_Pnorv_NO1 Pichia norvegensis Pichiales Pichiaceae MATsc MATalpha medium mat_locus 47.76 MATALPHA1|MATALPHA2|sla2 MTL alpha medium idiomorph_gene_only 42.7 MTLalpha1|MTLalpha2 5.06 False +GCA_003705185.2_ASM370518v2 Ambrosiozyma ambrosiae Pichiales Pichiaceae MTL alpha high idiomorph_gene_only 50.6 MTLalpha1|MTLalpha2 MATsc MATalpha medium idiomorph_gene_only 47.37 MATALPHA1|MATALPHA2|MATA2 3.23 False family_unconfirmed mtl_outside_scope +GCA_003705185.2_ASM370518v2 Ambrosiozyma ambrosiae Pichiales Pichiaceae MTL A high idiomorph_gene_only 42.62 MTLA1|MTLA2 MATsc MATa high mat_locus 35.0 MATA1|MATA2|sla2 7.62 False family_unconfirmed mtl_outside_scope +GCA_003705225.2_ASM370522v2 Ambrosiozyma vanderkliftii Pichiales Pichiaceae MATsc MATalpha medium mat_locus 48.21 MATALPHA1|MATALPHA2|MATA2|sla2 MTL alpha high idiomorph_gene_only 46.48 MTLalpha1|MTLalpha2 1.73 True family_unconfirmed cross_call_near_tie +GCA_003705515.2_ASM370551v2 Pichia kudriavzevii Pichiales Pichiaceae MATsc MATa medium mat_locus 51.06 MATALPHA1|MATALPHA2|MATA1|sla2 MTL alpha medium idiomorph_gene_only 42.42 MTLA1|MTLalpha1|MTLalpha2 8.64 False +GCA_003706235.2_ASM370623v2 Wenyingozyma naganishii Pichiales Pichiaceae MTL alpha medium idiomorph_gene_only 53.33 MTLA1|MTLA2|MTLalpha1|MTLalpha2 MATsc MATa medium mat_locus 42.11 MATALPHA1|MATALPHA2|MATA1|sla2 11.22 False family_unconfirmed mtl_outside_scope +GCA_003706315.3_ASM370631v3 Ambrosiozyma oregonensis Pichiales Pichiaceae MATsc MATalpha medium idiomorph_gene_only 45.45 MATALPHA1|MATALPHA2|MATA2 MTL alpha high idiomorph_gene_only 48.1 MTLalpha1|MTLalpha2 -2.65 True family_unconfirmed cross_call_near_tie +GCA_003706445.3_ASM370644v3 Williopsis mrakii Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 60.0 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 MTL A high mat_locus 48.39 MTLA1|MTLA2|MTLalpha1|PAP1 11.61 False +GCA_003706615.3_ASM370661v3 Gotozyma montana Phaffomycetales Phaffomycetaceae MATsc MATa medium partial_locus 55.93 MATA1|sla2 MTL A high idiomorph_gene_only 47.69 MTLA1|MTLA2 8.24 False +GCA_003706635.2_ASM370663v2 Ambrosiozyma maleeae Pichiales Pichiaceae MTL alpha medium mat_locus 45.83 MTLalpha1|MTLalpha2|PAP1 MATsc MATalpha medium mat_locus 37.97 MATALPHA1|MATALPHA2|sla2 7.86 False family_unconfirmed mtl_outside_scope +GCA_003706655.3_ASM370665v3 Barnettozyma californica Phaffomycetales Phaffomycetaceae MTL A high mat_locus 51.72 MTLA1|MTLA2|MTLalpha1|OBP1 MATsc MATa high mat_locus 42.53 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 9.19 False family_unconfirmed mtl_outside_scope +GCA_003706665.2_ASM370666v2 Barnettozyma hawaiiensis Phaffomycetales Phaffomycetaceae MATsc MATa medium mat_locus 46.875 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 MTL A high mat_locus 43.59 MTLA1|MTLA2|MTLalpha1|OBP1 3.28 False +GCA_003706765.3_ASM370676v3 Xingzhongia hampshirensis Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 54.55 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 MTL alpha high mat_locus 53.57 MTLA1|MTLA2|MTLalpha1|MTLalpha2|PAP1 0.98 True family_unconfirmed cross_call_near_tie +GCA_003707015.3_ASM370701v3 Wickerhamomyces canadensis Phaffomycetales Wickerhamomycetaceae MATsc MATa medium partial_locus 62.5 MATA1|sla2 MTL A high idiomorph_gene_only 58.18 MTLA1|MTLA2 4.32 False +GCA_003707205.3_ASM370720v3 Kregervanrija delftensis Pichiales Pichiaceae MATsc MATa medium idiomorph_gene_only 51.85 MATALPHA1|MATALPHA2|MATA1 MTL alpha high idiomorph_gene_only 41.67 MTLA1|MTLA2|MTLalpha1|MTLalpha2 10.18 False +GCA_003707275.3_ASM370727v3 Kregervanrija fluxuum Pichiales Pichiaceae MATsc MATa medium idiomorph_gene_only 38.89 MATALPHA1|MATALPHA2|MATA1 MTL alpha medium idiomorph_gene_only 38.67 MTLA1|MTLalpha1|MTLalpha2 0.22 True family_unconfirmed cross_call_near_tie +GCA_003707675.3_ASM370767v3 Ambrosiozyma philentoma Pichiales Pichiaceae MTL alpha high idiomorph_gene_only 49.4 MTLalpha1|MTLalpha2 MATsc MATalpha medium idiomorph_gene_only 39.44 MATALPHA1|MATALPHA2|MATA2 9.96 False family_unconfirmed mtl_outside_scope +GCA_003707675.3_ASM370767v3 Ambrosiozyma philentoma Pichiales Pichiaceae MTL A high idiomorph_gene_only 42.19 MTLA1|MTLA2 MATsc MATa high mat_locus 37.31 MATA1|MATA2|sla2 4.88 False family_unconfirmed mtl_outside_scope +GCA_003707735.2_ASM370773v2 Candida freyschussii Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 56.36 MATA1|MATA2|sla2 MTL A high idiomorph_gene_only 50.82 MTLA1|MTLA2 5.54 False +GCA_003707885.2_ASM370788v2 Komagataea salicaria Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 55.0 MATALPHA1|MATA1|MATA2|sla2 MTL A high homothallic_candidate 40.48 MTLA1|MTLA2|MTLalpha1|OBP1 14.52 False +GCA_003708265.3_ASM370826v3 Williopsis vartiovaarae Phaffomycetales Wickerhamomycetaceae MATsc MATa medium mat_locus 52.54 MATA1|MATA2|sla2 MTL A high idiomorph_gene_only 50.0 MTLA1|MTLA2 2.54 True family_unconfirmed cross_call_near_tie +GCA_003708285.2_ASM370828v2 Petasospora xylosilytica Phaffomycetales Wickerhamomycetaceae MATsc MATa medium partial_locus 56.36 MATA1|sla2 MTL A medium mat_locus 56.36 MTLA1|MTLA2|PIK1 0.0 True family_unconfirmed cross_call_near_tie +GCA_003708295.3_ASM370829v3 Petasospora mycetangii Phaffomycetales Wickerhamomycetaceae MTL A high idiomorph_gene_only 50.0 MTLA1|MTLA2 MATsc MATa medium mat_locus 43.02 MATA1|MATA2|sla2 6.98 False family_unconfirmed mtl_outside_scope +GCA_003709245.3_ASM370924v3 Williopsis saturnus Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 63.64 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 MTL A high mat_locus 46.38 MTLA1|MTLA2|MTLalpha1|PAP1 17.26 False +GCA_004931855.1_ASM493185v1 Pichia inconspicua Pichiales Pichiaceae MATsc MATalpha high idiomorph_gene_only 40.48 MATALPHA1|MATALPHA2 MTL alpha high idiomorph_gene_only 40.0 MTLalpha1|MTLalpha2 0.48 True family_unconfirmed cross_call_near_tie +GCA_010994365.1_ASM1099436v1 Saccharomycopsis schoenii Ascoideales Saccharomycopsidaceae MTL alpha medium idiomorph_gene_only 50.0 MTLA1|MTLalpha1|MTLalpha2 MATsc MATalpha medium idiomorph_gene_only 45.71 MATALPHA1|MATALPHA2|MATA1 4.29 False family_unconfirmed mtl_outside_scope +GCA_012062855.1_ASM1206285v1 Saccharomycopsis fibuligera Ascoideales Saccharomycopsidaceae MTL alpha medium idiomorph_gene_only 50.0 MTLA1|MTLA2|MTLalpha1|MTLalpha2 MATsc MATalpha medium mat_locus 37.33 MATALPHA1|MATA1|MATA2|sla2 12.67 False family_unconfirmed mtl_outside_scope +GCA_017948575.1_ASM1794857v1 Williopsis subsufficiens Phaffomycetales Wickerhamomycetaceae MATsc MATa medium mat_locus 63.64 MATALPHA1|MATALPHA2|MATA1|sla2 MTL A high mat_locus 49.21 MTLA1|MTLA2|MTLalpha1|MTLalpha2|PAP1 14.43 False +GCA_018343965.1_ASM1834396v1 Petasospora fabianii Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 58.18 MATA1|MATA2|sla2 MTL A medium mat_locus 57.14 MTLA1|MTLA2|PIK1 1.04 True family_unconfirmed cross_call_near_tie +GCA_019096115.1_ASM1909611v1 Pichia kluyveri Pichiales Pichiaceae MATsc MATalpha high mat_locus 51.85 MATALPHA1|MATALPHA2|sla2 MTL alpha high idiomorph_gene_only 35.71 MTLalpha1|MTLalpha2 16.14 False +GCA_019155655.1_ASM1915565v1 Kregervanrija delftensis Pichiales Pichiaceae MATsc MATa medium mat_locus 51.85 MATALPHA1|MATALPHA2|MATA1|sla2 MTL alpha high idiomorph_gene_only 41.67 MTLA1|MTLA2|MTLalpha1|MTLalpha2 10.18 False +GCA_020280145.1_ASM2028014v1 Gotozyma botsteinii Phaffomycetales Phaffomycetaceae MTL alpha high mat_locus 52.46 MTLA1|MTLA2|MTLalpha1|PAP1 MATsc MATa medium mat_locus 45.0 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 7.46 False family_unconfirmed mtl_outside_scope +GCA_020995425.1_ASM2099542v1 Williopsis sargentensis Phaffomycetales Wickerhamomycetaceae MATsc MATa medium mat_locus 52.54 MATA1|MATA2|sla2 MTL A high idiomorph_gene_only 50.0 MTLA1|MTLA2 2.54 True family_unconfirmed cross_call_near_tie +GCA_022641835.1_ASM2264183v1 Petasospora fabianii Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 58.18 MATA1|MATA2|sla2 MTL A medium mat_locus 57.14 MTLA1|MTLA2|PIK1 1.04 True family_unconfirmed cross_call_near_tie +GCA_023497445.1_ASM2349744v1 Saccharomycopsis fibuligera Ascoideales Saccharomycopsidaceae MTL alpha medium idiomorph_gene_only 47.222 MTLA1|MTLA2|MTLalpha1|MTLalpha2 MATsc MATalpha medium mat_locus 37.33 MATALPHA1|MATA1|MATA2|sla2 9.89 False family_unconfirmed mtl_outside_scope +GCA_023627795.1_ASM2362779v1 Barnettozyma californica Phaffomycetales Phaffomycetaceae MTL A high mat_locus 51.72 MTLA1|MTLA2|MTLalpha1|OBP1 MATsc MATa high mat_locus 42.53 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 9.19 False family_unconfirmed mtl_outside_scope +GCA_023629335.1_ASM2362933v1 Pichia kluyveri Pichiales Pichiaceae MATsc MATalpha high mat_locus 51.85 MATALPHA1|MATALPHA2|sla2 MTL alpha high idiomorph_gene_only 35.71 MTLalpha1|MTLalpha2 16.14 False +GCA_025531525.1_ASM2553152v1 Pichia sp. P7020A Pichiales Pichiaceae MATsc MATalpha high mat_locus 46.55 MATALPHA1|MATALPHA2|sla2 MTL alpha high idiomorph_gene_only 40.0 MTLalpha1|MTLalpha2 6.55 False +GCA_025531535.1_ASM2553153v1 Pichia sp. F1605B Pichiales Pichiaceae MATsc MATalpha high mat_locus 46.55 MATALPHA1|MATALPHA2|sla2 MTL alpha high idiomorph_gene_only 40.0 MTLalpha1|MTLalpha2 6.55 False +GCA_025531545.1_ASM2553154v1 Pichia inconspicua Pichiales Pichiaceae MATsc MATalpha high idiomorph_gene_only 40.48 MATALPHA1|MATALPHA2 MTL alpha high idiomorph_gene_only 40.0 MTLalpha1|MTLalpha2 0.48 True family_unconfirmed cross_call_near_tie +GCA_025531555.1_ASM2553155v1 Pichia inconspicua Pichiales Pichiaceae MATsc MATalpha high mat_locus 40.48 MATALPHA1|MATALPHA2|sla2 MTL alpha high idiomorph_gene_only 40.0 MTLalpha1|MTLalpha2 0.48 True family_unconfirmed cross_call_near_tie +GCA_029299855.1_ASM2929985v1 Saccharomycopsidaceae sp. Ascoideales Saccharomycopsidaceae MTL alpha high idiomorph_gene_only 42.34 MTLalpha1|MTLalpha2 MATsc MATalpha medium idiomorph_gene_only 37.33 MATALPHA1|MATA2 5.01 False family_unconfirmed mtl_outside_scope +GCA_030267745.1_ASM3026774v1 Ambrosiozyma monospora Pichiales Pichiaceae MATsc MATalpha medium idiomorph_gene_only 44.78 MATALPHA1|MATALPHA2 MTL alpha medium idiomorph_gene_only 43.28 MTLalpha1|MTLalpha2 1.5 True family_unconfirmed cross_call_near_tie +GCA_030556525.1_ASM3055652v1 Wickerhamomyces quercuum Phaffomycetales Wickerhamomycetaceae MATsc MATa medium partial_locus 60.34 MATA1|sla2 MTL A high mat_locus 54.24 MTLA1|MTLA2|OBP1 6.1 False +GCA_030557365.1_ASM3055736v1 Williopsis sargentensis Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 58.18 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 MTL A high mat_locus 48.44 MTLA1|MTLA2|MTLalpha1|PAP1 9.74 False +GCA_030557395.1_ASM3055739v1 Ambrosiozyma platypodis Pichiales Pichiaceae MATsc MATalpha medium idiomorph_gene_only 45.76 MATALPHA1|MATALPHA2|MATA2 MTL alpha high idiomorph_gene_only 46.99 MTLalpha1|MTLalpha2 -1.23 True family_unconfirmed cross_call_near_tie +GCA_030557395.1_ASM3055739v1 Ambrosiozyma platypodis Pichiales Pichiaceae MTL A high idiomorph_gene_only 43.08 MTLA1|MTLA2 MATsc MATa high mat_locus 35.82 MATA1|MATA2|sla2 7.26 False family_unconfirmed mtl_outside_scope +GCA_030557705.1_ASM3055770v1 Taiozyma odintsovae Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 55.93 MATA1|MATA2|sla2 MTL A high idiomorph_gene_only 43.08 MTLA1|MTLA2 12.85 False +GCA_030558335.1_ASM3055833v1 Petasospora stauntonica Phaffomycetales Wickerhamomycetaceae MTL A high idiomorph_gene_only 52.38 MTLA1|MTLA2 MATsc MATa medium partial_locus 44.93 MATA1|sla2 7.45 False family_unconfirmed mtl_outside_scope +GCA_030558495.1_ASM3055849v1 Pichia insulana Pichiales Pichiaceae MATsc MATalpha high mat_locus 41.67 MATALPHA1|MATALPHA2|sla2 MTL alpha high idiomorph_gene_only 41.18 MTLalpha1|MTLalpha2 0.49 True family_unconfirmed cross_call_near_tie +GCA_030561065.1_ASM3056106v1 Sporopachydermia cereana Sporopachydermiales Sporopachydermiaceae MATsc MATalpha medium idiomorph_gene_only 42.47 MATALPHA1|MATALPHA2 MTL alpha medium idiomorph_gene_only 38.81 MTLalpha1|MTLalpha2 3.66 False +GCA_030563305.1_ASM3056330v1 Petasospora maesae Phaffomycetales Wickerhamomycetaceae MTL A high mat_locus 56.36 MTLA1|MTLA2|PIK1 MATsc MATa medium partial_locus 50.0 MATA1|sla2 6.36 False family_unconfirmed mtl_outside_scope +GCA_030563965.1_ASM3056396v1 Pichia cactophila Pichiales Pichiaceae MATsc MATa medium partial_locus 50.0 MATALPHA2|MATA1|sla2 MTL alpha medium idiomorph_gene_only 48.15 MTLA1|MTLA2|MTLalpha2 1.85 True family_unconfirmed cross_call_near_tie +GCA_030564545.1_ASM3056454v1 Saturnispora mendoncae Pichiales Pichiaceae MTL alpha high idiomorph_gene_only 48.15 MTLalpha1|MTLalpha2 MATsc MATalpha high idiomorph_gene_only 42.86 MATALPHA1|MATALPHA2 5.29 False family_unconfirmed mtl_outside_scope +GCA_030565225.1_ASM3056522v1 Allodekkera sacchari Pichiales Pichiaceae MATsc MATalpha medium mat_locus 50.0 MATALPHA1|MATALPHA2|MATA1|sla2 MTL alpha high idiomorph_gene_only 38.46 MTLalpha1|MTLalpha2 11.54 False +GCA_030567395.1_ASM3056739v1 Citeromyces hawaiiensis Pichiales Pichiaceae MTL alpha medium idiomorph_gene_only 45.0 MTLalpha1|MTLalpha2 MATsc MATalpha medium mat_locus 41.89 MATALPHA1|MATALPHA2|sla2 3.11 False family_unconfirmed mtl_outside_scope +GCA_030567455.1_ASM3056745v1 Komagataea norvegica Phaffomycetales Wickerhamomycetaceae MATsc MATa medium mat_locus 56.36 MATA1|MATA2|sla2 MTL A high idiomorph_gene_only 58.18 MTLA1|MTLA2 -1.82 True family_unconfirmed cross_call_near_tie +GCA_030567475.1_ASM3056747v1 Ambrosiozyma angophorae Pichiales Pichiaceae MTL alpha high idiomorph_gene_only 54.17 MTLalpha1|MTLalpha2 MATsc MATalpha medium mat_locus 50.88 MATALPHA1|MATALPHA2|MATA2|sla2 3.29 False family_unconfirmed mtl_outside_scope +GCA_030567475.1_ASM3056747v1 Ambrosiozyma angophorae Pichiales Pichiaceae MTL alpha high idiomorph_gene_only 54.17 MTLalpha1|MTLalpha2 MATsc MATalpha medium mat_locus 50.88 MATALPHA1|MATALPHA2|MATA2|sla2 3.29 False family_unconfirmed mtl_outside_scope +GCA_030567475.1_ASM3056747v1 Ambrosiozyma angophorae Pichiales Pichiaceae MTL alpha high idiomorph_gene_only 54.17 MTLalpha1|MTLalpha2 MATsc MATalpha high mat_locus 50.88 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 3.29 False family_unconfirmed mtl_outside_scope +GCA_030567495.1_ASM3056749v1 Ambrosiozyma neoplatypodis Pichiales Pichiaceae MTL alpha high idiomorph_gene_only 40.3 MTLalpha1|MTLalpha2 MATsc MATalpha medium mat_locus 37.04 MATALPHA1|MATALPHA2|MATA2|sla2 3.26 False family_unconfirmed mtl_outside_scope +GCA_030568845.1_ASM3056884v1 Millerago galiae Phaffomycetales Phaffomycetaceae MATsc MATa medium mat_locus 58.49 MATA1|MATA2|sla2 MTL A high idiomorph_gene_only 44.44 MTLA1|MTLA2 14.05 False +GCA_030569135.1_ASM3056913v1 Pichia inconspicua Pichiales Pichiaceae MATsc MATalpha high idiomorph_gene_only 40.48 MATALPHA1|MATALPHA2 MTL alpha high idiomorph_gene_only 40.0 MTLalpha1|MTLalpha2 0.48 True family_unconfirmed cross_call_near_tie +GCA_030569275.1_ASM3056927v1 Candida sanyiensis Phaffomycetales Phaffomycetaceae MATsc MATa medium partial_locus 51.72 MATA1|sla2 MTL A high idiomorph_gene_only 48.28 MTLA1|MTLA2 3.44 False +GCA_030569515.1_ASM3056951v1 Barnettozyma vustinii Phaffomycetales Phaffomycetaceae MATsc MATa medium partial_locus 50.91 MATA1|sla2 MTL A high idiomorph_gene_only 50.72 MTLA1|MTLA2 0.19 True family_unconfirmed cross_call_near_tie +GCA_030569745.1_ASM3056974v1 Petasospora bimundalis Phaffomycetales Wickerhamomycetaceae MTL A high idiomorph_gene_only 45.59 MTLA1|MTLA2 MATsc MATa high mat_locus 41.38 MATA1|MATA2|sla2 4.21 False family_unconfirmed mtl_outside_scope +GCA_030570285.1_ASM3057028v1 Pichia norvegensis Pichiales Pichiaceae MATsc MATalpha medium mat_locus 47.76 MATALPHA1|MATALPHA2|sla2 MTL alpha medium idiomorph_gene_only 42.7 MTLalpha1|MTLalpha2 5.06 False +GCA_030570795.1_ASM3057079v1 Wickerhamomyces silvicola Phaffomycetales Wickerhamomycetaceae MATsc MATa medium mat_locus 40.32 MATALPHA1|MATALPHA2|MATA1|sla2 MTL alpha medium idiomorph_gene_only 41.54 MTLA1|MTLA2|MTLalpha1|MTLalpha2 -1.22 True family_unconfirmed cross_call_near_tie +GCA_030570875.1_ASM3057087v1 Citeromyces matritensis Pichiales Pichiaceae MTL alpha medium idiomorph_gene_only 43.59 MTLA1|MTLalpha1|MTLalpha2 MATsc MATalpha high mat_locus 37.65 MATALPHA1|MATALPHA2|sla2 5.94 False family_unconfirmed mtl_outside_scope +GCA_030571235.1_ASM3057123v1 Wickerhamomyces sp. yHMH26 Phaffomycetales Wickerhamomycetaceae MATsc MATa medium mat_locus 59.32 MATA1|MATA2|sla2 MTL A high idiomorph_gene_only 53.45 MTLA1|MTLA2 5.87 False +GCA_030572235.1_ASM3057223v1 Ambrosiozyma kamigamensis Pichiales Pichiaceae MATsc MATalpha medium mat_locus 47.46 MATALPHA1|MATALPHA2|MATA2|sla2 MTL alpha high idiomorph_gene_only 40.3 MTLalpha1|MTLalpha2 7.16 False +GCA_030572555.1_ASM3057255v1 Candida sp. Saccharomycetales MATsc MATa medium mat_locus 62.07 MATA1|MATA2|sla2 MTL A high mat_locus 55.17 MTLA1|MTLA2|OBP1 6.9 False +GCA_030572875.1_ASM3057287v1 Wickerhamomyces kurtzmanii Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 59.02 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 MTL alpha high idiomorph_gene_only 49.23 MTLA1|MTLA2|MTLalpha1|MTLalpha2 9.79 False +GCA_030574175.1_ASM3057417v1 Williopsis subsufficiens Phaffomycetales Wickerhamomycetaceae MATsc MATa medium mat_locus 63.64 MATALPHA1|MATALPHA2|MATA1|sla2 MTL A medium mat_locus 50.79 MTLA1|MTLA2|MTLalpha1|PAP1 12.85 False +GCA_030574595.1_ASM3057459v1 Ruyongia chambardii Phaffomycetales Wickerhamomycetaceae MATsc MATalpha medium mat_locus 47.95 MATALPHA1|MATALPHA2|MATA2|sla2 MTL alpha medium idiomorph_gene_only 44.3 MTLA1|MTLalpha1|MTLalpha2 3.65 False +GCA_030574595.1_ASM3057459v1 Ruyongia chambardii Phaffomycetales Wickerhamomycetaceae MATsc MATa medium partial_locus 58.18 MATA1|sla2 MTL A high idiomorph_gene_only 50.0 MTLA1|MTLA2 8.18 False +GCA_030574715.1_ASM3057471v1 Xingzhongia strasburgensis Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 54.55 MATA1|MATA2|sla2 MTL A high idiomorph_gene_only 55.93 MTLA1|MTLA2 -1.38 True family_unconfirmed cross_call_near_tie +GCA_030574855.1_ASM3057485v1 Taiozyma rabaulensis Phaffomycetales Wickerhamomycetaceae MATsc MATa medium mat_locus 57.63 MATA1|MATA2|sla2 MTL A high mat_locus 44.83 MTLA1|MTLA2|PIK1 12.8 False +GCA_030574875.1_ASM3057487v1 Taiozyma peoriensis Phaffomycetales Wickerhamomycetaceae MATsc MATa medium mat_locus 56.36 MATA1|MATA2|sla2 MTL A high mat_locus 46.15 MTLA1|MTLA2|MTLalpha1|PAP1 10.21 False +GCA_030575215.1_ASM3057521v1 Saccharomycopsis javanensis Ascoideales Saccharomycopsidaceae MTL alpha high idiomorph_gene_only 52.38 MTLalpha1|MTLalpha2 MATsc MATalpha medium idiomorph_gene_only 37.89 MATALPHA1|MATALPHA2|MATA2 14.49 False family_unconfirmed mtl_outside_scope +GCA_030579615.1_ASM3057961v1 Sporopachydermia quercuum Sporopachydermiales Sporopachydermiaceae MATsc MATa high mat_locus 50.94 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 MTL alpha high idiomorph_gene_only 42.67 MTLA1|MTLA2|MTLalpha1|MTLalpha2 8.27 False +GCA_030579935.1_ASM3057993v1 Ambrosiozyma cicatricosa Pichiales Pichiaceae MATsc MATalpha medium idiomorph_gene_only 44.78 MATALPHA1|MATALPHA2 MTL alpha medium idiomorph_gene_only 43.28 MTLalpha1|MTLalpha2 1.5 True family_unconfirmed cross_call_near_tie +GCA_030579955.1_ASM3057995v1 Ambrosiozyma monospora Pichiales Pichiaceae MATsc MATalpha medium idiomorph_gene_only 44.78 MATALPHA1|MATALPHA2 MTL alpha medium idiomorph_gene_only 43.28 MTLalpha1|MTLalpha2 1.5 True family_unconfirmed cross_call_near_tie +GCA_030579955.1_ASM3057995v1 Ambrosiozyma monospora Pichiales Pichiaceae MTL A high idiomorph_gene_only 49.15 MTLA1|MTLA2 MATsc MATa medium partial_locus 39.76 MATA1|sla2 9.39 False family_unconfirmed mtl_outside_scope +GCA_030580035.1_ASM3058003v1 Pichia pseudocactophila Pichiales Pichiaceae MATsc MATalpha medium partial_locus 44.78 MATALPHA1|MATA2|sla2 MTL alpha medium idiomorph_gene_only 41.18 MTLalpha1|MTLalpha2 3.6 False +GCA_030580115.1_ASM3058011v1 Kregervanrija pseudodelftensis Pichiales Pichiaceae MATsc MATa medium idiomorph_gene_only 46.27 MATALPHA1|MATALPHA2|MATA1 MTL alpha medium idiomorph_gene_only 41.94 MTLA1|MTLalpha1|MTLalpha2 4.33 False +GCA_030580415.1_ASM3058041v1 Citeromyces nyonsensis Pichiales Pichiaceae MTL alpha high idiomorph_gene_only 43.75 MTLalpha1|MTLalpha2 MATsc MATalpha high mat_locus 40.62 MATALPHA1|MATALPHA2|sla2 3.13 False family_unconfirmed mtl_outside_scope +GCA_030580455.1_ASM3058045v1 Barnettozyma sp. UFMG-CM-Y5996 Phaffomycetales Phaffomycetaceae MATsc MATa medium mat_locus 56.36 MATALPHA1|MATALPHA2|MATA1|sla2 MTL A high mat_locus 57.14 MTLA1|MTLA2|MTLalpha1|OBP1 -0.78 True family_unconfirmed cross_call_near_tie +GCA_030582155.1_ASM3058215v1 Hansenula lynferdii Phaffomycetales Wickerhamomycetaceae MATsc MATa medium mat_locus 54.55 MATA1|MATA2|sla2 MTL A high idiomorph_gene_only 50.88 MTLA1|MTLA2 3.67 False +GCA_030582235.1_ASM3058223v1 Ruyongia ponderosae Phaffomycetales Wickerhamomycetaceae MTL A high mat_locus 67.65 MTLA1|MTLA2|PIK1 MATsc MATa high mat_locus 56.36 MATA1|MATA2|sla2 11.29 False family_unconfirmed mtl_outside_scope +GCA_030582255.1_ASM3058225v1 Hansenula subpelliculosa Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 58.18 MATA1|MATA2|sla2 MTL A high idiomorph_gene_only 55.0 MTLA1|MTLA2 3.18 False +GCA_030582275.1_ASM3058227v1 Waltiozyma pijperi Phaffomycetales Wickerhamomycetaceae MTL A medium mat_locus 56.36 MTLA1|MTLA2|MTLalpha1|MTLalpha2|PIK1 MATsc MATa high mat_locus 52.73 MATALPHA1|MATA1|MATA2|sla2 3.63 False family_unconfirmed mtl_outside_scope +GCA_030583195.1_ASM3058319v1 Saccharomycopsis fibuligera Ascoideales Saccharomycopsidaceae MTL alpha medium idiomorph_gene_only 50.0 MTLA1|MTLA2|MTLalpha1|MTLalpha2 MATsc MATalpha medium mat_locus 37.33 MATALPHA1|MATA1|MATA2|sla2 12.67 False family_unconfirmed mtl_outside_scope +GCA_030585085.1_ASM3058508v1 Petasospora xishuangbannaensis Phaffomycetales Wickerhamomycetaceae MTL alpha medium mat_locus 56.36 MTLA1|MTLA2|MTLalpha1|PIK1 MATsc MATa medium mat_locus 47.37 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 8.99 False family_unconfirmed mtl_outside_scope +GCA_030674255.1_ASM3067425v1 Hansenula queroliae Phaffomycetales Wickerhamomycetaceae MATsc MATa medium mat_locus 52.46 MATA1|MATA2|sla2 MTL A high idiomorph_gene_only 51.72 MTLA1|MTLA2 0.74 True family_unconfirmed cross_call_near_tie +GCA_030770065.1_ASM3077006v1 Pichia fermentans Pichiales Pichiaceae MATsc MATalpha high mat_locus 46.55 MATALPHA1|MATALPHA2|sla2 MTL alpha high idiomorph_gene_only 40.0 MTLalpha1|MTLalpha2 6.55 False +GCA_031125485.1_ASM3112548v1 Saccharomycopsis javanensis Ascoideales Saccharomycopsidaceae MTL alpha high idiomorph_gene_only 52.38 MTLalpha1|MTLalpha2 MATsc MATalpha medium idiomorph_gene_only 37.89 MATALPHA1|MATALPHA2|MATA2 14.49 False family_unconfirmed mtl_outside_scope +GCA_031125595.1_ASM3112559v1 Saccharomycopsis capsularis Ascoideales Saccharomycopsidaceae MATsc MATalpha medium mat_locus 39.44 MATALPHA1|MATA1|MATA2|sla2 MTL alpha medium mat_locus 28.65 MTLalpha1|MTLalpha2|PIK1 10.79 False +GCA_031125625.1_ASM3112562v1 Saccharomycopsis capsularis Ascoideales Saccharomycopsidaceae MTL alpha high idiomorph_gene_only 49.32 MTLalpha1|MTLalpha2 MATsc MATalpha medium partial_locus 44.62 MATALPHA1|MATA2|sla2 4.7 False family_unconfirmed mtl_outside_scope +GCA_031125665.1_ASM3112566v1 Saccharomycopsis capsularis Ascoideales Saccharomycopsidaceae MATsc MATalpha medium partial_locus 39.44 MATALPHA1|MATA2|sla2 MTL alpha medium idiomorph_gene_only 29.14 MTLalpha1|MTLalpha2 10.3 False +GCA_031125675.1_ASM3112567v1 Saccharomycopsis capsularis Ascoideales Saccharomycopsidaceae MATsc MATalpha medium partial_locus 39.44 MATALPHA1|MATA2|sla2 MTL alpha medium idiomorph_gene_only 29.14 MTLalpha1|MTLalpha2 10.3 False +GCA_031125685.1_ASM3112568v1 Saccharomycopsis capsularis Ascoideales Saccharomycopsidaceae MATsc MATalpha medium partial_locus 39.44 MATALPHA1|MATA2|sla2 MTL alpha medium idiomorph_gene_only 29.14 MTLalpha1|MTLalpha2 10.3 False +GCA_031126305.1_ASM3112630v1 Saccharomycopsis fibuligera Ascoideales Saccharomycopsidaceae MTL alpha high idiomorph_gene_only 42.34 MTLalpha1|MTLalpha2 MATsc MATalpha medium idiomorph_gene_only 37.33 MATALPHA1|MATA2 5.01 False family_unconfirmed mtl_outside_scope +GCA_037040195.1_ASM3704019v1 Pichia inconspicua Pichiales Pichiaceae MATsc MATalpha high idiomorph_gene_only 40.48 MATALPHA1|MATALPHA2 MTL alpha high idiomorph_gene_only 40.0 MTLalpha1|MTLalpha2 0.48 True family_unconfirmed cross_call_near_tie +GCA_037041065.1_ASM3704106v1 Hansenula sp. DX7706-1 Phaffomycetales Wickerhamomycetaceae MATsc MATa medium partial_locus 61.02 MATA1|sla2 MTL A high idiomorph_gene_only 51.72 MTLA1|MTLA2 9.3 False +GCA_037041205.1_ASM3704120v1 Pichia fermentans Pichiales Pichiaceae MATsc MATalpha medium idiomorph_gene_only 40.0 MATALPHA1|MATALPHA2|MATA2 MTL alpha high idiomorph_gene_only 40.0 MTLalpha1|MTLalpha2 0.0 True family_unconfirmed cross_call_near_tie +GCA_037041255.1_ASM3704125v1 Pichia fermentans Pichiales Pichiaceae MATsc MATalpha medium mat_locus 40.0 MATALPHA1|MATALPHA2|MATA2|sla2 MTL alpha high idiomorph_gene_only 40.0 MTLalpha1|MTLalpha2 0.0 True family_unconfirmed cross_call_near_tie +GCA_037041515.1_ASM3704151v1 Pichia fermentans Pichiales Pichiaceae MATsc MATalpha high mat_locus 46.55 MATALPHA1|MATALPHA2|sla2 MTL alpha high idiomorph_gene_only 40.0 MTLalpha1|MTLalpha2 6.55 False +GCA_037041755.1_ASM3704175v1 Pichia fermentans Pichiales Pichiaceae MATsc MATalpha medium mat_locus 40.0 MATALPHA1|MATALPHA2|MATA2|sla2 MTL alpha high idiomorph_gene_only 40.0 MTLalpha1|MTLalpha2 0.0 True family_unconfirmed cross_call_near_tie +GCA_037042445.1_ASM3704244v1 Hansenula sp. Y91-04 Phaffomycetales Wickerhamomycetaceae MATsc MATa medium partial_locus 61.02 MATA1|sla2 MTL A high idiomorph_gene_only 51.72 MTLA1|MTLA2 9.3 False +GCA_037102705.1_ASM3710270v1 Pichia kluyveri Pichiales Pichiaceae MATsc MATalpha high mat_locus 51.85 MATALPHA1|MATALPHA2|sla2 MTL alpha high idiomorph_gene_only 35.71 MTLalpha1|MTLalpha2 16.14 False +GCA_037355565.1_Ssch_CD502 Saccharomycopsis schoenii Ascoideales Saccharomycopsidaceae MATsc MATalpha medium idiomorph_gene_only 37.14 MATALPHA1|MATA2 MTL alpha medium idiomorph_gene_only 39.76 MTLalpha1|MTLalpha2 -2.62 True family_unconfirmed cross_call_near_tie +GCA_039700735.1_ASM3970073v1 Pichia pseudocactophila Pichiales Pichiaceae MATsc MATalpha medium partial_locus 44.78 MATALPHA1|MATA2|sla2 MTL alpha medium idiomorph_gene_only 41.18 MTLalpha1|MTLalpha2 3.6 False +GCA_039700745.1_ASM3970074v1 Pichia cactophila Pichiales Pichiaceae MATsc MATalpha high mat_locus 40.48 MATALPHA1|MATALPHA2|sla2 MTL alpha high idiomorph_gene_only 40.0 MTLalpha1|MTLalpha2 0.48 True family_unconfirmed cross_call_near_tie +GCA_040365455.1_JCM_7609_assembly_v001 Saccharomycopsis fibuligera Ascoideales Saccharomycopsidaceae MTL alpha medium idiomorph_gene_only 47.54 MTLA2|MTLalpha1|MTLalpha2 MATsc MATalpha medium idiomorph_gene_only 37.33 MATALPHA1|MATA2 10.21 False family_unconfirmed mtl_outside_scope +GCA_040365455.1_JCM_7609_assembly_v001 Saccharomycopsis fibuligera Ascoideales Saccharomycopsidaceae MTL alpha medium idiomorph_gene_only 50.0 MTLA1|MTLalpha1|MTLalpha2 MATsc MATalpha medium mat_locus 37.33 MATALPHA1|MATA1|MATA2|sla2 12.67 False family_unconfirmed mtl_outside_scope +GCA_040802125.1_ASM4080212v1 Millerago phaffii Phaffomycetales Phaffomycetaceae MATsc MATa medium mat_locus 60.38 MATA1|MATA2|sla2 MTL A high idiomorph_gene_only 43.06 MTLA1|MTLA2 17.32 False +GCA_040938015.1_ASM4093801v1 Pichia sp. VM-2024a Pichiales Pichiaceae MATsc MATalpha high idiomorph_gene_only 40.48 MATALPHA1|MATALPHA2 MTL alpha high idiomorph_gene_only 40.0 MTLalpha1|MTLalpha2 0.48 True family_unconfirmed cross_call_near_tie +GCA_041498895.1_ASM4149889v1 Pichiaceae sp. Pichiales Pichiaceae MATsc MATa high mat_locus 41.89 MATA1|MATA2|sla2 MTL A high idiomorph_gene_only 42.86 MTLA1|MTLA2 -0.97 True family_unconfirmed cross_call_near_tie +GCA_047651925.1_ASM4765192v1 Saccharomyces cerevisiae_Schizosaccharomyces pombe fusant MATsc MATalpha medium idiomorph_gene_only 100.0 MATALPHA1|MATALPHA2|MATA2 MTL alpha high idiomorph_gene_only 36.49 MTLalpha1|MTLalpha2 63.51 False +GCA_047651925.1_ASM4765192v1 Saccharomyces cerevisiae_Schizosaccharomyces pombe fusant MATsc MATa high idiomorph_gene_only 100.0 MATALPHA1|MATALPHA2|MATA1|MATA2 MTL alpha medium idiomorph_gene_only 35.59 MTLA1|MTLalpha2 64.41 False +GCA_048164895.1_ASM4816489v1 Saccharomycopsis crataegensis Ascoideales Saccharomycopsidaceae MTL alpha high idiomorph_gene_only 42.34 MTLA2|MTLalpha1|MTLalpha2 MATsc MATalpha medium idiomorph_gene_only 37.33 MATALPHA1|MATA2 5.01 False family_unconfirmed mtl_outside_scope +GCA_049863505.1_ASM4986350v1 Barnettozyma discipulorum Phaffomycetales Phaffomycetaceae MTL A medium mat_locus 51.61 MTLA1|MTLalpha1|OBP1 MATsc MATa medium partial_locus 48.44 MATALPHA1|MATA1|sla2 3.17 False family_unconfirmed mtl_outside_scope +GCA_053455635.1_ASM5345563v1 Hansenula anomala Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 58.18 MATA1|MATA2|sla2 MTL A high idiomorph_gene_only 55.0 MTLA1|MTLA2 3.18 False +GCA_054085685.1_DORT_Sapseu_12645 Saccharomycodes sp. B7079-1 Saccharomycodales Saccharomycodaceae MATsc MATalpha high mat_locus 36.62 MATALPHA1|MATALPHA2|sla2 MTL alpha high mat_locus 38.89 MTLalpha1|MTLalpha2|PIK1 -2.27 True family_unconfirmed cross_call_near_tie +GCA_054085705.1_DORT_Sapseu_12643 Saccharomycodes sp. B7079-1 Saccharomycodales Saccharomycodaceae MATsc MATalpha high mat_locus 36.62 MATALPHA1|MATALPHA2|sla2 MTL alpha high mat_locus 38.89 MTLalpha1|MTLalpha2|PIK1 -2.27 True family_unconfirmed cross_call_near_tie +GCA_054953955.1_ASM5495395v1 Saccharomycopsis schoenii Ascoideales Saccharomycopsidaceae MTL alpha medium idiomorph_gene_only 50.0 MTLA1|MTLalpha1|MTLalpha2 MATsc MATalpha medium mat_locus 45.71 MATALPHA1|MATA1|MATA2|sla2 4.29 False family_unconfirmed mtl_outside_scope +GCA_054953955.1_ASM5495395v1 Saccharomycopsis schoenii Ascoideales Saccharomycopsidaceae MTL alpha medium idiomorph_gene_only 51.429 MTLA1|MTLA2|MTLalpha1|MTLalpha2 MATsc MATalpha medium mat_locus 45.71 MATALPHA1|MATA1|MATA2|sla2 5.72 False family_unconfirmed mtl_outside_scope +GCA_054953955.1_ASM5495395v1 Saccharomycopsis schoenii Ascoideales Saccharomycopsidaceae MTL alpha medium idiomorph_gene_only 50.0 MTLA1|MTLalpha1|MTLalpha2 MATsc MATalpha medium idiomorph_gene_only 45.71 MATALPHA1|MATA1|MATA2 4.29 False family_unconfirmed mtl_outside_scope +GCA_054953955.1_ASM5495395v1 Saccharomycopsis schoenii Ascoideales Saccharomycopsidaceae MTL alpha medium idiomorph_gene_only 51.429 MTLA1|MTLA2|MTLalpha1|MTLalpha2 MATsc MATalpha medium mat_locus 45.71 MATALPHA1|MATA1|MATA2|sla2 5.72 False family_unconfirmed mtl_outside_scope +GCA_054953955.1_ASM5495395v1 Saccharomycopsis schoenii Ascoideales Saccharomycopsidaceae MTL alpha medium mat_locus 51.429 MTLA1|MTLalpha1|MTLalpha2|PIK1 MATsc MATalpha high mat_locus 45.71 MATALPHA1|MATALPHA2|MATA1|MATA2|sla2 5.72 False family_unconfirmed mtl_outside_scope +GCA_054953955.1_ASM5495395v1 Saccharomycopsis schoenii Ascoideales Saccharomycopsidaceae MATsc MATalpha medium mat_locus 48.485 MATALPHA1|MATA1|MATA2|sla2 MTL alpha medium idiomorph_gene_only 51.43 MTLA1|MTLalpha1|MTLalpha2 -2.95 True family_unconfirmed cross_call_near_tie +GCA_058970815.1_ASM5897081v1 Petasospora fabianii Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 58.18 MATA1|MATA2|sla2 MTL A medium mat_locus 57.14 MTLA1|MTLA2|PIK1 1.04 True family_unconfirmed cross_call_near_tie +GCA_060251755.1_ASM6025175v1 Wickerhamomyces sp. HBSY964-1 Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 60.34 MATA1|MATA2|sla2 MTL A high idiomorph_gene_only 55.17 MTLA1|MTLA2 5.17 False +GCA_060251785.1_ASM6025178v1 Wickerhamomyces sp. HBSY304-4 Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 59.32 MATA1|MATA2|sla2 MTL A high idiomorph_gene_only 55.0 MTLA1|MTLA2 4.32 False +GCA_060251865.1_ASM6025186v1 Wickerhamomyces sp. 3Q4-1 Phaffomycetales Wickerhamomycetaceae MATsc MATa medium partial_locus 56.36 MATA1|sla2 MTL A high idiomorph_gene_only 52.5 MTLA1|MTLA2 3.86 False +GCA_060251885.1_ASM6025188v1 Wickerhamomyces sp. HHY24-4 Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 52.38 MATA1|MATA2|sla2 MTL A medium mat_locus 48.75 MTLA1|MTLA2|PIK1 3.63 False +GCA_900465365.1_CvDDNA1.1 Williopsis vartiovaarae Phaffomycetales Wickerhamomycetaceae MATsc MATa medium mat_locus 54.24 MATA1|MATA2|sla2 MTL A high idiomorph_gene_only 50.0 MTLA1|MTLA2 4.24 False +GCA_947297755.1_246_Pichia_kluyveri Pichia kluyveri Pichiales Pichiaceae MATsc MATalpha high idiomorph_gene_only 51.85 MATALPHA1|MATALPHA2 MTL alpha high idiomorph_gene_only 35.71 MTLalpha1|MTLalpha2 16.14 False +GCA_947297755.1_246_Pichia_kluyveri Pichia kluyveri Pichiales Pichiaceae MATsc MATalpha high mat_locus 51.85 MATALPHA1|MATALPHA2|sla2 MTL alpha high idiomorph_gene_only 35.71 MTLalpha1|MTLalpha2 16.14 False +GCA_963678715.1_2795_Cyberlindnera_fabianii Petasospora fabianii Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 58.18 MATA1|MATA2|sla2 MTL A medium mat_locus 57.14 MTLA1|MTLA2|PIK1 1.04 True family_unconfirmed cross_call_near_tie +GCA_982397265.1_4-FMI Williopsis jadinii Phaffomycetales Wickerhamomycetaceae MATsc MATa high mat_locus 58.18 MATA1|MATA2|sla2 MTL A medium mat_locus 57.14 MTLA1|MTLA2|PIK1 1.04 True family_unconfirmed cross_call_near_tie +GCF_020623625.1_UHD_SCDLUD_16 Saccharomycodes ludwigii Saccharomycodales Saccharomycodaceae MATsc MATalpha high mat_locus 34.67 MATALPHA1|MATALPHA2|sla2 MTL alpha high mat_locus 37.5 MTLalpha1|MTLalpha2|PIK1 -2.83 True family_unconfirmed cross_call_near_tie diff --git a/src/MATPredict/detect/family_status.py b/src/MATPredict/detect/family_status.py index f40503a7..70761d63 100644 --- a/src/MATPredict/detect/family_status.py +++ b/src/MATPredict/detect/family_status.py @@ -11,13 +11,15 @@ 1. **Cross-calls.** Two families calling overlapping loci (overlap of 0.9 or more of the shorter locus, on one contig) are one locus. The call from the family whose `taxonomic_scope` contains the - genome is kept. If neither or both families are scoped to it, the call whose best core gene has the - higher identity is kept (curator's decision, 2026-10-29: the confidence tier is not comparable across - families, so it no longer decides). When the best identities are within `NEAR_TIE_POINTS` (3), the - call from the family that declares no `confirm_outside_scope` rule is kept, else the better score - (locus class, tier, polished genes, genes found, family name), and the kept call is flagged - `family_unconfirmed` (reason `cross_call_near_tie`). The other call is not lost: it is recorded - on the kept call as `cross_call`. + genome is kept. Where neither family is scoped to it, the family is decided ONCE FOR THE GENOME + (curator's decision, 2026-10-29, after an independent evaluation of the 3-point near-tie margin of the + first draft, `results/2026-10-29_near_tie/`): each family's mean over the genome's unscoped cross-called + loci of the best core-gene identity is computed, and the family with the higher mean is kept in every + such locus (equal means: the smaller family name). There is no margin and no preference for either + family. The confidence tier is not comparable across families and does not decide. Every such kept call + carries `family_ambiguous` (both identities, their gap, the genome means), because a best-hit identity + against a different reference protein of each family is an uncertain score. The other call is not lost: + it is recorded on the kept call as `cross_call`. 2. **Family status.** A call from a family that declares `confirm_outside_scope` (MTL) in a genome outside its scope is `family_unconfirmed` (reason `_outside_scope`). It becomes `family_confirmed` when at least `min_flank_genes` of the declared flank genes (PAP1, OBP1, PIK1) @@ -39,9 +41,6 @@ CROSS_FAMILY_POLICIES = (POLICY_OFF, POLICY_ON) DEFAULT_CROSS_FAMILY_POLICY = POLICY_OFF -#: Best-core-identity difference (percentage points) at or below which two cross-called families are a near tie. -NEAR_TIE_POINTS = 3.0 - #: Fraction of the shorter locus that two calls must share to count as one locus. MIN_OVERLAP = 0.9 @@ -106,45 +105,62 @@ def _best_core_identity(r) -> float: def _note(r) -> dict: return {"family": f"{r.family_key.phylum}:{r.family_key.locus_name}", "idiomorph": r.idiomorph, "confidence": r.confidence, "locus_class": r.locus_class, "contig": r.contig, - "start": r.start, "end": r.end, "genes_found": list(r.genes_found)} + "start": r.start, "end": r.end, "genes_found": list(r.genes_found), + # the evidence of the call that was set aside, so the two families can be compared gene for gene after the run + "gene_evidence": [{"gene": e.gene_name, "role": e.role, "identity": round(e.identity, 2) if e.identity is not None else None, + "coverage": round(e.coverage, 2) if e.coverage is not None else None, "status": str(e.status)} + for e in r.gene_evidence if e.lost_to is None]} + + +def _family_name(r) -> str: + return f"{r.family_key.phylum}:{r.family_key.locus_name}" def resolve_cross_calls(results: list, families: list, lineage: set[int]) -> list: - """`results` with each cross-family group reduced to one call; the others ride on it as `cross_call`.""" + """`results` with each cross-family group reduced to one call; the others ride on it as `cross_call`. + + A group with a family scoped to the genome keeps that family's best call. The other groups (no scoped family) are decided + together: the family with the higher mean best core-gene identity over the genome's unscoped groups wins each of them.""" by_key = {f.key: f for f in families} def in_scope(r) -> bool: family = by_key.get(r.family_key) return bool(lineage and family and lineage & set(family.taxonomic_scope)) - def needs_confirmation(r) -> bool: - family = by_key.get(r.family_key) - return bool(getattr(family, "confirm_outside_scope", None)) + groups = _groups(results) + unscoped = [g for g in groups if not any(in_scope(results[i]) for i in g)] + pooled: dict[str, list[float]] = {} + for g in unscoped: + for fam in {_family_name(results[i]) for i in g}: + pooled.setdefault(fam, []).append(max(_best_core_identity(results[i]) for i in g if _family_name(results[i]) == fam)) + means = {fam: sum(v) / len(v) for fam, v in pooled.items()} drop: set[int] = set() - kept: dict[int, list[dict]] = {} - for group in _groups(results): + kept: dict[int, tuple[list[dict], dict | None]] = {} + for group in groups: scoped = [i for i in group if in_scope(results[i])] - near_tie = False + ambiguous = None if scoped: best = min(scoped, key=lambda i: _score(results[i])) else: - top = max(_best_core_identity(results[i]) for i in group) - close = [i for i in group if top - _best_core_identity(results[i]) <= NEAR_TIE_POINTS] - near_tie = len(close) > 1 - pool = [i for i in close if not needs_confirmation(results[i])] or close - best = min(pool, key=lambda i: _score(results[i])) if near_tie else close[0] + here = {_family_name(results[i]) for i in group} + winner = min(here, key=lambda f: (-means[f], f)) + best = min((i for i in group if _family_name(results[i]) == winner), key=lambda i: _score(results[i])) + ident = {f: round(max(_best_core_identity(results[i]) for i in group if _family_name(results[i]) == f), 2) for f in sorted(here)} + rest = [v for f, v in ident.items() if f != winner] + ambiguous = {"reason": "cross_call_unscoped", "kept_family": winner, "identities": ident, + "gap": round(ident[winner] - max(rest), 2) if rest else None, + "genome_mean_identity": {f: round(means[f], 2) for f in sorted(here)}, + "genome_loci": {f: len(pooled[f]) for f in sorted(here)}} notes = [] for i in sorted(group): if i != best: note = _note(results[i]) note["best_core_identity"] = round(_best_core_identity(results[i]), 2) - if near_tie: - note["near_tie"] = True notes.append(note) - kept[best] = notes + kept[best] = (notes, ambiguous) drop.update(i for i in group if i != best) - return [replace(r, cross_call=kept[i]) if i in kept else r for i, r in enumerate(results) if i not in drop] + return [replace(r, cross_call=kept[i][0], family_ambiguous=kept[i][1]) if i in kept else r for i, r in enumerate(results) if i not in drop] def _gap(a, b) -> int: @@ -170,9 +186,6 @@ def flag_family_status(results: list, families: list, lineage: set[int]) -> list for r in results: family = by_key.get(r.family_key) rule = getattr(family, "confirm_outside_scope", None) - if any(c.get("near_tie") for c in r.cross_call) and not (rule and lineage and not lineage & set(family.taxonomic_scope)): - out.append(replace(r, family_status={"status": STATUS_UNCONFIRMED, "reason": "cross_call_near_tie"})) - continue if not rule or not lineage or lineage & set(family.taxonomic_scope): out.append(r) continue diff --git a/src/MATPredict/detect/pipeline.py b/src/MATPredict/detect/pipeline.py index ca7c7f56..1ecf0c07 100644 --- a/src/MATPredict/detect/pipeline.py +++ b/src/MATPredict/detect/pipeline.py @@ -421,6 +421,10 @@ class DetectionResult: cassette: dict | None = None """`--cross-family-policy on` only: this call is one of two cassettes (MATa and MATalpha) of a family that declares `cassette_report`; which one is expressed is not determined (`family_status`). None otherwise.""" + family_ambiguous: dict | None = None + """`--cross-family-policy on` only: this locus was called by two families and neither is scoped to the genome; the family was + decided once for the genome by the higher mean best core-gene identity. Holds the identities of both families, their gap and + the genome means. None otherwise.""" cross_call: list = field(default_factory=list) """`--cross-family-policy on` only: the overlapping calls of other families folded into this one.""" verification: dict | None = None diff --git a/src/MATPredict/detect/report.py b/src/MATPredict/detect/report.py index 12988f0b..5c4ca28d 100644 --- a/src/MATPredict/detect/report.py +++ b/src/MATPredict/detect/report.py @@ -200,6 +200,8 @@ def write_detection_gff3( attrs += ";cassette=" + r.cassette["idiomorph"] + "_cassette" if getattr(r, "cross_call", None): attrs += ";cross_call=" + ",".join(c["family"] for c in r.cross_call) + if getattr(r, "family_ambiguous", None): + attrs += ";family_ambiguous=" + "|".join(f"{f}:{v}" for f, v in r.family_ambiguous["identities"].items()) lines.append("\t".join([ contig, "MATPredict", "MAT_locus", str(start), str(end), ".", ".", ".", attrs, ])) @@ -357,6 +359,7 @@ def _result_doc(r: DetectionResult) -> dict: **({"family_status": r.family_status} if getattr(r, "family_status", None) else {}), **({"cross_call": list(r.cross_call)} if getattr(r, "cross_call", None) else {}), **({"cassette": r.cassette} if getattr(r, "cassette", None) else {}), + **({"family_ambiguous": r.family_ambiguous} if getattr(r, "family_ambiguous", None) else {}), # Same-locus calls folded into this one (curator's ruling 2026-09-27; # see `locus_merge`). Empty list when unmerged. "merged_from": r.merged_from, diff --git a/tests/detect/test_family_status.py b/tests/detect/test_family_status.py index 4d9e15f1..e14ff450 100644 --- a/tests/detect/test_family_status.py +++ b/tests/detect/test_family_status.py @@ -48,11 +48,12 @@ def test_cross_call_keeps_the_family_scoped_to_the_genome(): assert out[0].cross_call[0]["family"] == "Ascomycota:MTL" -def test_cross_call_without_gene_evidence_is_a_near_tie_and_keeps_the_family_without_a_rule(): +def test_cross_call_without_gene_evidence_has_equal_means_and_keeps_the_smaller_family_name(): sc, mtl = _call(SC, 100, 5000, confidence="medium"), _call(MTL, 120, 5000, confidence="high") out = fs.resolve_cross_calls([sc, mtl], FAMILIES, {OTHER}) assert [r.family_key for r in out] == [SC] - assert out[0].cross_call[0]["family"] == "Ascomycota:MTL" and out[0].cross_call[0]["near_tie"] is True + assert out[0].cross_call[0]["family"] == "Ascomycota:MTL" and "near_tie" not in out[0].cross_call[0] + assert out[0].family_ambiguous["kept_family"] == "Ascomycota:MATsc" and out[0].family_ambiguous["gap"] == 0.0 def test_cross_call_needs_90_percent_overlap_on_the_same_contig(): @@ -160,19 +161,55 @@ def test_higher_core_identity_wins_not_the_tier(): assert out[0].cross_call[0]["best_core_identity"] == 50.0 and "near_tie" not in out[0].cross_call[0] -def test_near_tie_keeps_the_family_without_a_confirmation_rule_and_flags_it(): +def test_there_is_no_margin_a_small_gap_is_decided_by_identity_and_flagged_ambiguous(): sc, mtl = _scored(SC, 100, 5000, 48.0, "medium"), _scored(MTL, 100, 5000, 50.0, "high") out = fs.apply([sc, mtl], FAMILIES, {OTHER}, "on") - assert [r.family_key for r in out] == [SC] - assert out[0].family_status == {"status": fs.STATUS_UNCONFIRMED, "reason": "cross_call_near_tie"} - assert out[0].cross_call[0]["near_tie"] is True + assert [r.family_key for r in out] == [MTL] # 2 points higher wins; no preference for the family without a rule + amb = out[0].family_ambiguous + assert amb == {"reason": "cross_call_unscoped", "kept_family": "Ascomycota:MTL", + "identities": {"Ascomycota:MATsc": 48.0, "Ascomycota:MTL": 50.0}, "gap": 2.0, + "genome_mean_identity": {"Ascomycota:MATsc": 48.0, "Ascomycota:MTL": 50.0}, + "genome_loci": {"Ascomycota:MATsc": 1, "Ascomycota:MTL": 1}} + # the flank rule is a separate flag: MTL outside Serinales without PAP1, OBP1, PIK1 is unconfirmed + assert out[0].family_status["status"] == fs.STATUS_UNCONFIRMED and out[0].family_status["reason"] == "mtl_outside_scope" -def test_exactly_equal_identity_is_a_near_tie(): +def test_exactly_equal_identity_keeps_the_smaller_family_name(): sc, mtl = _scored(SC, 100, 5000, 50.0, "medium"), _scored(MTL, 100, 5000, 50.0, "high") assert [r.family_key for r in fs.resolve_cross_calls([sc, mtl], FAMILIES, {OTHER})] == [SC] +def test_the_family_is_decided_once_for_the_genome_by_the_mean_identity(): + # locus 1: MATsc 60 vs MTL 58 (per locus MATsc); locus 2: MATsc 40 vs MTL 55 (per locus MTL); means MATsc 50, MTL 56.5 + calls = [_scored(SC, 100, 5000, 60.0), _scored(MTL, 100, 5000, 58.0), _scored(SC, 100, 5000, 40.0), _scored(MTL, 100, 5000, 55.0)] + from dataclasses import replace + calls = [replace(c, contig="c1") if i < 2 else replace(c, contig="c2", gene_evidence=[replace(c.gene_evidence[0], contig="c2")]) for i, c in enumerate(calls)] + out = fs.resolve_cross_calls(calls, FAMILIES, {OTHER}) + assert sorted((r.contig, r.family_key.locus_name) for r in out) == [("c1", "MTL"), ("c2", "MTL")] # one family for the genome + assert all(r.family_ambiguous["genome_mean_identity"] == {"Ascomycota:MATsc": 50.0, "Ascomycota:MTL": 56.5} for r in out) + assert all(r.family_ambiguous["genome_loci"] == {"Ascomycota:MATsc": 2, "Ascomycota:MTL": 2} for r in out) + + +def test_a_scoped_decision_records_no_ambiguity_whatever_the_identities(): + from dataclasses import replace + one = [_scored(SC, 100, 5000, 30.0), _scored(MTL, 100, 5000, 90.0)] + two = [replace(c, contig="c2", gene_evidence=[replace(c.gene_evidence[0], contig="c2")]) for c in (_scored(SC, 100, 5000, 40.0), _scored(MTL, 100, 5000, 45.0))] + out = fs.resolve_cross_calls(one + two, FAMILIES, {SACCHAROMYCETACEAE}) + assert sorted((r.contig, r.family_key.locus_name) for r in out) == [("c1", "MATsc"), ("c2", "MATsc")] + assert all(r.family_ambiguous is None for r in out) + + +def test_a_third_family_group_is_decided_apart_from_the_scoped_group(): + from dataclasses import replace + og = FamilyKey("Ascomycota", "MATog") + fams = FAMILIES + [_family(og, [12345])] + one = [_scored(SC, 100, 5000, 30.0), _scored(MTL, 100, 5000, 90.0)] # SC is scoped: MATsc wins, no ambiguity + two = [replace(c, contig="c2", gene_evidence=[replace(c.gene_evidence[0], contig="c2")]) for c in (_scored(MTL, 100, 5000, 40.0), _scored(og, 100, 5000, 45.0))] + out = {r.contig: r for r in fs.resolve_cross_calls(one + two, fams, {SACCHAROMYCETACEAE})} + assert out["c1"].family_key == SC and out["c1"].family_ambiguous is None + assert out["c2"].family_key == og and out["c2"].family_ambiguous["genome_loci"] == {"Ascomycota:MATog": 1, "Ascomycota:MTL": 1} # c1 did not enter the means + + def test_scope_still_beats_identity(): sc, mtl = _scored(SC, 100, 5000, 30.0, "low"), _scored(MTL, 100, 5000, 90.0, "high") assert [r.family_key for r in fs.resolve_cross_calls([sc, mtl], FAMILIES, {SACCHAROMYCETACEAE})] == [SC] From 97bfd901ceee9acf3517664ec7046ed14499e56c Mon Sep 17 00:00:00 2001 From: Jason Stajich Date: Thu, 29 Oct 2026 20:48:26 -0700 Subject: [PATCH 2/6] Per-genus table and a draft curation list for the MATsc/MTL ambiguous calls Co-Authored-By: Claude Sonnet 5.5 --- .../GENUS_CURATION_LIST.md | 55 +++++++++++++++++++ results/2026-10-29_near_tie/genus_table.tsv | 28 ++++++++++ 2 files changed, 83 insertions(+) create mode 100644 results/2026-10-29_near_tie/GENUS_CURATION_LIST.md create mode 100644 results/2026-10-29_near_tie/genus_table.tsv diff --git a/results/2026-10-29_near_tie/GENUS_CURATION_LIST.md b/results/2026-10-29_near_tie/GENUS_CURATION_LIST.md new file mode 100644 index 00000000..1dec8d12 --- /dev/null +++ b/results/2026-10-29_near_tie/GENUS_CURATION_LIST.md @@ -0,0 +1,55 @@ +# Genera that need a curator ruling on MATsc against MTL (draft, 2026-10-29) + +From the 354-genome replay with the genome-level rule (`genus_table.tsv`, one row per genus: genomes, species, loci, family kept, mean best core-gene identity per family, gap, loci with MTL flank support). 156 `family_ambiguous` loci, 140 genomes, 27 genera. Identity gap = MATsc minus MTL, median over the genus's loci, in percentage points; the scores are best-hit identities of one gene (see README: about 6.5 points of noise per locus), so a gap under about 5 points is weak. + +Nothing here is a ruling. The choice per genus is one of: **leave** (the genome-level identity rule decides, with `family_ambiguous`), **scope** (the genus is added to the `taxonomic_scope` of a family, as for MATkp, MATog and MATpk; needs at least one reference record from the genus or evidence that the references transfer), or **hold** (leave unresolved and report both). + +## A. Consistent in the data, large gap (MATsc side): leave + +| Genus | genomes (species) | kept | gap | note | +|---|---|---|---|---| +| Williopsis | 9 (6) | MATsc 9 | +9.7 | | +| Taiozyma | 3 (3) | MATsc 3 | +12.8 | | +| Millerago | 2 (2) | MATsc 2 | +15.7 | | +| Sporopachydermia | 3 (2) | MATsc 3 | +8.3 | | +| Kregervanrija | 4 (3) | MATsc 4 | +7.3 | one near tie called different idiomorphs under the old rule | +| Hansenula | 6 (6) | MATsc 6 | +3.4 | gap small | +| Candida (sensu lato, 3 species) | 3 (3) | MATsc 3 | +5.5 | | +| *Pichia* other than *P. kudriavzevii* (11 species) | 27 (11) | MATsc 28 | +4.3 | not routed to MATpk (species scope); MATpk call at 31-60% identity in the genus-scope trial, MATsc `medium` before | + +Proposed: **leave**. A ruling would need a reference record from the genus. + +## B. Lean MTL, no flank support: curator to decide + +| Genus | genomes (species) | kept | gap | loci with PAP1/OBP1/PIK1 flank | +|---|---|---|---|---| +| Saccharomycopsis | 20 (6) | MTL 22, MATsc 5 | -5.0 | 0 | +| Ambrosiozyma | 13 (11) | MTL 15, MATsc 4 | -3.3 | 0 | +| Citeromyces | 3 (3) | MTL 3 | -3.1 | 0 | +| Saturnispora, Wenyingozyma | 1 each | MTL | -5.3, -11.2 | 0 | + +The family is split inside the genus for Saccharomycopsis and Ambrosiozyma (a few loci keep MATsc), which the per-locus rule produced and the genome-level rule only partly removes (a genome with a single cross-called locus is decided by it). No genome has two MTL flank genes, so MTL here is a choice by identity alone, the same weakness as the MTL-in-Serinales finding of #188. Proposed: **hold** and check synteny (SLA2/DIC1 against PAP1/OBP1/PIK1 neighbourhood) for one genome per genus before any scope. + +## C. Split or tied genera: needs the evidence + +| Genus | genomes (species) | kept | gap | flank loci | +|---|---|---|---|---| +| Petasospora | 11 (7) | MATsc 6, MTL 5 | 0.0 | 2 | +| Wickerhamomyces | 9 (9) | MATsc 8, MTL 1 | +4.3 | 0 | +| Barnettozyma | 8 (5) | MTL 6, MATsc 2 | -6.2 | 6 | +| Gotozyma, Komagataea, Ruyongia, Xingzhongia | 2 each | split | -0.2 to +6.4 | 0-1 | +| Saccharomycodes | 3 (2) | MTL 3 | -2.3 | 3 (one gene each) | + +Barnettozyma is the one genus where MTL flank genes show up in most loci (6 of 8, never two): worth a synteny look first. Saccharomycodes is close to Saccharomycetaceae by phylogeny, so MATsc would be the expected family although the identity leans MTL. Proposed: **hold**. + +## What would settle each + +1. Synteny of one genome per genus B and C (a figure with the flanks of both families). +2. A profile score of each locus's genes against both reference sets (alpha-box and HMG-box profiles), instead of best-hit identity. +3. A curated reference record from a genus (as for MATpk) before it is scoped. + +## Questions for the curator + +1. Accept **leave** for the genera of A? +2. For B and C: **hold** now, with a synteny check as the next step, or scope any genus now? +3. Is the order of work: Barnettozyma, Saccharomycopsis, Ambrosiozyma, Petasospora? diff --git a/results/2026-10-29_near_tie/genus_table.tsv b/results/2026-10-29_near_tie/genus_table.tsv new file mode 100644 index 00000000..2a9053c1 --- /dev/null +++ b/results/2026-10-29_near_tie/genus_table.tsv @@ -0,0 +1,28 @@ +genus order family genomes species loci kept_MATsc kept_MTL mean_MATsc mean_MTL median_gap_sc_minus_mtl min_gap max_gap loci_with_mtl_flank split +Pichia Pichiales Pichiaceae 27 11 28 28 0 45.5 39.8 4.3 0.0 16.1 0 +Saccharomycopsis Ascoideales Saccharomycopsidaceae 20 6 27 5 22 40.7 45.1 -5.0 -14.5 10.8 0 yes +Ambrosiozyma Pichiales Pichiaceae 13 11 19 4 15 43.3 46.7 -3.3 -10.0 7.2 0 yes +Petasospora Phaffomycetales Wickerhamomycetaceae 11 7 11 6 5 52.2 54.8 0.0 -9.0 1.0 2 yes +Wickerhamomyces Phaffomycetales Wickerhamomycetaceae 9 9 9 8 1 56.7 52.0 4.3 -1.2 9.8 0 yes +Williopsis Phaffomycetales Wickerhamomycetaceae 9 6 9 9 0 58.5 50.0 9.7 1.0 17.3 0 +Barnettozyma Phaffomycetales Phaffomycetaceae 8 5 8 2 6 46.6 51.2 -6.2 -9.2 3.3 6 yes +Hansenula Phaffomycetales Wickerhamomycetaceae 6 6 6 6 0 57.6 52.7 3.4 0.7 9.3 0 +Kregervanrija Pichiales Pichiaceae 4 3 4 4 0 47.2 41.0 7.3 0.2 10.2 0 +Candida Phaffomycetales Wickerhamomycetaceae 3 3 3 3 0 56.7 51.4 5.5 3.4 6.9 0 +Citeromyces Pichiales Pichiaceae 3 3 3 0 3 40.1 44.1 -3.1 -5.9 -3.1 0 +Saccharomycodes Saccharomycodales Saccharomycodaceae 3 2 3 0 3 36.0 38.4 -2.3 -2.8 -2.3 3 +Sporopachydermia Sporopachydermiales Sporopachydermiaceae 3 2 3 3 0 48.1 41.4 8.3 3.7 8.3 0 +Taiozyma Phaffomycetales Wickerhamomycetaceae 3 3 3 3 0 56.6 44.7 12.8 10.2 12.9 0 +Gotozyma Phaffomycetales Phaffomycetaceae 2 2 2 1 1 50.5 50.1 0.4 -7.5 8.2 1 yes +Komagataea Phaffomycetales Wickerhamomycetaceae 2 2 2 1 1 55.7 49.3 6.4 -1.8 14.5 0 yes +Millerago Phaffomycetales Phaffomycetaceae 2 2 2 2 0 59.4 43.8 15.7 14.1 17.3 0 +Ruyongia Phaffomycetales Wickerhamomycetaceae 2 2 3 2 1 54.2 54.0 3.7 -11.3 8.2 1 yes +Xingzhongia Phaffomycetales Wickerhamomycetaceae 2 2 2 1 1 54.5 54.8 -0.2 -1.4 1.0 0 yes +Allodekkera Pichiales Pichiaceae 1 1 1 1 0 50.0 38.5 11.5 11.5 11.5 0 +Pachysolen Alaninales Pachysolenaceae 1 1 1 0 1 44.2 53.5 -9.2 -9.2 -9.2 1 +Pichiaceae Pichiales Pichiaceae 1 1 1 0 1 41.9 42.9 -1.0 -1.0 -1.0 0 +Saccharomyces 1 1 2 2 0 100.0 36.0 64.0 63.5 64.4 0 +Saccharomycopsidaceae Ascoideales Saccharomycopsidaceae 1 1 1 0 1 37.3 42.3 -5.0 -5.0 -5.0 0 +Saturnispora Pichiales Pichiaceae 1 1 1 0 1 42.9 48.1 -5.3 -5.3 -5.3 0 +Waltiozyma Phaffomycetales Wickerhamomycetaceae 1 1 1 0 1 52.7 56.4 -3.6 -3.6 -3.6 1 +Wenyingozyma Pichiales Pichiaceae 1 1 1 0 1 42.1 53.3 -11.2 -11.2 -11.2 0 From e1471de149205ee8e43bd0ba43e070018a1e2296 Mon Sep 17 00:00:00 2001 From: Jason Stajich Date: Thu, 29 Oct 2026 20:58:19 -0700 Subject: [PATCH 3/6] Flank synteny of the 156 ambiguous loci: no MTL flank gene beside any; SLA2 beside 129, DIC1 beside 71 Co-Authored-By: Claude Sonnet 5.5 --- .../GENUS_CURATION_LIST.md | 24 +++ results/2026-10-29_near_tie/flank_synteny.py | 71 ++++++++ results/2026-10-29_near_tie/flank_synteny.tsv | 157 ++++++++++++++++++ 3 files changed, 252 insertions(+) create mode 100644 results/2026-10-29_near_tie/flank_synteny.py create mode 100644 results/2026-10-29_near_tie/flank_synteny.tsv diff --git a/results/2026-10-29_near_tie/GENUS_CURATION_LIST.md b/results/2026-10-29_near_tie/GENUS_CURATION_LIST.md index 1dec8d12..c5599c89 100644 --- a/results/2026-10-29_near_tie/GENUS_CURATION_LIST.md +++ b/results/2026-10-29_near_tie/GENUS_CURATION_LIST.md @@ -53,3 +53,27 @@ Barnettozyma is the one genus where MTL flank genes show up in most loci (6 of 8 1. Accept **leave** for the genera of A? 2. For B and C: **hold** now, with a synteny check as the next step, or scope any genus now? 3. Is the order of work: Barnettozyma, Saccharomycopsis, Ambrosiozyma, Petasospora? + +## Synteny check (curator's order: Barnettozyma, Saccharomycopsis, Ambrosiozyma, Petasospora; all 156 loci were run) + +`flank_synteny.py` cuts each ambiguous locus +/- 40 kb and searches 35 flank proteins from the curated records with miniprot (SLA2, CHA1, APN2, DIC1 from the MATsc, MATyl and MATog records; PAP1, OBP1, PIK1 from the MTL records). A hit counts at 40% identity or more; `flank_synteny.tsv` has the nearest hit of each gene (identity@distance to the locus edge, 0 = inside the locus span). Cluster job 31430330. + +| Genus | loci | kept MATsc / MTL | SLA2 or CHA1 within 10 kb | DIC1 within 10 kb | PIK1, OBP1 or PAP1 within 20 kb | +|---|---|---|---|---|---| +| Barnettozyma | 8 | 2 / 6 | 7 | 7 | **0** | +| Saccharomycopsis | 27 | 5 / 22 | 21 | 0 | **0** | +| Ambrosiozyma | 19 | 4 / 15 | 13 | 13 | **0** | +| Petasospora | 11 | 6 / 5 | 11 | 11 | **0** | +| Wickerhamomyces | 9 | 8 / 1 | 9 | 9 | **0** | +| all 27 genera | 156 | 91 / 65 | 129 | 71 | **0** | + +Findings: + +1. **No MTL flank gene lies near any of the 156 loci, including the 65 where MTL was kept.** The MTL architecture has PAP1, OBP1 and PIK1 beside the locus; none is found within 20 kb at 40% identity or more. (The detector's own flank rule found one flank gene beside 38 MTL calls, never two; a hit below 40% identity is not counted here, and a divergent PIK1 in a distant genus could be missed. This is the weak point of the check.) +2. **SLA2 or CHA1 sits beside the locus in 129 of 156 loci**, and **DIC1 beside 71**, the same side-by-side as the *Komagataella* (MATkp) and *Ogataea* (MATog) cassettes: SLA2 on one side, DIC1 on the other. DIC1 is present in the Pichiales and Phaffomycetales genera (Barnettozyma 7 of 8, Ambrosiozyma 13 of 19, Petasospora 11 of 11, Wickerhamomyces 9 of 9) and absent in Saccharomycopsis and Saccharomycodes (Ascoideales, Saccharomycodales), which have SLA2 only. +3. So the identity preference for MTL in Saccharomycopsis, Ambrosiozyma, Barnettozyma and Citeromyces is not backed by the neighbourhood: these loci sit in an SLA2 (+ DIC1) neighbourhood, a MATsc, MATog or MATkp-like arrangement. The MTL calls are probably the closest reference by sequence only. + +### Proposed (for the curator; not implemented) + +- **Genera with SLA2 + DIC1 beside the locus** (Barnettozyma, Ambrosiozyma, Petasospora, Wickerhamomyces, Hansenula, Williopsis, Ruyongia, ...): a MATog/MATkp-type architecture. Candidate action: a reference record from one genus (a *Barnettozyma* or *Petasospora* species with a manual locus check) before scoping; until then the MATsc/MATog calls stand. +- **Rule change to consider:** an MTL call outside Serinales with no flank support should not win a cross-call against a family whose own flank genes are present (MATsc: SLA2). Applied to this replay it would keep MATsc in all 65 loci where MTL won. It makes the flank rule decide the family, the asymmetric evidence that the evaluation warned about, but here the asymmetry is complete (0 of 156). This needs the curator's decision. diff --git a/results/2026-10-29_near_tie/flank_synteny.py b/results/2026-10-29_near_tie/flank_synteny.py new file mode 100644 index 00000000..9632931c --- /dev/null +++ b/results/2026-10-29_near_tie/flank_synteny.py @@ -0,0 +1,71 @@ +"""Flank check for the family_ambiguous loci of the v8 replay: which family's flank genes sit beside the locus? + +For each ambiguous locus cut the contig window locus +/- WINDOW bp, search the flank proteins of both families +with miniprot (SLA2, CHA1, APN2, DIC1 from the MATsc, MATyl and MATog records; PAP1, OBP1, PIK1 from the MTL records) and report the nearest hit +of each gene with its distance to the locus edge and its identity. MATsc-type neighbourhood: SLA2 (or CHA1) next to the locus; MTL-type: PIK1/OBP1/PAP1. +usage: python3 flank_synteny.py (run on the cluster with miniprot on PATH)""" +import collections, glob, gzip, json, os, subprocess, sys, tempfile +import yaml + +R, DB, LIB, OUT = sys.argv[1:5] +WINDOW = 40000 +FLANK = {"sla2": "SLA2", "cha1": "CHA1", "apn2": "APN2", "dic1": "DIC1", "PAP1": "PAP1", "OBP1": "OBP1", "PIK1": "PIK1"} + +def flank_refs(path): + """One protein per (gene, record) from the curated records, named |.""" + n = 0 + with open(path, "w") as out: + for faa in glob.glob(f"{DB}/Ascomycota/*/*/proteins.faa"): + rec = os.path.basename(os.path.dirname(faa)) + if not any(f in rec for f in ("_MATsc_", "_MTL_", "_MATyl_", "_MATog_")): + continue + name = seq = None + for line in open(faa): + if line.startswith(">"): + if name in FLANK and seq: out.write(f">{FLANK[name]}|{rec}\n{seq}\n"); n += 1 + name = next((x[5:] for x in line.strip().split("|") if x.startswith("name=")), None); seq = "" + else: + seq += line.strip() + if name in FLANK and seq: out.write(f">{FLANK[name]}|{rec}\n{seq}\n"); n += 1 + return n + +def genome_seq(asm, contig): + want, seq, on = contig, [], False + with gzip.open(f"{LIB}/{asm}.fa.gz", "rt") as fh: + for line in fh: + if line.startswith(">"): + if on: break + on = line[1:].split()[0] == want + elif on: + seq.append(line.strip()) + return "".join(seq) + +work = tempfile.mkdtemp(dir=R) +refs = os.path.join(work, "flank_refs.faa"); print("flank reference proteins:", flank_refs(refs), flush=True) +rows = [] +for d in sorted(glob.glob(f"{R}/out_v8/runs/*")): + asm = os.path.basename(d); f = d + "/detection_report.yaml" + if not os.path.exists(f): continue + y = yaml.safe_load(open(f)) + for l in y.get("detected") or []: + if not l.get("family_ambiguous"): continue + seq = genome_seq(asm, l["contig"]) + lo, hi = max(1, l["start"] - WINDOW), min(len(seq), l["end"] + WINDOW) + fa = os.path.join(work, "win.fa"); open(fa, "w").write(f">w\n{seq[lo - 1:hi]}\n") + gff = subprocess.run(["miniprot", "--gff", "-t", "2", fa, refs], capture_output=True, text=True).stdout + best = {} + for g in gff.splitlines(): + c = g.split("\t") + if len(c) < 9 or c[2] != "mRNA": continue + a = dict(x.split("=", 1) for x in c[8].split(";") if "=" in x) + gene = a.get("Target", "").split()[0].split("|")[0] + ident = float(a.get("Identity", 0)) * 100; s0, e0 = lo - 1 + int(c[3]), lo - 1 + int(c[4]) + dist = 0 if (s0 <= l["end"] and e0 >= l["start"]) else min(abs(s0 - l["end"]), abs(e0 - l["start"])) + if gene not in best or ident > best[gene][0]: best[gene] = (round(ident, 1), dist, s0, e0, c[6]) + rows.append(dict(genome=asm, family=l["family"].split(":")[1], idiomorph=l.get("idiomorph"), contig=l["contig"], start=l["start"], end=l["end"], + identity=l["family_ambiguous"]["identities"], **{k: (f"{v[0]}@{v[1]}" if (v := best.get(k)) else "") for k in sorted(set(FLANK.values()))})) +cols = ["genome", "family", "idiomorph", "contig", "start", "end"] + sorted(set(FLANK.values())) +with open(OUT, "w") as out: + out.write("\t".join(cols) + "\n") + for r in rows: out.write("\t".join(str(r[c]) for c in cols) + "\n") +print(len(rows), "loci") diff --git a/results/2026-10-29_near_tie/flank_synteny.tsv b/results/2026-10-29_near_tie/flank_synteny.tsv new file mode 100644 index 00000000..6988bfc3 --- /dev/null +++ b/results/2026-10-29_near_tie/flank_synteny.tsv @@ -0,0 +1,157 @@ +genome family idiomorph contig start end APN2 CHA1 DIC1 OBP1 PAP1 PIK1 SLA2 +GCA_001599195.1_JCM_3601_assembly_v001 MATsc MATa BCGI01000001.1 643043 698460 61.4@1099 51.5@0 +GCA_001599295.1_JCM_9486_assembly_v001 MATsc MATa BCGN01000003.1 1834745 1863776 59.6@3603 55.8@0 +GCA_001599995.1_JCM_7599_assembly_v001 MTL A BCIP01000001.1 108563 114355 71.9@1825 52.3@0 +GCA_001661245.1_Pacta1_2 MTL alpha KV454014.1 197158 238577 56.3@0 +GCA_001936135.1_KJJ81 MTL alpha CP012819.1 1926142 1945025 51.7@0 +GCA_001936135.1_KJJ81 MTL alpha CP012812.1 1952798 1972723 51.6@0 +GCA_001936155.1_KPH12 MTL alpha CP012826.1 1898110 1918007 51.7@0 +GCA_001936275.1_ATCC36309 MTL alpha CP015981.1 1940512 1959967 51.7@0 +GCA_003123585.1_ASM312358v1 MTL A QBLI01000035.1 9748 26373 58.2@8224 51.2@0 +GCA_003123885.1_ASM312388v1 MTL A QBLJ01000026.1 125869 142498 58.2@8167 51.2@0 +GCA_003243015.1_ASM324301v1 MATsc MATalpha NHAM01000013.1 323577 328981 50.0@0 +GCA_003327685.1_ASM332768v1 MATsc MATalpha QEFR01000004.1 276325 287124 51.1@0 +GCA_003339355.1_UCD_Pferm_PL1 MATsc MATalpha QAWB01000478.1 178 1924 +GCA_003339405.1_UCD_Pnorv_NO1 MATsc MATalpha QAWC01000011.1 43142 48071 51.0@0 +GCA_003705185.2_ASM370518v2 MTL alpha PPHU02000014.1 79953 84602 +GCA_003705185.2_ASM370518v2 MTL A PPHU02000007.1 26712 32905 71.3@1437 52.7@0 +GCA_003705225.2_ASM370522v2 MATsc MATalpha PPHW02000031.1 88938 96840 71.5@0 52.7@0 +GCA_003705515.2_ASM370551v2 MATsc MATa PPIQ02000974.1 165583 172315 51.1@0 +GCA_003706235.2_ASM370623v2 MTL alpha PPKS02000022.1 33100 71249 72.4@0 47.6@0 +GCA_003706315.3_ASM370631v3 MTL alpha PPKY03000108.1 1223 2583 +GCA_003706445.3_ASM370644v3 MATsc MATa PPLH03000051.1 39 38039 62.2@0 52.0@0 +GCA_003706615.3_ASM370661v3 MATsc MATa PPLU03000009.1 138944 143669 55.3@16230 51.3@0 +GCA_003706635.2_ASM370663v2 MTL alpha PPLV02000004.1 622360 649386 71.8@2573 51.9@0 +GCA_003706655.3_ASM370665v3 MTL A PPLX03000005.1 120524 137156 58.2@8173 51.2@0 +GCA_003706665.2_ASM370666v2 MATsc MATa PPLY02000023.1 22910 35246 58.2@3585 50.5@0 +GCA_003706765.3_ASM370676v3 MATsc MATa PPXL03000005.1 545853 574183 58.4@4269 52.4@0 +GCA_003707015.3_ASM370701v3 MATsc MATa PPMU03000001.1 253309 258264 59.1@1070 53.4@0 +GCA_003707205.3_ASM370720v3 MATsc MATa PPNL03000096.1 227 10984 +GCA_003707275.3_ASM370727v3 MATsc MATa PPNM03000112.1 217 12323 +GCA_003707675.3_ASM370767v3 MTL alpha PPKZ03000012.1 331460 336694 +GCA_003707675.3_ASM370767v3 MTL A PPKZ03000004.1 215815 223380 70.4@1597 52.6@0 +GCA_003707735.2_ASM370773v2 MATsc MATa PPLE02000007.1 114093 119141 61.1@683 53.8@0 +GCA_003707885.2_ASM370788v2 MATsc MATa PPMB02000005.1 308839 322961 58.8@0 51.4@0 +GCA_003708265.3_ASM370826v3 MATsc MATa PPNV03000010.1 378085 383189 60.4@16318 52.2@0 +GCA_003708285.2_ASM370828v2 MATsc MATa PPNT02000026.1 37428 67326 62.5@0 51.9@0 +GCA_003708295.3_ASM370829v3 MTL A PPNU03000009.1 78602 83299 61.4@1290 52.3@0 +GCA_003709245.3_ASM370924v3 MATsc MATa PPNR03000050.1 40 48778 63.3@0 52.3@0 +GCA_004931855.1_ASM493185v1 MATsc MATalpha SELW01000438.1 292 1942 +GCA_010994365.1_ASM1099436v1 MTL alpha JNFU01000001.1 1750657 1752492 55.8@419 +GCA_012062855.1_ASM1206285v1 MTL alpha WXEZ01000003.1 716032 735927 51.7@0 +GCA_017948575.1_ASM1794857v1 MATsc MATa JACVEX010000198.1 581 38969 64.0@0 51.8@0 +GCA_018343965.1_ASM1834396v1 MATsc MATa JADIOU010000016.1 198194 253611 61.4@1099 51.5@0 +GCA_019096115.1_ASM1909611v1 MATsc MATalpha JAGUCV010000004.1 269830 282876 51.5@0 +GCA_019155655.1_ASM1915565v1 MATsc MATa JAFMZF010000005.1 1021368 1037845 51.6@0 +GCA_020280145.1_ASM2028014v1 MTL alpha JAFIIU010000003.1 172887 196979 58.1@0 52.5@0 +GCA_020995425.1_ASM2099542v1 MATsc MATa CP083467.1 866744 871848 60.4@16318 52.2@0 +GCA_022641835.1_ASM2264183v1 MATsc MATa CP048715.1 630345 685843 61.4@1099 51.5@0 +GCA_023497445.1_ASM2349744v1 MTL alpha CP095753.1 1930140 1949510 51.7@0 +GCA_023627795.1_ASM2362779v1 MTL A JAMAIE010000005.1 614225 630853 58.2@8172 51.2@0 +GCA_023629335.1_ASM2362933v1 MATsc MATalpha JAMAIZ010000027.1 46063 56850 51.3@0 +GCA_025531525.1_ASM2553152v1 MATsc MATalpha JAMYHI010000112.1 23938 28926 51.7@0 +GCA_025531535.1_ASM2553153v1 MATsc MATalpha JAMYHH010000108.1 26928 31916 51.7@0 +GCA_025531545.1_ASM2553154v1 MATsc MATalpha JAMYHG010000426.1 315 1969 +GCA_025531555.1_ASM2553155v1 MATsc MATalpha JAMYHF010000081.1 16823 21824 50.9@0 +GCA_029299855.1_ASM2929985v1 MTL alpha DAGXHN010000045.1 42219 43819 +GCA_030267745.1_ASM3026774v1 MATsc MATalpha BSXS01010739.1 454 2132 63.0@234 +GCA_030556525.1_ASM3055652v1 MATsc MATa JAKTUE010000007.1 151609 186922 60.2@0 53.0@0 +GCA_030557365.1_ASM3055736v1 MATsc MATa JAKTPA010000050.1 568 38098 62.5@0 52.0@0 +GCA_030557395.1_ASM3055739v1 MTL alpha JAKTPC010000023.1 4649 14590 +GCA_030557395.1_ASM3055739v1 MTL A JAKTPC010000004.1 532268 539022 71.6@1143 53.0@0 +GCA_030557705.1_ASM3055770v1 MATsc MATa JANIVH010000002.1 1002757 1025745 62.9@1076 52.7@0 +GCA_030558335.1_ASM3055833v1 MTL A JAJMSG010000009.1 219121 223919 59.9@1111 52.1@0 +GCA_030558495.1_ASM3055849v1 MATsc MATalpha JAJMSP010000150.1 7862 12760 51.0@0 +GCA_030561065.1_ASM3056106v1 MATsc MATalpha JAKTWI010001458.1 202 1715 +GCA_030563305.1_ASM3056330v1 MTL A JAKUBT010000004.1 231765 255322 62.0@0 21.4@0 51.8@0 +GCA_030563965.1_ASM3056396v1 MATsc MATa JAJMKU010000007.1 131833 137795 50.9@0 +GCA_030564545.1_ASM3056454v1 MTL alpha JAJLVT010000128.1 173 1192 +GCA_030565225.1_ASM3056522v1 MATsc MATalpha JAJMBG010000014.1 55897 72598 62.8@1108 52.6@0 +GCA_030567395.1_ASM3056739v1 MTL alpha JAJLSF010000362.1 18802 25725 48.6@0 +GCA_030567455.1_ASM3056745v1 MTL A JAJLSD010000016.1 99135 103909 57.7@914 49.8@0 +GCA_030567475.1_ASM3056747v1 MTL alpha JAJLSH010000159.1 3398 8183 70.1@1804 51.3@0 +GCA_030567475.1_ASM3056747v1 MTL alpha JAJLSH010000044.1 1882 20575 70.1@0 51.3@0 +GCA_030567475.1_ASM3056747v1 MTL alpha JAJLSH010000171.1 2820 12134 70.1@1804 51.3@0 +GCA_030567495.1_ASM3056749v1 MTL alpha JAJLSG010000226.1 51846 79195 70.4@0 52.7@0 +GCA_030568845.1_ASM3056884v1 MATsc MATa JAJMIZ010000007.1 1476 6559 52.0@0 +GCA_030569135.1_ASM3056913v1 MATsc MATalpha JAJMJZ010002059.1 355 2005 +GCA_030569275.1_ASM3056927v1 MATsc MATa JAJMKO010000124.1 3439 18025 50.3@0 +GCA_030569515.1_ASM3056951v1 MATsc MATa JAJMLD010000026.1 1 2470 57.9@10135 39.6@0 +GCA_030569745.1_ASM3056974v1 MTL A JAJMLR010000017.1 211458 216185 62.9@1102 52.6@0 +GCA_030570285.1_ASM3057028v1 MATsc MATalpha JAJLVM010000195.1 22724 27653 51.0@0 +GCA_030570795.1_ASM3057079v1 MTL alpha JAJLWN010000014.1 131342 159843 59.6@877 52.8@0 +GCA_030570875.1_ASM3057087v1 MTL alpha JAJLWQ010000352.1 64296 77670 48.9@0 +GCA_030571235.1_ASM3057123v1 MATsc MATa JAJLXG010000020.1 180291 184855 59.5@645 50.9@0 +GCA_030572235.1_ASM3057223v1 MATsc MATalpha JAJLZM010000262.1 47848 53764 71.1@2051 52.8@0 +GCA_030572555.1_ASM3057255v1 MATsc MATa JAJMAJ010000003.1 169290 191981 61.4@0 51.2@0 +GCA_030572875.1_ASM3057287v1 MATsc MATa JAJMCJ010000135.1 2109 13054 54.7@3918 53.8@0 +GCA_030574175.1_ASM3057417v1 MATsc MATa JAJMEN010000065.1 587 39245 64.0@0 52.0@0 +GCA_030574595.1_ASM3057459v1 MATsc MATalpha JAJMFI010000625.1 5415 14719 57.9@1241 49.8@0 +GCA_030574595.1_ASM3057459v1 MATsc MATa JAJMFI010000654.1 2055 7536 57.1@1482 49.7@0 +GCA_030574715.1_ASM3057471v1 MTL A JAJMFO010000032.1 120169 124860 52.5@0 +GCA_030574855.1_ASM3057485v1 MATsc MATa JAJMFP010000178.1 180711 200557 62.9@995 52.9@0 +GCA_030574875.1_ASM3057487v1 MATsc MATa JAJMFM010000007.1 81519 108643 62.5@1146 52.3@0 +GCA_030575215.1_ASM3057521v1 MTL alpha JAJMII010000120.1 597 1764 +GCA_030579615.1_ASM3057961v1 MATsc MATa JAKTRI010000005.1 9416 38447 59.6@3603 55.8@0 +GCA_030579935.1_ASM3057993v1 MATsc MATalpha JAKTRY010000741.1 268 1661 68.8@3935 +GCA_030579955.1_ASM3057995v1 MTL alpha JAKTRZ010000681.1 281 1959 +GCA_030579955.1_ASM3057995v1 MTL A JAKTRZ010000415.1 3088 8880 71.9@1833 53.1@0 +GCA_030580035.1_ASM3058003v1 MATsc MATalpha JAKTSE010000178.1 222345 227442 51.2@0 +GCA_030580115.1_ASM3058011v1 MATsc MATa JAKTSJ010000109.1 230 10994 +GCA_030580415.1_ASM3058041v1 MTL alpha JAKTTA010000039.1 23763 28578 48.4@0 +GCA_030580455.1_ASM3058045v1 MTL A JAKTSX010000010.1 206303 219920 60.8@2214 50.8@0 +GCA_030582155.1_ASM3058215v1 MATsc MATa JAKTWT010000007.1 285543 290653 61.9@1217 53.4@0 +GCA_030582235.1_ASM3058223v1 MTL A JAKTWV010000016.1 21750 37222 60.1@0 49.9@0 +GCA_030582255.1_ASM3058225v1 MATsc MATa JAKTWW010000016.1 6038 12420 60.4@257 53.7@0 +GCA_030582275.1_ASM3058227v1 MTL A JAKTWX010000358.1 10668 34198 50.5@0 48.8@0 +GCA_030583195.1_ASM3058319v1 MTL alpha JAJMHU010000036.1 1757 21563 51.7@0 +GCA_030585085.1_ASM3058508v1 MTL alpha JAJMBV010000006.1 337097 373300 62.5@0 50.9@0 +GCA_030674255.1_ASM3067425v1 MATsc MATa JAJLXP010000001.1 300082 305157 61.2@1145 52.6@0 +GCA_030770065.1_ASM3077006v1 MATsc MATalpha JASOBJ010000274.1 18393 23381 51.7@0 +GCA_031125485.1_ASM3112548v1 MTL alpha JASTUL010000111.1 1497 2664 +GCA_031125595.1_ASM3112559v1 MATsc MATalpha JASTUX010000026.1 70699 92003 50.2@0 +GCA_031125625.1_ASM3112562v1 MTL alpha JASTUY010000005.1 71131 76576 50.3@0 +GCA_031125665.1_ASM3112566v1 MATsc MATalpha JASTUZ010000025.1 69685 75089 50.0@0 +GCA_031125675.1_ASM3112567v1 MATsc MATalpha JASVEF010000013.1 168013 173417 50.0@0 +GCA_031125685.1_ASM3112568v1 MATsc MATalpha JASTVA010000011.1 168247 173651 50.0@0 +GCA_031126305.1_ASM3112630v1 MTL alpha JASTUP010000673.1 2307 3907 +GCA_037040195.1_ASM3704019v1 MATsc MATalpha JAXQGK010000272.1 463 2117 59.2@234 +GCA_037041065.1_ASM3704106v1 MATsc MATa JAXQHV010000076.1 306470 311669 62.5@1239 51.7@0 +GCA_037041205.1_ASM3704120v1 MATsc MATalpha JAXQIC010000078.1 1476 3214 65.0@145 +GCA_037041255.1_ASM3704125v1 MATsc MATalpha JAXQIE010000001.1 7928 12909 51.6@0 +GCA_037041515.1_ASM3704151v1 MATsc MATalpha JAXQIP010000894.1 1 4386 49.4@0 +GCA_037041755.1_ASM3704175v1 MATsc MATalpha JAXQJC010000140.1 9845 14826 51.6@0 +GCA_037042445.1_ASM3704244v1 MATsc MATa JAXQKK010000058.1 33959 39158 62.5@1239 51.7@0 +GCA_037102705.1_ASM3710270v1 MATsc MATalpha BTGB01000003.1 287773 298560 51.4@0 +GCA_037355565.1_Ssch_CD502 MTL alpha JBAKGB010000901.1 722 1871 +GCA_039700735.1_ASM3970073v1 MATsc MATalpha JBBJZV010000113.1 360583 365680 51.2@0 +GCA_039700745.1_ASM3970074v1 MATsc MATalpha JBBJZU010000151.1 66405 71301 51.0@0 +GCA_040365455.1_JCM_7609_assembly_v001 MTL alpha BCIU01000086.1 39282 56202 +GCA_040365455.1_JCM_7609_assembly_v001 MTL alpha BCIU01000040.1 47819 68154 52.6@0 +GCA_040802125.1_ASM4080212v1 MATsc MATa JBEUWP010000001.1 360635 365892 55.9@549 51.7@0 +GCA_040938015.1_ASM4093801v1 MATsc MATalpha JBBULV010000672.1 561 2215 +GCA_041498895.1_ASM4149889v1 MTL A JBGMOJ010000036.1 108850 114405 68.4@2048 51.6@0 +GCA_047651925.1_ASM4765192v1 MATsc MATalpha CM105497.1 12854 36780 +GCA_047651925.1_ASM4765192v1 MATsc MATa CM105497.1 191610 194513 +GCA_048164895.1_ASM4816489v1 MTL alpha JBKSNE010000019.1 1692 12445 +GCA_049863505.1_ASM4986350v1 MTL A CM113344.1 1130885 1139023 59.1@1077 51.2@0 +GCA_053455635.1_ASM5345563v1 MATsc MATa JBQYEW010000016.1 172246 177905 59.7@937 53.7@0 +GCA_054085685.1_DORT_Sapseu_12645 MTL alpha JBSZQV010000009.1 639172 670297 44.4@0 +GCA_054085705.1_DORT_Sapseu_12643 MTL alpha JBSZQX010000011.1 644859 675983 44.4@0 +GCA_054953955.1_ASM5495395v1 MTL alpha CM143131.1 298409 303209 42.6@0 +GCA_054953955.1_ASM5495395v1 MTL alpha CM143129.1 463900 474618 40.2@0 +GCA_054953955.1_ASM5495395v1 MTL alpha CM143126.1 1288273 1290053 45.3@465 +GCA_054953955.1_ASM5495395v1 MTL alpha CM143128.1 2741968 2771606 42.6@0 +GCA_054953955.1_ASM5495395v1 MTL alpha CM143127.1 474935 502738 42.6@0 +GCA_054953955.1_ASM5495395v1 MTL alpha CM143130.1 2215366 2219597 43.1@0 +GCA_058970815.1_ASM5897081v1 MATsc MATa JBZCIV010000002.1 570188 625602 61.4@1099 51.4@0 +GCA_060251755.1_ASM6025175v1 MATsc MATa JBSNFT010000016.1 13481 40810 58.4@0 52.7@0 +GCA_060251785.1_ASM6025178v1 MATsc MATa JBSNFU010000005.1 282523 287669 63.7@1213 52.7@0 +GCA_060251865.1_ASM6025186v1 MATsc MATa JBSNFY010000016.1 15369 32262 62.2@1207 53.4@0 +GCA_060251885.1_ASM6025188v1 MATsc MATa JBSNFS010000011.1 284134 335651 62.9@0 53.1@0 +GCA_900465365.1_CvDDNA1.1 MATsc MATa UICF01000025.1 1119346 1124444 61.2@16356 52.0@0 +GCA_947297755.1_246_Pichia_kluyveri MATsc MATalpha CAMYTV010000058.1 998 2259 +GCA_947297755.1_246_Pichia_kluyveri MATsc MATalpha CAMYTV010000030.1 184325 195115 51.3@0 +GCA_963678715.1_2795_Cyberlindnera_fabianii MATsc MATa CAVMBU010000011.1 635202 690623 61.4@1099 51.5@0 +GCA_982397265.1_4-FMI MATsc MATa CEVXIE010000012.1 38798 94215 61.4@1099 51.4@0 +GCF_020623625.1_UHD_SCDLUD_16 MTL alpha NC_060204.1 594740 625360 44.2@0 From 0ac710a981d88fb8e4b1c7bd042e4aba1e672544 Mon Sep 17 00:00:00 2001 From: Jason Stajich Date: Thu, 29 Oct 2026 21:02:20 -0700 Subject: [PATCH 4/6] Candidate reference records for the SLA2-type genera: S. schoenii, Barnettozyma californica, Petasospora fabianii Co-Authored-By: Claude Sonnet 5.5 --- .../2026-10-29_near_tie/CANDIDATE_RECORDS.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 results/2026-10-29_near_tie/CANDIDATE_RECORDS.md diff --git a/results/2026-10-29_near_tie/CANDIDATE_RECORDS.md b/results/2026-10-29_near_tie/CANDIDATE_RECORDS.md new file mode 100644 index 00000000..9a64a3fc --- /dev/null +++ b/results/2026-10-29_near_tie/CANDIDATE_RECORDS.md @@ -0,0 +1,38 @@ +# Candidate reference records for the SLA2-type genera (draft, 2026-10-29) + +Search: PubMed (via the PubMed MCP) and NCBI Protein and Assembly (E-utilities) for MAT loci in Barnettozyma, Petasospora (Cyberlindnera fabianii), Wickerhamomyces, Ambrosiozyma, Saccharomycopsis, Citeromyces, Williopsis (Cyberlindnera jadinii), Hansenula, Kuraishia and Pachysolen. Only three leads are real; nothing here is curated yet. + +## 1. *Saccharomycopsis schoenii*: best candidate (published locus, RNA-seq, chromosome-scale assembly) + +- **Paper:** Kriti D, Barazandeh M, Ogbede JU, Giaever G, Nislow C. G3 2026;16(5), [10.1093/g3journal/jkag067](https://doi.org/10.1093/g3journal/jkag067) (PMID 41849659, PMC13148404). Chromosome-scale assembly (6 nuclear chromosomes, PacBio HiFi + Hi-C), BRAKER2 annotation, RNA-seq. +- **What it says about MAT:** an expanded MAT system, with SLA2-MAT cassettes (MATa1, MATa2, MATalpha1, MATalpha2) on every chromosome; SLA2 stays tightly linked to the MAT genes on every chromosome while DIC1 is scattered; the cassettes are co-transcribed (189-247 bp splice junctions between MATa1 and SLA2; conserved 58 bp introns between MATa2 and MATa1). The active locus is on chromosome IV: a leftmost alpha-dominant sub-cluster (470,610-475,000: MATalpha2, MATalpha1) and a rightmost palindromic cassette (528,044-537,777; SLA2 anchor flanked by mirrored MATa1 and MATa2 arrays). The species is homothallic (Dost et al., Microbiol Res 2024, [10.1016/j.micres.2024.127691](https://doi.org/10.1016/j.micres.2024.127691), PMID 38492364; *S. lassenensis* is heterothallic). +- **Assembly:** GenBank JBTFFQ000000000, BioProject PRJNA1364152 (data availability). The v0.7.0 genome table has GCA_054953955.1 (NCYC 2975, chromosome level, submitted 2026-02-09), which I expect to be this assembly (not checked against the WGS prefix). Our replay calls six `MTL alpha` loci there (CM143126-CM143131), each with SLA2 (40-45% identity) inside the locus, no DIC1 and no PIK1/OBP1/PAP1: the published SLA2-MAT architecture, not MTL. +- **Record plan:** one record per active locus, `system` homothallic or `unknown`, the gene models of the deposit (annotation plus RNA-seq, tier 2), a family of its own or an SLA2-MAT family (curator). +- **Needs:** the deposit's annotation (GFF) and exact coordinates of the chromosome IV loci; the MATa1/MATa2 intron structure. + +## 2. *Barnettozyma californica* and relatives + +- **Paper:** Hession C, Byrne KP, Wolfe KH, Butler G. PLoS Genet 2025;21(12):e1011814, [10.1371/journal.pgen.1011814](https://doi.org/10.1371/journal.pgen.1011814) (PMID 41359681, PMC12711049). A centromere formed at the MAT locus of *B. californica* (250 kb from the old one); the same chromosome carries MAT and MRP17-PUT2 about 250 kb apart in all three *Barnettozyma* species studied. +- **MAT structure (S3 Fig, text only read):** a 460 bp centromere-associated sequence lies in a 2.8 kb intergenic region **between MATa1 and MATa2 on one side and MATalpha1 and MATalpha2 on the other**, so one locus carries both gene pairs. +- **Our replay:** five *B. californica* assemblies (UCD09 GCA_003123585.1, UCD89 GCA_003123885.1, NRRL Y-17395 GCA_003706655.x, PB4207 GCA_023627795.1) give one MTL call of 16 kb with SLA2 inside and **DIC1 8.2 kb away**, no PIK1: the SLA2-MAT-DIC1 arrangement. +- **Assembly with the best contiguity:** *B. discipulorum* GCA_049863505.1 (PYCC:10016, complete genome, 2025-04-23; not in our run). The accessions the paper used are in its S1 Table, which was not read. +- **Record plan:** a record from the paper's locus (both idiomorph gene pairs at one locus), pseudohomothallic or `unknown`, tier 2; family decision for the curator (a Phaffomycetales/Barnettozyma family, or MATog-like). +- **Needs:** S1 Table and S3 Fig (supplement) for the assembly and coordinates. + +## 3. *Petasospora (Cyberlindnera) fabianii*: annotation-only + +- Protein ONH67106 "Mating-type-like protein ALPHA1" (strain 65, MPUK01000005.1, locus tag BON22_3092, MATalpha_HMGbox region): a draft-genome annotation with no paper on the locus (PubMed finds none), tier 3 at best. +- Chromosome-level assemblies: GCA_022641835.1 ("Missouri", CP048715.1): our MATsc call is at 630,345-685,843 with DIC1 1.1 kb from the locus and SLA2 inside; GCA_050575385.1 (TBRC4498, chromosome) is uncalled in v0.7.0. +- **Record plan:** a manual annotation of the CP048715.1 locus (the same procedure as for CBS 573) would make this a real record; needs the curator's go-ahead on the evidence bar (no publication, no RNA-seq). + +## Leads not followed +- *Williopsis (Cyberlindnera) jadinii* XP_020071302: hypothetical HMG-box protein, nothing on MAT. +- *Wickerhamomyces anomalus* (isolate KG16, JAHTLX01) is one of the seven Phaffomycetales genomes of Hession et al.; whether the supplement describes its MAT locus was not checked. +- *Ambrosiozyma*, *Citeromyces*, *Hansenula*, *Kuraishia*, *Pachysolen*: no MAT-named protein records or papers found. + +## Next steps +1. Fetch the S. schoenii annotation (GCA_054953955.1 or JBTFFQ) and the Hession et al. supplement (S1 Table, S3 Fig) for the coordinates. +2. Draft records for S. schoenii (chromosome IV) and *B. californica* with the existing `curate-db propose` workflow, plus a family decision (separate or MATog-like). +3. Curator: the family structure (one SLA2-MAT family for these genera, or per genus) and the evidence bar for the annotation-only *P. fabianii* lead. + +Sources (PubMed): 41849659, 41359681, 38492364. From 20336b6c99f8f92dc190f8b690df7fda48f9d1d5 Mon Sep 17 00:00:00 2001 From: Jason Stajich Date: Fri, 30 Oct 2026 03:47:32 -0700 Subject: [PATCH 5/6] S. schoenii chromosome IV MAT loci: gene models rebuilt from public RNA-seq (the authors' GTF is not published) Co-Authored-By: Claude Sonnet 5.5 --- results/2026-10-29_ss_records/.gitignore | 5 + results/2026-10-29_ss_records/README.md | 27 + results/2026-10-29_ss_records/chr4_models.py | 39 + results/2026-10-29_ss_records/chr4_orfs.py | 55 + .../data/chr4_models.txt | 65 + .../2026-10-29_ss_records/data/chr4_orfs.tsv | 54 + .../data/depth_chrIV_455k-545k.tsv.gz | Bin 0 -> 135551 bytes .../2026-10-29_ss_records/data/genome.fa.fai | 7 + .../data/junctions_chrIV.tsv | 6 + .../data/miniprot_all.gff | 294 + .../2026-10-29_ss_records/data/stringtie.gtf | 7291 +++++++++++++++++ results/2026-10-29_ss_records/make_refs.sh | 6 + results/2026-10-29_ss_records/refs.faa | 126 + results/2026-10-29_ss_records/ss_models.slurm | 15 + results/2026-10-29_ss_records/ss_rnaseq.slurm | 29 + 15 files changed, 8019 insertions(+) create mode 100644 results/2026-10-29_ss_records/.gitignore create mode 100644 results/2026-10-29_ss_records/README.md create mode 100644 results/2026-10-29_ss_records/chr4_models.py create mode 100644 results/2026-10-29_ss_records/chr4_orfs.py create mode 100644 results/2026-10-29_ss_records/data/chr4_models.txt create mode 100644 results/2026-10-29_ss_records/data/chr4_orfs.tsv create mode 100644 results/2026-10-29_ss_records/data/depth_chrIV_455k-545k.tsv.gz create mode 100644 results/2026-10-29_ss_records/data/genome.fa.fai create mode 100644 results/2026-10-29_ss_records/data/junctions_chrIV.tsv create mode 100644 results/2026-10-29_ss_records/data/miniprot_all.gff create mode 100644 results/2026-10-29_ss_records/data/stringtie.gtf create mode 100644 results/2026-10-29_ss_records/make_refs.sh create mode 100644 results/2026-10-29_ss_records/refs.faa create mode 100644 results/2026-10-29_ss_records/ss_models.slurm create mode 100644 results/2026-10-29_ss_records/ss_rnaseq.slurm diff --git a/results/2026-10-29_ss_records/.gitignore b/results/2026-10-29_ss_records/.gitignore new file mode 100644 index 00000000..81f01bb3 --- /dev/null +++ b/results/2026-10-29_ss_records/.gitignore @@ -0,0 +1,5 @@ +data/spliced_*.txt +data/transcripts.fa +data/transcripts.fa.transdecoder.* +data/longest_orfs.pep +refs.faa.bak diff --git a/results/2026-10-29_ss_records/README.md b/results/2026-10-29_ss_records/README.md new file mode 100644 index 00000000..f46d05e7 --- /dev/null +++ b/results/2026-10-29_ss_records/README.md @@ -0,0 +1,27 @@ +# S. schoenii chromosome IV MAT loci: gene models rebuilt from public RNA-seq (2026-10-30) + +**Why:** Kriti et al., G3 2026 ([10.1093/g3journal/jkag067](https://doi.org/10.1093/g3journal/jkag067), PMID 41849659) describe SLA2-MAT cassettes on every chromosome of *S. schoenii* (GDD12, GCA_054953955.1, WGS JBTFFQ01) and say the BRAKER2 GTF is on GitHub and Zenodo. Neither holds it (GitHub `dkriti/Saccharomycopsis-schoenii-Genome-Assembly` and Zenodo 10.5281/zenodo.18950794 carry scripts only; checked 2026-10-29), and the NCBI assembly has no annotation. The models below are rebuilt here and are **ours, not the authors'**. + +**Method** (`ss_rnaseq.slurm`, `ss_models.slurm`, `chr4_orfs.py`, `chr4_models.py`, `make_refs.sh`): the three paired non-stranded RNA-seq runs of PRJNA1364152 (SRR37453601-03; 86% overall alignment) mapped with hisat2; StringTie transcripts; TransDecoder long ORFs; ORFs identified by phmmer against the 63 curated Saccharomycotina MAT proteins (`refs.faa`) and Pfam-A (HMG_box, Homeodomain, MATalpha_HMGbox, I_LWEQ). The library is not stranded, so transcript and ORF strands are inferred from the ORF alone. + +## What agrees with the paper +- Chromosome IV is CM143129.1. Splice junction **536,635-536,692 (58 bp, 218 reads)** = the paper's conserved 58 bp intron at 536,635. The paper's mirrored junction at 529,128 is not seen (the two arms are an inverted repeat, so reads map to one copy). +- RNA depth in the left cluster ends near 474,500 (paper: SLA2 to 475,000); the right cassette has two blocks, 530-532 kb and 534-536 kb, with no depth at 532.5-533.5 kb (the paper's spacer). +- SLA2 (I_LWEQ domain, 546-712 bits to curated SLA2) is found as one ORF in each arm of the palindrome (CDS 529,992-532,490 and 533,981-535,828, mirrored) and, diverged, at 472,708-474,606: the paper's "SLA2 anchors". + +## Models (ours) +| locus | ORF | CDS (CM143129.1) | evidence | +|---|---|---|---| +| left | MATalpha1 | 471,020-471,595, minus | 191 aa, MATalpha_HMGbox 54 bits, 73 bits to *Ogataea* MATalpha1 | +| left | HMG-like (a2-type) | 470,349-470,951 plus, or 470,176-470,243 + 470,336-470,951 with a 92 bp intron (97 reads) | 200/227 aa, 44 bits to *S. cerevisiae* MATA2, no Pfam hit | +| left | homeodomain | 471,961-472,227 + 472,445-472,489 plus | 103 aa (partial), Homeodomain 57 bits; the 217 bp intron (198 reads) joins it toward SLA2, the paper's "MATa1-SLA2 splice junction" | +| left | SLA2 | 472,708-473,478 and 473,680-474,606 | two diverged pieces, I_LWEQ 186 bits | +| right (IR copy 2) | homeodomain | 536,046-536,090 + 536,296-536,634 + 536,693-536,944, minus | 211 aa, Homeodomain 54 bits, introns of 205 bp (221 reads) and 58 bp (218 reads) | +| right (IR copy 1) | homeodomain | 529,258-529,749 | 163 aa, 34 bits; the 58 bp intron is not seen here | +Raw table: `data/chr4_orfs.tsv`; junctions `data/junctions_chrIV.tsv`; transcripts `data/stringtie.gtf`. + +## What is not settled +- **Gene names.** A homeodomain protein is MATa1 or MATalpha2; Pfam cannot say which. The paper calls the left cluster alpha (MATalpha2, MATalpha1) and the right cassette a (MATa1, MATa2). I use those names only by position, as a hypothesis. +- **No HMG-box (MATa2) ORF in the right cassette** passed the filters; the left "HMG-like" ORF has no Pfam hit, as for *Komagataella* MATa2 (13.6 bits, below GA). +- Palindrome copies are collapsed by short-read mapping; strand of the unstranded transcripts is inferred. +- These are our own ORF calls, not an annotation of the deposit, so a record built on them is **tier 3**, not tier 2, until the authors' GTF is obtained or the models are checked another way. diff --git a/results/2026-10-29_ss_records/chr4_models.py b/results/2026-10-29_ss_records/chr4_models.py new file mode 100644 index 00000000..f6b0aabc --- /dev/null +++ b/results/2026-10-29_ss_records/chr4_models.py @@ -0,0 +1,39 @@ +"""S. schoenii chromosome IV (CM143129.1): StringTie transcripts and TransDecoder ORFs in the MAT region, identified by phmmer +against the curated Saccharomycotina MAT proteins (refs.faa). Usage: chr4_models.py data/ refs.faa A B""" +import re, sys, collections, pyhmmer +from pyhmmer.easel import SequenceFile, Alphabet, TextSequence, DigitalSequenceBlock +d, refs, A, B = sys.argv[1], sys.argv[2], int(sys.argv[3]), int(sys.argv[4]) +tx = {} +for l in open(f"{d}/stringtie.gtf"): + f = l.split("\t") + if f[0] != "CM143129.1" or f[2] not in ("transcript", "exon"): continue + tid = re.search(r'transcript_id "([^"]+)"', f[8]).group(1) + t = tx.setdefault(tid, {"strand": f[6], "exons": [], "span": None, "cov": None}) + if f[2] == "transcript": + t["span"] = (int(f[3]), int(f[4])); t["cov"] = float(re.search(r'cov "([^"]+)"', f[8]).group(1)) + else: t["exons"].append((int(f[3]), int(f[4]))) +keep = {k: v for k, v in tx.items() if v["span"] and A <= v["span"][0] and v["span"][1] <= B} +pep = {} +name = None +for l in open(f"{d}/longest_orfs.pep"): + if l.startswith(">"): + name = l[1:].split()[0]; hdr = l; pep[name] = [hdr.strip(), ""] + elif name: pep[name][1] += l.strip() +alpha = Alphabet.amino() +q = [] +for tid in keep: + for n, (h, s) in pep.items(): + if n.startswith(tid + ".p") and s: + q.append(TextSequence(name=n.encode(), sequence=s.rstrip("*")).digitize(alpha)) +with SequenceFile(refs, digital=True, alphabet=alpha) as sf: db = sf.read_block() +out = {} +for hits in pyhmmer.phmmer(q, db, E=1e-2): + qn = hits.query.name if isinstance(hits.query.name, str) else hits.query.name.decode() + if len(hits): + h = hits[0]; out[qn] = (h.name if isinstance(h.name, str) else h.name.decode(), h.score, h.evalue) +for tid, t in sorted(keep.items(), key=lambda kv: kv[1]["span"]): + print(tid, t["strand"], t["span"], f"cov={t['cov']:.0f}", "exons=" + ",".join(f"{a}-{b}" for a, b in sorted(t["exons"]))) + for n, (h, s) in pep.items(): + if n.startswith(tid + ".p") and s: + hit = out.get(n) + print(" ", h[:110].split(" ")[0], h.split()[-2] if False else "", f"len={len(s.rstrip('*'))}", ("-> %s %.0f bits E=%.1g" % (hit[0].split("|")[0][-45:] + ("|" + hit[0].split("name=")[1].split("|")[0] if "name=" in hit[0] else ""), hit[1], hit[2])) if hit else "") diff --git a/results/2026-10-29_ss_records/chr4_orfs.py b/results/2026-10-29_ss_records/chr4_orfs.py new file mode 100644 index 00000000..b3dc275e --- /dev/null +++ b/results/2026-10-29_ss_records/chr4_orfs.py @@ -0,0 +1,55 @@ +"""ORFs of the StringTie transcripts in a window of S. schoenii chromosome IV with genomic CDS coordinates, Pfam domains +(HMG_box, Homeodomain, MATalpha_HMGbox, ANTH/ENTH, I/LWEQ) and the best curated MAT reference hit. +Usage: chr4_orfs.py data refs.faa Pfam-A.hmm A B""" +import re, sys, pyhmmer +from pyhmmer.easel import SequenceFile, Alphabet, TextSequence +d, refs, pfam, A, B = sys.argv[1], sys.argv[2], sys.argv[3], int(sys.argv[4]), int(sys.argv[5]) +tx = {} +for l in open(f"{d}/stringtie.gtf"): + f = l.split("\t") + if f[0] != "CM143129.1" or f[2] != "exon": continue + tid = re.search(r'transcript_id "([^"]+)"', f[8]).group(1) + tx.setdefault(tid, {"strand": f[6], "ex": []})["ex"].append((int(f[3]), int(f[4]))) +tx = {k: v for k, v in tx.items() if A <= min(a for a, b in v["ex"]) and max(b for a, b in v["ex"]) <= B} +def to_genome(tid, s, e): # 1-based transcript coords (transcript orientation = genome + order of exons, '+' transcripts; '-' reversed) + ex = sorted(tx[tid]["ex"]); strand = tx[tid]["strand"] + blocks, off = [], 0 + seq = ex if strand != "-" else ex[::-1] + for a, b in seq: + L = b - a + 1 + lo, hi = max(s, off + 1), min(e, off + L) + if lo <= hi: + blocks.append((a + (lo - off - 1), a + (hi - off - 1)) if strand != "-" else (b - (hi - off - 1), b - (lo - off - 1))) + off += L + return sorted(blocks) +orfs = []; name = None +for l in open(f"{d}/longest_orfs.pep"): + if l.startswith(">"): + m = re.match(r">(\S+) type:(\S+) len:(\d+) \S+ (\S+):(\d+)-(\d+)\(([+-])\)", l) + name = m.group(1); tid = name.rsplit(".p", 1)[0] + orfs.append([name, tid, m, ""]) + else: orfs[-1][3] += l.strip() +orfs = [o for o in orfs if o[1] in tx and len(o[3].rstrip("*")) >= 60] +alpha = Alphabet.amino() +seqs = {o[0]: TextSequence(name=o[0].encode(), sequence=o[3].rstrip("*")).digitize(alpha) for o in orfs} +with SequenceFile(refs, digital=True, alphabet=alpha) as sf: db = sf.read_block() +best = {} +for hits in pyhmmer.phmmer(list(seqs.values()), db, E=1e-2): + if len(hits): + h = hits[0]; best[hits.query.name.decode() if isinstance(hits.query.name, bytes) else hits.query.name] = (h.name.decode() if isinstance(h.name, bytes) else h.name, h.score) +dom = {} +want = {"HMG_box", "Homeodomain", "MATalpha_HMGbox", "ANTH", "ENTH", "I_LWEQ", "HMG_box_2", "Homeobox_KN"} +with pyhmmer.plan7.HMMFile(pfam) as hf: + for hits in pyhmmer.hmmscan(list(seqs.values()), hf, E=1e-3): + q = hits.query.name.decode() if isinstance(hits.query.name, bytes) else hits.query.name + dom[q] = [((h.name.decode() if isinstance(h.name, bytes) else h.name), round(h.score, 1)) for h in hits if (h.name.decode() if isinstance(h.name, bytes) else h.name) in want] +print("orf\ttranscript\tstrand\tlen\tcds_blocks\tbest_ref\tbits\tpfam") +for name, tid, m, s in orfs: + ts, te, st = min(int(m.group(5)), int(m.group(6))), max(int(m.group(5)), int(m.group(6))), m.group(7) + blocks = to_genome(tid, ts, te) if True else [] + br = best.get(name) + ref = "" + if br: + ref = br[0].split("|")[0][-40:] + ("|" + br[0].split("name=")[1].split("|")[0] if "name=" in br[0] else "|" + br[0].split("|")[-1]) + gs = {("+","+"):"+",("+","-"):"-",("-","+"):"-",("-","-"):"+"}.get((tx[tid]["strand"], st), "?") + print(name, tid, gs, len(s.rstrip('*')), ";".join(f"{a}-{b}" for a, b in blocks), ref, f"{br[1]:.0f}" if br else "", dom.get(name, ""), sep="\t") diff --git a/results/2026-10-29_ss_records/data/chr4_models.txt b/results/2026-10-29_ss_records/data/chr4_models.txt new file mode 100644 index 00000000..e6ac03af --- /dev/null +++ b/results/2026-10-29_ss_records/data/chr4_models.txt @@ -0,0 +1,65 @@ +SS.1982.1 + (469005, 473478) cov=85 exons=469005-472227,472445-473478 + >SS.1982.1.p1 len=256 -> 1173061_clib918_MATdc_A|sla2 273 bits E=9e-84 + >SS.1982.1.p2 len=248 + >SS.1982.1.p3 len=200 -> 4932_s288c_MATsc_HMRa|MATA2 44 bits E=8e-14 + >SS.1982.1.p4 len=191 -> 1005962_dl-1_MATog_MATa-MATalpha|MATalpha1 73 bits E=9e-23 + >SS.1982.1.p5 len=103 -> 5476_sc5314_MTL_A_MTLA1 50 bits E=1e-15 + >SS.1982.1.p6 len=98 + >SS.1982.1.p7 len=80 + >SS.1982.1.p8 len=73 + >SS.1982.1.p9 len=73 +SS.1982.2 + (469005, 473478) cov=30 exons=469005-470243,470336-472227,472445-473478 + >SS.1982.2.p1 len=256 -> 1173061_clib918_MATdc_A|sla2 273 bits E=9e-84 + >SS.1982.2.p2 len=248 + >SS.1982.2.p3 len=227 -> 4932_s288c_MATsc_HMRa|MATA2 43 bits E=1e-13 + >SS.1982.2.p4 len=191 -> 1005962_dl-1_MATog_MATa-MATalpha|MATalpha1 73 bits E=9e-23 + >SS.1982.2.p5 len=103 -> 5476_sc5314_MTL_A_MTLA1 50 bits E=1e-15 + >SS.1982.2.p6 len=98 + >SS.1982.2.p7 len=80 + >SS.1982.2.p8 len=73 + >SS.1982.2.p9 len=73 +SS.1983.1 . (473679, 474606) cov=37 exons=473679-474606 + >SS.1983.1.p1 len=309 -> 460519_cbs-7435_MATkp_MATa|sla2 302 bits E=1e-92 + >SS.1983.1.p2 len=197 +SS.1981.1 . (483659, 484889) cov=56 exons=483659-484889 +SS.1984.1 . (485926, 486704) cov=205 exons=485926-486704 +SS.1985.1 . (487454, 487699) cov=11 exons=487454-487699 +SS.1986.1 . (503375, 504795) cov=41 exons=503375-504795 + >SS.1986.1.p1 len=163 -> 5476_sc5314_MTL_A_MTLA1 34 bits E=8e-11 + >SS.1986.1.p2 len=108 -> MH260578_SLA2 109 bits E=3e-34 + >SS.1986.1.p3 len=106 + >SS.1986.1.p4 len=102 + >SS.1986.1.p5 len=80 +SS.1987.1 . (513657, 515192) cov=43 exons=513657-515192 + >SS.1987.1.p1 len=201 + >SS.1987.1.p2 len=165 + >SS.1987.1.p3 len=134 + >SS.1987.1.p4 len=130 + >SS.1987.1.p5 len=82 + >SS.1987.1.p6 len=70 + >SS.1987.1.p7 len=69 +SS.2000.1 . (522696, 524063) cov=17 exons=522696-524063 + >SS.2000.1.p1 len=112 + >SS.2000.1.p2 len=61 +SS.2001.1 . (528841, 532491) cov=143 exons=528841-532491 + >SS.2001.1.p1 len=832 -> 460519_cbs-7435_MATkp_MATa|sla2 712 bits E=5e-216 + >SS.2001.1.p2 len=219 + >SS.2001.1.p3 len=191 + >SS.2001.1.p4 len=163 -> 5476_sc5314_MTL_A_MTLA1 34 bits E=1e-10 + >SS.2001.1.p5 len=116 + >SS.2001.1.p6 len=106 + >SS.2001.1.p7 len=80 + >SS.2001.1.p8 len=71 +SS.2002.1 - (533930, 536977) cov=32 exons=533930-536634,536693-536977 + >SS.2002.1.p1 len=632 -> 1173061_clib918_MATdc_A|sla2 571 bits E=8e-174 + >SS.2002.1.p2 len=271 -> 5476_sc5314_MTL_A_MTLA1 33 bits E=2e-10 + >SS.2002.1.p3 len=197 + >SS.2002.1.p4 len=191 + >SS.2002.1.p5 len=106 + >SS.2002.1.p6 len=80 +SS.2002.2 - (533980, 536977) cov=160 exons=533980-536090,536296-536634,536693-536977 + >SS.2002.2.p1 len=615 -> 1173061_clib918_MATdc_A|sla2 546 bits E=3e-166 + >SS.2002.2.p2 len=211 -> 5476_sc5314_MTL_A_MTLA1 47 bits E=9e-15 + >SS.2002.2.p3 len=191 + >SS.2002.2.p4 len=181 + >SS.2002.2.p5 len=80 diff --git a/results/2026-10-29_ss_records/data/chr4_orfs.tsv b/results/2026-10-29_ss_records/data/chr4_orfs.tsv new file mode 100644 index 00000000..9f503158 --- /dev/null +++ b/results/2026-10-29_ss_records/data/chr4_orfs.tsv @@ -0,0 +1,54 @@ +orf transcript strand len cds_blocks best_ref bits pfam +SS.1982.1.p1 SS.1982.1 - 256 472708-473478 1173061_clib918_MATdc_A|sla2 273 [('I_LWEQ', 185.9)] +SS.1982.1.p2 SS.1982.1 + 248 469005-469751 [] +SS.1982.1.p3 SS.1982.1 + 200 470349-470951 4932_s288c_MATsc_HMRa|MATA2 44 [] +SS.1982.1.p4 SS.1982.1 - 191 471020-471595 1005962_dl-1_MATog_MATa-MATalpha|MATalpha1 73 [('MATalpha_HMGbox', 54.2)] +SS.1982.1.p5 SS.1982.1 + 103 471961-472227;472445-472489 5476_sc5314_MTL_A_MTLA1|5476_sc5314_MTL_A_MTLA1 50 [('Homeodomain', 56.8), ('Homeobox_KN', 34.3)] +SS.1982.1.p6 SS.1982.1 - 98 469070-469366 [] +SS.1982.1.p7 SS.1982.1 - 80 471942-472184 [] +SS.1982.1.p8 SS.1982.1 + 73 469958-470179 [] +SS.1982.1.p9 SS.1982.1 + 73 473258-473476 [] +SS.1982.2.p1 SS.1982.2 - 256 472708-473478 1173061_clib918_MATdc_A|sla2 273 [('I_LWEQ', 185.9)] +SS.1982.2.p2 SS.1982.2 + 248 469005-469751 [] +SS.1982.2.p3 SS.1982.2 + 227 470176-470243;470336-470951 4932_s288c_MATsc_HMRa|MATA2 43 [] +SS.1982.2.p4 SS.1982.2 - 191 471020-471595 1005962_dl-1_MATog_MATa-MATalpha|MATalpha1 73 [('MATalpha_HMGbox', 54.2)] +SS.1982.2.p5 SS.1982.2 + 103 471961-472227;472445-472489 5476_sc5314_MTL_A_MTLA1|5476_sc5314_MTL_A_MTLA1 50 [('Homeodomain', 56.8), ('Homeobox_KN', 34.3)] +SS.1982.2.p6 SS.1982.2 - 98 469070-469366 [] +SS.1982.2.p7 SS.1982.2 - 80 471942-472184 [] +SS.1982.2.p8 SS.1982.2 + 73 469958-470179 [] +SS.1982.2.p9 SS.1982.2 + 73 473258-473476 [] +SS.1983.1.p1 SS.1983.1 ? 309 473680-474606 460519_cbs-7435_MATkp_MATa|sla2 302 [] +SS.1983.1.p2 SS.1983.1 ? 197 474014-474604 [] +SS.1986.1.p1 SS.1986.1 ? 163 503715-504206 5476_sc5314_MTL_A_MTLA1|5476_sc5314_MTL_A_MTLA1 34 [('Homeodomain', 32.0)] +SS.1986.1.p2 SS.1986.1 ? 108 504467-504793 MH260578_SLA2|MH260578_SLA2 109 [('I_LWEQ', 94.3)] +SS.1986.1.p3 SS.1986.1 ? 106 503948-504268 [] +SS.1986.1.p4 SS.1986.1 ? 102 503375-503683 [] +SS.1986.1.p5 SS.1986.1 ? 80 503696-503938 [] +SS.1987.1.p1 SS.1987.1 ? 201 514179-514784 [] +SS.1987.1.p2 SS.1987.1 ? 165 513658-514152 [] +SS.1987.1.p3 SS.1987.1 ? 134 514786-515190 [] +SS.1987.1.p4 SS.1987.1 ? 130 514123-514515 [] +SS.1987.1.p5 SS.1987.1 ? 82 513659-513907 [] +SS.1987.1.p6 SS.1987.1 ? 70 514847-515059 [] +SS.1987.1.p7 SS.1987.1 ? 69 513915-514124 [] +SS.2000.1.p1 SS.2000.1 ? 112 523396-523734 [] +SS.2000.1.p2 SS.2000.1 ? 61 523205-523390 [] +SS.2001.1.p1 SS.2001.1 ? 832 529992-532490 460519_cbs-7435_MATkp_MATa|sla2 712 [('I_LWEQ', 182.4)] +SS.2001.1.p2 SS.2001.1 ? 219 531298-531957 [] +SS.2001.1.p3 SS.2001.1 ? 191 530542-531117 [] +SS.2001.1.p4 SS.2001.1 ? 163 529258-529749 5476_sc5314_MTL_A_MTLA1|5476_sc5314_MTL_A_MTLA1 34 [('Homeodomain', 33.9)] +SS.2001.1.p5 SS.2001.1 ? 116 528876-529226 [] +SS.2001.1.p6 SS.2001.1 ? 106 529491-529811 [] +SS.2001.1.p7 SS.2001.1 ? 80 529239-529481 [] +SS.2001.1.p8 SS.2001.1 ? 71 531843-532058 [] +SS.2002.1.p1 SS.2002.1 + 632 533930-535828 1173061_clib918_MATdc_A|sla2 571 [('I_LWEQ', 183.0)] +SS.2002.1.p2 SS.2002.1 - 271 536071-536634;536693-536944 5476_sc5314_MTL_A_MTLA1|5476_sc5314_MTL_A_MTLA1 33 [('Homeodomain', 33.1)] +SS.2002.1.p3 SS.2002.1 - 197 533932-534522 [] +SS.2002.1.p4 SS.2002.1 - 191 534703-535278 [] +SS.2002.1.p5 SS.2002.1 - 106 536009-536329 [] +SS.2002.1.p6 SS.2002.1 + 80 536339-536581 [] +SS.2002.2.p1 SS.2002.2 + 615 533981-535828 1173061_clib918_MATdc_A|sla2 546 [('I_LWEQ', 183.1)] +SS.2002.2.p2 SS.2002.2 - 211 536046-536090;536296-536634;536693-536944 5476_sc5314_MTL_A_MTLA1|5476_sc5314_MTL_A_MTLA1 47 [('Homeodomain', 54.2), ('Homeobox_KN', 33.1)] +SS.2002.2.p3 SS.2002.2 - 191 534703-535278 [] +SS.2002.2.p4 SS.2002.2 - 181 533980-534522 [] +SS.2002.2.p5 SS.2002.2 + 80 536339-536581 [] diff --git a/results/2026-10-29_ss_records/data/depth_chrIV_455k-545k.tsv.gz b/results/2026-10-29_ss_records/data/depth_chrIV_455k-545k.tsv.gz new file mode 100644 index 0000000000000000000000000000000000000000..703881e4c4dd3d7d369d3a62b8a1910f90e048ad GIT binary patch literal 135551 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 results/2026-10-29_ss_records/refs.faa +grep -c ">" results/2026-10-29_ss_records/refs.faa diff --git a/results/2026-10-29_ss_records/refs.faa b/results/2026-10-29_ss_records/refs.faa new file mode 100644 index 00000000..902b8463 --- /dev/null +++ b/results/2026-10-29_ss_records/refs.faa @@ -0,0 +1,126 @@ +>MH260578_SUI1 +MSNIENLKSFDPFADTGDDETEVTNYIHIRIQQRNGRKTLTTVQGLPDEYDLKKILKVIKKEFACNGNIVKDDELGEVIQLQGDQRLKIMEFMVQTLGIKKKNIKIHGF +>MH260578_SLA2 +MFSSLVSREGETKRSRKTSSNMFSSSRHVTDISTAIKKACTPEDTASKRKHVRACIVYTWDHKSSKDFWETMKVVPLKNTDTQLFKALILIHKVLQEGHPSALVGGFKNMEWISNLDTLRTLDRRFQVLIPEYVNYILQKLRFHHNHRGFNGTFEYEEYVSLRTVSDPNEGYDAILDLTSLQDSLDSFGRDIFATVRNNNSECIISALVPIVAESYGIYKFLISMLRAMYKMSDSAEILEPLKSKFEDQHERLYDFYANCSNIRYLTTLITIPKLPFEAPNLIIQNDEDENVNLPPLTEQKTAATTLRHSPTPFEQENERQQQQAPIATQPTGMVRNAFVEQQQLYEQQQQQLEQQRQAELQQQQQQQLAQQQYWEQQQRQQAEAQQLAQQQLLLDQAQRHAQGRVAELERDILTLKGQYDNDQLMLQSYDQKVQALENELASTTQTAQEQLASKDEQLNLLQEQVEYWKNKYESLAKLYSQLRTEHLNLLTKSKKIQQKAASAQEAIEKREKLERDMKAKNIELADLIKERDRARLELERFKNGTKTDLQTLQLEKDELEQKLATLDRAQSANLTAIFNQHNKELQELQNKFKDVTLNAPSDEKLKQLEEQLQEKDLEIEMMQQTMDETIKDLVKTQNSREEKSEMQNKLNSTKVLGLIDAILKSGINRIQDAVFELDSPMQAGNLNSSPEYVLTLLEKSSGLVTDFASSFNNMLVDGDNANEALVIDSITNFTTSISDILLNTKGLTRLTKQDDFQDDLIDTAKDIAEISEVYLESLYHSNLVNKSIDDQTDIVINGNIDVQEILQTLLQLVESMKTPSSKIDLSKVDGELSDLVDKEMEHASRVIEEASVHLSSLLNQPFDVSMSSIDIEVNKSILAAASAIITAIKYLIRASIESQEEIVNNGRGSHSKTSFYKKNNKWTEGLISASKSIAYSTNTLIRIADGVLQNKHSNEELVVASREVAASTAQLVSAARVKSQFMSKTQNKLEDASKKVNLACKQLVDQVNKLIIGKHEVEDIDYSKLSIHENKTAEMEQQVEILKLENALSSARKRLGEIRKFSYKDDDSDEE +>MH260578_MATalpha1 +MARMWNKSSTLRVKKQRPSRICKTTTKATIFIAKPTPRYVIPLEVEELLGKYISRNNLDLRTLSNVKKKNKKHKTVVNGFTAFRTYYSKFGKTYEDQENLSKELANLWKQTPSIQSTWRGYSEEYRASETDLPFVEWFDTYKSLIKPEPEKRDYITQTTTMSHLTVEDVYDNLGSNSMN +>MH260578_MATalpha2 +MQHDELLEVYIHLKDVLRQLAETPIDEELSSTDLLKDMLNIKEILESGSPLQKQSCELIRMIRRISTSIYDMISQRSTLKTKYGLDLKSWDLDNSMMNTEDTNLTKNMDIHNSSSIDIDIDDEEISTALRDEGIHSSFCNTDSNSIKTKDGSSRNGKRLPKETIAVLNKWFNDNIENPYVQKEDISYLKAKTNLQASQIKNWVSNKRRKRKGSKVSPSIVEILN +>MH260578_TGL1 +MNLLIIFLNLVSAVVQLPLLIFHKLGVEEYLSYFQTPSNRPDNISAVSQENKTKISPSAKPLHEVATTHCLHQKIIKANDIVDIVHAHGYKVHEHIVQTKDGYLLSIHRILKSSGDKPQNSRVVYLHHGLLTNSELFLLGENKEKCLPFLLVDQGYDVWLGNNRGNKYSRKHLFLSSTDEKFWNYSLDEFAMFDIPNTVNYILRNTQQDSLSYIGFSQGSAQCLAALSLNHDLNKKINKFIGLSPAMIPQGLNNPIASFLVTSAPGLLYRIFGKRAILPSVVFWQKLMGPVLYEKVVDKSLVFLFNWKSGNIKTSQKKVGYPHMFSPSSVKSVAHWFQIIDSKRFQMFDEGGASGSRLVYLSGTSGKTNRVASFPTQTITTPCLFVYGKSDMLIDIERTLDNLSCDIQTIGIDGYEHMDTLWADQVEKKVFPVVLQYLKQ +>MH260578_SEC3 +MSQRSHGETGGGQRLFVPTHKPMNSMDLARQYEMDMHNITKYLFKEVDAQGYKLESFVSYVRIIEDSRSPSSRPPANSPLSNKKNRFLILSAKASGRMRLHKAKESSSGVIQIGRSWDFDELTTLELDDGSPTGFVCEMGKRYYWEVHTPKERRVWCTTLLQNFINYTKGNIPRLVNCSIQYFHLEALYDSYRGQGSSMYTGSGNIPASPLSNQNAMSSPVKTSVKSSLRSPLRSPIKSPIKSPTKSHTNIQRSPIKSSSPEVSSLKQRLATPPLSNSPYSPLGNTRTNLGTAVAGNANNAFGLGVGISPVSKSSEVSSDHQDAEREAKKIAEINKRRQQEIEKRKREELERRRREQEEFEKNEREQNELRIAEEIEERKQKEEQKRLQEMEKEREVQRIKQEELEIERQKQERIDEEKRLKEMEIAKKKAQKQHHQQELLRNEIKPPGFAGIAKRGPPSEALSNAPSQMSFEYGDESQYHHQNVSTESANTIGVDSFIEGYGSSGDAEEETAPLNIGIAQVKQNKDNKMVPSNLSKPVITETIEESDSDRSLKIATDSDIEKLIKNVDGSPMDKKKVIDTEQLHENRIRAFSRVKENATNKLDLLEVLEELGYDPLFDDSESLEKKILKKLDEIQYSKIKTLTDVTSATNALKETISTAFKSCDVIDPVLSLFSVELSTFKDDVHYIEEQGQGLQVEATNEKLLMNEVNDLIHSVEISDSKLQKLLTSKIVLSENNSEFEDILLELYNALKKMNDASSDDPMSANYQLSQMKALQEKKNVFEGSKNKFVSNFTRISEKLFKSVSMSLTTRLQQVTPETFETNFLQTSFMEKSSLLITISGFIAFVKSVSNDGYDSIVNSFVVAFEPFFENMATILLQHLTSVASSKLEEPFSFTLNPSQLIDQEYINSRAKKDSAKTLFNRNNKLSTEATTISSNVETFFSQLVNIMSIEQELIRVLFGFSSSSDCLFENLVKVKLSQRCQKFRNTSNFLKAPIESDRRVGDEIYELMKGIFDPVFGAVLKVIFSLSKNHMLEIPAILSILKTYSQSLAPTCHEYAYGNFTKFEARINTIWTKEIDQQIQNIVHTKVHCKVANFVKAYPVFYRRVNNFIDSLNLVNMTSFGPDEGWYGNYYMVWAIIKAALNKGVEQLQIEIPVFEGIENDEIDIETLTQKHLALLLNYKWLVEETRSLNGFPKELNKSIDDLRDKELREFTGSFIRQFRIGGVIRLVEGMESVLSEHSNPANMNSYSIETIKELMSSFKGDNFKQEISSIAEHLKETLKGRCYNESDPTEDSEYSVAIGKQIEKELYNNCMYTISQHFISIFTRLSNIVEKHYINFEVPVDKYIINFNFKKYYSV +>460519_cbs-7435_MATkp_MATa_MATa2 +MTVTTFLSSSFDSVAFAMTCVSDKSYKTTAGKGLSGKKFNLSTHRPRNKFIISKSIFSKVIQRYYPDLSFEENSKIASYLWKHRFGCFDKYYEYLQIEESKFTSLVTSKIDQLAFKAVPTEKTTSQCTFRFSSSPKRRRTVNLNILKPLCKRVYSQQFHSPLTGITTQDIFVAEENNV +>460519_cbs-7435_MATkp_MATa_MATa1 +MSGNTFREITAACLLSMILSTDDYTKPATSCHMHQLTAPDLSDYSLLDALFVTCDRALEYQALTYRLQASMEDAMKIIESARYQTKDLPTLDNIFKTFYKTLLDTIESIEATGTSTLLSDFTHQISFFNIDPSVISLSDETKECAYSFFSDSLHHHPVKRTRKTISKEVKKILEEAFKAKAAPNTKERLLIAQRCALTPLQVRMWFTNKRTRNKIKQRLQAQSHP +>460523_cbs-4732_MATog_MATa-MATalpha_MATalpha2 +MDDMLTKIQERTKCLIYILMERQIRAARLEQLLLDYISCKPHDKLCKSSMEGFTTERSLKYTRDCPQYAAVTTSQPRYRIEKRSKRFPKTAQMELENWYTENEDNPYLSKRDLQQLVHKTGLCAPQVRNWVSNRRRKERTLTISKELSDLLNQDTRCSPNDVV +>460523_cbs-4732_MATog_MATa-MATalpha_MATalpha1 +MMFHVLCFFGNRTSRVANLCLQLKFPPHNDSPKMALDELNLSFLTHLPQIPTTSPLLKRLLTEYGAIDNGKDSLNKVAPKKSSRHRVQKEKKRLNGFMAFRSFYSRNIANYNSQKALSQDLADAWNREKHQQIWSLYAIQYNHSKSKEPFSRWLEMKLSNKLGKFNSDDPTTRREINVMSHIVVEDVFQECSSQY +>460523_cbs-4732_MATog_MATa-MATalpha_MATa1 +MQFTILNEPSLDSQRREGDLASENYVFGDIRKEGVRILEDSLRSERNALLAIGAGGAADRVKQHYRKLLDDWEAAIMEIRSNDKYESLCCGFAIEKAEVETEMRNTEELDVYKECLVSECFDKKKRRHIPESSKELLEKAFKVKRFPNSKERERIARECGISPLQVRVWFTNKRARSKSRA +>5476_sc5314_MTL_A_MTLA2 +MPYTFNFPKSQSSFKYSIKSLTNSRSFPMISIYVTPQSTPKFINNQSIDKMTVLSSFRSRNSFIIARSILSKLLRKNKADFKKVSKSVSLLWGSVDNSFKNYFEYLSILESQWHDKKSSNLNPISSTRTTSELNYIELCSSIYNQSRKHPRSVQGNKAKFRLYKNVSKKSNRKPRRLKNGFKVSRSTINCSYGIYTEDVFQ +>5476_sc5314_MTL_A_MTLA1 +MNSEIESSLTLLKSVEKLVQATSVYKNEDNEEIFLQLKRERQENSNSHEETETFFHESLDRLMKLSSIAGSKVQYELSLNNLYNLLLRTRKQEEEEAFIFPTVSTEEFALEQITFEVSDQMDDDKDSEDDILIKGEEIKKSKKKRQRLDNSTKEFLEKVFEKNKQPNRRERELIAEKHGVSLSQIRVWFTNKRMRKKEPKSKAKSSSNST +>1005962_dl-1_MATog_MATa-MATalpha|gene_index=0|name=sla2|role=flanking_conserved +MLSFGSHSNLDIQASLKKACTADAAAPKRKHVRACIVYTWDHKSSREFWHCLKLLPIQSNDTQIFKTLIVIHKVLQEGHPTCLIGGYKNISWLESLSRFSNNGTAAGYTRLIKEYVFYLEQKLKFHHDHRGFNGMFEYEEYVSLRTVSDPNEGFESIMDLLSLQDSLDNLQRVIFSSIRHTSESECVISSLVPIIAESYGIYKFLISMLKALYKSSESDEVIAPLKDRFDVQHRRLFEFYADCSSIKYLTTLVTIPRLPSSPPILQDEEDPQGFPLVRERSSVSNSEESNIPRSSNIQSQPTGAMVDSFVRQQQELEEQQRQAEERRQAELLEQQMLQRDQARFWEEQQRQQAVSQELAQSQLLADQMQRQAQGKLAQLEQDLLTLGGQHERDQLMLEQYDQRVKVLENELRIVTQTAEEQLAVKTSQCSHLEEQVQYWKNKYESLAKLYSQLRQEHLNLLGKFKIVQQKAASAQESIDKREKLEKDLKAKNIELADLIKERDRARLDLARIKGNDSEQVQMLRTQLRDMETKLKSLEETHSQNLASLFSQHSKEIEEIKASASELKEGGLNEEAQQEVQMLQQAMDDTMQELAEQHQAIEKEAETRVLRLIDTLLKVSSDRLREFVFNLESPVYSNTDIPTAEYLGTMLERVSHLSTQFSTTMTDYIADNMKGESESGLIKAIIELTDSIGNLFSNVKAVLRDRKDDVQEILVEGSKDLAHMVELFFESMLSNHLLKLEIHERTDRVITGNINVQEVIQSLMQVVEVFRDPGRKTPVSSDELGYFLDKELANTQAAVEKAAGLLESMSTRHKLEVQEDGSLEVNEAIISCASAIINAVKLLLEACIDAQEEIVSRGRGSMSRALFYKKNNRWTEGLISASKQVAYATGILIRMADGVLAGTNSSEELIVASNEVASATAQLVSSSRVKSDLMSQSHLNLEEASRKVTSSCKMLVTKVRSLLLSDESNKTVDYSQLTAHENRTAELEQQVEILKLESALSHARKRLGEIRKFSYRDEES +>1005962_dl-1_MATog_MATa-MATalpha|gene_index=1|name=MATa1|role=core_MAT +MQFIILNEPSLDSQRREGNLASENCVFARDIRKEGVKVLEDSLRSERNALLAIGAGGAVDRVERHYRRLLDGWEAAIMEIRSNDKYESLWRGFAIEKAEVETEMRKVEKQWPGELDVYKECFVSECFDKKKRRHIPESSKELLEKAFKVKRFPNSKERERIARECGISPLQVRVWFTNKRARSKSRA +>1005962_dl-1_MATog_MATa-MATalpha|gene_index=2|name=MATalpha1|role=core_MAT +MFLAFFVIARVGLQNLCLQRKFPPHGDSAKMALDGLNLSFLTHLPQIPTTSPLLKRLLSEYGAIDNGNDSSNKVAPKKSRRHRVQKQKKRLNGFMAFRSFYSRNIANYNSQKALSQDLADAWNREKHQQIWSLYAIQYNHSKSKEPFSIWLEMKLNKKLRKNNSDDPTTRREINIMSDIVVEDVFQECSS +>1005962_dl-1_MATog_MATa-MATalpha|gene_index=3|name=MATalpha2|role=core_MAT +MSSYEEQCSAPDLLLLLDRLIDSITESDLSLEDELYWDSHVHSLMAVITHTVSSPSGTPMDDMLGQIQERTKCLIYILMERQIRAARLEQLLLDYISCKPHDKFCKSSMESFTTERTIEYTRDCPPYAAVTTSQPGYKTEKRSKRFPKTAQMELENWYTENEDNPYLSKRDLQQLVHKTGLCAPQVRNWVSNRRRKERTLTISKELSDLLNQDTDCSPNDVV +>1005962_dl-1_MATog_MATa-MATalpha|gene_index=4|name=dic1|role=flanking_conserved +MNSDKSTKSIAPSANFPFWYGGAASMFACLFTHPLDLAKVRLQTAKVPGDSLVSLAFKIIKTEGVLAAYAGLTASLLRQATYSTARFGVYEKLKEIMTDPTRGQASTFQLLAASMIAGAVGGVVGNPADVVNIRMQNDNSLPESQRRHYKHALDGLLKITREENLTALFRGLGPNLARGILMTASQVVSYDVAKKLLVENLSMDPKTKATHFSASLIAGLVATTVCSPADVLKTRIMNSSGTGQSSFGILKDAISREGLGFMFRGWTPAFIRLGPHTILTFIALEELRRLKIGL +>460519_cbs-7435_MATkp_MATa|gene_index=0|name=dic1|role=flanking_conserved +MTQINRESNDDSTMQYERIPPAKGVFPFWYGGAASMFACLFTHPLDLAKVRLQTASQPGQNLLTIAIRIISSEGILGAYSGLSASLLRQATYSTTRFGIYEALKDYLTKANNNQDLSTAILLPCSMLAGGIGGLVGNPSDVVNIRMQNDSSLPKPARRNYRNALHGLARMAKEEGLGSWFRGLLPNLTRGVLMTASQVVSYDVAKKFLVKKLSFDETTRATHFSASLMAGLVATTVCSPADVVKTRIMNSAEKHQSIITVLTTAMRKEGPGFLFRGWFPSFIRLGPHTILTFVALEQLRTWRIAM +>460519_cbs-7435_MATkp_MATa|gene_index=1|name=MATa2|role=core_MAT +MTVTTFLSSSFDSVAFAMTCVSDKSYKTTAGKGLSGKKFNLSTHRPRNKFIISKSIFSKVIQRYYPDLSFEENSKIASYLWKHRFGCFDKYYEYLQIEESKFTSLVTSKIDQLAFKAVPTEKTTSQCTFRFSSSPKRRRTVNLNILKPLCKRVYSQQFHSPLTGITTQDIFVAEENNV +>460519_cbs-7435_MATkp_MATa|gene_index=2|name=MATa1|role=core_MAT +MSGNTFREITAACLLSMILSTDDYTKPATSCHMHQLTAPDLSDYSLLDALFVTCDRALEYQALTYRLQASMEDAMKIIESARYQTKDLPTLDNIFKTFYKTLLDTIESIEATGTSTLLSDFTHQISFFNIDPSVISLSDETKECAYSFFSDSLHHHPVKRTRKTISKEVKKILEEAFKAKAAPNTKERLLIAQRCALTPLQVRMWFTNKRTRNKIKQRLQAQSHP +>460519_cbs-7435_MATkp_MATa|gene_index=3|name=sla2|role=flanking_conserved +MSRQEADLKVSIKKACSTEEAAPKRKHVRACIVFTWDHRSSKAFYNGLRLLPIQNDEIPLFKSLITIHKVLQEGHPSAIKEGIKNRDWIQSLGHVFPGDGMKRYGRLIREYDRYLIRKIDFHNSHKGFNGTFEYEEYVSLKTVSDPNEGYEAIMDLMVLQDSINDLQRLLFASIDSSSHSELKISALVPLIAESYGIFKFITSMLRGMCHSLGHDDEALQPLIERFISQYSDLYDFYAECSYVKYLTSLVNIPKLPFEAPDLFNWDETDELKPRILAEEPSLQVSSKAPSEEFGTPTEVIHSQPTAGTDLWAQSNALKQQYEQEQQLLEQERQQQLLEQQHQQQQQLEYWEKQKELQEQQQLYAQQQLESDQLQRQVQGRVGELERDLLILRGQFDRDQLMLRQYDERVKALETELSSTTQNAQQQLGAKEELLGNIQEQAAQWKSKYDSLAKLYSQLREEHLNLLSKFKTAQLKASSAREAIDKREKIERDLKAKNIELADLIRERDRARLDLERSKSDKNSETERLEARLREQETKLADIEKLHSSELKSFLSQHNKEIEELQNQLQASSLSESANERLKALEAQLQEKDDELAIAHQTMEATIKELTGQQSIQNSAIDEQIDAILLEHIDKLTEVIDAILTSGVQRIQDGLFELDSPMQAGNQNSSPEYLSSIIEKSSNLATEFTSSFNGFIADGPNGDHVSVIQTITEFTTSIVDLLLNCKGVVRLASSDQEAEALLNSARDVAEESESFIVSLYSSSLKGLSDQEKTDKAIEGNVDIQQELQTLSSLVEKLISSQVNINVNDNVGELVDREMAHAAETIAKASDHLTDLLTNAKQDISTIDMKINNSILSAAIAVTKAIILLIKTATDCQNEIVNHGRGSSSRTSFYKKHNKWTEGLISASKSVAYSTNSLIQIADGVLSSTSSPEQLIVACNDVAASTAQLVAASRVKASFMSKTQDKLELASKSVTSACRSLVRQVQEILSQKDKEELEIDYSKLSAHENKTVQMEQQVEILKLETALQNARRRLGEIRRFGYHADEE +>460519_cbs-7435_MATkp_MATalpha|gene_index=0|name=sla2|role=flanking_conserved +MSRQEADLKVSIKKACSTEEAAPKRKHVRACIVFTWDHRSSKAFYNGLRLLPIQNDEIPLFKSLITIHKVLQEGHPSAIKEGIKNRDWIQSLGHVFPGDGMKRYGRLIREYDRYLIRKIDFHNSHKGFNGTFEYEEYVSLKTVSDPNEGYEAIMDLMVLQDSINDLQRLLFASIDSSSHSELKISALVPLIAESYGIFKFITSMLRGMCHSLGHDDEALQPLIERFISQYSDLYDFYAECSYVKYLTSLVNIPKLPFEAPDLFNWDETDELKPRILAEEPSLQVSSKAPSEEFGTPTEVIHSQPTAGTDLWAQSNALKQQYEQEQQLLEQERQQQLLEQQHQQQQQLEYWEKQKELQEQQQLYAQQQLESDQLQRQVQGRVGELERDLLILRGQFDRDQLMLRQYDERVKALETELSSTTQNAQQQLGAKEELLGNIQEQAAQWKSKYDSLAKLYSQLREEHLNLLSKFKTAQLKASSAREAIDKREKIERDLKAKNIELADLIRERDRARLDLERSKSDKNSETERLEARLREQETKLADIEKLHSSELKSFLSQHNKEIEELQNQLQASSLSESANERLKALEAQLQEKDDELAIAHQTMEATIKELTGQQSIQNSAIDEQIDAILLEHIDKLTEVIDAILTSGVQRIQDGLFELDSPMQAGNQNSSPEYLSSIIEKSSNLATEFTSSFNGFIADGPNGDHVSVIQTITEFTTSIVDLLLNCKGVVRLASSDQEAEALLNSARDVAEESESFIVSLYSSSLKGLSDQEKTDKAIEGNVDIQQELQTLSSLVEKLISSQVNINVNDNVGELVDREMAHAAETIAKASDHLTDLLTNAKQDISTIDMKINNSILSAAIAVTKAIILLIKTATDCQNEIVNHGRGSSSRTSFYKKHNKWTEGLISASKSVAYSTNSLIQIADGVLSSTSSPEQLIVACNDVAASTAQLVAASRVKASFMSKTQDKLELASKSVTSACRSLVRQVQEILSQKDKEELEIDYSKLSAHENKTVQMEQQVEILKLETALQNARRRLGEIRRFGYHADE +>460519_cbs-7435_MATkp_MATalpha|gene_index=1|name=MATalpha1|role=core_MAT +MLPPQPKSFKGIQKPFKCSQYAHSTLDNGNMLQHTKHPELVTYQLETPRTRSLQQIESHLLQETTLGIKRTGENQYSEKRTKSSRSYMSKRINAFIAFRSYYSRQVNDYNKQISISRLLSVAWKNENKELWRSYALLYNSSNSNIPFVDWLQTKGPKNSKRTSTVTKSFISWNELLSTRNKIEDVFLDLQ +>460519_cbs-7435_MATkp_MATalpha|gene_index=2|name=MATalpha2|role=core_MAT +MISQLLRVHKTLMRILQGISHNALHSNWTSICNQIGSSQRKLSSLLEQGIDQNDQTLREILVQINRMCRAIALMLENKRMLKNDVEIILQQILDSNSTERKRRLPREKVRILENWFADHFQHPYATQQDFDELVHLTSLSKTQIRNWISNKRRKERSSTVSTELLQALNKSPS +>460519_cbs-7435_MATkp_MATalpha|gene_index=3|name=dic1|role=flanking_conserved +MTQINRESNDDSTMQYERIPPAKGVFPFWYGGAASMFACLFTHPLDLAKVRLQTASQPGQNLLTIAIRIISSEGILGAYSGLSASLLRQATYSTTRFGIYEALKDYLTKANNNQDLSTAILLPCSMLAGGIGGLVGNPSDVVNIRMQNDSSLPKPARRNYRNALHGLARMAKEEGLGSWFRGLLPNLTRGVLMTASQVVSYDVAKKFLVKKLSFDETTRATHFSASLMAGLVATTVCSPADVVKTRIMNSAEKHQSIITVLTTAMRKEGPGFLFRGWFPSFIRLGPHTILTFVALEQLRTWRIAM +>460519_gs115_MATkp_MATalpha|gene_index=0|name=dic1|role=flanking_conserved +MTQINRESNDDSTMQYERIPPAKGVFPFWYGGAASMFACLFTHPLDLAKVRLQTASQPGQNLLTIAIRIISSEGILGAYSGLSASLLRQATYSTTRFGIYEALKDYLTKANNNQDLSTAILLPCSMLAGGIGGLVGNPSDVVNIRMQNDSSLPKPARRNYRNALHGLARMAKEEGLGSWFRGLLPNLTRGVLMTASQVVSYDVAKKFLVKKLSFDETTRATHFSASLMAGLVATTVCSPADVVKTRIMNSAEKHQSIITVLTTAMRKEGPGFLFRGWFPSFIRLGPHTILTFVALEQLRTWRIAM +>460519_gs115_MATkp_MATalpha|gene_index=1|name=MATalpha2|role=core_MAT +MISQLLRVHKTLMRILQGISHNALHSNWTSICNQIGSSQRKLSSLLEQGIDQNDQTLREILVQINRMCRAIALMLENKRMLKNDVEIILQQILDSNSTERKRRLPREKVRILENWFADHFQHPYATQQDFDELVHLTSLSKTQIRNWISNKRRKERSSTVSTELLQALNKSPS +>460519_gs115_MATkp_MATalpha|gene_index=3|name=sla2|role=flanking_conserved +MSRQEADLKVSIKKACSTEEAAPKRKHVRACIVFTWDHRSSKAFYNGLRLLPIQNDEIPLFKSLITIHKVLQEGHPSAIKEGIKNRDWIQSLGHVFPGDGMKRYGRLIREYDRYLIRKIDFHNSHKGFNGTFEYEEYVSLKTVSDPNEGYEAIMDLMVLQDSINDLQRLLFASIDSSSHSELKISALVPLIAESYGIFKFITSMLRGMCHSLGHDDEALQPLIERFISQYSDLYDFYAECSYVKYLTSLVNIPKLPFEAPDLFNWDETDELKPRILAEEPSLQVSSKAPSEEFGTPTEVIHSQPTAGTDLWAQSNALKQQYEQEQQLLEQERQQQLLEQQHQQQQQLEYWEKQKELQEQQQLYAQQQLESDQLQRQVQGRVGELERDLLILRGQFDRDQLMLRQYDERVKALETELSSTTQNAQQQLGAKEELLGNIQEQAAQWKSKYDSLAKLYSQLREEHLNLLSKFKTAQLKASSAREAIDKREKIERDLKAKNIELADLIRERDRARLDLERSKSDKNSETERLEARLREQETKLADIEKLHSSELKSFLSQHNKEIEELQNQLQASSLSESANERLKALEAQLQEKDDELAIAHQTMEATIKELTGQQSIQNSAIDEQIDAILLEHIDKLTEVIDAILTSGVQRIQDGLFELDSPMQAGNQNSSPEYLSSIIEKSSNLATEFTSSFNGFIADGPNGDHVSVIQTITEFTTSIVDLLLNCKGVVRLASSDQEAEALLNSARDVAEESESFIVSLYSSSLKGLSDQEKTDKAIEGNVDIQQELQTLSSLVEKLISSQVNINVNDNVGELVDREMAHAAETIAKASDHLTDLLTNAKQDISTIDMKINNSILSAAIAVTKAIILLIKTATDCQNEIVNHGRGSSSRTSFYKKHNKWTEGLISASKSVAYSTNSLIQIADGVLSSTSSPEQLIVACNDVAASTAQLVAASRVKASFMSKTQDKLELASKSVTSACRSLVRQVQEILSQKDKEELEIDYSKLSAHENKTVQMEQQVEILKLETALQNARRRLGEIRRFGYHADE +>460523_cbs-4732_MATog_MATa-MATalpha|gene_index=0|name=dic1|role=flanking_conserved +MEVCITTQSIDNGVGAASMFACLFTHPLDLAKVRLQTAKVPGDSLVSLAYKIVKTEGVLAAYAGLSASLLRQATYSTARFGVYEKLKGIMTDPTKGQASTFQLLAASMIAGAVGGVVGNPADVVNIRMQNDNSLPESQRRHYKHALDGLLKITREENITALFRGLGPNLARGILMTASQVVSYDVAKKLLVENLSMDPKTKATHFSASLIAGLVATTVCSPADVLKTRIMNSSGTGQSSFGILKDAISREGLGFMFRGWTPAFIRLGPHTILTFIALEELRRLKIGL +>460523_cbs-4732_MATog_MATa-MATalpha|gene_index=1|name=MATalpha2|role=core_MAT +MDDMLTKIQERTKCLIYILMERQIRAARLEQLLLDYISCKPHDKLCKSSMEGFTTERSLKYTRDCPQYAAVTTSQPRYRIEKRSKRFPKTAQMELENWYTENEDNPYLSKRDLQQLVHKTGLCAPQVRNWVSNRRRKERTLTISKELSDLLNQDTRCSPNDVV +>460523_cbs-4732_MATog_MATa-MATalpha|gene_index=2|name=MATalpha1|role=core_MAT +MMFHVLCFFGNRTSRVANLCLQLKFPPHNDSPKMALDELNLSFLTHLPQIPTTSPLLKRLLTEYGAIDNGKDSLNKVAPKKSSRHRVQKEKKRLNGFMAFRSFYSRNIANYNSQKALSQDLADAWNREKHQQIWSLYAIQYNHSKSKEPFSRWLEMKLSNKLGKFNSDDPTTRREINVMSHIVVEDVFQECSSQY +>460523_cbs-4732_MATog_MATa-MATalpha|gene_index=3|name=MATa1|role=core_MAT +MQFTILNEPSLDSQRREGDLASENYVFGDIRKEGVRILEDSLRSERNALLAIGAGGAADRVKQHYRKLLDDWEAAIMEIRSNDKYESLCCGFAIEKAEVETEMRNTEELDVYKECLVSECFDKKKRRHIPESSKELLEKAFKVKRFPNSKERERIARECGISPLQVRVWFTNKRARSKSRA +>460523_cbs-4732_MATog_MATa-MATalpha|gene_index=4|name=sla2|role=flanking_conserved +QMLQQAMDDTMQELAEQHQAIEKEAETRVLRLIDTLLKVSTDRLREFVFNLESPVYSNTDIPTAEYLGTMLEKVSHLSTQFSTTMTDYIADNMRGDSESGLIKAITEFTDSIGNLFSNVKAVLRDRKDDVQEILVEGAKDLAHMVELFFESMLSDHLLKLEIHERTDRVITGNINVQEVIQSLMQVVEVFRDPGRKSPVSSDELGYFLDKELANTQAAVEKAADLLESMSTRHKLEVQEGGSLEVNEAIISCASAIINAVKLLLEACIEAQEEIVSRGKGSLSRALFYKKNNRWTEGLISASKQVAYATGILIRMADGVLAGTNSSEELIVASNEVASATAQLVSSSRVKSDLMSQSHLNLEEASRKVTSSCKMLVTKVRSLLLTDESNKTVDYSQLTAHENRTAELEQQVEILKLESALSQARKRLGEIRKFSYRDEES +>28985_nrrl-y-1140_MATsc_HMLalpha|gene_index=0|name=MATALPHA1|role=core_MAT +MKSNAPTFKVAVSKRSCSSVRKTSKKIRSGMIRKPSVSSRYRKHEGVNLYMSKVTPTSIPAPPQVLVAYIKEKVKTLNKSEVLMSLGNSNQLSSRDVKTKTKKKQINDFIAFRSYYSRLLNGILTQTELSTIISKHWTVDKQTRKNWELIAQEYNCDASGKHFFNWLEVNYGIDKQWLYEIVQYEECLTPTTKKPYVENIYNSGFKQRIDSPNQKDITFSQSDNSADWLVDPIFFDTEFLATSFDRTNLIISDCYSLMNSV +>28985_nrrl-y-1140_MATsc_HMLalpha|gene_index=1|name=MATALPHA2|role=core_MAT +MSRIPIHSLLNPSESCKSISNVPSNYRDLSTFNKERAKVITTFQEMFYSMLENNDDYNKIESLIRNFQPKLTWSHKCESLTFKQKAYLTAIIQKSIKSLLVLLKEKGKMREIEFSRKEVRKINKYRQSSKNFESVNIKILTQDLMHSNNNEFKKGKRFPKSHIQLLENWYSMNRRNPYLAENDLAYISKNTTLTKTQIKNWLANRRRKDKITEVSSDIRNILN +>28985_nrrl-y-1140_MATsc_MATa|gene_index=0|name=sla2|role=flanking_conserved +MSREEQTLEKSIKKALSGGDVAPKRKHVRACIVYTWDHKSSKTFFNLLKLQPYATDELQLFKALVLLHKVLQEGHPSALVEGIRNIDWIESLSRIFSVDSDDGSKYGSSRMRYIGDEYAKAIGEYVFFLVEKLQFHKSHKGFNGIFEYEEYVSLVSVSDPNEGYETVLDLMNLEDVADNLQKLIFAGISNRKSGFGSFSSGLDCRGAVLIPLVSETYGIFKFVTSMMKALYKQMGDYDALSGLFDRYTEQCARLNEFYFDCNTVQPLKNLITIPTLPSDPMSRIIDDEDDAEVNDVVFEKRSKSSVSSLPSRTPTRENLRDPSPVHEAPPVARPAEVRSLSQPAAPVVPIATGVVMPVVTGYSQPPLQVVPTGAEFWSIPSTSAPTRSVVASHDDLLIEQQKQQQIQQQQYALQLEHQKQLQLQQEQQALLQQRIQQQEMEKEALIQQKTASLQNDIMSFKNQYERDQVMLEQYDKRVQKLESELESVKEFKEKYQSLAKLYSQLRQEHLNILKKMKKTQDDLAEAESEVKKLKSSALSNVGIRNNNKGESEREEAKDRSGMILKSLVESSIKSLQDPIASLDVSDLATDLSNAFIDGDINTIVNILPEFVSLLLRCPQEMQTIAEDFLRCLSSAKQTDSVINANIAFQEKLKRLGEIRQYSYRYGDSDEV +>28985_nrrl-y-1140_MATsc_MATa|gene_index=1|name=MATA1|role=core_MAT +MCDNDMADIQSKLSSFCEEIRALALKEGYNLEGDKSPSSKPYFMSWPKEIDVNHPNFAFFTKLQFQYDKSLETILNSCYLQELQLDPTRIIETLQQHFNNSILRYADIENISDVKDESPMSFDTEHECTDTSEDISDKSEISSTNSDNPIQNCYPTYKRSFIKHESRGILEKIFKVKQCPNTSERLYIAQKLDLTPSQVRIWFTNKRMRAKKHTTGKGTKRKSKKYPS +>28985_nrrl-y-1140_MATsc_MATa|gene_index=2|name=MATA2|role=core_MAT +MANSTLRRTTFFKLTTTEDEDTIPKLLQPNNNSVAFPNLKRTGKAFTNDTIKENTKKYTRPRNQFVLMRTLFNRRVNNHILQYYNKSKLEKKMFTLTSKITSELWNESSPDLKSYFSLLATLEENWHKYTHYCSWDRNSAQTLSMEPIELSQVRPRLISSLTVGAGSSVSTYTLRELLLVRKIKSRKRKTTTLTQDSSPTTKFKYKFKKQPKTKMNSNLSKLRFKSKQPPTPPEENSNVFKKRYTSENRIIEDLFLM +>381046_cbs-6340_MATsc_HMLalpha|gene_index=0|name=MATALPHA1|role=core_MAT +MNSTKPSFKVLIKKKGKTLNRRLKNSSKSYRENGANLYMSYSKPQAIPKPPNTLINLVRSKKTSQSSRKCLKNDYILKELDVKKLSIYSNNTVLKKKINPFIGFRSYYAKFAKGRVRQQELSKILSEYWTKNSKIHSVWEFFTQHYNREVTSMCFTLWLEENYQQSYEESELDSECMAKRSQPYIEDLYSGTGEFLTKLTSRELLDISGNHSGFQGSLNSLPFFEEHNRTTDWMLSSILQCDQVPYYPN +>381046_cbs-6340_MATsc_HMLalpha|gene_index=1|name=MATALPHA2|role=core_MAT +MSHISVSSLLNLPVFQASHQEKATSPITSQSCLVASGKQRKFNATAKKRLERWFCSNIQYPYPNKIQILSLSKNTNLSIKQIQNWMSNRRRKSRKESIDSLLEPILNS +>4932_s288c_MATsc_HMRa|gene_index=0|name=MATA2|role=core_MAT +MRSIENDRSNYQLTQKNKSADGLVFNVVTQDMINKSTKPYRGHRFTKENVRILESWFAKNIENPYLDTKGLENLMKNTSLSRIQIKNWVSNRRRKEKTITIAPELADLLSGEPLAKKKE +>4932_s288c_MATsc_HMRa|gene_index=1|name=MATA1|role=core_MAT +MDDICSMAENINRTLFNILGTEIDEINLNTNNLYNFIMESNLTKVEQHTLHKNISNNRLEIYHHIKKEKSPKGKSSISPQARAFLEQVFRRKQSLNSKEKEEVAKKCGITPLQVRVWFINKRMRSK +>4932_s288c_MATsc_MATalpha|gene_index=0|name=MATALPHA2|role=core_MAT +MNKIPIKDLLNPQITDEFKSSILDINKKLFSICCNLPKLPESVTTEEEVELRDILGFLSRANKNRKISDEEKKLLQTTSQLTTTITVLLKEMRSIENDRSNYQLTQKNKSADGLVFNVVTQDMINKSTKPYRGHRFTKENVRILESWFAKNIENPYLDTKGLENLMKNTSLSRIQIKNWVSNRRRKEKTITIAPELADLLSGEPLAKKKE +>4932_s288c_MATsc_MATalpha|gene_index=1|name=MATALPHA1|role=core_MAT +MFTSKPAFKIKNKASKSYRNTAVSKKLKEKRLAEHVRPSCFNIIRPLKKDIQIPVPSSRFLNKIQIHRIASGSQNTQFRQFNKTSIKSSKKYLNSFMAFRAYYSQFGSGVKQNVLSSLLAEEWHADKMQHGIWDYFAQQYNFINPGFGFVEWLTNNYAEVRGDGYWEDVFVHLAL +>4956_da2_MATsc_MATalpha|gene_index=0|name=cha1|role=flanking_variable +RNATPSLEHENIIYPKRAQVAS +>4956_da2_MATsc_MATalpha|gene_index=1|name=alpha2|role=core_MAT +MNKIPIERLLNPVHQEFPHEKLKNINNKLLALCSKLPSENEQFEKDKAELEKILPSLNILIRECGSSKEDQKMVHRIHQLSSVFSLLLNEVSELKSKRSQFLRSKPKYHLPYAAALGNTGKEGMVFNIVTQDTLNSARRSNKTYRGHRLPKHITRLLESWFNRNIEHPYLQTSSMKELMVETKLSGPQIKNWVSNRRRKEKSLTISFEVSELVKESKQGTEELNE +>4956_da2_MATsc_MATalpha|gene_index=2|name=alpha1|role=core_MAT +MNTKSFRGFKSNQPLFKVKVEKKGRSKRPTLQDTTQTSKCIAGKCIEDQQVNVFMTVSKLIKIPSPPEVLLRKIEEEKHKLKKDDFNMDNILLWDPYVYWGEGYFFSIADSSLNNLSTKGSRKGCSEKPLNSFMAFRAYNSQFGNGLKQNILSSLLAAAWHSHPEQQKIWDTFAQQFNFVKPKCGFVEWVDQRYERESCI +>4956_da2_MATsc_MATalpha|gene_index=3|name=sla2|role=flanking_conserved +SSNSNSGMSYGNVVNEEPRPVISGDVRLAIYLSRQCISNYNQPVSVLSISQLCNEVASQFLNSTPHIPTIIQLTHQITTLLQHNPSPLLAQASQLYFQALLSPSQQDIINANTNLQQLLTN +>4959_cbs767_MTL_A|gene_index=2|name=MTLalpha1|role=core_MAT +MTSEVAKVIPKRFTSRFTVSKTGKRSNSNIKNEAIDIGRQRKVKSMQVVFFTELPSLPTPSIDLQEILIRFNQATRNCAGDSSWGSQLFDMKVPTRKSRIRCKKTRCLNGFMAFRSFYSRSIYNVEHQRELSTLLGKLWKNEPNKAIWNRYAIEYNSQAINQDFVDWLFKALGLEVETFPIPYTSTVRNESWTFSSRNNENAVEDIYYIGTV +>4959_cbs767_MTL_A|gene_index=0|name=MTLA1|role=core_MAT +MEGYTKSHDVVVEVPENENIKAYTTRVESGHISEPSSSNGSNLTLNVKNEYENISSDGKVIDRYQLLKEKGYSHGFLLEEASISVTCETPDPHLQQQRKVSRFGREVHENTNVFPNKKGSYKCDSEASNRFLENVFKTNSYPTSKERHIIAKKCGLSPTQVGAWFTNRRNVSE +>4959_cbs767_MTL_A|gene_index=1|name=MTLA2|role=core_MAT +MSLSPDKIFTFCFKLPRRIDIPVESNQPTTKKNFKIKELTTTNSYPSISINIKQYVSFTSEKYIEASRKPTAKDKKTAITRGSFRTRNKFIIARNLLCRLVKHEKALSSTEISKVVSLVWKESNKSLHDYFEYLSLLETYWYDKLMSSYGNSTLQATATAAVSIRLSSVPYENLCASCYNKHKQKKTLNYDYSKSAKFRVHKDFKEKKKTFLTIKDHSKKLEKLSDAFRINQCTITTNFGIVTEDMFFNSL +>1173061_cbs615-84_MATdc_B|gene_index=0|name=MATB|role=core_MAT +MPEFKRFRFRHHKISCPSTTKNESKFLFCPQFIDFSAPKNGSEECRHTETMLAIPPPSSELLKALDELRTLQCSVQKKGIIRSRRRKPNTNMAKKVSRINGFTAFKSYYSQNITSVCQGTISSKLSKVWQIEKNQDVWDNYARHYRRYQRKEPEHFCVWLLRATQNNSIDKQKTHSFTKLNDGDENLDIEALCFNLNEDSFTKDLITTQSSGDLNPYSNYGFDTLDFITDSSKVSSDNIESSNMNDYMDGLSPESCESISPFDIIDSTFSEPTSNHYDYMFIDSPSDSLLEDFFSDKNVVSDKNCKQPFVPLELNKDQFLPMPELWVSLNSEYSLSKLS +>1173061_clib918_MATdc_A|gene_index=0|name=sla2|role=flanking_conserved +MATLSKAEAELTVHIKKATNPEETAPKRKHVRQCIIYTWDNHSGRAFWNGMKIQPLQNDEVQVFKALITIHKVLQEGHPSVLREAQQNRSWLESLARGAHAGRHTYAKLIYEYVGLLLKKLNFHKNHPDFNGTFEYEEYISLRNIDDPNEGYQAIVDLMDLQDAIDNFQRLIIASLKHGRPNECRISALIPLVAESYGIYRFTTTMLRAMHATTNDDDALEPLRSRYYSQHQRLLEFYYDCSSLKYLTSVITIPTLSQDPPNLYGENPEEGEAPALPKRPISEVASLATGATTAPSTTDLTPEPVVDFWSTPQGQQQLQQQQLQQQQYEEEQRRLAAQREAELQQQQMLHLQQQQQFEEQQRMQAEQQRLAQEALLRDQYQRQADGRAAELERDILNLRGQYERDQLMLEQYDRRVKGLEGELQQVIANTNLQSQSKDDMIRSLQEQVNSLKSKYDVLAKLYSQLRQEHLDKLKELKLLKVKAASAQEAIEKREKLERDIKAKNIELADLIRERDRARYDLDKSRGNQKDVIEKLERQLRLTEDKLADAERSKGADLSLLISKHNRELADLEEALKAKQSVLDNYANRSFDDSDLKLKLAEKDDELEILQETVDSMEAALKEMSLNHNEADQALEEQIDEVLKEHLSKLNSIIDSVLESSAERVQESLFEFESPMQAGNQNSTPEYLLSIVEKASTSATDFATSFNNFIIDGPNGDYSGIISTATILSSVIPDVLNNAKGLTRLARDDTVADNIISYARLAAVAVEDFFSGVQSNKLAQLSDEDKTDKVINFNIDVQTHLQSLSQVSEKLTPRAGTHLNGSGDLGDLVDREMARAAEAIESANAKLNELLSRPKDPKFSVFDLKIHEAILAAAIAVTTAIAALIKAASDCQQEIVAQGKGASSRTAFYKKHNRWTEGLISAAKSVAASTNVLIETADGVLSGNHTPEQLIVASNEVASSTAQLVAASRVKASYMSKTQDRLEGASKAVTSACRSLVNQVQDILSKKQQKEENDVDYSKLTPHVLKTTEMEQQVEILKLENSLNSARKRLGEIRKYSYVDDEDEE +>1173061_clib918_MATdc_A|gene_index=1|name=MATA|role=core_MAT +MNSFLETPALILYSRKSQLPKKSEKSENVMKRIFSPDSFPSSTSKFNDPREKKKIMSDFLFYDGANNTFSETQAPPRKRKNSTEDKPIPRPTNSFICARSMLHKMFERLNISTIECSNLMSDIWKNYNDDLFKHYFRYLSFLEACWHTSVYPNYRYNPRKKLPSPKPSSCALKKYSKSIIKKRPVKTRAKSSGSTNMMPIKINSCTPGFSFNTEAPRRNYELEIIISELMKEEQLYFGMPIIETAPTSVNCKPFQIDDFSDNFLAFSYLYDEGMRDMSGAR +>4952_clib122_MATyl_B|gene_index=0|name=apn2|role=flanking_conserved +MRFVTFNICGINNVLSYHPWNEQRSFEHMFAVLKADVICLQETKLQPHLLKREHALVPGYDSYWSFSNTKKGYSGVAVYVKHGIKVLKAEEGLTGQLVSPDSKKGLTYQQLYERQRERDGSSKSCIGAYPEGNPQRLFQVDSEGRSLVLDLGFCVVFGLYCPSTATEGEERDAYRDDYFGLLEERVNLLVEAGREVVVMGDLNVARELYDSAEGMQALHKAKHITLPTLGDKEEGRFVEVFEKLNPGQCKSWREAKVGRRVFHRLVPDLLQDSCRNKHPNRPDMYTCWNVMMNYRPGNFGSRIDYVLASKGLKVEDADILPHLEGSDHCPVYAEVREPDACQEKDNRATQGAANQTKQASSSAPNSFRPKLFHRTNKQFVQTTSVMSMFRAQTPPTKGITKPKAPSKSTAKKQAAISSFFQKPDPEAAVVSTCVSDVHTKPLGQSQSPAVSPNIESTYQGCDAGAHATREGEDTRPQMATRLDLPEPTEYLDIAERVEEAEKVASQWSKIMTKKPAPVCAHNLPAVLRTTRKKGPNQGKHFWVCGQNHSLQLVGDSYKASADPDAKGSQDDTSARCNFFQWK +>4952_clib122_MATyl_B|gene_index=1|name=matb2|role=core_MAT +MKETRDLLFYNENSIDFNFSPEEMDTHQMMCVNNDSQQDTSFLTATTCIFDFQKDIYDDQNLMSFDPFFPQQRDMALWIASVGNGAIDWSTKPQLTLSKKIPDVVNEKGEEITPADLQRHYADKHVAKLPDHSCDLYYLLFKHAKFEATTLRIPLSLLNDNGTGALGPFDEIRSLTDEEQRLLTLLKTISHYSWVTKHATKDCTGQLLDLCKEGLQLVESIQVNKTFNGVILHILVAYFGRRSTALRDEFQLHKLFLEQRLDIELEILAQHGGADAIDSEKLRKVKKLSELWEWFNAIPYNHHPSVSQIEFIASQIGEKVSFVKSWVANKRRTGAKKRSKKPAPSTQIRPALKVFLEKKPFVSRQVV +>4952_clib122_MATyl_B|gene_index=2|name=matb1|role=core_MAT +MRQDEYHIKQRIFSISKAAITMIKIKTEHKVVKARTPKKMKPGMARFRIQAVPIINQNNNAYLSEISFEEKLEPVPPMYPELQKVLDYIHSRKVPFDGSSGPYPPSSRRQVVNGYVAFKLYHHVPHTDLSAIDITHLLQGPWRACPDRHIWTKYADHYRSRGRDVAFKTWLLSVTSPAPEKGLIIQPQTQSEQGYNFSSSSDFSSSPEHSETLPVSSGEPSTPVDPFLIEFDQGIAEKEASFTSPCNQNYDLDFSQLQPLSIRVPYFNQYASSSNSGLDVDYFDGSTLDTPSYIDTFITPLH +>4952_clib122_MATyl_B|gene_index=3|name=sla2|role=flanking_conserved +MSSNRAEVDLNVNIKKATNTDESAPKRKHVRACIVYTHDHRSSKAFWNGIRIQPLQTDDVMVFKALITIHKVLQEGHPSALRDAQANVNFIQSLARGNNYTGPNQGNHGYGKLISEYVRFLMQKLTFHKYHPAFNGMFEYEDYISLRTVNDPNEGYEAIMNLMTLQDGVDDFQRLVFSSLQRSRSNECKISSLVPMIAESYGIYRFVISMLRAMHVSTGNDEALESLRQRFYSQHDRLRDFYYDCSTLKYLRSIVTIPQLGKNPPNLLEEEDGPGLPQRPKSVAETRSVSPEPAPLPVATPTPSIPAEAQPIENFWSQDALLAQQQYDAEQERLRQQQAMEEERIRQMQMQQQQQFEMQQRQQMEAQQRAQEQLMADQMARHAQGRMAELERDILALRGQYDQDQLMLEQYDGRVKALEAELNQLQQTAHQSAQAKDDLIESLQQQITMWRQKYETLAKRYSSMREEYLALLKKLKATQQKAASAKEAIEKAEKLERDMRHKNIELADLIKERDRARYDLDRAKGGNKEDVERLERELRMAQDKLADKDRSTGADLSLLLSKHNRELSELENALKMKQRALDERGDDSDLLRRLEEKEIEYEALNEAFNSLALHQEQQGNNSNGGSTPLAALHSIIDALLESGSQRVQDALFELESPMQAGNQNSTPEYLLSVIEKASESASAFATSFNNFLADETDGDYAEIIKTVNIYSTAVENVLSNSKGLTRLAKDDASADALVNFARESAEATERNFIGLLSEIIEDFPLDDKMERVITLNMNVQTALQHLTKLAERMAPKTNINMSGDLGDLVEREMAKAADAIAAASAKLGDLLKFNQSDPLKSTTDLQLHEAAIQAAQAVINAIAALIRAATDAQNEIVAQGRGTSSRAQFYKKNNKWTEGLISAAKSVAASTNILIEKADGTLRRTSGLEELIVASNNVAASTAQLVAASRVKATFMSKTQDKLEECSKVVTSACRNLVKQVQEILNKKFGELDEKVDYAALSKHEFKTTEMEQQVEILKLENDLQGARKRLGQMRKVAYLHQDEEESIPGQED +>4952_w29_MATyl_A|gene_index=0|name=sla2|role=flanking_conserved +MSSNRAEVDLNVNIKKATNTDESAPKRKHVRACIVYTHDHRSSKAFWNGIRIQPLQTDDVMVFKALITIHKVLQEGHPSALRDAQANVNFIQSLARGNNYTGPNQGNHGYGKLISEYVRFLMQKLTFHKYHPAFNGMFEYEDYISLRTVNDPNEGYEAIMNLMTLQDGVDDFQRLVFSSLQRSRSNECKISSLVPMIAESYGIYRFVISMLRAMHVSTGNDEALESLRQRFYSQHDRLRDFYYDCSTLKYLRSIVTIPQLGKNPPNLLEEEDGPGLPQRPKSVAETRSVSPEPAPLPVATPTPSIPAEAQPIENFWSQDALLAQQQYDAEQERLRQQQAMEEERIRQMQMQQQQQFEMQQRQQMEAQQRAQEQLMADQMARHAQGRMAELERDILALRGQYDQDQLMLEQYDGRVKALEAELNQLQQTAHQSAQAKDDLIESLQQQITMWRQKYETLAKRYSSMREEYLALLKKLKATQQKAASAKEAIEKAEKMERDMRHKNIELADLIKERDRARYDLDRAKGGNKEDVERLERELRMAQDKLADKDRSTGADLSLLLSKHNRELSELENALKMKQRALDERGDDSDLLRRLEEKEIEYEALNEAFNSLALHQEQQGNNSNGGSTPLAALHSIIDALLESGSQRVQDALFELESPMQAGNQNSTPEYLLSVIEKASESASAFATSFNNFLADETDGDYAEIIKTVNIYSTAVENVLSNSKGLTRLAKDDASADALVNFARESAEATERNFIGLLSEIIEDFPLDDKMERVITLNMNVQTALQHLTKLAERMAPKTNINMSGDLGDLVEREMAKAADAIAAAASAKLGDLLKFNQSDPLKSTTDLQLHEAAIQAAQAVINAIAALIRAATDAQNEIVAQGRGTSSRAQFYKKNNKWTEGLISAAKSVAASTNILIEKADGTLRRTSGLEELIVASNNVAASTAQLVAASRVKATFMSKTQDKLEECSKVVTSACRNLVKQVQEILNKKFGELDEKVDYAALSKHEFKTTEMEQQVEILKLENDLQGARKRLGQMRKVAYLHQDEEESIPGQED +>4952_w29_MATyl_A|gene_index=1|name=mata1|role=core_MAT +MPSRTPTDIWRCQRLILAARKGETTCQALHEQSIEISSSLKWFEEISEWMSKFPESGLYISTTIWTFLEGVPNEHRIKYDRLIRHYITYIQQLVPARLVTAYLDSLFKICSHPTRTERRIIGEHCGISLHQVTQWFTNRRFREPKTDSPDDGSTRFIPSPMTSPGSIDECSFPESP +>4952_w29_MATyl_A|gene_index=2|name=mata2|role=core_MAT +MENTILHIHSFQLPQTEQPYPEAMLFDRDTSDSRTVLTQKPNGLEISLNFLQYDGHKGLFIRQDSRTNEPEYIEPKVLKPRNSYILFRNATSRCSQSIDPNSAFVSRVSSYIWGSGIPNPIVRRWFKYMGFFEALYHEVDYPEYIPNKLPKSPKKPKVQKGATKSKKKGAKGKNKVTALQVLVGPTVGVGGRMTVSPMTAFFSNNSHVTCYDPNFVLDTPTREFLMMPLDDITLPSQGPRSDSQEQHVPRQPPDGQDYFDILDIDDFVSPYDDLTTRSFTNRQLFKHATLG +>4952_w29_MATyl_A|gene_index=3|name=apn2|role=flanking_conserved +RDAYRDDYFGLLEERVNLLVEAGREVVVMGDLNVARELYDSAEGMQALHKAKHITLPTLGDKEEGRFVEVFEKLNPGQCKSWREAKVGRRVFHRLVPDLLQDSCRNKHPNRPDMYTCWNVMMNYRPGNFGSRIDYVLASKGLKVEDADILPHLEGSDHCPVYAEVREPDACQEKDNRATQGAANQTKQASSSAPNSFRPKLFHRTNKQFVQTTSVMSMFRAQTPPTKGITKPKAPSKSTAKKQAAISSFFQKPDPEAAVVSTCVSDVHTKPLGQSQSPAVSPNIESTYQGCDAGAHATREGEDTRPQMATRLDLPEPTEYLDIAERVEEAEKVASQWSKIMTKKPAPVCAHNLPAVLRTTRKKGPNQGKHFWVCGQNHSLQLVGDSYKASADPDAKGSQDDTSARCNFFQWK diff --git a/results/2026-10-29_ss_records/ss_models.slurm b/results/2026-10-29_ss_records/ss_models.slurm new file mode 100644 index 00000000..fe4105a3 --- /dev/null +++ b/results/2026-10-29_ss_records/ss_models.slurm @@ -0,0 +1,15 @@ +#!/bin/bash +#SBATCH -p exfab -A exfab -c 8 --mem 24G -t 04:00:00 -J ss-stringtie +#SBATCH -o /bigdata/stajichlab/jstajich/projects/MATPredict/logs/ss_stringtie_%j.log +# Transcript models (StringTie) and ORFs (TransDecoder) from the merged S. schoenii RNA-seq alignment (non-stranded library). +set -euo pipefail +W=/bigdata/stajichlab/jstajich/projects/MATPredict/results/2026-10-29_ss_records/work; cd $W +set +eu; source /etc/profile 2>/dev/null; module load stringtie/3.0.3 transdecoder/5.5.0 gffread/0.12.7; set -eu +stringtie all.bam -p 8 -o stringtie.gtf -l SS +gffread -g genome.fa -w transcripts.fa stringtie.gtf +gffread stringtie.gtf -T -o /dev/null 2>/dev/null || true +rm -rf td; mkdir td; cd td +TransDecoder.LongOrfs -t ../transcripts.fa -m 60 > /dev/null +TransDecoder.Predict -t ../transcripts.fa --single_best_only > /dev/null +cp transcripts.fa.transdecoder.pep transcripts.fa.transdecoder.gff3 .. 2>/dev/null || cp *.transdecoder.* .. +touch $W/../DONE2 diff --git a/results/2026-10-29_ss_records/ss_rnaseq.slurm b/results/2026-10-29_ss_records/ss_rnaseq.slurm new file mode 100644 index 00000000..0337408c --- /dev/null +++ b/results/2026-10-29_ss_records/ss_rnaseq.slurm @@ -0,0 +1,29 @@ +#!/bin/bash +#SBATCH -p exfab -A exfab -c 8 --mem 32G -t 08:00:00 -J ss-models +#SBATCH -o /bigdata/stajichlab/jstajich/projects/MATPredict/logs/ss_models_%j.log +# S. schoenii (GCA_054953955.1, strain GDD12): public RNA-seq (PRJNA1364152) mapped to the assembly, and the curated +# Saccharomycotina MAT proteins aligned with miniprot, to build gene models for the MAT loci (the paper's GTF is not public). +set -euo pipefail +D=/bigdata/stajichlab/jstajich/projects/MATPredict/results/2026-10-29_ss_records +W=$D/work; mkdir -p $W; cd $W +set +eu; source /etc/profile 2>/dev/null; module load hisat2/2.2.1 samtools/1.19.2; set -eu +export PATH=/bigdata/stajichlab/jstajich/projects/MATPredict/.pixi/envs/default/bin:$PATH +ASM=https://ftp.ncbi.nlm.nih.gov/genomes/all/GCA/054/953/955/GCA_054953955.1_ASM5495395v1/GCA_054953955.1_ASM5495395v1_genomic.fna.gz +[ -s genome.fa ] || curl -sL $ASM | zcat > genome.fa +samtools faidx genome.fa +miniprot -t8 -d genome.mpi genome.fa +miniprot -t8 --gff -P SS genome.mpi $D/refs.faa > miniprot_all.gff 2> miniprot.log +[ -s idx.1.ht2 ] || hisat2-build -p 8 -q genome.fa idx > /dev/null +for RUN in SRR37453601 SRR37453602 SRR37453603; do + P=${RUN:0:6}; L=00${RUN: -1} + for m in 1 2; do curl -sL --retry 5 --retry-all-errors -C - ftp.sra.ebi.ac.uk/vol1/fastq/$P/$L/$RUN/${RUN}_$m.fastq.gz -o ${RUN}_$m.fastq.gz; done + [ -s $RUN.bam ] || hisat2 --dta -p 8 --max-intronlen 5000 --summary-file $RUN.hisat2.txt -x idx -1 ${RUN}_1.fastq.gz -2 ${RUN}_2.fastq.gz | samtools sort -@4 -o $RUN.bam - + samtools index $RUN.bam +done +samtools merge -f -@4 all.bam SRR3745360?.bam; samtools index all.bam +# per-base depth and spliced-read junctions over every contig carrying an MAT call +for R in CM143126.1 CM143127.1 CM143128.1 CM143129.1 CM143130.1 CM143131.1; do + samtools depth -a -r $R all.bam | awk -v r=$R '$3>0' > depth_$R.tsv + samtools view all.bam $R | awk '$6 ~ /N/{print $3,$4,$6}' > spliced_$R.txt +done +touch $D/DONE From 43e05d05d33a49c8ab420ff8f10fa104f76f5a8d Mon Sep 17 00:00:00 2001 From: Jason Stajich Date: Fri, 30 Oct 2026 06:28:08 -0700 Subject: [PATCH 6/6] Cross-family flank rule: an unsupported out-of-scope MTL call cannot win against a family with its own flank gene Co-Authored-By: Claude Sonnet 5.5 --- .../GENUS_CURATION_LIST.md | 5 ++ src/MATPredict/detect/family_status.py | 50 ++++++++++++++++--- tests/detect/test_family_status.py | 49 ++++++++++++++++++ 3 files changed, 98 insertions(+), 6 deletions(-) diff --git a/results/2026-10-29_near_tie/GENUS_CURATION_LIST.md b/results/2026-10-29_near_tie/GENUS_CURATION_LIST.md index c5599c89..91396609 100644 --- a/results/2026-10-29_near_tie/GENUS_CURATION_LIST.md +++ b/results/2026-10-29_near_tie/GENUS_CURATION_LIST.md @@ -77,3 +77,8 @@ Findings: - **Genera with SLA2 + DIC1 beside the locus** (Barnettozyma, Ambrosiozyma, Petasospora, Wickerhamomyces, Hansenula, Williopsis, Ruyongia, ...): a MATog/MATkp-type architecture. Candidate action: a reference record from one genus (a *Barnettozyma* or *Petasospora* species with a manual locus check) before scoping; until then the MATsc/MATog calls stand. - **Rule change to consider:** an MTL call outside Serinales with no flank support should not win a cross-call against a family whose own flank genes are present (MATsc: SLA2). Applied to this replay it would keep MATsc in all 65 loci where MTL won. It makes the flank rule decide the family, the asymmetric evidence that the evaluation warned about, but here the asymmetry is complete (0 of 156). This needs the curator's decision. + +## Flank rule implemented (curator, 2026-10-30) +An out-of-scope MTL call with fewer than two of PAP1/OBP1/PIK1 within the window cannot win a cross-call against a family whose own flank gene (SLA2, DIC1) is in the call; it is set aside as `cross_call` (`flank_rule: true`), is left out of the genome mean, and the kept call's `family_ambiguous.reason` is `cross_call_flank_rule` (`flank_rule_set_aside` names the family). `src/MATPredict/detect/family_status.py`, 6 tests in `tests/detect/test_family_status.py`. + +Estimated effect on the 156 cross-called pairs of the v0.7.0 replay (`cross_call_pairs.tsv`, before the per-genome pooling): of the 51 pairs kept as MTL, **40 flip to MATsc** (Pichiaceae 14, Saccharomycopsidaceae 12, Wickerhamomycetaceae 7, Phaffomycetaceae 6, Pachysolenaceae 1); 11 stay MTL because the MATsc call has no SLA2/DIC1 (Saccharomycopsidaceae 8, Pichiaceae 3). This is not ground truth: MATsc is not the right family for these genera either (S. schoenii has its own `MATss` family now); the rule only removes the MTL call that has no flank gene of its own where a competitor has one. A v0.8 replay (`--preset v0.8`) is needed for exact numbers. diff --git a/src/MATPredict/detect/family_status.py b/src/MATPredict/detect/family_status.py index 70761d63..0f05ec7a 100644 --- a/src/MATPredict/detect/family_status.py +++ b/src/MATPredict/detect/family_status.py @@ -20,6 +20,15 @@ carries `family_ambiguous` (both identities, their gap, the genome means), because a best-hit identity against a different reference protein of each family is an uncertain score. The other call is not lost: it is recorded on the kept call as `cross_call`. + FLANK RULE (curator's decision, 2026-10-30, #188): in a group with no scoped family, a call from a family that + declares `confirm_outside_scope` (MTL) in a genome outside its scope, with fewer than `min_flank_genes` of its + declared flank genes within `window_bp` of a core gene, cannot win against a family in the group whose own + flank gene (a `flanking_conserved` or `flanking_variable` gene, such as SLA2 or DIC1 beside a MATsc call) is + present. The unsupported call is set aside as `cross_call` (`flank_rule: true`), is not counted in the genome + means, and the kept call's `family_ambiguous` carries the reason `cross_call_flank_rule`. Evidence: Saccharomycopsis, + Barnettozyma, Ambrosiozyma and Petasospora loci called MTL carry SLA2 or DIC1 beside the MAT genes and none of + PAP1/OBP1/PIK1 (results/2026-10-29_near_tie/), and the published S. schoenii architecture is SLA2-MAT. Where no + competitor has a flank gene, or the MTL call is supported or in scope, the identity rule decides as before. 2. **Family status.** A call from a family that declares `confirm_outside_scope` (MTL) in a genome outside its scope is `family_unconfirmed` (reason `_outside_scope`). It becomes `family_confirmed` when at least `min_flank_genes` of the declared flank genes (PAP1, OBP1, PIK1) @@ -116,6 +125,11 @@ def _family_name(r) -> str: return f"{r.family_key.phylum}:{r.family_key.locus_name}" +def _has_flank_gene(r) -> bool: + """The call carries a flank gene of its own family (SLA2, DIC1 for MATsc; PAP1, OBP1, PIK1 for MTL).""" + return any(e.role in ("flanking_conserved", "flanking_variable") and e.lost_to is None for e in r.gene_evidence) + + def resolve_cross_calls(results: list, families: list, lineage: set[int]) -> list: """`results` with each cross-family group reduced to one call; the others ride on it as `cross_call`. @@ -127,12 +141,29 @@ def in_scope(r) -> bool: family = by_key.get(r.family_key) return bool(lineage and family and lineage & set(family.taxonomic_scope)) + def unsupported(r) -> bool: + """An out-of-scope call of a family with a flank rule that the rule does not confirm.""" + family = by_key.get(r.family_key) + rule = getattr(family, "confirm_outside_scope", None) + if not rule or not lineage or lineage & set(family.taxonomic_scope): + return False + return len(flank_support(r, list(rule["flank_genes"]), int(rule.get("window_bp", 15000)))) < int(rule.get("min_flank_genes", 2)) + + def eligible(g: list[int]) -> tuple[list[int], list[int]]: + """(members that may win, members set aside by the flank rule) of a group with no scoped family.""" + weak = [i for i in g if unsupported(results[i])] + rest = [i for i in g if i not in weak] + if weak and any(_has_flank_gene(results[i]) for i in rest): + return rest, weak + return list(g), [] + groups = _groups(results) unscoped = [g for g in groups if not any(in_scope(results[i]) for i in g)] pooled: dict[str, list[float]] = {} for g in unscoped: - for fam in {_family_name(results[i]) for i in g}: - pooled.setdefault(fam, []).append(max(_best_core_identity(results[i]) for i in g if _family_name(results[i]) == fam)) + may_win, _ = eligible(g) + for fam in {_family_name(results[i]) for i in may_win}: + pooled.setdefault(fam, []).append(max(_best_core_identity(results[i]) for i in may_win if _family_name(results[i]) == fam)) means = {fam: sum(v) / len(v) for fam, v in pooled.items()} drop: set[int] = set() @@ -140,23 +171,30 @@ def in_scope(r) -> bool: for group in groups: scoped = [i for i in group if in_scope(results[i])] ambiguous = None + set_aside: list[int] = [] if scoped: best = min(scoped, key=lambda i: _score(results[i])) else: - here = {_family_name(results[i]) for i in group} + may_win, set_aside = eligible(group) + here = {_family_name(results[i]) for i in may_win} winner = min(here, key=lambda f: (-means[f], f)) - best = min((i for i in group if _family_name(results[i]) == winner), key=lambda i: _score(results[i])) - ident = {f: round(max(_best_core_identity(results[i]) for i in group if _family_name(results[i]) == f), 2) for f in sorted(here)} + best = min((i for i in may_win if _family_name(results[i]) == winner), key=lambda i: _score(results[i])) + ident = {f: round(max(_best_core_identity(results[i]) for i in group if _family_name(results[i]) == f), 2) + for f in sorted({_family_name(results[i]) for i in group})} rest = [v for f, v in ident.items() if f != winner] - ambiguous = {"reason": "cross_call_unscoped", "kept_family": winner, "identities": ident, + ambiguous = {"reason": "cross_call_flank_rule" if set_aside else "cross_call_unscoped", "kept_family": winner, "identities": ident, "gap": round(ident[winner] - max(rest), 2) if rest else None, "genome_mean_identity": {f: round(means[f], 2) for f in sorted(here)}, "genome_loci": {f: len(pooled[f]) for f in sorted(here)}} + if set_aside: + ambiguous["flank_rule_set_aside"] = sorted({_family_name(results[i]) for i in set_aside}) notes = [] for i in sorted(group): if i != best: note = _note(results[i]) note["best_core_identity"] = round(_best_core_identity(results[i]), 2) + if not scoped and i in set_aside: + note["flank_rule"] = True notes.append(note) kept[best] = (notes, ambiguous) drop.update(i for i in group if i != best) diff --git a/tests/detect/test_family_status.py b/tests/detect/test_family_status.py index e14ff450..aa6b60c3 100644 --- a/tests/detect/test_family_status.py +++ b/tests/detect/test_family_status.py @@ -213,3 +213,52 @@ def test_a_third_family_group_is_decided_apart_from_the_scoped_group(): def test_scope_still_beats_identity(): sc, mtl = _scored(SC, 100, 5000, 30.0, "low"), _scored(MTL, 100, 5000, 90.0, "high") assert [r.family_key for r in fs.resolve_cross_calls([sc, mtl], FAMILIES, {SACCHAROMYCETACEAE})] == [SC] + + +# ---- the flank rule (curator, 2026-10-30): an unsupported out-of-scope MTL call cannot win against a family with its own flank gene +def _with_flank(call, name, role="flanking_conserved", start=None, end=None): + from dataclasses import replace + g = _gene(name, role, start if start is not None else call.start, end if end is not None else call.start + 100) + return replace(call, gene_evidence=call.gene_evidence + [g], genes_found=call.genes_found + [name]) + + +def test_an_mtl_call_without_flank_support_loses_to_a_family_with_its_own_flank_gene_whatever_the_identity(): + sc, mtl = _with_flank(_scored(SC, 100, 5000, 40.0, "medium"), "sla2"), _scored(MTL, 100, 5000, 70.0) + out = fs.resolve_cross_calls([sc, mtl], FAMILIES, {OTHER}) + assert [r.family_key for r in out] == [SC] + assert out[0].cross_call[0]["family"] == "Ascomycota:MTL" and out[0].cross_call[0]["flank_rule"] is True + amb = out[0].family_ambiguous + assert amb["reason"] == "cross_call_flank_rule" and amb["flank_rule_set_aside"] == ["Ascomycota:MTL"] + assert amb["identities"] == {"Ascomycota:MATsc": 40.0, "Ascomycota:MTL": 70.0} + + +def test_an_mtl_call_with_two_flank_genes_keeps_the_identity_rule(): + mtl = _with_flank(_with_flank(_scored(MTL, 100, 5000, 70.0), "PAP1", "flanking_variable", 100, 200), "OBP1", "flanking_variable", 300, 400) + sc = _with_flank(_scored(SC, 100, 5000, 40.0, "medium"), "sla2") + out = fs.resolve_cross_calls([sc, mtl], FAMILIES, {OTHER}) + assert [r.family_key for r in out] == [MTL] and out[0].family_ambiguous["reason"] == "cross_call_unscoped" + assert "flank_rule" not in out[0].cross_call[0] + + +def test_no_competitor_flank_gene_means_no_rule(): + sc, mtl = _scored(SC, 100, 5000, 40.0, "medium"), _scored(MTL, 100, 5000, 70.0) + out = fs.resolve_cross_calls([sc, mtl], FAMILIES, {OTHER}) + assert [r.family_key for r in out] == [MTL] and out[0].family_ambiguous["reason"] == "cross_call_unscoped" + + +def test_an_mtl_call_inside_serinales_is_never_set_aside(): + sc, mtl = _with_flank(_scored(SC, 100, 5000, 40.0, "medium"), "sla2"), _scored(MTL, 100, 5000, 70.0) + out = fs.resolve_cross_calls([sc, mtl], FAMILIES, {SERINALES}) + assert [r.family_key for r in out] == [MTL] and out[0].family_ambiguous is None + + +def test_a_set_aside_call_is_not_counted_in_the_genome_mean(): + from dataclasses import replace + # locus 1: the rule sets MTL (90) aside; locus 2 is a plain identity decision. Means: MATsc (40+50)/2 = 45, MTL 55 over locus 2 only. + l1 = [_with_flank(_scored(SC, 100, 5000, 40.0), "sla2"), _scored(MTL, 100, 5000, 90.0)] + l2 = [replace(c, contig="c2", gene_evidence=[replace(g, contig="c2") for g in c.gene_evidence]) + for c in (_scored(SC, 100, 5000, 50.0), _scored(MTL, 100, 5000, 55.0))] + out = fs.resolve_cross_calls(l1 + l2, FAMILIES, {OTHER}) + assert {r.contig: r.family_key.locus_name for r in out} == {"c1": "MATsc", "c2": "MTL"} + c2 = next(r for r in out if r.contig == "c2") + assert c2.family_ambiguous["genome_mean_identity"] == {"Ascomycota:MATsc": 45.0, "Ascomycota:MTL": 55.0} # 90 is not in the MTL mean