gwseq-io 0.2.0

Rust library for processing bigWig, bigBed, BAM and HiC files
Documentation
//! Generated by `tools/bundle_genomes.py` — do not edit.
//!
//! 7 assemblies, 127 chromosomes, fetched from
//! `api.genome.ucsc.edu`.
//!
//! Static slices rather than a `phf` map: there are seven genomes, a scan
//! over `&str` beats hashing one, and the table is then plain data the
//! linker puts in `.rodata`.
//!
//! Chromosomes are ordered by id **as a string**, so `chr10` comes before
//! `chr2` — the documented ordering of `get_chr_sizes`. Unplaced contigs
//! and alt loci are filtered out; `full = true` refetches to get them.

/// `mm10` — 22 chromosomes.
static MM10: &[(&str, i64)] = &[
    ("chr1", 195471971),
    ("chr10", 130694993),
    ("chr11", 122082543),
    ("chr12", 120129022),
    ("chr13", 120421639),
    ("chr14", 124902244),
    ("chr15", 104043685),
    ("chr16", 98207768),
    ("chr17", 94987271),
    ("chr18", 90702639),
    ("chr19", 61431566),
    ("chr2", 182113224),
    ("chr3", 160039680),
    ("chr4", 156508116),
    ("chr5", 151834684),
    ("chr6", 149736546),
    ("chr7", 145441459),
    ("chr8", 129401213),
    ("chr9", 124595110),
    ("chrM", 16299),
    ("chrX", 171031299),
    ("chrY", 91744698),
];

/// `mm39` — 22 chromosomes.
static MM39: &[(&str, i64)] = &[
    ("chr1", 195154279),
    ("chr10", 130530862),
    ("chr11", 121973369),
    ("chr12", 120092757),
    ("chr13", 120883175),
    ("chr14", 125139656),
    ("chr15", 104073951),
    ("chr16", 98008968),
    ("chr17", 95294699),
    ("chr18", 90720763),
    ("chr19", 61420004),
    ("chr2", 181755017),
    ("chr3", 159745316),
    ("chr4", 156860686),
    ("chr5", 151758149),
    ("chr6", 149588044),
    ("chr7", 144995196),
    ("chr8", 130127694),
    ("chr9", 124359700),
    ("chrM", 16299),
    ("chrX", 169476592),
    ("chrY", 91455967),
];

/// `hg19` — 26 chromosomes.
static HG19: &[(&str, i64)] = &[
    ("chr1", 249250621),
    ("chr10", 135534747),
    ("chr11", 135006516),
    ("chr12", 133851895),
    ("chr13", 115169878),
    ("chr14", 107349540),
    ("chr15", 102531392),
    ("chr16", 90354753),
    ("chr17", 81195210),
    ("chr18", 78077248),
    ("chr19", 59128983),
    ("chr2", 243199373),
    ("chr20", 63025520),
    ("chr21", 48129895),
    ("chr22", 51304566),
    ("chr3", 198022430),
    ("chr4", 191154276),
    ("chr5", 180915260),
    ("chr6", 171115067),
    ("chr7", 159138663),
    ("chr8", 146364022),
    ("chr9", 141213431),
    ("chrM", 16571),
    ("chrMT", 16569),
    ("chrX", 155270560),
    ("chrY", 59373566),
];

/// `hg38` — 25 chromosomes.
static HG38: &[(&str, i64)] = &[
    ("chr1", 248956422),
    ("chr10", 133797422),
    ("chr11", 135086622),
    ("chr12", 133275309),
    ("chr13", 114364328),
    ("chr14", 107043718),
    ("chr15", 101991189),
    ("chr16", 90338345),
    ("chr17", 83257441),
    ("chr18", 80373285),
    ("chr19", 58617616),
    ("chr2", 242193529),
    ("chr20", 64444167),
    ("chr21", 46709983),
    ("chr22", 50818468),
    ("chr3", 198295559),
    ("chr4", 190214555),
    ("chr5", 181538259),
    ("chr6", 170805979),
    ("chr7", 159345973),
    ("chr8", 145138636),
    ("chr9", 138394717),
    ("chrM", 16569),
    ("chrX", 156040895),
    ("chrY", 57227415),
];

/// `dm6` — 8 chromosomes.
static DM6: &[(&str, i64)] = &[
    ("chr2L", 23513712),
    ("chr2R", 25286936),
    ("chr3L", 28110227),
    ("chr3R", 32079331),
    ("chr4", 1348131),
    ("chrM", 19524),
    ("chrX", 23542271),
    ("chrY", 3667352),
];

/// `ce11` — 7 chromosomes.
static CE11: &[(&str, i64)] = &[
    ("chrI", 15072434),
    ("chrII", 15279421),
    ("chrIII", 13783801),
    ("chrIV", 17493829),
    ("chrM", 13794),
    ("chrV", 20924180),
    ("chrX", 17718942),
];

/// `sacCer3` — 17 chromosomes.
static SACCER3: &[(&str, i64)] = &[
    ("chrI", 230218),
    ("chrII", 813184),
    ("chrIII", 316620),
    ("chrIV", 1531933),
    ("chrIX", 439888),
    ("chrM", 85779),
    ("chrV", 576874),
    ("chrVI", 270161),
    ("chrVII", 1090940),
    ("chrVIII", 562643),
    ("chrX", 745751),
    ("chrXI", 666816),
    ("chrXII", 1078177),
    ("chrXIII", 924431),
    ("chrXIV", 784333),
    ("chrXV", 1091291),
    ("chrXVI", 948066),
];

/// Assembly names as UCSC spells them, in bundling order.
pub static GENOME_NAMES: &[&str] = &["mm10", "mm39", "hg19", "hg38", "dm6", "ce11", "sacCer3"];

static GENOMES: &[(&str, &[(&str, i64)])] = &[
    ("mm10", MM10),
    ("mm39", MM39),
    ("hg19", HG19),
    ("hg38", HG38),
    ("dm6", DM6),
    ("ce11", CE11),
    ("sacCer3", SACCER3),
];

/// Chromosome sizes for a bundled assembly, matched case-insensitively.
///
/// The table doubles as the place a case-insensitive name is resolved to its
/// canonical spelling, so that `get_chr_sizes("SACCER3", full = true)` fetches
/// `sacCer3`: UCSC assembly names are case-sensitive and several are mixed
/// case, which rules out lowercasing the argument alone — that only ever meets
/// a key already lowercase.
pub fn get(genome: &str) -> Option<(&'static str, &'static [(&'static str, i64)])> {
    GENOMES
        .iter()
        .find(|(name, _)| name.eq_ignore_ascii_case(genome))
        .map(|(name, sizes)| (*name, *sizes))
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn every_named_genome_is_present() {
        for name in GENOME_NAMES {
            assert!(get(name).is_some(), "{name}");
        }
        assert_eq!(GENOME_NAMES.len(), GENOMES.len());
    }

    #[test]
    fn names_resolve_case_insensitively_to_their_ucsc_spelling() {
        assert_eq!(get("SACCER3").unwrap().0, "sacCer3");
        assert_eq!(get("saccer3").unwrap().0, "sacCer3");
        assert_eq!(get("MM10").unwrap().0, "mm10");
        assert!(get("nosuchgenome").is_none());
    }

    #[test]
    fn chromosomes_are_sorted_as_strings_and_sizes_positive() {
        for (name, sizes) in GENOMES {
            let ids: Vec<&str> = sizes.iter().map(|(id, _)| *id).collect();
            let mut sorted = ids.clone();
            sorted.sort_unstable();
            assert_eq!(ids, sorted, "{name} is not sorted as strings");
            assert!(sizes.iter().all(|(_, size)| *size > 0), "{name}");
            assert!(!sizes.is_empty(), "{name}");
        }
    }

    #[test]
    fn chr10_comes_before_chr2() {
        let (_, mm10) = get("mm10").unwrap();
        let ids: Vec<&str> = mm10.iter().map(|(id, _)| *id).collect();
        let ten = ids.iter().position(|i| *i == "chr10").unwrap();
        let two = ids.iter().position(|i| *i == "chr2").unwrap();
        assert!(ten < two);
    }

    #[test]
    fn unplaced_contigs_are_filtered_out() {
        for (name, sizes) in GENOMES {
            assert!(
                sizes.iter().all(|(id, _)| !id.contains('_')),
                "{name} carries an unplaced contig"
            );
        }
    }
}