diff --git a/src/bin/commands/trimmer.rs b/src/bin/commands/trimmer.rs index cdf8f16..c3a7578 100644 --- a/src/bin/commands/trimmer.rs +++ b/src/bin/commands/trimmer.rs @@ -2,6 +2,7 @@ use crate::commands::command::Command; use anyhow::{Error, Result}; use clap::Parser; use fgoxide::io::Io; +use fqtk_lib::pair_overlap; use log::info; use pooled_writer::{bgzf::BgzfCompressor, Pool, PoolBuilder, PooledWriter}; use seq_io::fastq::{OwnedRecord, Reader as FastqReader, Record}; @@ -25,7 +26,7 @@ pub(crate) struct Trimmer { /// Minimum difference in base-quality for one read to correct an overlapping /// base from the other read. #[clap(long, short = 'd', default_value = "15")] - overlap_min_bq_delta: usize, + overlap_min_bq_delta: u8, /// Minimum pair overlap length to attempt correction. #[clap(long, short = 'l', default_value = "50")] @@ -109,10 +110,20 @@ impl Command for Trimmer { let f2 = readers.remove(0); for (r1, r2) in f1.into_records().zip(f2.into_records()) { - let r1 = r1?; - let r2 = r2?; + let mut r1 = r1?; + let mut r2 = r2?; + + if let Some(overlap) = pair_overlap::find_overlap( + r1.seq(), + r2.seq(), + self.overlap_min_len, + self.overlap_max_error_rate, + ) { + overlap.correct(&mut r1, &mut r2, self.overlap_min_bq_delta, true); + } + r1.write(&mut writers[0])?; - r2.write(&mut writers[0])?; + r2.write(&mut writers[1])?; } writers.into_iter().try_for_each(|w| w.close())?;