|
|
@@ -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:?}");
|
|
|
}
|
|
|
}
|