Thomas 2 年之前
父節點
當前提交
802f8e7df9
共有 1 個文件被更改,包括 25 次插入18 次删除
  1. 25 18
      src/lib.rs

+ 25 - 18
src/lib.rs

@@ -208,23 +208,33 @@ impl BwaAlign {
         let mut all_ranges = Vec::new();
         let (a, _) = self.aligner.align_read_pair(b"read_name", sequence.as_bytes(), &vec![b'2'; sequence.len()], String::new().as_bytes(), String::new().as_bytes());
 
-        if a.len() > 1 { // if multiple alignements;
-            for record in a.iter() {
-                let contig = self.bwa_tid_contig(record.tid() as usize);
-                let res = ranges_from_cigar(record.pos() as i32 + 1, Cigar::new_from_str(&format!("{}", record.cigar())), record.is_reverse());
-                res.into_iter().for_each(|(reference, query)| {
-                    all_ranges.push(((contig.clone(), reference.0, reference.1), query))
-                });
-            }
-        } else {
+
+        for record in a.iter() {
+            let contig = self.bwa_tid_contig(record.tid() as usize);
+            let res = ranges_from_cigar(record.pos() as i32 + 1, Cigar::new_from_str(&format!("{}", record.cigar())), record.is_reverse());
+            res.into_iter().for_each(|(reference, query)| {
+                all_ranges.push(((contig.clone(), reference.0, reference.1), query))
+            });
+        }
+       
+
+        all_ranges
+    }
+
+    pub fn get_ref_positions_indel(&self, sequence: &str) -> Vec<((String, String, i32, i32))> {
+        let mut all_ranges = Vec::new();
+        let (a, _) = self.aligner.align_read_pair(b"read_name", sequence.as_bytes(), &vec![b'2'; sequence.len()], String::new().as_bytes(), String::new().as_bytes());
+
+        if a.len() == 1 {
             let record = a.iter().next().unwrap();
-            // hgvs_from_cigar(record.pos() as i32 + 1, Cigar::new_from_str(&format!("{}", record.cigar())), record.is_reverse());
-            let r = find_deletion_insertion_ranges(record.pos() as u32 + 1, Cigar::new_from_str(&format!("{}", record.cigar())), record.is_reverse());
+            let (deletions, insertions) = find_deletion_insertion_ranges(record.pos() as u32 + 1, Cigar::new_from_str(&format!("{}", record.cigar())), record.is_reverse());
+            
             println!("{:?}", r);
         }
 
         all_ranges
     }
+
     pub fn bwa_tid_contig(&self, tid: usize) -> String {
         self.header.to_hashmap().get("SQ").unwrap().get(tid).unwrap().get("SN").unwrap().to_owned()
     }
@@ -313,10 +323,9 @@ pub fn format_seq(name: &str, sequence: &str, line_size: usize) -> String {
 }
 
 fn find_deletion_insertion_ranges(start_position: u32, cigar: Cigar, is_rc: bool) -> (Vec<(u32, u32)>, Vec<(u32, u32)>) {
-    let mut cigar = if is_rc { cigar.expand().chars().rev().collect::<Vec<char>>() } else { cigar.expand().chars().collect::<Vec<char>>() };
-
+    let cigar = if is_rc { cigar.expand().chars().rev().collect::<Vec<char>>() } else { cigar.expand().chars().collect::<Vec<char>>() };
 
-    // :)
+    // :-) 
     let mut position = start_position;
     let mut deletion_ranges = Vec::new();
     let mut insertion_ranges = Vec::new();
@@ -378,8 +387,6 @@ fn find_deletion_insertion_ranges(start_position: u32, cigar: Cigar, is_rc: bool
     (deletion_ranges, insertion_ranges)
 }
 
-
-
 pub fn hgvs_from_cigar(ref_start: i32, cigar: Cigar, is_rc: bool) {
     println!("{}", ref_start);
     let cigar = if is_rc { cigar.expand().chars().rev().collect::<Vec<char>>() } else { cigar.expand().chars().collect::<Vec<char>>() };
@@ -447,7 +454,7 @@ pub fn hgvs_from_cigar(ref_start: i32, cigar: Cigar, is_rc: bool) {
     
 }
 
-fn generate_deletion_hgvs_notation(
+pub fn generate_deletion_hgvs_notation(
     seqname: &str,
     deletion_ranges: &[(u32, u32)],
 ) -> String {
@@ -464,7 +471,7 @@ fn generate_deletion_hgvs_notation(
     hgvs_notation
 }
 
-fn generate_insertion_hgvs_notation(
+pub fn generate_insertion_hgvs_notation(
     seqname: &str,
     insertion_ranges: &[(u32, u32)],
     reference_sequence: &str,