(
mut record: rust_htslib::bam::record::Record,
upper_bound: usize,
)
| 558 | } |
| 559 | |
| 560 | fn 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 | |
| 611 | impl Read { |
| 612 | /// Creates a Read from a given rust_htslib bam record |
no test coverage detected