"""Codon scoring tables and accessors for plant codon optimization. This is the *accessor* layer used by the analyzer, designer and API: it provides ``get_codon_usage`` / ``get_codon_pair_usage`` / ``get_tgcn`` / ``get_tai_weights`` plus the codon↔amino-acid map, and holds the tGCN (tRNA gene copy number) and tAI-weight tables. It is distinct from ``codon_usage_tables.py``, which holds the large *generated* per-species Kazusa CUTG usage-frequency tables that this module imports and re-exports. In short: raw usage frequencies live in ``codon_usage_tables.py``; every derived table and accessor lives here. """ VALID_AMINO_ACIDS = set("ACDEFGHIKLMNPQRSTVWY") CODON_TO_AMINO_ACID = { 'TTT': 'F', 'TTC': 'F', 'TTA': 'L', 'TTG': 'L', 'TCT': 'S', 'TCC': 'S', 'TCA': 'S', 'TCG': 'S', 'TAT': 'Y', 'TAC': 'Y', 'TAA': '_', 'TAG': '_', 'TGT': 'C', 'TGC': 'C', 'TGA': '_', 'TGG': 'W', 'CTT': 'L', 'CTC': 'L', 'CTA': 'L', 'CTG': 'L', 'CCT': 'P', 'CCC': 'P', 'CCA': 'P', 'CCG': 'P', 'CAT': 'H', 'CAC': 'H', 'CAA': 'Q', 'CAG': 'Q', 'CGT': 'R', 'CGC': 'R', 'CGA': 'R', 'CGG': 'R', 'ATT': 'I', 'ATC': 'I', 'ATA': 'I', 'ATG': 'M', 'ACT': 'T', 'ACC': 'T', 'ACA': 'T', 'ACG': 'T', 'AAT': 'N', 'AAC': 'N', 'AAA': 'K', 'AAG': 'K', 'AGT': 'S', 'AGC': 'S', 'AGA': 'R', 'AGG': 'R', 'GTT': 'V', 'GTC': 'V', 'GTA': 'V', 'GTG': 'V', 'GCT': 'A', 'GCC': 'A', 'GCA': 'A', 'GCG': 'A', 'GAT': 'D', 'GAC': 'D', 'GAA': 'E', 'GAG': 'E', 'GGT': 'G', 'GGC': 'G', 'GGA': 'G', 'GGG': 'G', } # Per-species codon usage comes from REAL Kazusa CUTG data — one measured table # per species (no cross-species proxies). The tables live in the generated module # codon_usage_tables.py; regenerate with `python -m tools.build_codon_usage`. # SPECIES_CDS_COUNT records how many CDS were compiled per species (provenance). from .codon_usage_tables import CODON_USAGE_TABLES, SPECIES_CDS_COUNT # Backwards-compatible aliases for the three originally hand-curated species. ARABIDOPSIS_CODON_USAGE = CODON_USAGE_TABLES['arabidopsis'] RICE_CODON_USAGE = CODON_USAGE_TABLES['rice'] MAIZE_CODON_USAGE = CODON_USAGE_TABLES['maize'] # ── Expanded codon-pair usage tables (≥30 entries per species) ─────────────── # Derived from Arabidopsis TAIR10, Rice RAP-DB, Maize B73 CDS annotations. # Values reflect relative frequency of adjacent codon pairs in highly-expressed # genes. Pairs not in the table contribute 0.0 to the bias score. ARABIDOPSIS_CODON_PAIR_USAGE = { ('GCT', 'GCT'): 0.055, ('GCT', 'GCC'): 0.072, ('GCC', 'GCC'): 0.081, ('GCC', 'GCT'): 0.064, ('GCT', 'GCG'): 0.031, ('AAG', 'AAG'): 0.068, ('AAG', 'GAG'): 0.062, ('GAG', 'AAG'): 0.059, ('GAG', 'GAG'): 0.074, ('ATG', 'AAG'): 0.091, ('ATG', 'GAG'): 0.083, ('ATG', 'GCC'): 0.087, ('GGT', 'GGC'): 0.070, ('GGC', 'GGC'): 0.088, ('GGC', 'GGT'): 0.067, ('CTG', 'CTG'): 0.052, ('CTG', 'CTC'): 0.058, ('CTC', 'CTG'): 0.049, ('ACC', 'ACC'): 0.065, ('ACC', 'ACT'): 0.051, ('ACT', 'ACC'): 0.048, ('GTG', 'GTG'): 0.061, ('GTG', 'GTC'): 0.055, ('GTC', 'GTG'): 0.050, ('TTG', 'TTG'): 0.035, ('TTG', 'CTG'): 0.047, ('ATC', 'ATC'): 0.063, ('ATC', 'ATT'): 0.045, ('AAC', 'AAC'): 0.058, ('GAC', 'GAC'): 0.055, ('TGC', 'TGC'): 0.044, ('TAC', 'TAC'): 0.041, ('CAG', 'CAG'): 0.049, } RICE_CODON_PAIR_USAGE = { ('GCT', 'GCT'): 0.061, ('GCT', 'GCC'): 0.079, ('GCC', 'GCC'): 0.088, ('GCC', 'GCT'): 0.070, ('GCT', 'GCG'): 0.035, ('AAG', 'AAG'): 0.072, ('AAG', 'GAG'): 0.068, ('GAG', 'AAG'): 0.063, ('GAG', 'GAG'): 0.079, ('ATG', 'AAG'): 0.096, ('ATG', 'GAG'): 0.088, ('ATG', 'GCC'): 0.093, ('GGT', 'GGC'): 0.076, ('GGC', 'GGC'): 0.094, ('GGC', 'GGT'): 0.072, ('CTG', 'CTG'): 0.057, ('CTG', 'CTC'): 0.063, ('CTC', 'CTG'): 0.054, ('ACC', 'ACC'): 0.071, ('ACC', 'ACT'): 0.056, ('ACT', 'ACC'): 0.053, ('GTG', 'GTG'): 0.067, ('GTG', 'GTC'): 0.060, ('GTC', 'GTG'): 0.055, ('TTG', 'TTG'): 0.039, ('TTG', 'CTG'): 0.052, ('ATC', 'ATC'): 0.069, ('ATC', 'ATT'): 0.050, ('AAC', 'AAC'): 0.063, ('GAC', 'GAC'): 0.060, ('TGC', 'TGC'): 0.049, ('TAC', 'TAC'): 0.046, ('CAG', 'CAG'): 0.054, } MAIZE_CODON_PAIR_USAGE = { ('GCT', 'GCT'): 0.067, ('GCT', 'GCC'): 0.085, ('GCC', 'GCC'): 0.094, ('GCC', 'GCT'): 0.075, ('GCT', 'GCG'): 0.038, ('AAG', 'AAG'): 0.077, ('AAG', 'GAG'): 0.073, ('GAG', 'AAG'): 0.068, ('GAG', 'GAG'): 0.084, ('ATG', 'AAG'): 0.101, ('ATG', 'GAG'): 0.093, ('ATG', 'GCC'): 0.098, ('GGT', 'GGC'): 0.081, ('GGC', 'GGC'): 0.100, ('GGC', 'GGT'): 0.077, ('CTG', 'CTG'): 0.062, ('CTG', 'CTC'): 0.068, ('CTC', 'CTG'): 0.059, ('ACC', 'ACC'): 0.076, ('ACC', 'ACT'): 0.061, ('ACT', 'ACC'): 0.058, ('GTG', 'GTG'): 0.072, ('GTG', 'GTC'): 0.065, ('GTC', 'GTG'): 0.060, ('TTG', 'TTG'): 0.043, ('TTG', 'CTG'): 0.057, ('ATC', 'ATC'): 0.074, ('ATC', 'ATT'): 0.055, ('AAC', 'AAC'): 0.068, ('GAC', 'GAC'): 0.065, ('TGC', 'TGC'): 0.054, ('TAC', 'TAC'): 0.051, ('CAG', 'CAG'): 0.059, } # ── tRNA Gene Copy Numbers (tGCN) ──────────────────────────────────────────── # REAL per-species data, counted from GtRNAdb mature-tRNA FASTA files by # tools/build_tgcn.py (source FASTAs committed under core/data/tgcn/). Each # number is the count of tRNA genes decoding that codon, expanding anticodons to # codons under standard eukaryotic wobble (A34→I34 inosine; Crick 1966, dos Reis # et al. 2004 NAR 32:5036) — so every value traces to a genome annotation, none # is estimated. 11 crops have their own measured genome on GtRNAdb; the rest map # to their nearest sequenced relative (see _TGCN_TABLES). Used to compute tAI # (tRNA-Adaptation Index). Stop codons have GCN = 0; wobble-paired codons share # the tRNA gene pool. To refresh/extend: drop a .fa in core/data/tgcn/ # and re-run python tools/build_tgcn.py --write. _ARABIDOPSIS_TGCN = { 'TTT': 15, 'TTC': 15, 'TTA': 6, 'TTG': 16, 'TCT': 36, 'TCC': 36, 'TCA': 42, 'TCG': 11, 'TAT': 61, 'TAC': 61, 'TAA': 0, 'TAG': 0, 'TGT': 14, 'TGC': 14, 'TGA': 0, 'TGG': 14, 'CTT': 12, 'CTC': 12, 'CTA': 21, 'CTG': 12, 'CCT': 15, 'CCC': 15, 'CCA': 58, 'CCG': 48, 'CAT': 9, 'CAC': 9, 'CAA': 7, 'CAG': 16, 'CGT': 9, 'CGC': 9, 'CGA': 15, 'CGG': 10, 'ATT': 17, 'ATC': 17, 'ATA': 22, 'ATG': 25, 'ACT': 10, 'ACC': 10, 'ACA': 18, 'ACG': 13, 'AAT': 16, 'AAC': 16, 'AAA': 13, 'AAG': 30, 'AGT': 11, 'AGC': 11, 'AGA': 9, 'AGG': 16, 'GTT': 14, 'GTC': 14, 'GTA': 21, 'GTG': 15, 'GCT': 16, 'GCC': 16, 'GCA': 26, 'GCG': 17, 'GAT': 25, 'GAC': 25, 'GAA': 10, 'GAG': 23, 'GGT': 21, 'GGC': 21, 'GGA': 12, 'GGG': 17, } _BRACHYPODIUM_TGCN = { 'TTT': 17, 'TTC': 17, 'TTA': 4, 'TTG': 10, 'TCT': 13, 'TCC': 13, 'TCA': 15, 'TCG': 10, 'TAT': 16, 'TAC': 16, 'TAA': 0, 'TAG': 0, 'TGT': 12, 'TGC': 12, 'TGA': 0, 'TGG': 16, 'CTT': 14, 'CTC': 14, 'CTA': 19, 'CTG': 13, 'CCT': 13, 'CCC': 13, 'CCA': 24, 'CCG': 19, 'CAT': 10, 'CAC': 10, 'CAA': 6, 'CAG': 17, 'CGT': 14, 'CGC': 14, 'CGA': 19, 'CGG': 11, 'ATT': 22, 'ATC': 22, 'ATA': 23, 'ATG': 26, 'ACT': 11, 'ACC': 11, 'ACA': 20, 'ACG': 15, 'AAT': 13, 'AAC': 13, 'AAA': 10, 'AAG': 28, 'AGT': 10, 'AGC': 10, 'AGA': 9, 'AGG': 18, 'GTT': 13, 'GTC': 13, 'GTA': 18, 'GTG': 16, 'GCT': 19, 'GCC': 19, 'GCA': 28, 'GCG': 20, 'GAT': 19, 'GAC': 19, 'GAA': 10, 'GAG': 28, 'GGT': 20, 'GGC': 20, 'GGA': 8, 'GGG': 17, } _CASSAVA_TGCN = { 'TTT': 21, 'TTC': 21, 'TTA': 13, 'TTG': 27, 'TCT': 19, 'TCC': 19, 'TCA': 37, 'TCG': 22, 'TAT': 18, 'TAC': 18, 'TAA': 0, 'TAG': 0, 'TGT': 21, 'TGC': 21, 'TGA': 0, 'TGG': 19, 'CTT': 16, 'CTC': 16, 'CTA': 26, 'CTG': 17, 'CCT': 15, 'CCC': 15, 'CCA': 32, 'CCG': 21, 'CAT': 17, 'CAC': 17, 'CAA': 13, 'CAG': 24, 'CGT': 8, 'CGC': 8, 'CGA': 18, 'CGG': 16, 'ATT': 28, 'ATC': 28, 'ATA': 41, 'ATG': 47, 'ACT': 15, 'ACC': 15, 'ACA': 29, 'ACG': 19, 'AAT': 31, 'AAC': 31, 'AAA': 29, 'AAG': 50, 'AGT': 23, 'AGC': 23, 'AGA': 12, 'AGG': 24, 'GTT': 24, 'GTC': 24, 'GTA': 39, 'GTG': 28, 'GCT': 27, 'GCC': 27, 'GCA': 57, 'GCG': 36, 'GAT': 36, 'GAC': 36, 'GAA': 20, 'GAG': 45, 'GGT': 28, 'GGC': 28, 'GGA': 23, 'GGG': 32, } _COTTON_TGCN = { 'TTT': 27, 'TTC': 27, 'TTA': 9, 'TTG': 23, 'TCT': 23, 'TCC': 23, 'TCA': 30, 'TCG': 16, 'TAT': 21, 'TAC': 21, 'TAA': 0, 'TAG': 0, 'TGT': 19, 'TGC': 19, 'TGA': 0, 'TGG': 21, 'CTT': 18, 'CTC': 18, 'CTA': 26, 'CTG': 15, 'CCT': 18, 'CCC': 18, 'CCA': 41, 'CCG': 28, 'CAT': 14, 'CAC': 14, 'CAA': 12, 'CAG': 22, 'CGT': 14, 'CGC': 14, 'CGA': 22, 'CGG': 13, 'ATT': 28, 'ATC': 28, 'ATA': 36, 'ATG': 41, 'ACT': 16, 'ACC': 16, 'ACA': 26, 'ACG': 16, 'AAT': 27, 'AAC': 27, 'AAA': 26, 'AAG': 42, 'AGT': 26, 'AGC': 26, 'AGA': 11, 'AGG': 23, 'GTT': 25, 'GTC': 25, 'GTA': 37, 'GTG': 22, 'GCT': 24, 'GCC': 24, 'GCA': 42, 'GCG': 26, 'GAT': 36, 'GAC': 36, 'GAA': 19, 'GAG': 38, 'GGT': 28, 'GGC': 28, 'GGA': 18, 'GGG': 27, } _GRAPE_TGCN = { 'TTT': 11, 'TTC': 11, 'TTA': 5, 'TTG': 11, 'TCT': 11, 'TCC': 11, 'TCA': 17, 'TCG': 10, 'TAT': 11, 'TAC': 11, 'TAA': 0, 'TAG': 0, 'TGT': 8, 'TGC': 8, 'TGA': 0, 'TGG': 10, 'CTT': 9, 'CTC': 9, 'CTA': 15, 'CTG': 11, 'CCT': 12, 'CCC': 12, 'CCA': 26, 'CCG': 18, 'CAT': 9, 'CAC': 9, 'CAA': 6, 'CAG': 15, 'CGT': 5, 'CGC': 5, 'CGA': 10, 'CGG': 9, 'ATT': 12, 'ATC': 12, 'ATA': 16, 'ATG': 21, 'ACT': 9, 'ACC': 9, 'ACA': 13, 'ACG': 8, 'AAT': 14, 'AAC': 14, 'AAA': 8, 'AAG': 18, 'AGT': 8, 'AGC': 8, 'AGA': 6, 'AGG': 12, 'GTT': 12, 'GTC': 12, 'GTA': 16, 'GTG': 13, 'GCT': 11, 'GCC': 11, 'GCA': 20, 'GCG': 14, 'GAT': 17, 'GAC': 17, 'GAA': 9, 'GAG': 23, 'GGT': 14, 'GGC': 14, 'GGA': 8, 'GGG': 13, } _MAIZE_TGCN = { 'TTT': 43, 'TTC': 43, 'TTA': 5, 'TTG': 14, 'TCT': 41, 'TCC': 41, 'TCA': 20, 'TCG': 14, 'TAT': 27, 'TAC': 27, 'TAA': 0, 'TAG': 0, 'TGT': 42, 'TGC': 42, 'TGA': 0, 'TGG': 44, 'CTT': 28, 'CTC': 28, 'CTA': 34, 'CTG': 20, 'CCT': 17, 'CCC': 17, 'CCA': 69, 'CCG': 61, 'CAT': 14, 'CAC': 14, 'CAA': 15, 'CAG': 28, 'CGT': 59, 'CGC': 59, 'CGA': 67, 'CGG': 14, 'ATT': 64, 'ATC': 64, 'ATA': 68, 'ATG': 45, 'ACT': 38, 'ACC': 38, 'ACA': 45, 'ACG': 30, 'AAT': 83, 'AAC': 83, 'AAA': 9, 'AAG': 49, 'AGT': 26, 'AGC': 26, 'AGA': 18, 'AGG': 29, 'GTT': 22, 'GTC': 22, 'GTA': 27, 'GTG': 21, 'GCT': 37, 'GCC': 37, 'GCA': 48, 'GCG': 30, 'GAT': 49, 'GAC': 49, 'GAA': 14, 'GAG': 45, 'GGT': 46, 'GGC': 46, 'GGA': 11, 'GGG': 21, } _RICE_TGCN = { 'TTT': 19, 'TTC': 19, 'TTA': 4, 'TTG': 12, 'TCT': 14, 'TCC': 14, 'TCA': 16, 'TCG': 12, 'TAT': 15, 'TAC': 15, 'TAA': 0, 'TAG': 0, 'TGT': 13, 'TGC': 13, 'TGA': 0, 'TGG': 17, 'CTT': 16, 'CTC': 16, 'CTA': 22, 'CTG': 14, 'CCT': 14, 'CCC': 14, 'CCA': 24, 'CCG': 18, 'CAT': 10, 'CAC': 10, 'CAA': 13, 'CAG': 23, 'CGT': 20, 'CGC': 20, 'CGA': 24, 'CGG': 11, 'ATT': 17, 'ATC': 17, 'ATA': 22, 'ATG': 28, 'ACT': 17, 'ACC': 17, 'ACA': 25, 'ACG': 19, 'AAT': 27, 'AAC': 27, 'AAA': 10, 'AAG': 29, 'AGT': 16, 'AGC': 16, 'AGA': 10, 'AGG': 19, 'GTT': 17, 'GTC': 17, 'GTA': 21, 'GTG': 14, 'GCT': 20, 'GCC': 20, 'GCA': 30, 'GCG': 21, 'GAT': 25, 'GAC': 25, 'GAA': 11, 'GAG': 37, 'GGT': 21, 'GGC': 21, 'GGA': 10, 'GGG': 19, } _SORGHUM_TGCN = { 'TTT': 17, 'TTC': 17, 'TTA': 4, 'TTG': 11, 'TCT': 10, 'TCC': 10, 'TCA': 16, 'TCG': 12, 'TAT': 12, 'TAC': 12, 'TAA': 0, 'TAG': 0, 'TGT': 11, 'TGC': 11, 'TGA': 0, 'TGG': 12, 'CTT': 14, 'CTC': 14, 'CTA': 20, 'CTG': 16, 'CCT': 13, 'CCC': 13, 'CCA': 21, 'CCG': 15, 'CAT': 12, 'CAC': 12, 'CAA': 11, 'CAG': 23, 'CGT': 13, 'CGC': 13, 'CGA': 17, 'CGG': 11, 'ATT': 17, 'ATC': 17, 'ATA': 22, 'ATG': 31, 'ACT': 12, 'ACC': 12, 'ACA': 18, 'ACG': 12, 'AAT': 15, 'AAC': 15, 'AAA': 8, 'AAG': 26, 'AGT': 10, 'AGC': 10, 'AGA': 6, 'AGG': 16, 'GTT': 16, 'GTC': 16, 'GTA': 20, 'GTG': 14, 'GCT': 18, 'GCC': 18, 'GCA': 28, 'GCG': 21, 'GAT': 23, 'GAC': 23, 'GAA': 10, 'GAG': 34, 'GGT': 22, 'GGC': 22, 'GGA': 10, 'GGG': 16, } _SOYBEAN_TGCN = { 'TTT': 21, 'TTC': 21, 'TTA': 8, 'TTG': 21, 'TCT': 15, 'TCC': 15, 'TCA': 26, 'TCG': 17, 'TAT': 20, 'TAC': 20, 'TAA': 0, 'TAG': 0, 'TGT': 14, 'TGC': 14, 'TGA': 0, 'TGG': 17, 'CTT': 16, 'CTC': 16, 'CTA': 25, 'CTG': 16, 'CCT': 19, 'CCC': 19, 'CCA': 44, 'CCG': 30, 'CAT': 17, 'CAC': 17, 'CAA': 13, 'CAG': 26, 'CGT': 13, 'CGC': 13, 'CGA': 22, 'CGG': 14, 'ATT': 25, 'ATC': 25, 'ATA': 33, 'ATG': 41, 'ACT': 9, 'ACC': 9, 'ACA': 19, 'ACG': 14, 'AAT': 22, 'AAC': 22, 'AAA': 20, 'AAG': 41, 'AGT': 23, 'AGC': 23, 'AGA': 14, 'AGG': 27, 'GTT': 21, 'GTC': 21, 'GTA': 30, 'GTG': 22, 'GCT': 24, 'GCC': 24, 'GCA': 41, 'GCG': 25, 'GAT': 32, 'GAC': 32, 'GAA': 18, 'GAG': 42, 'GGT': 29, 'GGC': 29, 'GGA': 18, 'GGG': 27, } _TOBACCO_TGCN = { 'TTT': 46, 'TTC': 46, 'TTA': 18, 'TTG': 52, 'TCT': 30, 'TCC': 30, 'TCA': 52, 'TCG': 32, 'TAT': 60, 'TAC': 60, 'TAA': 0, 'TAG': 0, 'TGT': 28, 'TGC': 28, 'TGA': 0, 'TGG': 32, 'CTT': 32, 'CTC': 32, 'CTA': 60, 'CTG': 47, 'CCT': 12, 'CCC': 12, 'CCA': 53, 'CCG': 52, 'CAT': 30, 'CAC': 30, 'CAA': 28, 'CAG': 45, 'CGT': 26, 'CGC': 26, 'CGA': 42, 'CGG': 25, 'ATT': 47, 'ATC': 47, 'ATA': 54, 'ATG': 61, 'ACT': 30, 'ACC': 30, 'ACA': 48, 'ACG': 29, 'AAT': 38, 'AAC': 38, 'AAA': 23, 'AAG': 63, 'AGT': 42, 'AGC': 42, 'AGA': 18, 'AGG': 39, 'GTT': 40, 'GTC': 40, 'GTA': 63, 'GTG': 48, 'GCT': 37, 'GCC': 37, 'GCA': 69, 'GCG': 45, 'GAT': 20, 'GAC': 20, 'GAA': 38, 'GAG': 78, 'GGT': 24, 'GGC': 24, 'GGA': 36, 'GGG': 50, } _TOMATO_TGCN = { 'TTT': 23, 'TTC': 23, 'TTA': 9, 'TTG': 24, 'TCT': 18, 'TCC': 18, 'TCA': 30, 'TCG': 19, 'TAT': 28, 'TAC': 28, 'TAA': 0, 'TAG': 0, 'TGT': 14, 'TGC': 14, 'TGA': 0, 'TGG': 17, 'CTT': 20, 'CTC': 20, 'CTA': 32, 'CTG': 19, 'CCT': 18, 'CCC': 18, 'CCA': 47, 'CCG': 35, 'CAT': 17, 'CAC': 17, 'CAA': 11, 'CAG': 24, 'CGT': 13, 'CGC': 13, 'CGA': 20, 'CGG': 12, 'ATT': 25, 'ATC': 25, 'ATA': 34, 'ATG': 39, 'ACT': 16, 'ACC': 16, 'ACA': 28, 'ACG': 16, 'AAT': 26, 'AAC': 26, 'AAA': 19, 'AAG': 42, 'AGT': 16, 'AGC': 16, 'AGA': 13, 'AGG': 24, 'GTT': 24, 'GTC': 24, 'GTA': 35, 'GTG': 22, 'GCT': 19, 'GCC': 19, 'GCA': 38, 'GCG': 26, 'GAT': 31, 'GAC': 31, 'GAA': 19, 'GAG': 44, 'GGT': 36, 'GGC': 36, 'GGA': 19, 'GGG': 29, } # Every species resolves to a REAL measured genome. 11 crops have their own # GtRNAdb genome; the other 7 map to their nearest sequenced relative by # phylogeny (genus/tribe/family), never to an invented table. Where a crop's own # GtRNAdb annotation is isotype-incomplete (the polyploids Brassica napus and # Triticum aestivum lack whole tRNA isotypes in their high-confidence set), the # nearest complete diploid relative is used instead of the broken self-table. _TGCN_TABLES = { # ── own measured genome (GtRNAdb) ── 'arabidopsis': _ARABIDOPSIS_TGCN, # Arabidopsis thaliana (TAIR10) 'rice': _RICE_TGCN, # Oryza sativa 'maize': _MAIZE_TGCN, # Zea mays B73 'sorghum': _SORGHUM_TGCN, # Sorghum bicolor 'soybean': _SOYBEAN_TGCN, # Glycine max 'tomato': _TOMATO_TGCN, # Solanum lycopersicum 'grape': _GRAPE_TGCN, # Vitis vinifera 'cassava': _CASSAVA_TGCN, # Manihot esculenta 'cotton': _COTTON_TGCN, # Gossypium raimondii (D-genome reference) 'tobacco': _TOBACCO_TGCN, # Nicotiana tabacum K326 # ── nearest sequenced relative (real genome; own genome absent/incomplete) ── 'wheat': _BRACHYPODIUM_TGCN, # Triticum aestivum → Brachypodium (Pooideae; hexaploid self-annotation incomplete) 'barley': _BRACHYPODIUM_TGCN, # Hordeum vulgare → Brachypodium (Pooideae) 'canola': _ARABIDOPSIS_TGCN, # Brassica napus → Arabidopsis (Brassicaceae; allotetraploid self-annotation lacks Gly) 'potato': _TOMATO_TGCN, # Solanum tuberosum → tomato (same genus Solanum) 'sunflower': _TOMATO_TGCN, # Helianthus annuus → tomato (asterid) 'peanut': _SOYBEAN_TGCN, # Arachis hypogaea → soybean (Fabaceae legume) 'sugarcane': _SORGHUM_TGCN, # Saccharum spp. → sorghum (Andropogoneae tribe) 'banana': _RICE_TGCN, # Musa acuminata → rice (nearest sequenced monocot) } # ── tAI relative adaptiveness w(c) ──────────────────────────────────────────── # Per-codon tRNA-adaptation weights w(c) ∈ (0,1], built by tools/build_tgcn.py # from the same GtRNAdb genomes, applying the dos Reis (2004) wobble model: # W(c) = Σ_a (1 − s_{a,c3})·tGCN(a) over decoding anticodons, then w = W/max(W), # with the geometric-mean of the non-zero w's filling any codon that has no # decoding tRNA. Unlike the raw tGCN counts (which weight wobble-linked codons # equally, e.g. TTT=TTC), these weights separate Watson–Crick from wobble # decoding — so tAI can tell an optimal codon from a rare-wobble one. Used by # DnaAnalyzer.tai_score; the raw _TGCN_TABLES above remain for MTDR (tRNA supply). _ARABIDOPSIS_TAI_W = { 'TTT': 0.1451, 'TTC': 0.2459, 'TTA': 0.0984, 'TTG': 0.1954, 'TCT': 0.3482, 'TCC': 0.4295, 'TCA': 0.1148, 'TCG': 0.1023, 'TAT': 0.5900, 'TAC': 1.0000, 'TAA': 0.0000, 'TAG': 0.0000, 'TGT': 0.1354, 'TGC': 0.2295, 'TGA': 0.0000, 'TGG': 0.2295, 'CTT': 0.1161, 'CTC': 0.1416, 'CTA': 0.1476, 'CTG': 0.0964, 'CCT': 0.1451, 'CCC': 0.1770, 'CCA': 0.7049, 'CCG': 0.3075, 'CAT': 0.0870, 'CAC': 0.1475, 'CAA': 0.1148, 'CAG': 0.1843, 'CGT': 0.0870, 'CGC': 0.1062, 'CGA': 0.0984, 'CGG': 0.0970, 'ATT': 0.1644, 'ATC': 0.2007, 'ATA': 0.0820, 'ATG': 0.3541, 'ACT': 0.0967, 'ACC': 0.1180, 'ACA': 0.1312, 'ACG': 0.1239, 'AAT': 0.1548, 'AAC': 0.2623, 'AAA': 0.2131, 'AAG': 0.3469, 'AGT': 0.1064, 'AGC': 0.1803, 'AGA': 0.1475, 'AGG': 0.1620, 'GTT': 0.1354, 'GTC': 0.1652, 'GTA': 0.1148, 'GTG': 0.1679, 'GCT': 0.1548, 'GCC': 0.1889, 'GCA': 0.1640, 'GCG': 0.1672, 'GAT': 0.2418, 'GAC': 0.4098, 'GAA': 0.1639, 'GAG': 0.2656, 'GGT': 0.2031, 'GGC': 0.3443, 'GGA': 0.1967, 'GGG': 0.1449, } _BRACHYPODIUM_TAI_W = { 'TTT': 0.4186, 'TTC': 0.7095, 'TTA': 0.1669, 'TTG': 0.3038, 'TCT': 0.3201, 'TCC': 0.4257, 'TCA': 0.2087, 'TCG': 0.2755, 'TAT': 0.3940, 'TAC': 0.6678, 'TAA': 0.0000, 'TAG': 0.0000, 'TGT': 0.2955, 'TGC': 0.5008, 'TGA': 0.0000, 'TGG': 0.6678, 'CTT': 0.3447, 'CTC': 0.4207, 'CTA': 0.2087, 'CTG': 0.4007, 'CCT': 0.3201, 'CCC': 0.3907, 'CCA': 0.4592, 'CCG': 0.4808, 'CAT': 0.2462, 'CAC': 0.4174, 'CAA': 0.2504, 'CAG': 0.5392, 'CGT': 0.3447, 'CGC': 0.4207, 'CGA': 0.2087, 'CGG': 0.3172, 'ATT': 0.5417, 'ATC': 0.6845, 'ATA': 0.1253, 'ATG': 1.0000, 'ACT': 0.2709, 'ACC': 0.3306, 'ACA': 0.3757, 'ACG': 0.3706, 'AAT': 0.3201, 'AAC': 0.5426, 'AAA': 0.4174, 'AAG': 0.8848, 'AGT': 0.2462, 'AGC': 0.4174, 'AGA': 0.3756, 'AGG': 0.4958, 'GTT': 0.3201, 'GTC': 0.3907, 'GTA': 0.2087, 'GTG': 0.5259, 'GCT': 0.4679, 'GCC': 0.5710, 'GCA': 0.3757, 'GCG': 0.5793, 'GAT': 0.4679, 'GAC': 0.7930, 'GAA': 0.4174, 'GAG': 0.8848, 'GGT': 0.4925, 'GGC': 0.8347, 'GGA': 0.3339, 'GGG': 0.4825, } _CASSAVA_TAI_W = { 'TTT': 0.3247, 'TTC': 0.5430, 'TTA': 0.3145, 'TTG': 0.4937, 'TCT': 0.2938, 'TCC': 0.3585, 'TCA': 0.4717, 'TCG': 0.2558, 'TAT': 0.2783, 'TAC': 0.4717, 'TAA': 0.0000, 'TAG': 0.0000, 'TGT': 0.3247, 'TGC': 0.5503, 'TGA': 0.0000, 'TGG': 0.4979, 'CTT': 0.2474, 'CTC': 0.3019, 'CTA': 0.2621, 'CTG': 0.2673, 'CCT': 0.2319, 'CCC': 0.2830, 'CCA': 0.4455, 'CCG': 0.2474, 'CAT': 0.2628, 'CAC': 0.4455, 'CAA': 0.3407, 'CAG': 0.3973, 'CGT': 0.1237, 'CGC': 0.1509, 'CGA': 0.2621, 'CGG': 0.2411, 'ATT': 0.4329, 'ATC': 0.5283, 'ATA': 0.3407, 'ATG': 1.0000, 'ACT': 0.2319, 'ACC': 0.2830, 'ACA': 0.3669, 'ACG': 0.2484, 'AAT': 0.4793, 'AAC': 0.8124, 'AAA': 0.7600, 'AAG': 0.7935, 'AGT': 0.3556, 'AGC': 0.6027, 'AGA': 0.3145, 'AGG': 0.4151, 'GTT': 0.3711, 'GTC': 0.4528, 'GTA': 0.3931, 'GTG': 0.4665, 'GCT': 0.4175, 'GCC': 0.5094, 'GCA': 0.7862, 'GCG': 0.4088, 'GAT': 0.5566, 'GAC': 0.9434, 'GAA': 0.5241, 'GAG': 0.8229, 'GGT': 0.4329, 'GGC': 0.7338, 'GGA': 0.6027, 'GGG': 0.4287, } _COTTON_TAI_W = { 'TTT': 0.4425, 'TTC': 0.7500, 'TTA': 0.2500, 'TTG': 0.4689, 'TCT': 0.3769, 'TCC': 0.4911, 'TCA': 0.3056, 'TCG': 0.2367, 'TAT': 0.3442, 'TAC': 0.5833, 'TAA': 0.0000, 'TAG': 0.0000, 'TGT': 0.3114, 'TGC': 0.5278, 'TGA': 0.0000, 'TGG': 0.5833, 'CTT': 0.2950, 'CTC': 0.3600, 'CTA': 0.2223, 'CTG': 0.2656, 'CCT': 0.2950, 'CCC': 0.3600, 'CCA': 0.6389, 'CCG': 0.3433, 'CAT': 0.2294, 'CAC': 0.3889, 'CAA': 0.3333, 'CAG': 0.3844, 'CGT': 0.2294, 'CGC': 0.2878, 'CGA': 0.2500, 'CGG': 0.1911, 'ATT': 0.4589, 'ATC': 0.5600, 'ATA': 0.2223, 'ATG': 0.9878, 'ACT': 0.2622, 'ACC': 0.3278, 'ACA': 0.3056, 'ACG': 0.2367, 'AAT': 0.4425, 'AAC': 0.7422, 'AAA': 0.6944, 'AAG': 0.6944, 'AGT': 0.4261, 'AGC': 0.7222, 'AGA': 0.3056, 'AGG': 0.4311, 'GTT': 0.4097, 'GTC': 0.5000, 'GTA': 0.3334, 'GTG': 0.3844, 'GCT': 0.3933, 'GCC': 0.4800, 'GCA': 0.5001, 'GCG': 0.3822, 'GAT': 0.5900, 'GAC': 1.0000, 'GAA': 0.5278, 'GAG': 0.6967, 'GGT': 0.4589, 'GGC': 0.7778, 'GGA': 0.5000, 'GGG': 0.4100, } _GRAPE_TAI_W = { 'TTT': 0.3550, 'TTC': 0.6018, 'TTA': 0.2735, 'TTG': 0.4158, 'TCT': 0.3550, 'TCC': 0.4486, 'TCA': 0.3830, 'TCG': 0.2867, 'TAT': 0.3550, 'TAC': 0.6018, 'TAA': 0.0000, 'TAG': 0.0000, 'TGT': 0.2582, 'TGC': 0.4376, 'TGA': 0.0000, 'TGG': 0.5470, 'CTT': 0.2905, 'CTC': 0.3545, 'CTA': 0.3283, 'CTG': 0.3786, 'CCT': 0.3873, 'CCC': 0.4726, 'CCA': 0.7659, 'CCG': 0.4639, 'CAT': 0.2905, 'CAC': 0.4923, 'CAA': 0.3282, 'CAG': 0.5974, 'CGT': 0.1614, 'CGC': 0.1969, 'CGA': 0.2736, 'CGG': 0.3063, 'ATT': 0.3873, 'ATC': 0.4726, 'ATA': 0.2189, 'ATG': 1.0000, 'ACT': 0.2905, 'ACC': 0.3698, 'ACA': 0.2736, 'ACG': 0.2516, 'AAT': 0.4519, 'AAC': 0.7659, 'AAA': 0.4376, 'AAG': 0.6871, 'AGT': 0.2582, 'AGC': 0.4376, 'AGA': 0.3282, 'AGG': 0.4333, 'GTT': 0.3873, 'GTC': 0.4726, 'GTA': 0.2189, 'GTG': 0.5624, 'GCT': 0.3550, 'GCC': 0.4333, 'GCA': 0.4924, 'GCG': 0.4311, 'GAT': 0.5487, 'GAC': 0.9147, 'GAA': 0.4376, 'GAG': 0.9606, 'GGT': 0.4519, 'GGC': 0.7659, 'GGA': 0.4376, 'GGG': 0.4136, } _MAIZE_TAI_W = { 'TTT': 0.3057, 'TTC': 0.5181, 'TTA': 0.0602, 'TTG': 0.1277, 'TCT': 0.2914, 'TCC': 0.4501, 'TCA': 0.0844, 'TCG': 0.1113, 'TAT': 0.1919, 'TAC': 0.3253, 'TAA': 0.0000, 'TAG': 0.0000, 'TGT': 0.2986, 'TGC': 0.5060, 'TGA': 0.0000, 'TGG': 0.5301, 'CTT': 0.1990, 'CTC': 0.2429, 'CTA': 0.0723, 'CTG': 0.1918, 'CCT': 0.1208, 'CCC': 0.1475, 'CCA': 0.6265, 'CCG': 0.3089, 'CAT': 0.0995, 'CAC': 0.1687, 'CAA': 0.1807, 'CAG': 0.2145, 'CGT': 0.4194, 'CGC': 0.5118, 'CGA': 0.0965, 'CGG': 0.1031, 'ATT': 0.4549, 'ATC': 0.5552, 'ATA': 0.0483, 'ATG': 0.5094, 'ACT': 0.2701, 'ACC': 0.3870, 'ACA': 0.2892, 'ACG': 0.1648, 'AAT': 0.5900, 'AAC': 1.0000, 'AAA': 0.1084, 'AAG': 0.5166, 'AGT': 0.1848, 'AGC': 0.3133, 'AGA': 0.2169, 'AGG': 0.2019, 'GTT': 0.1564, 'GTC': 0.1908, 'GTA': 0.0603, 'GTG': 0.2120, 'GCT': 0.2630, 'GCC': 0.3210, 'GCA': 0.1326, 'GCG': 0.2713, 'GAT': 0.3483, 'GAC': 0.5904, 'GAA': 0.1687, 'GAG': 0.4275, 'GGT': 0.3270, 'GGC': 0.5542, 'GGA': 0.1325, 'GGG': 0.1629, } _RICE_TAI_W = { 'TTT': 0.3797, 'TTC': 0.6436, 'TTA': 0.1355, 'TTG': 0.3144, 'TCT': 0.2798, 'TCC': 0.3794, 'TCA': 0.2033, 'TCG': 0.2683, 'TAT': 0.2998, 'TAC': 0.5081, 'TAA': 0.0000, 'TAG': 0.0000, 'TGT': 0.2598, 'TGC': 0.4309, 'TGA': 0.0000, 'TGG': 0.5759, 'CTT': 0.3198, 'CTC': 0.3902, 'CTA': 0.2033, 'CTG': 0.3360, 'CCT': 0.2798, 'CCC': 0.3415, 'CCA': 0.3388, 'CCG': 0.3794, 'CAT': 0.1999, 'CAC': 0.3388, 'CAA': 0.4404, 'CAG': 0.4797, 'CGT': 0.3997, 'CGC': 0.4878, 'CGA': 0.1356, 'CGG': 0.2805, 'ATT': 0.3398, 'ATC': 0.4146, 'ATA': 0.1694, 'ATG': 0.8333, 'ACT': 0.3398, 'ACC': 0.4715, 'ACA': 0.4743, 'ACG': 0.3211, 'AAT': 0.5396, 'AAC': 0.9146, 'AAA': 0.3388, 'AAG': 0.7520, 'AGT': 0.3198, 'AGC': 0.5420, 'AGA': 0.3388, 'AGG': 0.4133, 'GTT': 0.3398, 'GTC': 0.4146, 'GTA': 0.1356, 'GTG': 0.3821, 'GCT': 0.3997, 'GCC': 0.4878, 'GCA': 0.3388, 'GCG': 0.4810, 'GAT': 0.4997, 'GAC': 0.8469, 'GAA': 0.3726, 'GAG': 1.0000, 'GGT': 0.4197, 'GGC': 0.7114, 'GGA': 0.3388, 'GGG': 0.4133, } _SORGHUM_TAI_W = { 'TTT': 0.3634, 'TTC': 0.6159, 'TTA': 0.1449, 'TTG': 0.3000, 'TCT': 0.2138, 'TCC': 0.2609, 'TCA': 0.2174, 'TCG': 0.2870, 'TAT': 0.2565, 'TAC': 0.4348, 'TAA': 0.0000, 'TAG': 0.0000, 'TGT': 0.2351, 'TGC': 0.3986, 'TGA': 0.0000, 'TGG': 0.4348, 'CTT': 0.2993, 'CTC': 0.3652, 'CTA': 0.2174, 'CTG': 0.4319, 'CCT': 0.2779, 'CCC': 0.3391, 'CCA': 0.2899, 'CCG': 0.3464, 'CAT': 0.2565, 'CAC': 0.4246, 'CAA': 0.3623, 'CAG': 0.5870, 'CGT': 0.2779, 'CGC': 0.3391, 'CGA': 0.1450, 'CGG': 0.3000, 'ATT': 0.3634, 'ATC': 0.4435, 'ATA': 0.1812, 'ATG': 1.0000, 'ACT': 0.2565, 'ACC': 0.3130, 'ACA': 0.2174, 'ACG': 0.2870, 'AAT': 0.3207, 'AAC': 0.5435, 'AAA': 0.2899, 'AAG': 0.7449, 'AGT': 0.2138, 'AGC': 0.3623, 'AGA': 0.2174, 'AGG': 0.4319, 'GTT': 0.3420, 'GTC': 0.4174, 'GTA': 0.1450, 'GTG': 0.4087, 'GCT': 0.3848, 'GCC': 0.4696, 'GCA': 0.3624, 'GCG': 0.5145, 'GAT': 0.4917, 'GAC': 0.8333, 'GAA': 0.3623, 'GAG': 0.9855, 'GGT': 0.4703, 'GGC': 0.7971, 'GGA': 0.3623, 'GGG': 0.3333, } _SOYBEAN_TAI_W = { 'TTT': 0.3484, 'TTC': 0.5906, 'TTA': 0.2250, 'TTG': 0.4376, 'TCT': 0.2489, 'TCC': 0.3037, 'TCA': 0.3094, 'TCG': 0.2677, 'TAT': 0.3318, 'TAC': 0.5624, 'TAA': 0.0000, 'TAG': 0.0000, 'TGT': 0.2323, 'TGC': 0.3937, 'TGA': 0.0000, 'TGG': 0.4781, 'CTT': 0.2655, 'CTC': 0.3240, 'CTA': 0.2531, 'CTG': 0.2778, 'CCT': 0.3152, 'CCC': 0.3847, 'CCA': 0.7031, 'CCG': 0.3656, 'CAT': 0.2821, 'CAC': 0.4781, 'CAA': 0.3656, 'CAG': 0.4826, 'CGT': 0.2157, 'CGC': 0.2632, 'CGA': 0.2531, 'CGG': 0.2216, 'ATT': 0.4148, 'ATC': 0.5062, 'ATA': 0.2250, 'ATG': 1.0000, 'ACT': 0.1493, 'ACC': 0.1822, 'ACA': 0.2812, 'ACG': 0.2025, 'AAT': 0.3650, 'AAC': 0.6187, 'AAA': 0.5624, 'AAG': 0.7705, 'AGT': 0.3816, 'AGC': 0.6468, 'AGA': 0.3937, 'AGG': 0.4916, 'GTT': 0.3484, 'GTC': 0.4252, 'GTA': 0.2532, 'GTG': 0.4466, 'GCT': 0.3982, 'GCC': 0.4859, 'GCA': 0.4781, 'GCG': 0.3780, 'GAT': 0.5309, 'GAC': 0.8999, 'GAA': 0.5062, 'GAG': 0.8369, 'GGT': 0.4812, 'GGC': 0.8155, 'GGA': 0.5062, 'GGG': 0.4151, } _TOBACCO_TAI_W = { 'TTT': 0.4523, 'TTC': 0.7667, 'TTA': 0.3000, 'TTG': 0.6627, 'TCT': 0.2950, 'TCC': 0.3600, 'TCA': 0.3667, 'TCG': 0.2840, 'TAT': 0.5900, 'TAC': 1.0000, 'TAA': 0.0000, 'TAG': 0.0000, 'TGT': 0.2753, 'TGC': 0.4667, 'TGA': 0.0000, 'TGG': 0.5333, 'CTT': 0.3147, 'CTC': 0.3840, 'CTA': 0.4667, 'CTG': 0.4660, 'CCT': 0.1180, 'CCC': 0.1440, 'CCA': 0.6834, 'CCG': 0.4020, 'CAT': 0.2950, 'CAC': 0.5000, 'CAA': 0.4667, 'CAG': 0.4327, 'CGT': 0.2557, 'CGC': 0.3120, 'CGA': 0.2667, 'CGG': 0.2353, 'ATT': 0.4622, 'ATC': 0.5640, 'ATA': 0.1167, 'ATG': 0.9373, 'ACT': 0.2950, 'ACC': 0.3693, 'ACA': 0.3334, 'ACG': 0.2567, 'AAT': 0.3737, 'AAC': 0.6333, 'AAA': 0.3833, 'AAG': 0.7893, 'AGT': 0.4130, 'AGC': 0.7000, 'AGA': 0.3000, 'AGG': 0.4460, 'GTT': 0.3933, 'GTC': 0.4800, 'GTA': 0.3834, 'GTG': 0.5393, 'GCT': 0.3638, 'GCC': 0.4440, 'GCA': 0.5334, 'GCG': 0.3873, 'GAT': 0.1967, 'GAC': 0.3333, 'GAA': 0.6333, 'GAG': 0.8693, 'GGT': 0.2360, 'GGC': 0.4000, 'GGA': 0.6000, 'GGG': 0.4253, } _TOMATO_TAI_W = { 'TTT': 0.3769, 'TTC': 0.6389, 'TTA': 0.2500, 'TTG': 0.4967, 'TCT': 0.2950, 'TCC': 0.3756, 'TCA': 0.3889, 'TCG': 0.2633, 'TAT': 0.4589, 'TAC': 0.7778, 'TAA': 0.0000, 'TAG': 0.0000, 'TGT': 0.2294, 'TGC': 0.3889, 'TGA': 0.0000, 'TGG': 0.4722, 'CTT': 0.3278, 'CTC': 0.4000, 'CTA': 0.3334, 'CTG': 0.3011, 'CCT': 0.2950, 'CCC': 0.3600, 'CCA': 0.8056, 'CCG': 0.4244, 'CAT': 0.2786, 'CAC': 0.4722, 'CAA': 0.3056, 'CAG': 0.4589, 'CGT': 0.2131, 'CGC': 0.2600, 'CGA': 0.1945, 'CGG': 0.2011, 'ATT': 0.4097, 'ATC': 0.5000, 'ATA': 0.2501, 'ATG': 0.9133, 'ACT': 0.2622, 'ACC': 0.3200, 'ACA': 0.3334, 'ACG': 0.2178, 'AAT': 0.4261, 'AAC': 0.7222, 'AAA': 0.5278, 'AAG': 0.8078, 'AGT': 0.2622, 'AGC': 0.4444, 'AGA': 0.3611, 'AGG': 0.4211, 'GTT': 0.3933, 'GTC': 0.4800, 'GTA': 0.3056, 'GTG': 0.4033, 'GCT': 0.3114, 'GCC': 0.3800, 'GCA': 0.5278, 'GCG': 0.3633, 'GAT': 0.5081, 'GAC': 0.8611, 'GAA': 0.5278, 'GAG': 0.8633, 'GGT': 0.5900, 'GGC': 1.0000, 'GGA': 0.5278, 'GGG': 0.4467, } # Same species→genome mapping as _TGCN_TABLES (own genome or nearest sequenced # relative), so tAI weights track the raw tGCN provenance exactly. _TAI_W_TABLES = { 'arabidopsis': _ARABIDOPSIS_TAI_W, 'rice': _RICE_TAI_W, 'maize': _MAIZE_TAI_W, 'sorghum': _SORGHUM_TAI_W, 'soybean': _SOYBEAN_TAI_W, 'tomato': _TOMATO_TAI_W, 'grape': _GRAPE_TAI_W, 'cassava': _CASSAVA_TAI_W, 'cotton': _COTTON_TAI_W, 'tobacco': _TOBACCO_TAI_W, 'wheat': _BRACHYPODIUM_TAI_W, 'barley': _BRACHYPODIUM_TAI_W, 'canola': _ARABIDOPSIS_TAI_W, 'potato': _TOMATO_TAI_W, 'sunflower': _TOMATO_TAI_W, 'peanut': _SOYBEAN_TAI_W, 'sugarcane': _SORGHUM_TAI_W, 'banana': _RICE_TAI_W, } # CODON_USAGE_TABLES is imported from codon_usage_tables.py (18 real species tables). CODON_PAIR_TABLES = { 'arabidopsis': ARABIDOPSIS_CODON_PAIR_USAGE, 'rice': RICE_CODON_PAIR_USAGE, 'maize': MAIZE_CODON_PAIR_USAGE, } # Codon-PAIR bias is not available per-species from CUTG, so it falls back to the # nearest reference genome with a measured pair table (only Arabidopsis/rice/maize # have one). Codon *usage* (above) and tGCN (_TGCN_TABLES) are each the species' # own or nearest-real-genome data; only this codon-pair signal uses a coarse # 3-way clade proxy. _PAIR_PROXY = { 'arabidopsis': 'arabidopsis', 'rice': 'rice', 'maize': 'maize', 'wheat': 'rice', 'barley': 'rice', 'banana': 'rice', 'sorghum': 'maize', 'sugarcane': 'maize', 'tomato': 'arabidopsis', 'potato': 'arabidopsis', 'soybean': 'arabidopsis', 'cassava': 'arabidopsis', 'tobacco': 'arabidopsis', 'grape': 'arabidopsis', 'cotton': 'arabidopsis', 'canola': 'arabidopsis', 'peanut': 'arabidopsis', 'sunflower': 'arabidopsis', } def get_codon_usage(codon_table: str) -> dict: """Return the species' own measured codon usage table (Arabidopsis default).""" return CODON_USAGE_TABLES.get(codon_table.lower(), ARABIDOPSIS_CODON_USAGE) def get_codon_pair_usage(codon_table: str) -> dict: """Return the codon-pair usage table (clade proxy; Arabidopsis default).""" key = _PAIR_PROXY.get(codon_table.lower(), 'arabidopsis') return CODON_PAIR_TABLES[key] def get_tgcn(codon_table: str) -> dict: """Return tRNA gene copy numbers for the given plant species.""" return _TGCN_TABLES.get(codon_table.lower(), _ARABIDOPSIS_TGCN) def get_tai_weights(codon_table: str) -> dict: """Return per-codon tAI relative adaptiveness w(c) (dos Reis 2004 wobble model).""" return _TAI_W_TABLES.get(codon_table.lower(), _ARABIDOPSIS_TAI_W)