diff --git a/src/bin/dmox.rs b/src/bin/dmox.rs index afb8a1a79657de3c0513a75b84b88286fba0206a..e1315f91d206fea4fbcc40091403a8d411df96f2 100644 --- a/src/bin/dmox.rs +++ b/src/bin/dmox.rs @@ -12,6 +12,7 @@ use snafu::{ensure, ResultExt, Snafu}; #[derive(Parser)] #[command(version, about)] +#[allow(clippy::struct_excessive_bools)] struct Cli { /// Forward indexes .fastq.gz file. #[arg(long)] @@ -63,6 +64,42 @@ struct Cli { #[arg(long)] samples: PathBuf, + /// Raise to output BX codes as part of demultiplexed fastq identifiers. + #[arg( + long, + num_args(0..=1), + default_value_t = true, + default_missing_value("true"), + )] + bx: std::primitive::bool, + + /// Raise to output RX codes as part of demultiplexed fastq identifiers. + #[arg( + long, + num_args(0..=1), + default_value_t = false, + default_missing_value("true"), + )] + rx: std::primitive::bool, + + /// Raise to output QX codes as part of demultiplexed fastq identifiers. + #[arg( + long, + num_args(0..=1), + default_value_t = false, + default_missing_value("true"), + )] + qx: std::primitive::bool, + + /// Raise to output the last part of original fastq identifiers. + #[arg( + long, + num_args(0..=1), + default_value_t = false, + default_missing_value("true"), + )] + id_tail: std::primitive::bool, + /// Desired output compression level (defaults to gzip's default). #[arg(long, default_value_t = 6)] zlevel: u32, @@ -139,14 +176,18 @@ fn run() -> Result<(), Error> { max_distance, schema, samples, + bx, + rx, + qx, + id_tail, zlevel, clear, unclear, n_modules, module_size, n_writers, - max_queued_blocks, writers_capacity, + max_queued_blocks, readers_channel_capacity, } = Cli::parse(); @@ -198,6 +239,10 @@ fn run() -> Result<(), Error> { path.push(format!("{id}.{infix}.fq.gz")); path }), + output_bx: bx, + output_rx: rx, + output_qx: qx, + output_id_tail: id_tail, readers_channel_capacity, n_writers, max_queued_blocks, diff --git a/src/config.rs b/src/config.rs index 6e5ddc44d3bf616c6c475525283710896a81ba97..b46b476af08aff7ea74070c34f331d2ea2ab2603 100644 --- a/src/config.rs +++ b/src/config.rs @@ -5,6 +5,7 @@ use std::{ path::PathBuf, }; +#[allow(clippy::struct_excessive_bools)] pub struct Config { pub module_size: usize, pub n_modules: u64, @@ -17,6 +18,10 @@ pub struct Config { pub clear: PathBuf, pub unclear: PathBuf, pub sample: Box<SamplePath>, + pub output_bx: bool, + pub output_rx: bool, + pub output_qx: bool, + pub output_id_tail: bool, pub readers_channel_capacity: usize, pub n_writers: usize, pub max_queued_blocks: usize, diff --git a/src/lib.rs b/src/lib.rs index f62fc2de2e83a4e967d30d686154ed0150c27fe9..544c67009c7d6e11bdf61859de5739399e194a5a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -406,21 +406,27 @@ pub fn demultiplex(cf: &Config) -> Result<(), Error> { } // Identifier head. w!(r.id_head()); - // BX code: - w!(b"BX:Z:"); - write_code(buffer, &bx).unwrap(); - // RX code: - w!(b"\tRX:Z:"); - w!(i1.read()); - w!(b"+"); - w!(i2.read()); - // QX code: - w!(b"\tQX:Z:"); - w!(i1.quality()); - w!(b"+"); - w!(i2.quality()); - - // Drop identifier tail. + if cf.output_bx { + w!(b" BX:Z:"); + write_code(buffer, &bx).unwrap(); + } + if cf.output_rx { + w!(b" RX:Z:"); + w!(i1.read()); + w!(b"+"); + w!(i2.read()); + } + if cf.output_qx { + w!(b" QX:Z:"); + w!(i1.quality()); + w!(b"+"); + w!(i2.quality()); + } + if cf.output_id_tail { + w!(b" "); + w!(r.id_tail()); + } + w!(b"\n"); // Actual Sequence. diff --git a/src/parse/fastq.rs b/src/parse/fastq.rs index da494f3013024682cc991badeeee9faa9d0ab0f9..e59a5a678f3652edf21129054010244c8f48bae0 100644 --- a/src/parse/fastq.rs +++ b/src/parse/fastq.rs @@ -215,8 +215,8 @@ macro_rules! get { } impl Block { - get! { id_head separator } - get! { trimmed: read quality } + get! { separator } + get! { trimmed: id_head id_tail read quality } } //==================================================================================================