@@ -21,8 +21,7 @@ use prettytable::{format as prettyformat, row, table};
2121
2222use crate :: {
2323 error:: {
24- BirliError ,
25- BirliError :: { BadMWAVersion , DryRun } ,
24+ BirliError :: { self , BadMWAVersion , DryRun } ,
2625 CLIError :: { InvalidCommandLineArgument , InvalidRangeSpecifier } ,
2726 } ,
2827 flags:: FlagContext ,
@@ -39,7 +38,7 @@ use crate::{
3938 precession:: { precess_time, PrecessionInfo } ,
4039 History , Jones , LatLngHeight , MwaObsContext , ObsContext , RADec , VisContext , ENH ,
4140 } ,
42- passband_gains:: { PFB_COTTER_2014_10KHZ , PFB_JAKE_2022_200HZ } ,
41+ passband_gains:: { OSPFB_JAKE_2025_200HZ , PFB_COTTER_2014_10KHZ , PFB_JAKE_2022_200HZ } ,
4342 with_increment_duration, Axis , Complex , FlagFileSet , PreprocessContext , VisSelection ,
4443} ;
4544
@@ -760,8 +759,10 @@ impl<'a> BirliContext<'a> {
760759 ) ,
761760 PossibleValue :: new ( "jake" )
762761 . help ( "see: PFB_JAKE_2022_200HZ in src/passband_gains.rs" ) ,
762+ PossibleValue :: new ( "jake_oversampled" )
763+ . help ( "see: OSPFB_JAKE_2025_200HZ in src/passband_gains.rs" ) ,
763764 PossibleValue :: new ( "auto" )
764- . help ( "MWAX => jake, legacy => cotter" ) ,
765+ . help ( "MWAX => jake or jake_oversampled , legacy => cotter" ) ,
765766 ] )
766767 . default_value ( "auto" )
767768 . alias ( "pfb-gains" )
@@ -1340,6 +1341,12 @@ impl<'a> BirliContext<'a> {
13401341 mwa_version,
13411342 ..
13421343 } = corr_ctx;
1344+ let MetafitsContext {
1345+ oversampled,
1346+ cable_delays_applied,
1347+ geometric_delays_applied,
1348+ ..
1349+ } = meta_ctx;
13431350 prep_ctx. array_pos = if matches. is_present ( "emulate-cotter" ) {
13441351 info ! ( "Using array position from Cotter." ) ;
13451352 LatLngHeight {
@@ -1378,9 +1385,8 @@ impl<'a> BirliContext<'a> {
13781385 } ;
13791386 prep_ctx. correct_cable_lengths = {
13801387 let cable_delays_disabled = matches. is_present ( "no-cable-delay" ) ;
1381- let cable_delays_applied = meta_ctx. cable_delays_applied ;
1382- debug ! (
1383- "cable corrections: applied={}, disabled={}" ,
1388+ info ! (
1389+ "cable corrections: applied={:?}, disabled={}" ,
13841390 cable_delays_applied, cable_delays_disabled
13851391 ) ;
13861392 matches ! (
@@ -1391,20 +1397,43 @@ impl<'a> BirliContext<'a> {
13911397 prep_ctx. correct_digital_gains = !matches. is_present ( "no-digital-gains" ) ;
13921398 prep_ctx. passband_gains = match matches. value_of ( "passband-gains" ) {
13931399 None | Some ( "none" ) => None ,
1394- Some ( "jake" ) => Some ( PFB_JAKE_2022_200HZ ) ,
1395- Some ( "cotter" ) => Some ( PFB_COTTER_2014_10KHZ ) ,
1396- Some ( "auto" ) => match mwa_version {
1397- MWAVersion :: CorrMWAXv2 => Some ( PFB_JAKE_2022_200HZ ) ,
1398- MWAVersion :: CorrLegacy | MWAVersion :: CorrOldLegacy => Some ( PFB_COTTER_2014_10KHZ ) ,
1399- #[ rustfmt:: skip]
1400- ver => { return Err ( BadMWAVersion { message : "unknown mwa version" . into ( ) , version : ver. to_string ( ) } ) } ,
1400+ Some ( g) if g == "jake" => {
1401+ info ! ( "passband gains: {} (mwax, not oversampled)" , g) ;
1402+ Some ( PFB_JAKE_2022_200HZ )
1403+ }
1404+ Some ( g) if g == "jake_oversampled" => {
1405+ info ! ( "passband gains: {} (mwax, oversampled)" , g) ;
1406+ Some ( OSPFB_JAKE_2025_200HZ )
1407+ }
1408+ Some ( g) if g == "cotter" => {
1409+ info ! ( "passband gains: {} (legacy)" , g) ;
1410+ Some ( PFB_COTTER_2014_10KHZ )
1411+ }
1412+ Some ( g) if g == "auto" => match ( mwa_version, oversampled) {
1413+ ( MWAVersion :: CorrMWAXv2 , false ) => {
1414+ info ! ( "passband gains: {} (mwax, not oversampled)" , g) ;
1415+ Some ( PFB_JAKE_2022_200HZ )
1416+ }
1417+ ( MWAVersion :: CorrMWAXv2 , true ) => {
1418+ info ! ( "passband gains: {} (mwax, oversampled)" , g) ;
1419+ Some ( OSPFB_JAKE_2025_200HZ )
1420+ }
1421+ ( MWAVersion :: CorrLegacy | MWAVersion :: CorrOldLegacy , _) => {
1422+ info ! ( "passband gains: {} (legacy)" , g) ;
1423+ Some ( PFB_COTTER_2014_10KHZ )
1424+ }
1425+ ( ver, _) => {
1426+ return Err ( BadMWAVersion {
1427+ message : "unknown mwa version" . into ( ) ,
1428+ version : ver. to_string ( ) ,
1429+ } )
1430+ }
14011431 } ,
14021432 Some ( option) => panic ! ( "unknown option for --passband-gains: {option}" ) ,
14031433 } ;
14041434 prep_ctx. correct_geometry = {
14051435 let geometric_delays_disabled = matches. is_present ( "no-geometric-delay" ) ;
1406- let geometric_delays_applied = meta_ctx. geometric_delays_applied ;
1407- debug ! (
1436+ info ! (
14081437 "geometric corrections: applied={:?}, disabled={}" ,
14091438 geometric_delays_applied, !geometric_delays_disabled
14101439 ) ;
@@ -1917,12 +1946,12 @@ impl<'a> BirliContext<'a> {
19171946
19181947#[ cfg( test) ]
19191948mod argparse_tests {
1920- use marlu:: RADec ;
1949+ use marlu:: { mwalib :: MWAVersion , RADec } ;
19211950
19221951 use approx:: { assert_abs_diff_eq, assert_abs_diff_ne} ;
19231952
19241953 use crate :: {
1925- passband_gains:: { PFB_COTTER_2014_10KHZ , PFB_JAKE_2022_200HZ } ,
1954+ passband_gains:: { OSPFB_JAKE_2025_200HZ , PFB_COTTER_2014_10KHZ , PFB_JAKE_2022_200HZ } ,
19261955 test_common:: { get_1254670392_avg_paths, get_mwax_data_paths} ,
19271956 BirliContext , BirliError , VisSelection ,
19281957 } ;
@@ -2021,7 +2050,7 @@ mod argparse_tests {
20212050 assert_abs_diff_ne ! ( prep_ctx. passband_gains. unwrap( ) [ 0 ] , PFB_JAKE_2022_200HZ [ 0 ] ) ;
20222051 }
20232052
2024- /// pfb gains is cotter by default for legacy correlator .
2053+ /// invalid pfb gains are rejected .
20252054 #[ test]
20262055 fn test_invalid_pfb ( ) {
20272056 let ( metafits_path, gpufits_paths) = get_1254670392_avg_paths ( ) ;
@@ -2041,6 +2070,52 @@ mod argparse_tests {
20412070 assert ! ( birli_ctx. is_err( ) ) ;
20422071 }
20432072
2073+ /// correlator version throws an error when pfb gains are auto,
2074+ /// selects oversampled pfb for oversampled ovservations.
2075+ #[ test]
2076+ fn test_corr_type_auto_pfb ( ) {
2077+ let ( metafits_path, gpufits_paths) = get_1254670392_avg_paths ( ) ;
2078+
2079+ #[ rustfmt:: skip]
2080+ let args = vec ! [
2081+ "birli" ,
2082+ "-m" , metafits_path,
2083+ "--no-draw-progress" ,
2084+ "--pfb-gains" , "auto" ,
2085+ gpufits_paths[ 0 ] ,
2086+ gpufits_paths[ 1 ] ,
2087+ ] ;
2088+
2089+ // create an initial birli context so we can give it an unfamiliar correlator version and parse again
2090+ let mut birli_ctx = BirliContext :: from_args ( & args) . unwrap ( ) ;
2091+ let matches = BirliContext :: get_matches ( & args) . unwrap ( ) ;
2092+
2093+ // case 1: invalid corr type
2094+ birli_ctx. corr_ctx . mwa_version = MWAVersion :: VCSLegacyRecombined ;
2095+ let result = BirliContext :: < ' _ > :: parse_prep_matches ( & matches, & birli_ctx. corr_ctx ) ;
2096+ assert ! ( matches!( result, Err ( BirliError :: BadMWAVersion { .. } ) ) ) ;
2097+
2098+ // case 2: mwax, oversampled
2099+ // TODO: make this its own test case, need new metafits, ideally with sigchain corrections
2100+ birli_ctx. corr_ctx . mwa_version = MWAVersion :: CorrMWAXv2 ;
2101+ birli_ctx. corr_ctx . metafits_context . oversampled = true ;
2102+ let result = BirliContext :: < ' _ > :: parse_prep_matches ( & matches, & birli_ctx. corr_ctx ) ;
2103+ assert ! ( result. is_ok( ) ) ;
2104+ assert_abs_diff_eq ! (
2105+ result. unwrap( ) . passband_gains. unwrap( ) [ 0 ..10 ] ,
2106+ OSPFB_JAKE_2025_200HZ [ 0 ..10 ]
2107+ ) ;
2108+
2109+ // case 3: mwax, not oversampled
2110+ birli_ctx. corr_ctx . metafits_context . oversampled = false ;
2111+ let result = BirliContext :: < ' _ > :: parse_prep_matches ( & matches, & birli_ctx. corr_ctx ) ;
2112+ assert ! ( result. is_ok( ) ) ;
2113+ assert_abs_diff_eq ! (
2114+ result. unwrap( ) . passband_gains. unwrap( ) [ 0 ..10 ] ,
2115+ PFB_JAKE_2022_200HZ [ 0 ..10 ]
2116+ ) ;
2117+ }
2118+
20442119 /// pfb gains is jake by default for mwax correlator.
20452120 #[ test]
20462121 fn test_auto_pfb_mwax ( ) {
0 commit comments