MCPcopy Create free account
hub / github.com/alignoth/alignoth / clip_read

Function clip_read

src/plot.rs:560–609  ·  view source on GitHub ↗
(
    mut record: rust_htslib::bam::record::Record,
    upper_bound: usize,
)

Source from the content-addressed store, hash-verified

558}
559
560fn clip_read(
561 mut record: rust_htslib::bam::record::Record,
562 upper_bound: usize,
563) -> Result<rust_htslib::bam::record::Record> {
564 let read_start = record.pos() - record.cigar().leading_softclips();
565 let read_end = record.reference_end() + record.cigar().trailing_softclips();
566
567 let bases_to_trim_start = read_start.min(0).unsigned_abs() as usize;
568 let bases_to_trim_end = (read_end - upper_bound as i64).max(0) as usize;
569
570 let cigar = record.cigar();
571 let cigar_len = cigar.len();
572 let new_cigar: Vec<_> = cigar
573 .iter()
574 .enumerate()
575 .filter_map(|(i, c)| match c {
576 Cigar::SoftClip(len) => {
577 let mut new_len = *len as usize;
578 if i == 0 {
579 new_len = new_len.saturating_sub(bases_to_trim_start);
580 }
581 if i == cigar_len - 1 {
582 new_len = new_len.saturating_sub(bases_to_trim_end);
583 }
584 (new_len > 0).then_some(Cigar::SoftClip(new_len as u32))
585 }
586 _ => Some(*c),
587 })
588 .collect();
589
590 let seq = record.seq().as_bytes();
591 let qual = record.qual().to_vec();
592 let seq_len = seq.len();
593
594 let trim_start = bases_to_trim_start.min(seq_len);
595 let trim_end = seq_len - bases_to_trim_end.min(seq_len.saturating_sub(trim_start));
596
597 let new_seq = seq[trim_start..trim_end].to_vec();
598 let new_qual = qual[trim_start..trim_end].to_vec();
599
600 let new_cigar_string = CigarString::from(new_cigar);
601 record.set(
602 &record.qname().to_vec(),
603 Some(&new_cigar_string),
604 &new_seq,
605 &new_qual,
606 );
607
608 Ok(record)
609}
610
611impl Read {
612 /// Creates a Read from a given rust_htslib bam record

Callers 1

from_recordMethod · 0.85

Calls 2

OkFunction · 0.85
setMethod · 0.45

Tested by

no test coverage detected