diff --git a/src/commands/bam/filter.rs b/src/commands/bam/filter.rs index c68b083..24c5dad 100644 --- a/src/commands/bam/filter.rs +++ b/src/commands/bam/filter.rs @@ -2,20 +2,20 @@ use crate::{ cli::bam::{FilterArgs, FilterParams}, dispatch_single_with_htslib, io::{WriteNamedIter, WriteNamedIterImpl}, - types::{InputFormat, NumericBed3, SplitTranslater}, + types::{InputFormat, SplitTranslater}, }; -use super::utils::{parse_chr_name, parse_endpoints}; +use super::utils::{parse_chr_name, parse_endpoints, parse_strand}; use anyhow::Result; -use bedrs::{traits::IntervalBounds, types::Query, IntervalContainer}; +use bedrs::{traits::IntervalBounds, types::Query, IntervalContainer, StrandedBed3}; use rust_htslib::bam::{HeaderView, Read, Reader as BamReader, Record, Writer as BamWriter}; use serde::Serialize; -fn temp_bed3( +fn temp_sbed3( record: &Record, header: &HeaderView, translater: &SplitTranslater, -) -> Result> { +) -> Result>> { let chr_bytes = parse_chr_name(record, header)?; let chr_name = std::str::from_utf8(chr_bytes)?; let chr_idx = if let Some(idx) = translater.get_chr_idx(chr_name) { @@ -24,7 +24,8 @@ fn temp_bed3( return Ok(None); }; let (start, end) = parse_endpoints(record)?; - Ok(Some(NumericBed3::new(chr_idx, start, end))) + let strand = parse_strand(record); + Ok(Some(StrandedBed3::new(chr_idx, start, end, strand))) } fn run_inverted_overlap( @@ -39,7 +40,7 @@ where I: IntervalBounds + Copy + Serialize, WriteNamedIterImpl: WriteNamedIter, { - if let Some(bed) = temp_bed3(record, header, translater)? { + if let Some(bed) = temp_sbed3(record, header, translater)? { let no_overlaps = set.query_iter(&bed, query_method)?.next().is_none(); if no_overlaps { wtr.write(record)?; @@ -62,7 +63,7 @@ where I: IntervalBounds + Copy + Serialize, WriteNamedIterImpl: WriteNamedIter, { - if let Some(bed) = temp_bed3(record, header, translater)? { + if let Some(bed) = temp_sbed3(record, header, translater)? { let any_overlaps = set.query_iter(&bed, query_method)?.next().is_some(); if any_overlaps { wtr.write(record)?; diff --git a/src/commands/bam/utils.rs b/src/commands/bam/utils.rs index 2bbdae6..c47f709 100644 --- a/src/commands/bam/utils.rs +++ b/src/commands/bam/utils.rs @@ -1,4 +1,5 @@ use anyhow::{bail, Result}; +use bedrs::Strand; use rust_htslib::bam::{HeaderView, Record}; pub fn parse_chr_name<'a>(record: &Record, header: &'a HeaderView) -> Result<&'a [u8]> { @@ -42,3 +43,11 @@ pub fn get_strand(record: &Record) -> char { '+' } } + +pub fn parse_strand(record: &Record) -> Strand { + match get_strand(record) { + '+' => Strand::Forward, + '-' => Strand::Reverse, + _ => Strand::Unknown, + } +}