pub const HBB_CODING_SEQUENCE: &str = concat!(
"ATGGTGCATCTGACTCCTGAGGAGAAGTCTGCCGTTACTGCCCTGTGGGGCAAGGTG",
"AACGTGGATGAAGTTGGTGGTGAGGCCCTGGGCAGGCTGCTGGTGGTCTACCCTTGG",
"ACCCAGAGGTTCTTTGAGTCCTTTGGGGATCTGTCCACTCCTGATGCTGTTATGGGCA",
"ACCCTAAGGTGAAGGCTCATGGCAAGAAAGTGCTCGGTGCCTTTAGTGATGGCCTGGC",
"TCACCTGGACAACCTCAAGGGCACCTTTGCTCACTGCAGTGCCATGGGTGGACCCTTC",
"CTGGTGGCCTTGGACACCTTGGGCACCCTGCTCAATGACACCCTGGCAAACGCTGTCC",
"TGGCTCACTTTAAAGCCACTGGCGATGCCACTCAGCTCAATGTGAAACTGGACTGTGT",
"CCTCAAGGGCCTCTGATAAGAGCTAA",
);
pub mod hbb_variants {
pub const SICKLE_CELL_POS: usize = 20;
pub const HBC_POS: usize = 19;
pub const THAL_IVS1_110: usize = 110;
}
pub const TP53_EXONS_5_8: &str = concat!(
"TACTCCCCTGCCCTCAACAAGATGTTTTGCCAACTGGCCAAGACCTGCCCTGTGCAGC",
"TGTGGGTTGATTCCACACCCCCGCCCGGCACCCGCGTCCGCGCCATGGCCATCTACAA",
"GCAGTCACAGCACATGACGGAGGTTGTGAGGCGCTGCCCCCACCATGAGCGCTGCTCA",
"GATAGCGATGGTCTGGCCCCTCCTCAGCATCTTATCCGAGTGGAAGGAAATTTGCGTG",
"TGGAGTATTTGGATGACAGAAACACTTTTCGACATAGTGTGGTGGTGCCCTATGAGCC",
"GCCTGAGGTTGGCTCTGACTGTACCACCATCCACTACAACTACATGTGTAACAGTTCCT",
"GCATGGGCGGCATGAACCGGAGGCCCATCCTCACCATCATCACACTGGAAGACTCCAG",
"TGGTAATCTACTGGGACGGAACAGCTTTGAGGTGCGTGTTTGTGCCTGTCCTGGGAGA",
"GACCGGCGCACAGAGGAAGAGAATCTCCGCAAGAAAGGGGAGCCTCACCACGAGCTGC",
"CCCCAGGGAGCACTAAGCGAGCACTG",
);
pub mod tp53_variants {
pub const R175H_POS: usize = 147;
pub const R248W_POS: usize = 366;
pub const R273H_POS: usize = 441;
}
pub const BRCA1_EXON11_FRAGMENT: &str = concat!(
"GATTTATCTGCTCTTCGCGTTGAAGAAGTACAAAATGTCATTAATGCTATGCAGAAAA",
"TCTTAGAGTGTCCCATCTGTCTGGAGTTGATCAAGGAACCTGTCTCCACAAAGTGTGA",
"CCACATATTTTGCAAATTTTGCATGCTGAAACTTCTCAACCAGAAGAAAGGGCCTTCA",
"CAGTGTCCTTTATGTAAGAATGATATAACCAAAAGGAGCCTACAAGAAAGTACGAGAT",
"TTAGTCAACTTGTTGAAGAGCTATTGAAAATCATTTGTGCTTTTCAGCTTGACACAGG",
"ATTTGGAAACTCAAAGAAACATCAATCCAAGAATATTGGAGAAAACAGAGGGAACTCAA",
"TGATAAATGTTCAGTCTCCTGAAGATCTCCTGTGTTTCCAGCAGAAGAAGAAGCCATT",
"AAGTATCTTACCTCTTCTAATGAAACTGGCTATCTGCATGAGGATATTGGATTCAGAG",
"GAAACCCATTCTGGCTGCATTTTGCAGATCTTTTTCCCTTCTGTTAATATCCTGCTAC",
);
pub const CYP2D6_CODING: &str = concat!(
"ATGGGGCTAGAAGCACTGGTGCCCCTGGCCGTGATAGCCGCACTCCTCTGCCTCGCTC",
"TGTCCACCTTGGCAACCGTGATACCCTCTGTCACTTTGATACTGATGTCCAAGAAGAGG",
"CGCTTCTCCGTGTCCACCTTGCGCCCCTTCGGGGACGTGTTCAGCCTGCAGCTGGCCT",
"GGAGCCCAGTGAAGGATGAGACCACAGGATTCCCAAGGCCCTGCTCAGTTCCAATGGA",
"GAACTGAGCACATCCTCAGACTTTGACAAGTGGATCAAAGACTGCAAGGACAAGCCCG",
"GGGCCCAGCTCACAAGCACAATCCCCAGGATGTACTTCGGGGCCACGGATCCCCACTC",
"CTCCATCGCCCAGCAGGATGTAGAAACGGGCCAGGCCACCAAAGGTCCTGACTTCATT",
"GACCCTTACGGGATGGGGCCTCATCCCCAGCGCAGCCTTCATCCTTACGCTGCCTGGC",
"CTCCTGCTCATGATCTACCTGGCCGTCCCCATCTATGGCC",
);
pub const INS_CODING: &str = concat!(
"ATGGCCCTGTGGATGCGCCTCCTGCCCCTGCTGGCGCTGCTGGCCCTCTGGGGACCTG",
"ACCCAGCCGCAGCCTTTGTGAACCAACACCTGTGCGGCTCACACCTGGTGGAAGCTCT",
"CTACCTAGTGTGCGGGGAACGAGGCTTCTTCTACACACCCAAGACCCGCCGGGAGGCA",
"GAGGACCTGCAGGTGGGGCAGGTGGAGCTGGGCGGGGGCCCTGGTGCAGGCAGCCTGC",
"AGCCCTTGGCCCTGGAGGGGTCCCTGCAGAAGCGTGGCATTGTGGAACAATGCTGTAC",
"CAGCATCTGCTCCCTCTACCAGCTGGAGAACTACTGCAACTAG",
);
pub mod benchmark {
pub fn chr1_reference_1kb() -> String {
let pattern = "ACGTGCATGCTAGCATGCATGCTAGCTAGCTAG\
GATCGATCGATCGATCGATCGATCGATCGATCG\
ATCGATCGATCGATCATGCATGCATGCATGCAT\
GCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAG";
let mut result = String::with_capacity(1000);
while result.len() < 1000 {
result.push_str(pattern);
}
result.truncate(1000);
result
}
pub fn reference_10kb() -> String {
let base = chr1_reference_1kb();
let mut result = String::with_capacity(10_000);
while result.len() < 10_000 {
result.push_str(&base);
}
result.truncate(10_000);
result
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::DnaSequence;
#[test]
fn test_hbb_sequence_valid() {
let seq = DnaSequence::from_str(HBB_CODING_SEQUENCE).unwrap();
assert!(
seq.len() > 400,
"HBB CDS should be >400bp, got {}",
seq.len()
);
assert_eq!(seq.get(0), Some(crate::types::Nucleotide::A));
assert_eq!(seq.get(1), Some(crate::types::Nucleotide::T));
assert_eq!(seq.get(2), Some(crate::types::Nucleotide::G));
}
#[test]
fn test_tp53_sequence_valid() {
let seq = DnaSequence::from_str(TP53_EXONS_5_8).unwrap();
assert!(
seq.len() > 400,
"TP53 exons 5-8 should be >400bp, got {}",
seq.len()
);
}
#[test]
fn test_brca1_fragment_valid() {
let seq = DnaSequence::from_str(BRCA1_EXON11_FRAGMENT).unwrap();
assert!(
seq.len() > 400,
"BRCA1 fragment should be >400bp, got {}",
seq.len()
);
}
#[test]
fn test_cyp2d6_valid() {
let seq = DnaSequence::from_str(CYP2D6_CODING).unwrap();
assert!(
seq.len() > 400,
"CYP2D6 should be >400bp, got {}",
seq.len()
);
assert_eq!(seq.get(0), Some(crate::types::Nucleotide::A));
assert_eq!(seq.get(1), Some(crate::types::Nucleotide::T));
assert_eq!(seq.get(2), Some(crate::types::Nucleotide::G));
}
#[test]
fn test_insulin_valid() {
let seq = DnaSequence::from_str(INS_CODING).unwrap();
assert!(seq.len() > 300, "INS should be >300bp, got {}", seq.len());
}
#[test]
fn test_hbb_translates_to_hemoglobin() {
let seq = DnaSequence::from_str(HBB_CODING_SEQUENCE).unwrap();
let protein = crate::protein::translate_dna(seq.to_string().as_bytes());
assert_eq!(protein[0].to_char(), 'M'); assert_eq!(protein[1].to_char(), 'V'); assert_eq!(protein[2].to_char(), 'H'); assert_eq!(protein[3].to_char(), 'L'); assert!(protein.len() >= 100, "Should produce 100+ amino acids");
}
#[test]
fn test_benchmark_reference_length() {
let ref1k = benchmark::chr1_reference_1kb();
assert_eq!(ref1k.len(), 1000);
let ref10k = benchmark::reference_10kb();
assert_eq!(ref10k.len(), 10_000);
}
}