@@ -83,18 +83,20 @@ pub fn consensus(cli: &crate::cli::ConsensusArgs) -> Result<()> {
8383 let mut processed_clusters = 0 ;
8484 let mut processed_duplicate_groups = 0 ;
8585 let mut max_clusters = 0 ;
86+ let mut filtered_reads = 0 ;
8687
8788 let report_progress = |processed_reads : usize ,
8889 total_num_reads : usize ,
8990 processed_groups : usize ,
9091 processed_clusters : usize ,
92+ filtered_reads : usize ,
9193 max_clusters : usize | {
9294 let cluster_ratio = processed_clusters as f64 / processed_groups as f64 ;
9395
9496 if cli. no_clustering {
95- info ! ( "proc: {processed_reads} / {total_num_reads} reads" ) ;
97+ info ! ( "proc: {processed_reads} / {total_num_reads} reads (filtered: {filtered_reads}) " ) ;
9698 } else {
97- info ! ( "proc: {processed_reads} / {total_num_reads} reads\t (clusters per duplicate group: avg {cluster_ratio:.2}, max {max_clusters})" ) ;
99+ info ! ( "proc: {processed_reads} / {total_num_reads} reads\t (clusters per duplicate group: avg {cluster_ratio:.2}, max {max_clusters}; filtered: {filtered_reads} )" ) ;
98100 }
99101 } ;
100102
@@ -132,8 +134,10 @@ pub fn consensus(cli: &crate::cli::ConsensusArgs) -> Result<()> {
132134 . collect :: < Result < Vec < _ > > > ( ) ?
133135 } ;
134136
135- for ( elem, num_reads, clusters, is_duplicate) in output. into_iter ( ) {
137+ for ( elem, num_reads, clusters, num_filtered_reads , is_duplicate) in output. into_iter ( ) {
136138 processed_reads += num_reads;
139+ filtered_reads += num_filtered_reads;
140+
137141 if is_duplicate {
138142 processed_clusters += clusters;
139143 }
@@ -147,6 +151,7 @@ pub fn consensus(cli: &crate::cli::ConsensusArgs) -> Result<()> {
147151 total_num_reads,
148152 processed_duplicate_groups,
149153 processed_clusters,
154+ filtered_reads,
150155 max_clusters,
151156 ) ;
152157 }
@@ -163,19 +168,21 @@ pub fn consensus(cli: &crate::cli::ConsensusArgs) -> Result<()> {
163168 total_num_reads,
164169 processed_duplicate_groups,
165170 processed_clusters,
171+ filtered_reads,
166172 max_clusters,
167173 ) ;
168174
169- info ! ( "Complete\n input: {total_num_reads} reads\n duplicate groups: {processed_duplicate_groups} groups\n total clusters: {processed_clusters}" ) ;
175+ info ! ( "Complete\n input: {total_num_reads} reads\n duplicate groups: {processed_duplicate_groups} groups\n total clusters: {processed_clusters}\n filtered reads: {filtered_reads} " ) ;
170176
171177 Ok ( ( ) )
172178}
173179
174180/// Main consensus caller: coordinates simplex vs consensus processing
181+ /// The result format is (Output text, # reads, # clusters, # filtered reads, is_duplicate_group)
175182fn consensus_call (
176183 group : & DuplicateGroup ,
177184 args : & ConsensusArgs ,
178- ) -> Result < ( String , usize , usize , bool ) > {
185+ ) -> Result < ( String , usize , usize , usize , bool ) > {
179186 if group. group_type == DuplicateGroupType :: Filtered {
180187 handle_filtered_reads ( group, args)
181188 } else if group. reads . len ( ) == 1 {
@@ -189,7 +196,7 @@ fn consensus_call(
189196fn handle_filtered_reads (
190197 group : & DuplicateGroup ,
191198 args : & ConsensusArgs ,
192- ) -> Result < ( String , usize , usize , bool ) > {
199+ ) -> Result < ( String , usize , usize , usize , bool ) > {
193200 let reads_u8 = group. reads . concat ( ) ;
194201 let header_builder = formatter:: HeaderFormatter :: new ( group, args) ;
195202 let mut reader = FastqReader :: new ( Cursor :: new ( reads_u8) ) ;
@@ -215,14 +222,14 @@ fn handle_filtered_reads(
215222 read_idx += 1 ;
216223 }
217224
218- Ok ( ( result, group. reads . len ( ) , 0 , false ) )
225+ Ok ( ( result, group. reads . len ( ) , 0 , group . reads . len ( ) , false ) )
219226}
220227
221228/// Simplex read caller: processes single reads without consensus calling
222229fn handle_simplex_read (
223230 group : & DuplicateGroup ,
224231 args : & ConsensusArgs ,
225- ) -> Result < ( String , usize , usize , bool ) > {
232+ ) -> Result < ( String , usize , usize , usize , bool ) > {
226233 let reads_u8 = group. reads . concat ( ) ;
227234 let mut header_builder = formatter:: HeaderFormatter :: new ( group, args) ;
228235 let mut reader = FastqReader :: new ( Cursor :: new ( reads_u8) ) ;
@@ -247,14 +254,14 @@ fn handle_simplex_read(
247254 str :: from_utf8( qual) ?
248255 ) ?;
249256
250- Ok ( ( result, 1 , 1 , false ) )
257+ Ok ( ( result, 1 , 1 , 0 , false ) )
251258}
252259
253260/// Handles multi-read consensus calling with clustering
254261fn process_consensus_reads (
255262 group : & DuplicateGroup ,
256263 args : & ConsensusArgs ,
257- ) -> Result < ( String , usize , usize , bool ) > {
264+ ) -> Result < ( String , usize , usize , usize , bool ) > {
258265 // Filtered groups should always be simplex reads.
259266 assert_ne ! ( group. group_type, DuplicateGroupType :: Filtered ) ;
260267
@@ -301,7 +308,7 @@ fn process_consensus_reads(
301308 let consensus_output = generate_consensus_output ( & mut graphs, & header_builder) ?;
302309 result. push_str ( & consensus_output) ;
303310
304- Ok ( ( result, group. reads . len ( ) , graphs. len ( ) , true ) )
311+ Ok ( ( result, group. reads . len ( ) , graphs. len ( ) , 0 , true ) )
305312}
306313
307314/// Determines which graph to cluster read with or creates new graph
0 commit comments