use super::CombinatorialBarcode;
use super::Chemistry;
use seq_io::fastq::Reader as FastqReader;
use std::io::Cursor;
use crate::fileformat::shard::CellID;
use crate::fileformat::shard::ReadPair;
#[derive(Clone)]
pub struct PetriseqChemistry {
barcode: CombinatorialBarcode
}
impl Chemistry for PetriseqChemistry {
fn prepare(
&mut self,
fastq_file_r1: &mut FastqReader<Box<dyn std::io::Read>>,
_fastq_file_r2: &mut FastqReader<Box<dyn std::io::Read>>
) -> anyhow::Result<()> {
self.barcode.find_probable_barcode_boundaries(fastq_file_r1, 10000).expect("Failed to detect barcode setup from reads");
Ok(())
}
fn detect_barcode_and_trim(
&mut self,
r1_seq: &[u8],
r1_qual: &[u8],
r2_seq: &[u8],
r2_qual: &[u8]
) -> (bool, CellID, ReadPair) {
let total_score_cutoff = 2; let (isok, bc) = self.barcode.detect_barcode(
r1_seq,
true,
total_score_cutoff
);
if isok {
let umi_len = 7;
let bc_len = umi_len+7+15+7+14+7+6;
let r1_from = bc_len;
let r1_to = r1_seq.len();
let umi = r1_seq[0..umi_len].to_vec();
let r2_from=0;
let r2_to=r2_seq.len();
(true, bc, ReadPair{
r1: r1_seq[r1_from..r1_to].to_vec(),
r2: r2_seq[r2_from..r2_to].to_vec(),
q1: r1_qual[r1_from..r1_to].to_vec(),
q2: r2_qual[r2_from..r2_to].to_vec(),
umi: umi
})
} else {
(false, "".to_string(), ReadPair{r1: r1_seq.to_vec(), r2: r2_seq.to_vec(), q1: r1_qual.to_vec(), q2: r2_qual.to_vec(), umi: vec![].to_vec()})
}
}
}
impl PetriseqChemistry {
pub fn new() -> PetriseqChemistry {
let bcs = include_bytes!("petriseq_barcodes.tsv");
let barcode = CombinatorialBarcode::read_barcodes(Cursor::new(bcs));
PetriseqChemistry {
barcode: barcode
}
}
}