@@ -4,7 +4,7 @@ use rayon::prelude::*;
44use rayon:: ThreadPoolBuilder ;
55use itertools:: { multizip, multiunzip, izip} ;
66use std:: io:: prelude:: * ;
7- use std:: io:: BufReader ;
7+ use std:: io:: { BufReader , BufWriter } ;
88use std:: fs:: File ;
99use ndarray:: { Array1 , Array2 , stack, Axis } ;
1010use std:: io;
@@ -167,6 +167,18 @@ pub fn r_mbams(
167167 println ! ( "Define output file" ) ;
168168 }
169169
170+ let mut cfile: Option < BufWriter < File > > = None ;
171+ if out_raw_counts != "None" {
172+ cfile = Some ( BufWriter :: new ( File :: create ( out_raw_counts) . unwrap ( ) ) ) ;
173+ // Write the header to the file.
174+ let mut headstr = String :: new ( ) ;
175+ headstr. push_str ( "#\' chr\' \t \' start\' \t \' end\' " ) ;
176+ for label in bamlabels. iter ( ) {
177+ headstr. push_str ( & format ! ( "\t \' {}\' " , label) ) ;
178+ }
179+ writeln ! ( cfile. as_mut( ) . unwrap( ) , "{}" , headstr) . unwrap ( ) ;
180+ }
181+
170182 // Collate the coverage files into a matrix.
171183 let its: Vec < _ > = covcalcs. iter ( ) . map ( |x| x. into_iter ( ) ) . collect ( ) ;
172184 let zips = TempZip { iterators : its } ;
@@ -176,10 +188,11 @@ pub fn r_mbams(
176188 let zips_vec: Vec < _ > = zips. collect ( ) ;
177189 let matvec: Array2 < f32 > = pool. install ( || {
178190 let matvecs: Vec < Array1 < f32 > > = zips_vec
179- . par_iter ( )
191+ . iter ( )
180192 . flat_map ( |c| {
181- let readers: Vec < _ > = c. iter ( ) . map ( |x| BufReader :: new ( File :: open ( x) . unwrap ( ) ) . lines ( ) ) . collect ( ) ;
193+ let readers: Vec < _ > = c. par_iter ( ) . map ( |x| BufReader :: new ( File :: open ( x) . unwrap ( ) ) . lines ( ) ) . collect ( ) ;
182194 let mut _matvec: Vec < Array1 < f32 > > = Vec :: new ( ) ;
195+ let mut _regions: Vec < ( String , u32 , u32 ) > = Vec :: new ( ) ;
183196 for mut _l in ( TempZip { iterators : readers } ) {
184197 // unwrap all lines in _l
185198 let lines: Vec < _ > = _l
@@ -189,6 +202,16 @@ pub fn r_mbams(
189202 . map ( |x : Vec < & str > | ( x[ 0 ] . to_string ( ) , x[ 1 ] . parse :: < u32 > ( ) . unwrap ( ) , x[ 2 ] . parse :: < u32 > ( ) . unwrap ( ) , x[ 3 ] . parse :: < f32 > ( ) . unwrap ( ) ) )
190203 . collect ( ) ;
191204 let arrline = Array1 :: from ( lines. iter ( ) . map ( |x| x. 3 ) . collect :: < Vec < _ > > ( ) ) ;
205+ // If cfile is define, write the raw counts to file.
206+ if let Some ( ref mut file) = cfile {
207+ let mut regstr = String :: new ( ) ;
208+ regstr. push_str ( & format ! ( "{}\t {}\t {}" , lines[ 0 ] . 0 , lines[ 0 ] . 1 , lines[ 0 ] . 2 ) ) ;
209+ // push values from array
210+ for val in arrline. iter ( ) {
211+ regstr. push_str ( & format ! ( "\t {}" , val) ) ;
212+ }
213+ writeln ! ( file, "{}" , regstr) . unwrap ( ) ;
214+ }
192215 _matvec. push ( arrline) ;
193216 }
194217 _matvec
@@ -207,36 +230,14 @@ pub fn r_mbams(
207230 writeln ! ( sf_file, "{}\t {}" , label, sf) . unwrap ( ) ;
208231 }
209232 }
210- let mut npz = NpzWriter :: new ( File :: create ( ofile) . unwrap ( ) ) ;
233+ let mut npz = NpzWriter :: new_compressed ( File :: create ( ofile) . unwrap ( ) ) ;
211234 npz. add_array ( "matrix" , & matvec) . unwrap ( ) ;
212235 npz. add_array ( "labels" , & bamlabels_arr) . unwrap ( ) ;
213236 npz. finish ( ) . unwrap ( ) ;
214237 if verbose {
215238 println ! ( "Matrix written." ) ;
216239 }
217240
218- // If raw counts are required, write them to file.
219- if out_raw_counts != "None" {
220- let mut cfile = File :: create ( out_raw_counts) . unwrap ( ) ;
221- // Create the header
222- let mut headstr = String :: new ( ) ;
223- headstr. push_str ( "#\' chr\' \t \' start\' \t \' end\' " ) ;
224- for label in bamlabels. iter ( ) {
225- headstr. push_str ( & format ! ( "\t \' {}\' " , label) ) ;
226- }
227- writeln ! ( cfile, "{}" , headstr) . unwrap ( ) ;
228- for ( i, region) in regions. iter ( ) . enumerate ( ) {
229- let mut line = String :: new ( ) ;
230- line. push_str ( & format ! ( "{}\t {}\t {}" , region. chrom, region. get_startu( ) , region. get_endu( ) ) ) ;
231- for j in 0 ..bamlabels. len ( ) {
232- line. push_str ( & format ! ( "\t {}" , matvec[ [ i, j] ] ) ) ;
233- }
234- writeln ! ( cfile, "{}" , line) . unwrap ( ) ;
235- }
236- }
237- if verbose {
238- println ! ( "Counts written." ) ;
239- }
240241 Ok ( ( ) )
241242}
242243
0 commit comments