From 1800b4f8a7c1bc2630101afd7efed2e5e9051cfc Mon Sep 17 00:00:00 2001 From: timoast <4591688+timoast@users.noreply.github.com> Date: Sat, 20 Jul 2024 13:22:26 +0800 Subject: [PATCH] Skip second overlap if not needed --- src/main.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 937b44f..ea760fc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -126,6 +126,7 @@ fn fcount( let mut line_str = String::new(); let mut startpos: u32; let mut endpos: u32; + let mut check_end: bool; loop { match reader.read_line(&mut line_str) { @@ -156,6 +157,7 @@ fn fcount( // check if cell is to be included let cell_barcode: &str = fields[3]; if let Some(&cell_index) = cells.get(cell_barcode) { + check_end = true; // create intervals from fragment entry let seqname: &str = fields[0]; @@ -165,15 +167,23 @@ fn fcount( startpos = fields[1].parse().map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?; endpos = fields[2].parse().map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?; - // find overlapping peaks if let Some(olap_start) = find_overlaps(&peaks, seqname, startpos, startpos+1) { + for peak_index in olap_start { *peak_cell_counts[peak_index.0].entry(cell_index).or_insert(0) += 1; + + // check if fragment end is behind peak end (if so, it overlaps and we don't need a full search) + if endpos < peak_index.1 { + check_end = false; + *peak_cell_counts[peak_index.0].entry(cell_index).or_insert(0) += 1; + } } } - if let Some(olap_end) = find_overlaps(&peaks, seqname, endpos, endpos+1) { - for peak_index in olap_end { - *peak_cell_counts[peak_index.0].entry(cell_index).or_insert(0) += 1; + if check_end { + if let Some(olap_end) = find_overlaps(&peaks, seqname, endpos, endpos+1) { + for peak_index in olap_end { + *peak_cell_counts[peak_index.0].entry(cell_index).or_insert(0) += 1; + } } } }