use crate::cli::AddNucleosomeOptions;
use crate::fiber::FiberseqData;
use crate::utils::basemods::M6A_TYPE;
use crate::utils::nucleosome::*;
use crate::*;
use rayon::iter::ParallelIterator;
use rayon::prelude::*;
pub fn add_nucleosomes_to_bam(nuc_opts: &mut AddNucleosomeOptions) {
let mut bam = nuc_opts.input.bam_reader();
let mut out = nuc_opts.input.bam_writer(&nuc_opts.out);
let bam_chunk_iter = BamChunk::new(bam.records(), None);
for chunk in bam_chunk_iter {
let mut fibers: Vec<FiberseqData> = chunk
.into_iter()
.map(|r| FiberseqData::new(r, None, &nuc_opts.input.filters))
.collect();
fibers.par_iter_mut().for_each(|fd| {
let m6a: Vec<i64> = fd
.annotations
.get_forward_coords(M6A_TYPE)
.map(|v| v.into_iter().map(|(s, _)| s as i64).collect())
.unwrap_or_default();
add_nucleosomes_to_annotations(&fd.record, &mut fd.annotations, &m6a, &nuc_opts.nuc);
fd.serialize_annotations();
});
for fd in &fibers {
out.write(&fd.record).unwrap();
}
}
}