use crate::core::Locus;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Obs {
pub allele: u8,
pub base_qual: u8,
pub mapq: u8,
pub reverse: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub struct PileupColumn {
pub locus: Locus,
pub ref_base: u8,
pub raw_depth: u32,
pub obs: Vec<Obs>,
}
impl PileupColumn {
pub fn depth(&self) -> u32 {
self.obs.len() as u32
}
pub fn allele_counts(&self) -> [u32; 4] {
let mut counts = [0u32; 4];
for o in &self.obs {
counts[o.allele as usize] += 1;
}
counts
}
pub fn strand_counts(&self) -> [[u32; 2]; 4] {
let mut counts = [[0u32; 2]; 4];
for o in &self.obs {
counts[o.allele as usize][o.reverse as usize] += 1;
}
counts
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::Position;
fn obs(allele: u8, reverse: bool) -> Obs {
Obs {
allele,
base_qual: 30,
mapq: 60,
reverse,
}
}
#[test]
fn depth_allele_and_strand_counts() {
let col = PileupColumn {
locus: Locus {
contig: 0,
pos: Position(100),
},
ref_base: b'A',
raw_depth: 4,
obs: vec![obs(0, false), obs(0, true), obs(1, false)],
};
assert_eq!(col.depth(), 3);
assert_eq!(col.raw_depth, 4);
assert_eq!(col.allele_counts(), [2, 1, 0, 0]);
let sc = col.strand_counts();
assert_eq!(sc[0], [1, 1]);
assert_eq!(sc[1], [1, 0]);
}
}