|
|
@@ -572,6 +572,58 @@ impl NeoContig {
|
|
|
println!("{}", String::from_utf8_lossy(&line));
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ pub fn get_hgvs(self, centromere_pos: Vec<(String, i64)>) -> Option<String> {
|
|
|
+ fn get_hgvs_part(aln: Sam, centro_pos: i64) -> String {
|
|
|
+ let mut part = "".to_string();
|
|
|
+ if aln.ref_pos < centro_pos {
|
|
|
+ part = format!(
|
|
|
+ "pter_{}{}",
|
|
|
+ aln.ref_pos,
|
|
|
+ if aln.ref_range.start < aln.ref_range.end { "" } else { "inv" },
|
|
|
+ )
|
|
|
+ } else {
|
|
|
+ part = format!(
|
|
|
+ "{}_qter{}",
|
|
|
+ aln.ref_pos,
|
|
|
+ if aln.ref_range.start < aln.ref_range.end { "" } else { "inv" },
|
|
|
+ )
|
|
|
+ }
|
|
|
+ part
|
|
|
+ }
|
|
|
+
|
|
|
+ // only if chimeric
|
|
|
+ let mut res = None;
|
|
|
+ if self.alignments.len() == 2 {
|
|
|
+ let mut a_part = "".to_string();
|
|
|
+ let mut b_part = "".to_string();
|
|
|
+
|
|
|
+ centromere_pos.iter().for_each(|(contig, pos)| {
|
|
|
+ if *contig == self.alignments[0].ref_name {
|
|
|
+ a_part = get_hgvs_part(self.alignments[0].clone(), *pos);
|
|
|
+ }
|
|
|
+ if *contig == self.alignments[1].ref_name {
|
|
|
+ b_part = get_hgvs_part(self.alignments[1].clone(), *pos);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ let mut added_nt = self.alignments[0].sequence[
|
|
|
+ self.alignments[0].query_range.end..(self.alignments[1].query_range.start - 1)
|
|
|
+ ].to_string();
|
|
|
+
|
|
|
+ if added_nt.len() > 0 { added_nt.push(';'); }
|
|
|
+
|
|
|
+ res = Some(format!(
|
|
|
+ "{}:g.{}[{}{}:g.{}]",
|
|
|
+ self.alignments[0].ref_name,
|
|
|
+ a_part,
|
|
|
+ added_nt,
|
|
|
+ self.alignments[1].ref_name,
|
|
|
+ b_part
|
|
|
+ ));
|
|
|
+ }
|
|
|
+ res
|
|
|
+ }
|
|
|
}
|
|
|
pub struct Fasta {
|
|
|
fa: IndexedFasta
|