Skip to content

Commit

Permalink
fix: group deletions into ranges correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
ivan-aksamentov committed Jun 13, 2024
1 parent 92c8697 commit 149f294
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 19 deletions.
11 changes: 10 additions & 1 deletion packages/nextclade/src/analyze/aa_del.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
use crate::alphabet::aa::Aa;
use crate::alphabet::aa::{to_aa, Aa};
use crate::analyze::aa_sub::AaSub;
use crate::analyze::abstract_mutation::{AbstractMutation, CloneableMutation, MutParams, Pos, QryLetter, RefLetter};
use crate::coord::position::AaRefPosition;
use crate::coord::range::AaRefRange;
use eyre::Report;
use serde::{Deserialize, Serialize};
use std::fmt::{Display, Formatter};

Expand Down Expand Up @@ -45,6 +46,14 @@ impl Pos<AaRefPosition> for AaDel {
}

impl AaDel {
pub fn from_raw(cds: impl AsRef<str>, pos: usize, ref_nuc: char) -> Result<Self, Report> {
Ok(Self {
cds_name: cds.as_ref().to_owned(),
pos: pos.into(),
ref_aa: to_aa(ref_nuc)?,
})
}

/// Converts deletion to substitution to Gap
#[inline]
pub fn to_sub(&self) -> AaSub {
Expand Down
125 changes: 107 additions & 18 deletions packages/nextclade/src/analyze/group_adjacent_deletions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ pub fn group_adjacent<P: PositionLike>(dels: &[impl Pos<P>]) -> Vec<Range<P>> {
let mut end = begin;
for del in dels.iter().skip(1) {
if del.pos().as_isize() != end.as_isize() + 1 {
ranges.push(Range::new(begin, end));
ranges.push(Range::from_isize(begin.as_isize(), end.as_isize() + 1));
begin = del.pos();
}
end = del.pos();
}
ranges.push(Range::new(begin, end));
ranges.push(Range::from_isize(begin.as_isize(), end.as_isize() + 1));
} else {
return vec![];
}
Expand All @@ -42,8 +42,10 @@ pub fn group_adjacent_aa_dels(dels: &[AaDel]) -> Vec<AaDelRange> {
#[cfg(test)]
mod tests {
use super::*;
use crate::analyze::aa_del::{AaDel, AaDelRange};
use crate::analyze::nuc_del::{NucDel, NucDelRange};
use eyre::Report;
use pretty_assertions::assert_eq;

#[test]
fn test_group_adjacent_empty_input() -> Result<(), Report> {
Expand All @@ -57,7 +59,7 @@ mod tests {
fn test_group_adjacent_single_deletion() -> Result<(), Report> {
let dels = vec![NucDel::from_raw(5, 'A')?];
let ranges = group_adjacent_nuc_dels(&dels);
assert_eq!(ranges, vec![NucDelRange::from_usize(5, 5)]);
assert_eq!(ranges, vec![NucDelRange::from_usize(5, 6)]);
Ok(())
}

Expand All @@ -72,9 +74,9 @@ mod tests {
assert_eq!(
ranges,
vec![
NucDelRange::from_usize(1, 1),
NucDelRange::from_usize(3, 3),
NucDelRange::from_usize(5, 5)
NucDelRange::from_usize(1, 2),
NucDelRange::from_usize(3, 4),
NucDelRange::from_usize(5, 6),
]
);
Ok(())
Expand All @@ -88,7 +90,7 @@ mod tests {
NucDel::from_raw(3, 'G')?,
];
let ranges = group_adjacent_nuc_dels(&dels);
assert_eq!(ranges, vec![NucDelRange::from_usize(1, 3)]);
assert_eq!(ranges, vec![NucDelRange::from_usize(1, 4)]);
Ok(())
}

Expand Down Expand Up @@ -116,17 +118,104 @@ mod tests {
assert_eq!(
ranges,
vec![
NucDelRange::from_usize(1, 1),
NucDelRange::from_usize(3, 4),
NucDelRange::from_usize(6, 6),
NucDelRange::from_usize(8, 10),
NucDelRange::from_usize(12, 12),
NucDelRange::from_usize(14, 14),
NucDelRange::from_usize(16, 17),
NucDelRange::from_usize(19, 19),
NucDelRange::from_usize(21, 21),
NucDelRange::from_usize(23, 24),
NucDelRange::from_usize(26, 26)
NucDelRange::from_usize(1, 2),
NucDelRange::from_usize(3, 5),
NucDelRange::from_usize(6, 7),
NucDelRange::from_usize(8, 11),
NucDelRange::from_usize(12, 13),
NucDelRange::from_usize(14, 15),
NucDelRange::from_usize(16, 18),
NucDelRange::from_usize(19, 20),
NucDelRange::from_usize(21, 22),
NucDelRange::from_usize(23, 25),
NucDelRange::from_usize(26, 27),
]
);
Ok(())
}

#[test]
fn test_group_adjacent_aa_dels_empty_input() -> Result<(), Report> {
let dels = vec![];
let ranges = group_adjacent_aa_dels(&dels);
assert!(ranges.is_empty());
Ok(())
}

#[test]
fn test_group_adjacent_aa_dels_single_deletion() -> Result<(), Report> {
let dels = vec![AaDel::from_raw("Gene1", 5, 'A')?];
let ranges = group_adjacent_aa_dels(&dels);
assert_eq!(ranges, vec![AaDelRange::from_usize(5, 6)]);
Ok(())
}

#[test]
fn test_group_adjacent_aa_dels_multiple_non_adjacent_deletions() -> Result<(), Report> {
let dels = vec![
AaDel::from_raw("Gene1", 1, 'A')?,
AaDel::from_raw("Gene1", 3, 'T')?,
AaDel::from_raw("Gene1", 5, 'G')?,
];
let ranges = group_adjacent_aa_dels(&dels);
assert_eq!(
ranges,
vec![
AaDelRange::from_usize(1, 2),
AaDelRange::from_usize(3, 4),
AaDelRange::from_usize(5, 6),
]
);
Ok(())
}

#[test]
fn test_group_adjacent_aa_dels_multiple_adjacent_deletions() -> Result<(), Report> {
let dels = vec![
AaDel::from_raw("Gene1", 1, 'A')?,
AaDel::from_raw("Gene1", 2, 'T')?,
AaDel::from_raw("Gene1", 3, 'G')?,
];
let ranges = group_adjacent_aa_dels(&dels);
assert_eq!(ranges, vec![AaDelRange::from_usize(1, 4)]);
Ok(())
}

#[test]
fn test_group_adjacent_aa_dels_complex_mixed_deletions() -> Result<(), Report> {
let dels = vec![
AaDel::from_raw("Gene1", 1, 'A')?,
AaDel::from_raw("Gene1", 3, 'T')?,
AaDel::from_raw("Gene1", 4, 'G')?,
AaDel::from_raw("Gene1", 6, 'C')?,
AaDel::from_raw("Gene1", 8, 'A')?,
AaDel::from_raw("Gene1", 9, 'T')?,
AaDel::from_raw("Gene1", 10, 'G')?,
AaDel::from_raw("Gene1", 12, 'C')?,
AaDel::from_raw("Gene1", 14, 'A')?,
AaDel::from_raw("Gene1", 16, 'T')?,
AaDel::from_raw("Gene1", 17, 'G')?,
AaDel::from_raw("Gene1", 19, 'C')?,
AaDel::from_raw("Gene1", 21, 'A')?,
AaDel::from_raw("Gene1", 23, 'T')?,
AaDel::from_raw("Gene1", 24, 'G')?,
AaDel::from_raw("Gene1", 26, 'C')?,
];
let ranges = group_adjacent_aa_dels(&dels);
assert_eq!(
ranges,
vec![
AaDelRange::from_usize(1, 2),
AaDelRange::from_usize(3, 5),
AaDelRange::from_usize(6, 7),
AaDelRange::from_usize(8, 11),
AaDelRange::from_usize(12, 13),
AaDelRange::from_usize(14, 15),
AaDelRange::from_usize(16, 18),
AaDelRange::from_usize(19, 20),
AaDelRange::from_usize(21, 22),
AaDelRange::from_usize(23, 25),
AaDelRange::from_usize(26, 27),
]
);
Ok(())
Expand Down

0 comments on commit 149f294

Please sign in to comment.