pub mod async_io;
pub mod statistics;
use crate::utils::ReadStats;
use crate::cli::Cli;
#[derive(Debug, Clone, Copy)]
pub struct CoverageSummary {
pub total_coverage: u64,
pub analyzed_bases: u64,
}
impl CoverageSummary {
pub fn mean_coverage(self) -> f64 {
if self.analyzed_bases > 0 {
self.total_coverage as f64 / self.analyzed_bases as f64
} else {
0.0
}
}
}
fn calculate_reference_span(cigar: &noodles_bam::record::Cigar) -> u32 {
cigar
.iter()
.filter_map(|op_result| {
if let Ok(op) = op_result {
use noodles_sam::alignment::record::cigar::op::Kind;
match op.kind() {
Kind::Match
| Kind::Deletion
| Kind::Skip
| Kind::SequenceMatch
| Kind::SequenceMismatch => Some(op.len() as u32),
Kind::Insertion | Kind::SoftClip | Kind::HardClip | Kind::Pad => None,
}
} else {
None }
})
.sum()
}
pub async fn run_coverage_async(
cli: &Cli,
read_stats: Option<ReadStats>,
) -> Result<CoverageSummary, Box<dyn std::error::Error>> {
async_io::run_coverage_async_pipeline(cli, read_stats)
.await
.map_err(|e| e as Box<dyn std::error::Error>)
}