@@ -162,7 +162,7 @@ fn generate_plot_coverage(input_directory: &PathBuf) -> Result<Plot, Box<dyn Err
162162
163163 // Set the figure title
164164 let layout = Layout :: new ( )
165- . title ( & format ! (
165+ . title ( format ! (
166166 "Coverage | {}" ,
167167 input_directory
168168 . file_name( )
@@ -201,61 +201,59 @@ fn generate_plot_coverage_seg(input_directory: &PathBuf) -> Result<Plot, Box<dyn
201201 let mut file_paths = Vec :: new ( ) ;
202202
203203 // First, count files and collect paths
204- for entry in glob ( & format ! (
204+ for path in ( glob ( & format ! (
205205 "{}/tables/*coverage.txt" ,
206206 input_directory. display( )
207- ) ) ? {
208- if let Ok ( path ) = entry {
209- //file_count += 1;
210- file_paths . push ( path ) ;
211- }
207+ ) ) ?)
208+ . flatten ( )
209+ {
210+ //file_count += 1 ;
211+ file_paths . push ( path ) ;
212212 }
213213
214214 // Calculate grid dimensions for subplots
215215 let rows = 4 ; //((file_count + 2) as f64).sqrt().ceil() as usize;
216216 let cols = 2 ; //(file_count + rows - 1) / rows; // Ceiling division
217217
218218 // Load variant data into a HashMap keyed by segment name
219+ // TODO: consider a struct with named fields
219220 let mut variants_data: HashMap < String , Vec < ( u32 , String , String , u32 , u32 , f32 ) > > =
220221 HashMap :: new ( ) ;
221222
222223 // Look for variant files with matching prefixes in the directory
223- for entry in glob ( & format ! (
224+ for variant_path in ( glob ( & format ! (
224225 "{}/tables/*variants.txt" ,
225226 input_directory. display( )
226- ) ) ? {
227- if let Ok ( variant_path) = entry {
228- let file = File :: open ( & variant_path) ?;
229-
230- // Create a TSV reader
231- let mut rdr = ReaderBuilder :: new ( )
232- . delimiter ( b'\t' )
233- . has_headers ( true )
234- . from_reader ( file) ;
235-
236- for result in rdr. records ( ) {
237- let record = result?;
238- if record. len ( ) >= 8 {
239- let segment_name = record[ 0 ] . to_string ( ) ;
240- let position: u32 = record[ 1 ] . parse ( ) ?;
241- let consensus_allele: String = record[ 3 ] . to_string ( ) ;
242- let minority_allele: String = record[ 4 ] . to_string ( ) ;
243- let consensus_count: u32 = record[ 5 ] . parse ( ) ?;
244- let minority_count: u32 = record[ 6 ] . parse ( ) ?;
245- let minority_frequency: f32 = record[ 8 ] . parse ( ) ?;
246-
247- variants_data
248- . entry ( segment_name)
249- . or_insert_with ( Vec :: new)
250- . push ( (
251- position,
252- consensus_allele,
253- minority_allele,
254- consensus_count,
255- minority_count,
256- minority_frequency,
257- ) ) ;
258- }
227+ ) ) ?)
228+ . flatten ( )
229+ {
230+ let file = File :: open ( & variant_path) ?;
231+
232+ // Create a TSV reader
233+ let mut rdr = ReaderBuilder :: new ( )
234+ . delimiter ( b'\t' )
235+ . has_headers ( true )
236+ . from_reader ( file) ;
237+
238+ for result in rdr. records ( ) {
239+ let record = result?;
240+ if record. len ( ) >= 8 {
241+ let segment_name = record[ 0 ] . to_string ( ) ;
242+ let position: u32 = record[ 1 ] . parse ( ) ?;
243+ let consensus_allele: String = record[ 3 ] . to_string ( ) ;
244+ let minority_allele: String = record[ 4 ] . to_string ( ) ;
245+ let consensus_count: u32 = record[ 5 ] . parse ( ) ?;
246+ let minority_count: u32 = record[ 6 ] . parse ( ) ?;
247+ let minority_frequency: f32 = record[ 8 ] . parse ( ) ?;
248+
249+ variants_data. entry ( segment_name) . or_default ( ) . push ( (
250+ position,
251+ consensus_allele,
252+ minority_allele,
253+ consensus_count,
254+ minority_count,
255+ minority_frequency,
256+ ) ) ;
259257 }
260258 }
261259 }
@@ -356,7 +354,7 @@ fn generate_plot_coverage_seg(input_directory: &PathBuf) -> Result<Plot, Box<dyn
356354 // Create trace for minority values with consistent color (but with transparency)
357355 let minority_trace = Scatter :: new ( variant_positions, minority_values)
358356 . mode ( Mode :: Markers )
359- . name ( & format ! ( "{}" , segment_name) )
357+ . name ( & segment_name)
360358 . marker (
361359 plotly:: common:: Marker :: new ( )
362360 . color ( segment_color)
@@ -383,7 +381,7 @@ fn generate_plot_coverage_seg(input_directory: &PathBuf) -> Result<Plot, Box<dyn
383381 . columns ( cols)
384382 . pattern ( GridPattern :: Independent ) ,
385383 )
386- . title ( & format ! (
384+ . title ( format ! (
387385 "Segment Coverage | {}" ,
388386 input_directory
389387 . file_name( )
@@ -505,17 +503,15 @@ fn generate_sankey_plot(input_directory: &PathBuf) -> Result<Plot, Box<dyn Error
505503
506504 // Process data and build node map first
507505 let mut records = Vec :: new ( ) ;
508- for line in lines {
509- if let Ok ( line) = line {
510- let parts: Vec < & str > = line. split ( '\t' ) . collect ( ) ;
511- if parts. len ( ) >= 3 {
512- let record = parts[ 0 ] ;
513- let reads: u32 = parts[ 1 ] . parse ( ) . unwrap_or ( 0 ) ;
514-
515- // Skip "NA" values and 0 reads
516- if parts[ 1 ] != "NA" && reads > 0 {
517- records. push ( ( record. to_string ( ) , reads) ) ;
518- }
506+ for line in lines. map_while ( Result :: ok) {
507+ let parts: Vec < & str > = line. split ( '\t' ) . collect ( ) ;
508+ if parts. len ( ) >= 3 {
509+ let record = parts[ 0 ] ;
510+ let reads: u32 = parts[ 1 ] . parse ( ) . unwrap_or ( 0 ) ;
511+
512+ // Skip "NA" values and 0 reads
513+ if parts[ 1 ] != "NA" && reads > 0 {
514+ records. push ( ( record. to_string ( ) , reads) ) ;
519515 }
520516 }
521517 }
@@ -733,7 +729,7 @@ fn generate_sankey_plot(input_directory: &PathBuf) -> Result<Plot, Box<dyn Error
733729
734730 // Set layout
735731 let layout = Layout :: new ( )
736- . title ( & format ! (
732+ . title ( format ! (
737733 "Read Assignment | {}" ,
738734 input_directory
739735 . file_name( )
0 commit comments