Skip to content

Commit

Permalink
feat: added stranded methods to bam filter
Browse files Browse the repository at this point in the history
  • Loading branch information
noamteyssier committed Apr 11, 2024
1 parent 3b69f06 commit 25da60d
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 8 deletions.
17 changes: 9 additions & 8 deletions src/commands/bam/filter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Option<NumericBed3>> {
) -> Result<Option<StrandedBed3<usize>>> {
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) {
Expand All @@ -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<I>(
Expand All @@ -39,7 +40,7 @@ where
I: IntervalBounds<usize, usize> + Copy + Serialize,
WriteNamedIterImpl: WriteNamedIter<I>,
{
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)?;
Expand All @@ -62,7 +63,7 @@ where
I: IntervalBounds<usize, usize> + Copy + Serialize,
WriteNamedIterImpl: WriteNamedIter<I>,
{
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)?;
Expand Down
9 changes: 9 additions & 0 deletions src/commands/bam/utils.rs
Original file line number Diff line number Diff line change
@@ -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]> {
Expand Down Expand Up @@ -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,
}
}

0 comments on commit 25da60d

Please sign in to comment.