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;
use crate::barcode::CombinatorialBarcode;
#[derive(Clone)]
pub struct ParseBioChemistry {
barcode: CombinatorialBarcode
}
impl Chemistry for ParseBioChemistry {
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_r2, 1000).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_distance_cutoff = 1;
let (isok, bc) = self.barcode.detect_barcode(
r2_seq,
false,
total_distance_cutoff
);
if isok {
let r1_from=0;
let r1_to=r1_seq.len();
let r2_from = 8+4+8+4+8+4+8;
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: vec![].to_vec()})
} 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 ParseBioChemistry {
pub fn new() -> ParseBioChemistry {
ParseBioChemistry {
barcode: CombinatorialBarcode::new()
}
}
pub fn read_barcodes_pb(round: &str, src: impl Read) -> CombinatorialBarcode {
let mut cb: CombinatorialBarcode = CombinatorialBarcode::new();
let mut reader = csv::ReaderBuilder::new()
.delimiter(b'\t')
.from_reader(src);
for result in reader.deserialize() {
let record: BarcodeCsvFileRow = result.unwrap();
cb.add_bc(
format!("{}{}", round, record.well.as_str()), format!("{}{}", round, round),
format!("{}{}", round, record.seq.as_str())
);
}
if cb.num_pools()==0 {
println!("Warning: empty barcodes file");
}
cb
}
}
#[derive(Debug, serde::Deserialize, Eq, PartialEq)]
struct BarcodeCsvFileRow {
index: u64,
seq: String,
name: String,
well: String,
bctype: String
}