@@ -1354,24 +1354,7 @@ where
13541354 Some ( prev) => Some ( format ! ( "{prev}|{reference_name}" ) ) ,
13551355 None => Some ( reference_name) ,
13561356 } ;
1357- let bam_file_cache = |naming_readset| -> Option < String > {
1358- let bam_file_cache_path;
1359- match m. contains_id ( "bam-file-cache-directory" ) {
1360- false => None ,
1361- true => {
1362- bam_file_cache_path = generate_cached_bam_file_name (
1363- m. get_one :: < String > ( "bam-file-cache-directory" ) . unwrap ( ) ,
1364- match reference_tempfile {
1365- Some ( _) => CONCATENATED_REFERENCE_CACHE_STEM ,
1366- None => reference,
1367- } ,
1368- naming_readset,
1369- ) ;
1370- info ! ( "Caching BAM file to {bam_file_cache_path}" ) ;
1371- Some ( bam_file_cache_path)
1372- }
1373- }
1374- } ;
1357+ let mut bam_file_cache = build_bam_file_cache_fn ( m, reference_tempfile, reference) ;
13751358
13761359 for p in reference_wise_params {
13771360 bam_readers. push (
@@ -1382,7 +1365,9 @@ where
13821365 p. read2 ,
13831366 p. read_format . clone ( ) ,
13841367 p. threads ,
1385- bam_file_cache ( p. read1 ) . as_ref ( ) . map ( String :: as_ref) ,
1368+ bam_file_cache ( p. read1 , p. read2 )
1369+ . as_ref ( )
1370+ . map ( String :: as_ref) ,
13861371 discard_unmapped,
13871372 p. mapping_options ,
13881373 ) ,
@@ -1432,24 +1417,7 @@ fn get_streamed_bam_readers(
14321417 let index = setup_mapping_index ( & reference_wise_params, m, mapping_program) ;
14331418
14341419 let reference = reference_wise_params. reference ;
1435- let bam_file_cache = |naming_readset| -> Option < String > {
1436- let bam_file_cache_path;
1437- match m. contains_id ( "bam-file-cache-directory" ) {
1438- false => None ,
1439- true => {
1440- bam_file_cache_path = generate_cached_bam_file_name (
1441- m. get_one :: < String > ( "bam-file-cache-directory" ) . unwrap ( ) ,
1442- match reference_tempfile {
1443- Some ( _) => CONCATENATED_REFERENCE_CACHE_STEM ,
1444- None => reference,
1445- } ,
1446- naming_readset,
1447- ) ;
1448- info ! ( "Caching BAM file to {bam_file_cache_path}" ) ;
1449- Some ( bam_file_cache_path)
1450- }
1451- }
1452- } ;
1420+ let mut bam_file_cache = build_bam_file_cache_fn ( m, reference_tempfile, reference) ;
14531421
14541422 for p in reference_wise_params {
14551423 bam_readers. push (
@@ -1460,7 +1428,9 @@ fn get_streamed_bam_readers(
14601428 p. read2 ,
14611429 p. read_format . clone ( ) ,
14621430 p. threads ,
1463- bam_file_cache ( p. read1 ) . as_ref ( ) . map ( String :: as_ref) ,
1431+ bam_file_cache ( p. read1 , p. read2 )
1432+ . as_ref ( )
1433+ . map ( String :: as_ref) ,
14641434 discard_unmapped,
14651435 p. mapping_options ,
14661436 reference_tempfile. is_none ( ) ,
@@ -1580,6 +1550,90 @@ fn setup_bam_cache_directory(cache_directory: &str) {
15801550 }
15811551}
15821552
1553+ fn build_cache_name_iter ( m : & clap:: ArgMatches ) -> Option < std:: vec:: IntoIter < String > > {
1554+ if m. contains_id ( "bam-file-cache-names" ) {
1555+ let names: Vec < String > = m
1556+ . get_many :: < String > ( "bam-file-cache-names" )
1557+ . unwrap ( )
1558+ . map ( |s| s. to_string ( ) )
1559+ . collect ( ) ;
1560+
1561+ let single_count = m. get_many :: < String > ( "single" ) . map ( |v| v. len ( ) ) . unwrap_or ( 0 ) ;
1562+ let read1_count = m. get_many :: < String > ( "read1" ) . map ( |v| v. len ( ) ) . unwrap_or ( 0 ) ;
1563+ let coupled_count = m
1564+ . get_many :: < String > ( "coupled" )
1565+ . map ( |v| v. len ( ) / 2 )
1566+ . unwrap_or ( 0 ) ;
1567+ let interleaved_count = m
1568+ . get_many :: < String > ( "interleaved" )
1569+ . map ( |v| v. len ( ) )
1570+ . unwrap_or ( 0 ) ;
1571+ let expected = single_count + read1_count + coupled_count + interleaved_count;
1572+ if names. len ( ) != expected {
1573+ error ! (
1574+ "--bam-file-cache-names specified {names_len} names but {expected} read sets were provided" ,
1575+ names_len = names. len( )
1576+ ) ;
1577+ process:: exit ( 1 ) ;
1578+ }
1579+
1580+ let mut idx = 0 ;
1581+ let single_names = names[ idx..idx + single_count] . to_vec ( ) ;
1582+ idx += single_count;
1583+ let read1_names = names[ idx..idx + read1_count] . to_vec ( ) ;
1584+ idx += read1_count;
1585+ let coupled_names = names[ idx..idx + coupled_count] . to_vec ( ) ;
1586+ idx += coupled_count;
1587+ let interleaved_names = names[ idx..idx + interleaved_count] . to_vec ( ) ;
1588+
1589+ let mut iter_order = Vec :: new ( ) ;
1590+ iter_order. extend ( read1_names) ;
1591+ iter_order. extend ( coupled_names) ;
1592+ iter_order. extend ( interleaved_names) ;
1593+ iter_order. extend ( single_names) ;
1594+ Some ( iter_order. into_iter ( ) )
1595+ } else {
1596+ None
1597+ }
1598+ }
1599+
1600+ fn build_bam_file_cache_fn < ' a > (
1601+ m : & ' a clap:: ArgMatches ,
1602+ reference_tempfile : & ' a Option < NamedTempFile > ,
1603+ reference : & ' a str ,
1604+ ) -> impl FnMut ( & str , Option < & str > ) -> Option < String > + ' a {
1605+ let mut bam_cache_name_iter = build_cache_name_iter ( m) ;
1606+ move |read1 : & str , read2 : Option < & str > | -> Option < String > {
1607+ if let Some ( iter) = bam_cache_name_iter. as_mut ( ) {
1608+ let name = iter. next ( ) . unwrap_or_else ( || {
1609+ error ! ( "Not enough BAM file cache names specified" ) ;
1610+ process:: exit ( 1 ) ;
1611+ } ) ;
1612+ match read2 {
1613+ Some ( r2) => info ! ( "Caching BAM file to {name} for readset {read1} {r2}" ) ,
1614+ None => info ! ( "Caching BAM file to {name} for readset {read1}" ) ,
1615+ }
1616+ Some ( name)
1617+ } else if m. contains_id ( "bam-file-cache-directory" ) {
1618+ let path = generate_cached_bam_file_name (
1619+ m. get_one :: < String > ( "bam-file-cache-directory" ) . unwrap ( ) ,
1620+ match reference_tempfile {
1621+ Some ( _) => CONCATENATED_REFERENCE_CACHE_STEM ,
1622+ None => reference,
1623+ } ,
1624+ read1,
1625+ ) ;
1626+ match read2 {
1627+ Some ( r2) => info ! ( "Caching BAM file to {path} for readset {read1} {r2}" ) ,
1628+ None => info ! ( "Caching BAM file to {path} for readset {read1}" ) ,
1629+ }
1630+ Some ( path)
1631+ } else {
1632+ None
1633+ }
1634+ }
1635+ }
1636+
15831637fn get_streamed_filtered_bam_readers (
15841638 m : & clap:: ArgMatches ,
15851639 mapping_program : MappingProgram ,
@@ -1599,24 +1653,7 @@ fn get_streamed_filtered_bam_readers(
15991653 let index = setup_mapping_index ( & reference_wise_params, m, mapping_program) ;
16001654
16011655 let reference = reference_wise_params. reference ;
1602- let bam_file_cache = |naming_readset| -> Option < String > {
1603- let bam_file_cache_path;
1604- match m. contains_id ( "bam-file-cache-directory" ) {
1605- false => None ,
1606- true => {
1607- bam_file_cache_path = generate_cached_bam_file_name (
1608- m. get_one :: < String > ( "bam-file-cache-directory" ) . unwrap ( ) ,
1609- match reference_tempfile {
1610- Some ( _) => CONCATENATED_REFERENCE_CACHE_STEM ,
1611- None => reference,
1612- } ,
1613- naming_readset,
1614- ) ;
1615- info ! ( "Caching BAM file to {bam_file_cache_path}" ) ;
1616- Some ( bam_file_cache_path)
1617- }
1618- }
1619- } ;
1656+ let mut bam_file_cache = build_bam_file_cache_fn ( m, reference_tempfile, reference) ;
16201657
16211658 for p in reference_wise_params {
16221659 bam_readers. push (
@@ -1627,7 +1664,9 @@ fn get_streamed_filtered_bam_readers(
16271664 p. read2 ,
16281665 p. read_format . clone ( ) ,
16291666 p. threads ,
1630- bam_file_cache ( p. read1 ) . as_ref ( ) . map ( String :: as_ref) ,
1667+ bam_file_cache ( p. read1 , p. read2 )
1668+ . as_ref ( )
1669+ . map ( String :: as_ref) ,
16311670 filter_params. flag_filters . clone ( ) ,
16321671 filter_params. min_aligned_length_single ,
16331672 filter_params. min_percent_identity_single ,
0 commit comments