use std::collections::HashMap;
use crate::combination::CombinationMatch;
use crate::errors::LibraryError;
use crate::lib_spec::Library;
use crate::region::RegionMatch;
use crate::seqs::ReadGroup;
#[derive(Debug, Hash, PartialEq, Eq, Clone)]
pub struct LibraryCombinationKey {
pub regions: Vec<(String, RegionMatch)>,
}
impl LibraryCombinationKey {
pub fn new(regions: Vec<(String, RegionMatch)>) -> Self {
Self { regions }
}
}
#[derive(Debug)]
pub struct LibraryCombination {
counts: HashMap<ReadGroup, u32>,
regions: HashMap<String, RegionMatch>,
library_matches: CombinationMatch,
}
impl LibraryCombination {
pub fn new(regions: HashMap<String, RegionMatch>, library_matches: CombinationMatch) -> Self {
Self {
counts: HashMap::new(),
regions,
library_matches,
}
}
pub fn total_count(&self) -> u32 {
self.counts.values().sum()
}
pub fn increment_count(&mut self, group: &ReadGroup, n: u32) {
match self.counts.get_mut(group) {
Some(x) => *x += n,
None => {
self.counts.insert(group.clone(), n);
}
}
}
pub fn to_tsv(
&self,
region_ids: &Vec<String>,
library: Option<&Library>,
) -> Result<String, LibraryError> {
let mut output = String::with_capacity(100 * self.counts.len());
for (group, count) in self.counts.iter() {
match group {
ReadGroup::Ungrouped => output.push('\t'),
ReadGroup::Unmatched => output.push_str("_unmatched_\t"),
ReadGroup::Match(x) => {
output.push_str(x);
output.push('\t');
}
};
for reg_id in region_ids {
let region = self.regions.get(reg_id);
match region {
None => output.push('\t'), Some(r) => {
output.push_str(&r.str_sequence());
output.push('\t');
}
}
}
output.push_str(&self.library_matches.to_summary_tsv_chunk(library)?);
output.push_str(&count.to_string());
output.push('\n');
}
Ok(output)
}
}
#[cfg(test)]
mod tests {
}