Skip to content

Commit 18cc4e2

Browse files
authored
oversampled pfb gains (#180)
1 parent 983db44 commit 18cc4e2

File tree

3 files changed

+6503
-20
lines changed

3 files changed

+6503
-20
lines changed

RELEASES.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
# Version 0.18.0 (unreleased)
44

5+
- ✨ new features:
6+
- oversampled pfb gains for SHAO and NI receivers, automatically applied for oversampled observations
57
- 🙏 quality of life:
68
- `correct_van_vleck`, `correct_cable_lengths`, `correct_digital_gains`, `correct_coarse_passband_gains` only applied to
79
unflagged visibilities, avoids printing hundreds of gigabytes of warnings.

src/cli.rs

Lines changed: 94 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ use prettytable::{format as prettyformat, row, table};
2121

2222
use 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)]
19191948
mod 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

Comments
 (0)