@@ -8,7 +8,7 @@ use std::fs::File;
8
8
use itertools:: Itertools ;
9
9
use bigtools:: { Value } ;
10
10
use crate :: filehandler:: { bam_ispaired, write_covfile} ;
11
- use crate :: covcalc:: { bam_pileup, parse_regions, Alignmentfilters , region_divider} ;
11
+ use crate :: covcalc:: { bam_pileup, parse_regions, Alignmentfilters , TempZip , region_divider} ;
12
12
use crate :: normalization:: scale_factor_bamcompare;
13
13
use crate :: calc:: { median, calc_ratio} ;
14
14
use tempfile:: { TempPath } ;
@@ -68,7 +68,7 @@ pub fn r_bamcompare(
68
68
// Set up the bam files in a Vec.
69
69
let bamfiles = vec ! [ ( bamifile1, ispe1) , ( bamifile2, ispe2) ] ;
70
70
71
- let covcalcs: Vec < ParsedBamFile > = pool. install ( || {
71
+ let mut covcalcs: Vec < ParsedBamFile > = pool. install ( || {
72
72
bamfiles. par_iter ( )
73
73
. map ( |( bamfile, ispe) | {
74
74
let ( bg, mapped, unmapped, readlen, fraglen) = regionblocks. par_iter ( )
@@ -102,45 +102,44 @@ pub fn r_bamcompare(
102
102
println ! ( "scale factor1 = {}, scale factor2 = {}" , sf. 0 , sf. 1 ) ;
103
103
// Create output stream
104
104
let mut chrom = "" . to_string ( ) ;
105
- let lines = covcalcs[ 0 ] . bg . iter ( ) . zip ( covcalcs[ 1 ] . bg . iter ( ) ) . flat_map (
106
- |( t1, t2) | {
107
- let reader1 = BufReader :: new ( File :: open ( t1) . unwrap ( ) ) . lines ( ) ;
108
- let reader2 = BufReader :: new ( File :: open ( t2) . unwrap ( ) ) . lines ( ) ;
109
105
110
- reader1. zip ( reader2) . map (
111
- |( l1, l2) | {
112
- let l1 = l1. unwrap ( ) ;
113
- let l2 = l2. unwrap ( ) ;
114
- let fields1: Vec < & str > = l1. split ( '\t' ) . collect ( ) ;
115
- let fields2: Vec < & str > = l2. split ( '\t' ) . collect ( ) ;
116
-
117
- let chrom1: String = fields1[ 0 ] . to_string ( ) ;
118
- let chrom2: String = fields2[ 0 ] . to_string ( ) ;
119
- let start1: u32 = fields1[ 1 ] . parse ( ) . unwrap ( ) ;
120
- let start2: u32 = fields2[ 1 ] . parse ( ) . unwrap ( ) ;
121
- let end1: u32 = fields1[ 2 ] . parse ( ) . unwrap ( ) ;
122
- let end2: u32 = fields2[ 2 ] . parse ( ) . unwrap ( ) ;
123
-
124
- // Assert the regions are equal.
125
- assert_eq ! ( chrom1, chrom2) ;
126
- assert_eq ! ( start1, start2) ;
127
- assert_eq ! ( end1, end2) ;
128
-
129
- // Calculate the coverage.
130
- let cov1: f32 = fields1[ 3 ] . parse ( ) . unwrap ( ) ;
131
- let cov2: f32 = fields2[ 3 ] . parse ( ) . unwrap ( ) ;
132
- let cov = calc_ratio ( cov1, cov2, & sf. 0 , & sf. 1 , & pseudocount, operation) ;
133
-
134
- ( chrom1, Value { start : start1, end : end1, value : cov } )
135
- } ) . coalesce ( |p, c| {
136
- if p. 1 . value == c. 1 . value {
137
- Ok ( ( p. 0 , Value { start : p. 1 . start , end : c. 1 . end , value : p. 1 . value } ) )
138
- } else {
139
- Err ( ( p, c) )
140
- }
141
- } )
142
- }
143
- ) ;
106
+ // Extract both vecs of TempPaths into a single vector
107
+ let its = vec ! [
108
+ covcalcs[ 0 ] . bg. drain( ..) . collect:: <Vec <_>>( ) ,
109
+ covcalcs[ 1 ] . bg. drain( ..) . collect:: <Vec <_>>( )
110
+ ] ;
111
+ let its: Vec < _ > = its. iter ( ) . map ( |x| x. into_iter ( ) ) . collect ( ) ;
112
+ let zips = TempZip { iterators : its } ;
113
+ let zips_vec: Vec < _ > = zips. collect ( ) ;
114
+
115
+ let lines = zips_vec
116
+ . into_iter ( )
117
+ . flat_map ( |c| {
118
+ let readers: Vec < _ > = c. into_iter ( ) . map ( |x| BufReader :: new ( File :: open ( x) . unwrap ( ) ) . lines ( ) ) . collect ( ) ;
119
+ let temp_zip = TempZip { iterators : readers } ;
120
+ temp_zip. into_iter ( ) . map ( |mut _l| {
121
+ let lines: Vec < _ > = _l
122
+ . iter_mut ( )
123
+ . map ( |x| x. as_mut ( ) . unwrap ( ) )
124
+ . map ( |x| x. split ( '\t' ) . collect ( ) )
125
+ . map ( |x : Vec < & str > | ( x[ 0 ] . to_string ( ) , x[ 1 ] . parse :: < u32 > ( ) . unwrap ( ) , x[ 2 ] . parse :: < u32 > ( ) . unwrap ( ) , x[ 3 ] . parse :: < f32 > ( ) . unwrap ( ) ) )
126
+ . collect ( ) ;
127
+ assert_eq ! ( lines. len( ) , 2 ) ;
128
+ assert_eq ! ( lines[ 0 ] . 0 , lines[ 1 ] . 0 ) ;
129
+ assert_eq ! ( lines[ 0 ] . 1 , lines[ 1 ] . 1 ) ;
130
+ assert_eq ! ( lines[ 0 ] . 2 , lines[ 1 ] . 2 ) ;
131
+ // Calculate the coverage.
132
+ let cov = calc_ratio ( lines[ 0 ] . 3 , lines[ 1 ] . 3 , & sf. 0 , & sf. 1 , & pseudocount, operation) ;
133
+ ( lines[ 0 ] . 0 . clone ( ) , Value { start : lines[ 0 ] . 1 , end : lines[ 0 ] . 2 , value : cov } )
134
+ } ) . coalesce ( |p, c| {
135
+ if p. 1 . value == c. 1 . value && p. 0 == c. 0 {
136
+ Ok ( ( p. 0 , Value { start : p. 1 . start , end : c. 1 . end , value : p. 1 . value } ) )
137
+ } else {
138
+ Err ( ( p, c) )
139
+ }
140
+ } )
141
+ } ) ;
142
+
144
143
write_covfile ( lines, ofile, ofiletype, chromsizes) ;
145
144
Ok ( ( ) )
146
145
}
0 commit comments