Thomas il y a 2 ans
Parent
commit
fdc9f73364
1 fichiers modifiés avec 50 ajouts et 28 suppressions
  1. 50 28
      src/lib.rs

+ 50 - 28
src/lib.rs

@@ -215,18 +215,6 @@ pub fn get_start_end_qual_rec(
 
         if rend >= start && rend < stop {
             if record.mapq() >= mapq {
-                if record.is_supplementary() {
-                    match record.aux(b"SA") {
-                        std::result::Result::Ok(v) => match v {
-                            record::Aux::String(v) => {
-                                println!("{v}");
-                                let v = v.split(";");
-                            }
-                            _ => (),
-                        },
-                        Err(_) => (),
-                    };
-                }
                 let index = rend - start;
                 let u = results_end.get_mut(index as usize).unwrap();
                 u.push(record.clone());
@@ -236,19 +224,39 @@ pub fn get_start_end_qual_rec(
     Ok((results_start, results_end))
 }
 
-pub fn primary_record(
-    bam: &mut rust_htslib::bam::IndexedReader,
-    qname: &str,
-    positions: &Vec<(&str, i32, i32)>
-) -> Option<Record> {
-    for position in positions {
-        bam.fetch(*position).unwrap();
-        let records = bam.records();
-        for record in records {
-            let record = record.unwrap();
-            if qname == String::from_utf8(record.qname().to_vec()).unwrap().as_str() {
-                if !record.is_supplementary() {
-                    return Some(record.clone())
+pub fn primary_record(bam_path: &str, record: &Record) -> Option<Record> {
+    let mut bam = rust_htslib::bam::IndexedReader::from_path(bam_path).unwrap();
+    if record.is_supplementary() {
+        let qname = record.qname();
+        let mut positions: Vec<(&str, i32)> = Vec::new();
+        match record.aux(b"SA") {
+            std::result::Result::Ok(v) => match v {
+                record::Aux::String(v) => {
+                    positions = v
+                        .split(";")
+                        .filter(|s| s.len() != 0)
+                        .map(|s| {
+                            let s = s.split(",").take(2).collect::<Vec<&str>>();
+                            let chr = *s.get(0).unwrap();
+                            let position: i32 = s.get(1).unwrap().parse().unwrap();
+                            (chr, position)
+                        })
+                        .collect();
+                }
+                _ => (),
+            },
+            Err(_) => (),
+        };
+        for (chr, start) in positions {
+            bam.fetch((chr, start, start + 1)).unwrap();
+            let records = bam.records();
+            for record in records {
+                let record = record.unwrap();
+                // String::from_utf8(record.qname().to_vec()).unwrap().as_str()
+                if qname == record.qname() {
+                    if !record.is_supplementary() {
+                        return Some(record.clone());
+                    }
                 }
             }
         }
@@ -346,6 +354,18 @@ pub fn range_len_qual(
     Ok(depths)
 }
 
+pub fn swap_by_primary(bam_path: &str, records: Vec<Record>) -> Vec<Record> {
+    let mut res_records = Vec::new();
+    for record in records {
+        if let Some(record) = primary_record(bam_path, &record) {
+            res_records.push(record);
+        } else {
+            res_records.push(record);
+        }
+    }
+    res_records
+}
+
 #[cfg(test)]
 mod tests {
     // Note this useful idiom: importing names from outer (for mod tests) scope.
@@ -360,10 +380,12 @@ mod tests {
 
         let mut bam = rust_htslib::bam::IndexedReader::from_path(bam_path).unwrap();
 
-        let a = get_start_end_qual(&mut bam, chr, start, start + 1, mapq).unwrap();
-        println!("{a:?}");
+        // let a = get_start_end_qual(&mut bam, chr, start, start + 1, mapq).unwrap();
+        // println!("{a:?}");
 
         let res = get_start_end_qual_rec(&mut bam, chr, start, start + 1, mapq).unwrap();
-        println!("{res:?}");
+        let (s, e) = res;
+        let res_records = swap_by_primary(bam_path, e.get(0).unwrap().clone());
+        println!("{res_records:?}");
     }
 }