|
|
@@ -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,
|