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),
];
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),
];
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),
];
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),
];
static DM6: &[(&str, i64)] = &[
("chr2L", 23513712),
("chr2R", 25286936),
("chr3L", 28110227),
("chr3R", 32079331),
("chr4", 1348131),
("chrM", 19524),
("chrX", 23542271),
("chrY", 3667352),
];
static CE11: &[(&str, i64)] = &[
("chrI", 15072434),
("chrII", 15279421),
("chrIII", 13783801),
("chrIV", 17493829),
("chrM", 13794),
("chrV", 20924180),
("chrX", 17718942),
];
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),
];
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),
];
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"
);
}
}
}