use super::*;
use float_cmp::*;
use std::path::PathBuf;
#[test]
fn test_context_new_with_only_non000_batch() {
let metafits_filename = "test_files/1244973688_1_timestep/1244973688.metafits";
let gpuboxfiles =
vec!["test_files/1244973688_1_timestep/1244973688_20190619100110_ch114_001.fits"];
let context_result = CorrelatorContext::new(metafits_filename, &gpuboxfiles);
assert!(context_result.is_ok());
let context = context_result.unwrap();
println!("{:?}", context.gpubox_time_map);
let data_result = context.read_by_baseline(10, 10);
assert!(data_result.is_ok(), "Error was {:?}", data_result);
}
#[test]
fn test_context_new_with_000_and_001_batch() {
let metafits_filename = "test_files/1244973688_1_timestep/1244973688.metafits";
let gpuboxfiles = vec![
"test_files/1244973688_1_timestep/1244973688_20190619100110_ch114_000.fits",
"test_files/1244973688_1_timestep/1244973688_20190619100110_ch114_001.fits",
];
let context_result = CorrelatorContext::new(metafits_filename, &gpuboxfiles);
assert!(context_result.is_ok());
let context = context_result.unwrap();
println!("{:?}", context.gpubox_time_map);
let data_result1 = context.read_by_baseline(0, 10);
assert!(data_result1.is_ok(), "Error was {:?}", data_result1);
let data_result2 = context.read_by_baseline(10, 10);
assert!(data_result2.is_ok(), "Error was {:?}", data_result2);
let data_result3 = context.read_by_baseline(15, 10);
assert!(matches!(
data_result3.unwrap_err(),
GpuboxError::NoDataForTimeStepCoarseChannel {
timestep_index: _,
coarse_chan_index: _
}
));
}
#[test]
fn test_context_new_missing_gpubox_files() {
let metafits_filename = "test_files/1101503312_1_timestep/1101503312.metafits";
let gpuboxfiles: Vec<PathBuf> = Vec::new();
let context = CorrelatorContext::new(metafits_filename, &gpuboxfiles);
assert!(matches!(
context.unwrap_err(),
MwalibError::Gpubox(GpuboxError::NoGpuboxes)
));
}
#[test]
fn test_context_new_invalid_metafits() {
let metafits_filename = "invalid.metafits";
let filename = "test_files/1101503312_1_timestep/1101503312_20141201210818_gpubox01_00.fits";
let gpuboxfiles = vec![filename];
let context = CorrelatorContext::new(metafits_filename, &gpuboxfiles);
assert!(context.is_err());
}
#[test]
fn test_context_legacy_v1() {
let metafits_filename = "test_files/1101503312_1_timestep/1101503312.metafits";
let filename = "test_files/1101503312_1_timestep/1101503312_20141201210818_gpubox01_00.fits";
let gpuboxfiles = vec![filename];
let context = CorrelatorContext::new(metafits_filename, &gpuboxfiles)
.expect("Failed to create mwalibContext");
assert_eq!(context.mwa_version, MWAVersion::CorrLegacy);
assert_eq!(context.common_start_unix_time_ms, 1_417_468_096_000);
assert_eq!(context.common_end_unix_time_ms, 1_417_468_098_000);
assert_eq!(context.common_duration_ms, 2000);
assert_eq!(context.common_bandwidth_hz, 1_280_000);
assert_eq!(context.num_common_coarse_chans, 1);
assert_eq!(context.common_coarse_chan_indices[0], 0);
assert_eq!(context.common_good_timestep_indices.len(), 0);
assert_eq!(context.common_good_coarse_chan_indices.len(), 0);
assert_eq!(context.provided_timestep_indices.len(), 1);
assert_eq!(context.provided_timestep_indices[0], 0);
assert_eq!(context.provided_coarse_chan_indices.len(), 1);
assert_eq!(context.provided_coarse_chan_indices[0], 0);
assert_eq!(context.num_timesteps, 56);
assert_eq!(context.timesteps[0].unix_time_ms, 1_417_468_096_000);
assert_eq!(context.coarse_chans[0].corr_chan_number, 0);
assert_eq!(context.coarse_chans[0].gpubox_number, 1);
assert_eq!(context.coarse_chans[0].rec_chan_number, 109);
assert_eq!(context.coarse_chans[0].chan_centre_hz, 139_520_000);
assert_eq!(
context.metafits_context.antennas[0].tile_id,
context.metafits_context.rf_inputs[0].tile_id
);
assert_eq!(
context.metafits_context.antennas[0].tile_id,
context.metafits_context.rf_inputs[1].tile_id
);
assert_eq!(
context.metafits_context.antennas[1].tile_id,
context.metafits_context.rf_inputs[2].tile_id
);
assert_eq!(
context.metafits_context.antennas[1].tile_id,
context.metafits_context.rf_inputs[3].tile_id
);
assert_eq!(context.metafits_context.metafits_coarse_chans.len(), 24);
assert_eq!(context.metafits_context.metafits_timesteps.len(), 56);
assert_eq!(
context.metafits_context.num_metafits_fine_chan_freqs,
24 * 128
);
assert_eq!(
context.metafits_context.num_metafits_fine_chan_freqs,
context.metafits_context.metafits_fine_chan_freqs_hz.len()
);
assert_eq!(context.bscale, 0.5);
}
#[test]
fn test_context_mwax() {
let metafits_filename = "test_files/1244973688_1_timestep/1244973688.metafits";
let filename = "test_files/1244973688_1_timestep/1244973688_20190619100110_ch114_000.fits";
let gpuboxfiles = vec![filename];
let context = CorrelatorContext::new(metafits_filename, &gpuboxfiles)
.expect("Failed to create mwalibContext");
assert_eq!(context.mwa_version, MWAVersion::CorrMWAXv2);
assert_eq!(context.common_start_unix_time_ms, 1_560_938_470_000);
assert_eq!(context.common_end_unix_time_ms, 1_560_938_471_000);
assert_eq!(context.common_duration_ms, 1000);
assert_eq!(context.common_bandwidth_hz, 1_280_000);
assert_eq!(context.num_common_coarse_chans, 1);
assert_eq!(context.common_coarse_chan_indices[0], 10);
assert_eq!(context.num_common_timesteps, 1);
assert_eq!(context.common_timestep_indices[0], 0);
assert_eq!(context.common_good_timestep_indices.len(), 0);
assert_eq!(context.common_good_coarse_chan_indices.len(), 0);
assert_eq!(context.provided_timestep_indices.len(), 1);
assert_eq!(context.provided_timestep_indices[0], 0);
assert_eq!(context.provided_coarse_chan_indices.len(), 1);
assert_eq!(context.provided_coarse_chan_indices[0], 10);
assert_eq!(context.num_timesteps, 120);
assert_eq!(context.timesteps[0].unix_time_ms, 1_560_938_470_000);
assert_eq!(context.coarse_chans[10].corr_chan_number, 10);
assert_eq!(context.coarse_chans[10].gpubox_number, 114);
assert_eq!(context.coarse_chans[10].rec_chan_number, 114);
assert_eq!(context.coarse_chans[10].chan_centre_hz, 145_920_000);
assert_eq!(
context.metafits_context.antennas[0].tile_id,
context.metafits_context.rf_inputs[0].tile_id
);
assert_eq!(
context.metafits_context.antennas[0].tile_id,
context.metafits_context.rf_inputs[1].tile_id
);
assert_eq!(
context.metafits_context.antennas[1].tile_id,
context.metafits_context.rf_inputs[2].tile_id
);
assert_eq!(
context.metafits_context.antennas[1].tile_id,
context.metafits_context.rf_inputs[3].tile_id
);
assert_eq!(context.metafits_context.metafits_coarse_chans.len(), 24);
assert_eq!(context.metafits_context.metafits_timesteps.len(), 120);
assert_eq!(
context.num_timestep_coarse_chan_weight_floats,
((128 * 129) / 2) * 4
);
assert_eq!(context.bscale, 1.0);
}
#[test]
fn test_read_by_frequency_invalid_inputs() {
let mwax_metafits_filename = "test_files/1244973688_1_timestep/1244973688.metafits";
let mwax_filename = "test_files/1244973688_1_timestep/1244973688_20190619100110_ch114_000.fits";
let gpuboxfiles = vec![mwax_filename];
let context = CorrelatorContext::new(mwax_metafits_filename, &gpuboxfiles)
.expect("Failed to create CorrelatorContext");
let result_invalid_timestep = context.read_by_frequency(99999, 10);
assert!(matches!(
result_invalid_timestep.unwrap_err(),
GpuboxError::InvalidTimeStepIndex(_)
));
let result_invalid_coarse_chan = context.read_by_frequency(0, 99999);
assert!(matches!(
result_invalid_coarse_chan.unwrap_err(),
GpuboxError::InvalidCoarseChanIndex(_)
));
let result = context.read_by_frequency(10, 0);
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
matches!(
error,
GpuboxError::NoDataForTimeStepCoarseChannel {
timestep_index: _,
coarse_chan_index: _
}
),
"Error was {:?}",
error
);
}
#[test]
fn test_read_by_baseline_invalid_inputs() {
let mwax_metafits_filename = "test_files/1244973688_1_timestep/1244973688.metafits";
let mwax_filename = "test_files/1244973688_1_timestep/1244973688_20190619100110_ch114_000.fits";
let gpuboxfiles = vec![mwax_filename];
let context = CorrelatorContext::new(mwax_metafits_filename, &gpuboxfiles)
.expect("Failed to create CorrelatorContext");
let result_invalid_timestep = context.read_by_baseline(99999, 10);
assert!(matches!(
result_invalid_timestep.unwrap_err(),
GpuboxError::InvalidTimeStepIndex(_)
));
let result_invalid_coarse_chan = context.read_by_baseline(0, 99999);
assert!(matches!(
result_invalid_coarse_chan.unwrap_err(),
GpuboxError::InvalidCoarseChanIndex(_)
));
let result = context.read_by_baseline(10, 0);
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
matches!(
error,
GpuboxError::NoDataForTimeStepCoarseChannel {
timestep_index: _,
coarse_chan_index: _
}
),
"Error was {:?}",
error
);
}
#[test]
fn test_mwa_legacy_read() {
let mwax_metafits_filename = "test_files/1101503312_1_timestep/1101503312.metafits";
let mwax_filename =
"test_files/1101503312_1_timestep/1101503312_20141201210818_gpubox01_00.fits";
let gpuboxfiles = vec![mwax_filename];
let context = CorrelatorContext::new(mwax_metafits_filename, &gpuboxfiles)
.expect("Failed to create CorrelatorContext");
let mwalib_hdu_data_by_bl: Vec<f32> = context.read_by_baseline(0, 0).expect("Error!");
let mwalib_hdu_data_by_freq: Vec<f32> = context.read_by_frequency(0, 0).expect("Error!");
let sum_freq: f64 = mwalib_hdu_data_by_freq
.iter()
.fold(0., |sum, x| sum + *x as f64);
let sum_bl: f64 = mwalib_hdu_data_by_bl
.iter()
.fold(0., |sum, x| sum + *x as f64);
assert!(approx_eq!(f64, sum_bl, sum_freq, F64Margin::default()));
}
#[test]
fn test_mwax_read() {
let mwax_metafits_filename = "test_files/1244973688_1_timestep/1244973688.metafits";
let mwax_filename = "test_files/1244973688_1_timestep/1244973688_20190619100110_ch114_000.fits";
let mut fptr = fits_open!(&mwax_filename).unwrap();
let fits_hdu = fits_open_hdu!(&mut fptr, 1).unwrap();
let fits_hdu_data: Vec<f32> = get_fits_image!(&mut fptr, &fits_hdu).unwrap();
let gpuboxfiles = vec![mwax_filename];
let context = CorrelatorContext::new(mwax_metafits_filename, &gpuboxfiles)
.expect("Failed to create CorrelatorContext");
let mwalib_hdu_data_by_bl: Vec<f32> = context.read_by_baseline(0, 10).expect("Error!");
let mwalib_hdu_data_by_freq: Vec<f32> = context.read_by_frequency(0, 10).expect("Error!");
assert_eq!(fits_hdu_data.len(), mwalib_hdu_data_by_bl.len());
assert_eq!(fits_hdu_data.len(), mwalib_hdu_data_by_freq.len());
let sum_fits: f64 = fits_hdu_data.iter().fold(0., |sum, x| sum + *x as f64);
let sum_freq: f64 = mwalib_hdu_data_by_freq
.iter()
.fold(0., |sum, x| sum + *x as f64);
let sum_bl: f64 = mwalib_hdu_data_by_bl
.iter()
.fold(0., |sum, x| sum + *x as f64);
assert_eq!(
approx_eq!(f64, sum_fits, sum_freq, F64Margin::default()),
approx_eq!(f64, sum_fits, sum_bl, F64Margin::default())
);
assert_eq!(fits_hdu_data, mwalib_hdu_data_by_bl);
}
#[test]
fn test_validate_first_hdu() {
let metafits_filename = "test_files/1101503312_1_timestep/1101503312.metafits";
let filename = "test_files/1101503312_1_timestep/1101503312_20141201210818_gpubox01_00.fits";
let gpuboxfiles = vec![filename];
let context = CorrelatorContext::new(metafits_filename, &gpuboxfiles)
.expect("Failed to create CorrelatorContext");
let coarse_chan = context.coarse_chans[0].gpubox_number;
let (batch_index, _) =
context.gpubox_time_map[&context.timesteps[0].unix_time_ms][&coarse_chan];
let mut fptr =
fits_open!(&context.gpubox_batches[batch_index].gpubox_files[0].filename).unwrap();
let result_valid = CorrelatorContext::validate_first_hdu(
context.mwa_version,
context.metafits_context.num_corr_fine_chans_per_coarse,
context.metafits_context.num_baselines,
context.metafits_context.num_visibility_pols,
&mut fptr,
);
let result_invalid1 = CorrelatorContext::validate_first_hdu(
context.mwa_version,
context.metafits_context.num_corr_fine_chans_per_coarse + 1,
context.metafits_context.num_baselines,
context.metafits_context.num_visibility_pols,
&mut fptr,
);
let result_invalid2 = CorrelatorContext::validate_first_hdu(
context.mwa_version,
context.metafits_context.num_corr_fine_chans_per_coarse,
context.metafits_context.num_baselines + 1,
context.metafits_context.num_visibility_pols,
&mut fptr,
);
let result_invalid3 = CorrelatorContext::validate_first_hdu(
context.mwa_version,
context.metafits_context.num_corr_fine_chans_per_coarse,
context.metafits_context.num_baselines,
context.metafits_context.num_visibility_pols + 1,
&mut fptr,
);
assert!(result_valid.is_ok());
assert!(result_invalid1.is_err());
assert!(result_invalid2.is_err());
assert!(result_invalid3.is_err());
}
#[test]
fn test_validate_hdu_axes_good() {
let metafits_fine_chans_per_coarse = 128;
let metafits_baselines = 8256;
let visibility_pols = 4;
let result_good1 = CorrelatorContext::validate_hdu_axes(
MWAVersion::CorrOldLegacy,
metafits_fine_chans_per_coarse,
metafits_baselines,
visibility_pols,
8256 * 4 * 2,
128,
);
assert!(result_good1.is_ok());
let result_good2 = CorrelatorContext::validate_hdu_axes(
MWAVersion::CorrLegacy,
metafits_fine_chans_per_coarse,
metafits_baselines,
visibility_pols,
8256 * 4 * 2,
128,
);
assert!(result_good2.is_ok());
let result_good3 = CorrelatorContext::validate_hdu_axes(
MWAVersion::CorrMWAXv2,
metafits_fine_chans_per_coarse,
metafits_baselines,
visibility_pols,
128 * 4 * 2,
8256,
);
assert!(result_good3.is_ok());
}
#[test]
fn test_validate_hdu_axes_naxis_mismatches_oldlegacy() {
let metafits_fine_chans_per_coarse = 128;
let metafits_baselines = 8256;
let visibility_pols = 4;
let values = 1;
let result_bad1 = CorrelatorContext::validate_hdu_axes(
MWAVersion::CorrOldLegacy,
metafits_fine_chans_per_coarse,
metafits_baselines,
visibility_pols,
metafits_baselines * visibility_pols * values,
128,
);
assert!(matches!(
result_bad1.unwrap_err(),
GpuboxError::LegacyNaxis1Mismatch {
metafits_baselines: _,
visibility_pols: _,
naxis1: _,
naxis2: _,
calculated_naxis1: _
}
));
let result_bad2 = CorrelatorContext::validate_hdu_axes(
MWAVersion::CorrOldLegacy,
metafits_fine_chans_per_coarse,
metafits_baselines,
visibility_pols,
8256 * 4 * 2,
129,
);
assert!(matches!(
result_bad2.unwrap_err(),
GpuboxError::LegacyNaxis2Mismatch {
metafits_fine_chans_per_coarse: _,
naxis2: _,
calculated_naxis2: _
}
));
}
#[test]
fn test_validate_hdu_axes_naxis_mismatches_legacy() {
let metafits_fine_chans_per_coarse = 128;
let metafits_baselines = 8256;
let visibility_pols = 4;
let values = 1;
let result_bad1 = CorrelatorContext::validate_hdu_axes(
MWAVersion::CorrLegacy,
metafits_fine_chans_per_coarse,
metafits_baselines,
visibility_pols,
metafits_baselines * visibility_pols * values,
128,
);
assert!(matches!(
result_bad1.unwrap_err(),
GpuboxError::LegacyNaxis1Mismatch {
metafits_baselines: _,
visibility_pols: _,
naxis1: _,
naxis2: _,
calculated_naxis1: _
}
));
let result_bad2 = CorrelatorContext::validate_hdu_axes(
MWAVersion::CorrLegacy,
metafits_fine_chans_per_coarse,
metafits_baselines,
visibility_pols,
8256 * 4 * 2,
129,
);
assert!(matches!(
result_bad2.unwrap_err(),
GpuboxError::LegacyNaxis2Mismatch {
metafits_fine_chans_per_coarse: _,
naxis2: _,
calculated_naxis2: _
}
));
}
#[test]
fn test_validate_hdu_axes_naxis_mismatches_v2() {
let metafits_fine_chans_per_coarse = 128;
let metafits_baselines = 8256;
let visibility_pols = 4;
let values = 2;
let result_bad1 = CorrelatorContext::validate_hdu_axes(
MWAVersion::CorrMWAXv2,
metafits_fine_chans_per_coarse,
metafits_baselines,
visibility_pols,
metafits_fine_chans_per_coarse * visibility_pols,
8256,
);
assert!(matches!(
result_bad1.unwrap_err(),
GpuboxError::MwaxNaxis1Mismatch {
metafits_fine_chans_per_coarse: _,
visibility_pols: _,
naxis1: _,
naxis2: _,
calculated_naxis1: _
}
));
let result_bad2 = CorrelatorContext::validate_hdu_axes(
MWAVersion::CorrMWAXv2,
metafits_fine_chans_per_coarse,
metafits_baselines,
visibility_pols,
metafits_fine_chans_per_coarse * visibility_pols * values,
8257,
);
assert!(matches!(
result_bad2.unwrap_err(),
GpuboxError::MwaxNaxis2Mismatch {
metafits_baselines: _,
naxis2: _,
calculated_naxis2: _
}
));
}
#[test]
fn test_read_by_baseline_into_buffer_mwax() {
let mwax_metafits_filename = "test_files/1244973688_1_timestep/1244973688.metafits";
let mwax_filename = "test_files/1244973688_1_timestep/1244973688_20190619100110_ch114_000.fits";
let gpuboxfiles = vec![mwax_filename];
let context = CorrelatorContext::new(mwax_metafits_filename, &gpuboxfiles)
.expect("Failed to create CorrelatorContext");
let mwalib_hdu_data_by_bl: Vec<f32> = context.read_by_baseline(0, 10).expect("Error!");
let mwalib_hdu_data_by_freq: Vec<f32> = context.read_by_frequency(0, 10).expect("Error!");
let mut mwalib_hdu_data_by_bl2: Vec<f32> = vec![0.; context.num_timestep_coarse_chan_floats];
let result_read_bl_buffer =
context.read_by_baseline_into_buffer(0, 10, &mut mwalib_hdu_data_by_bl2);
assert!(result_read_bl_buffer.is_ok());
let sum_freq: f64 = mwalib_hdu_data_by_freq
.iter()
.fold(0., |sum, x| sum + *x as f64);
let sum_bl: f64 = mwalib_hdu_data_by_bl
.iter()
.fold(0., |sum, x| sum + *x as f64);
let sum_bl2: f64 = mwalib_hdu_data_by_bl2
.iter()
.fold(0., |sum, x| sum + *x as f64);
assert!(!approx_eq!(f64, sum_freq, 0., F64Margin::default()));
assert!(!approx_eq!(f64, sum_bl, 0., F64Margin::default()));
assert!(!approx_eq!(f64, sum_bl2, 0., F64Margin::default()));
assert!(approx_eq!(f64, sum_bl, sum_freq, F64Margin::default()));
assert!(approx_eq!(f64, sum_bl, sum_bl2, F64Margin::default()));
let result = context.read_by_baseline_into_buffer(10, 0, &mut mwalib_hdu_data_by_bl2);
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
matches!(
error,
GpuboxError::NoDataForTimeStepCoarseChannel {
timestep_index: _,
coarse_chan_index: _
}
),
"Error was {:?}",
error
);
let result = context.read_by_baseline_into_buffer(999, 10, &mut mwalib_hdu_data_by_bl2);
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
matches!(error, GpuboxError::InvalidTimeStepIndex(119)),
"Error was {:?}",
error
);
let result = context.read_by_baseline_into_buffer(0, 999, &mut mwalib_hdu_data_by_bl2);
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
matches!(error, GpuboxError::InvalidCoarseChanIndex(23)),
"Error was {:?}",
error
);
}
#[test]
fn test_read_by_frequency_into_buffer_mwax() {
let mwax_metafits_filename = "test_files/1244973688_1_timestep/1244973688.metafits";
let mwax_filename = "test_files/1244973688_1_timestep/1244973688_20190619100110_ch114_000.fits";
let gpuboxfiles = vec![mwax_filename];
let context = CorrelatorContext::new(mwax_metafits_filename, &gpuboxfiles)
.expect("Failed to create CorrelatorContext");
let mwalib_hdu_data_by_bl: Vec<f32> = context.read_by_baseline(0, 10).expect("Error!");
let mwalib_hdu_data_by_freq: Vec<f32> = context.read_by_frequency(0, 10).expect("Error!");
let mut mwalib_hdu_data_by_freq2: Vec<f32> = vec![0.; context.num_timestep_coarse_chan_floats];
let result_read_bl_buffer =
context.read_by_frequency_into_buffer(0, 10, &mut mwalib_hdu_data_by_freq2);
assert!(result_read_bl_buffer.is_ok());
let sum_bl: f64 = mwalib_hdu_data_by_bl
.iter()
.fold(0., |sum, x| sum + *x as f64);
let sum_freq: f64 = mwalib_hdu_data_by_freq
.iter()
.fold(0., |sum, x| sum + *x as f64);
let sum_freq2: f64 = mwalib_hdu_data_by_freq2
.iter()
.fold(0., |sum, x| sum + *x as f64);
assert!(!approx_eq!(f64, sum_bl, 0., F64Margin::default()));
assert!(!approx_eq!(f64, sum_freq, 0., F64Margin::default()));
assert!(!approx_eq!(f64, sum_freq2, 0., F64Margin::default()));
assert!(approx_eq!(f64, sum_bl, sum_freq, F64Margin::default()));
assert!(approx_eq!(f64, sum_freq, sum_freq2, F64Margin::default()));
let result = context.read_by_frequency_into_buffer(10, 0, &mut mwalib_hdu_data_by_freq2);
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
matches!(
error,
GpuboxError::NoDataForTimeStepCoarseChannel {
timestep_index: _,
coarse_chan_index: _
}
),
"Error was {:?}",
error
);
let result = context.read_by_frequency_into_buffer(999, 10, &mut mwalib_hdu_data_by_freq2);
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
matches!(error, GpuboxError::InvalidTimeStepIndex(119)),
"Error was {:?}",
error
);
let result = context.read_by_frequency_into_buffer(0, 999, &mut mwalib_hdu_data_by_freq2);
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
matches!(error, GpuboxError::InvalidCoarseChanIndex(23)),
"Error was {:?}",
error
);
}
#[test]
fn test_read_by_baseline_into_buffer_legacy() {
let mwax_metafits_filename = "test_files/1101503312_1_timestep/1101503312.metafits";
let mwax_filename =
"test_files/1101503312_1_timestep/1101503312_20141201210818_gpubox01_00.fits";
let gpuboxfiles = vec![mwax_filename];
let context = CorrelatorContext::new(mwax_metafits_filename, &gpuboxfiles)
.expect("Failed to create CorrelatorContext");
let mwalib_hdu_data_by_bl: Vec<f32> = context.read_by_baseline(0, 0).expect("Error!");
let mwalib_hdu_data_by_freq: Vec<f32> = context.read_by_frequency(0, 0).expect("Error!");
let mut mwalib_hdu_data_by_bl2: Vec<f32> = vec![0.; context.num_timestep_coarse_chan_floats];
let result_read_bl_buffer =
context.read_by_baseline_into_buffer(0, 0, &mut mwalib_hdu_data_by_bl2);
assert!(result_read_bl_buffer.is_ok());
let sum_freq: f64 = mwalib_hdu_data_by_freq
.iter()
.fold(0., |sum, x| sum + *x as f64);
let sum_bl: f64 = mwalib_hdu_data_by_bl
.iter()
.fold(0., |sum, x| sum + *x as f64);
let sum_bl2: f64 = mwalib_hdu_data_by_bl2
.iter()
.fold(0., |sum, x| sum + *x as f64);
assert!(!approx_eq!(f64, sum_freq, 0., F64Margin::default()));
assert!(!approx_eq!(f64, sum_bl, 0., F64Margin::default()));
assert!(!approx_eq!(f64, sum_bl2, 0., F64Margin::default()));
assert!(approx_eq!(f64, sum_bl, sum_freq, F64Margin::default()));
assert!(approx_eq!(f64, sum_bl, sum_bl2, F64Margin::default()));
let result = context.read_by_baseline_into_buffer(10, 10, &mut mwalib_hdu_data_by_bl2);
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
matches!(
error,
GpuboxError::NoDataForTimeStepCoarseChannel {
timestep_index: _,
coarse_chan_index: _
}
),
"Error was {:?}",
error
);
let result = context.read_by_baseline_into_buffer(999, 0, &mut mwalib_hdu_data_by_bl2);
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
matches!(error, GpuboxError::InvalidTimeStepIndex(55)),
"Error was {:?}",
error
);
let result = context.read_by_baseline_into_buffer(0, 999, &mut mwalib_hdu_data_by_bl2);
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
matches!(error, GpuboxError::InvalidCoarseChanIndex(23)),
"Error was {:?}",
error
);
}
#[test]
fn test_read_by_frequency_into_buffer_legacy() {
let mwax_metafits_filename = "test_files/1101503312_1_timestep/1101503312.metafits";
let mwax_filename =
"test_files/1101503312_1_timestep/1101503312_20141201210818_gpubox01_00.fits";
let gpuboxfiles = vec![mwax_filename];
let context = CorrelatorContext::new(mwax_metafits_filename, &gpuboxfiles)
.expect("Failed to create CorrelatorContext");
let mwalib_hdu_data_by_bl: Vec<f32> = context.read_by_baseline(0, 0).expect("Error!");
let mwalib_hdu_data_by_freq: Vec<f32> = context.read_by_frequency(0, 0).expect("Error!");
let mut mwalib_hdu_data_by_freq2: Vec<f32> = vec![0.; context.num_timestep_coarse_chan_floats];
let result_read_bl_buffer =
context.read_by_frequency_into_buffer(0, 0, &mut mwalib_hdu_data_by_freq2);
assert!(result_read_bl_buffer.is_ok());
let sum_bl: f64 = mwalib_hdu_data_by_bl
.iter()
.fold(0., |sum, x| sum + *x as f64);
let sum_freq: f64 = mwalib_hdu_data_by_freq
.iter()
.fold(0., |sum, x| sum + *x as f64);
let sum_freq2: f64 = mwalib_hdu_data_by_freq2
.iter()
.fold(0., |sum, x| sum + *x as f64);
assert!(!approx_eq!(f64, sum_bl, 0., F64Margin::default()));
assert!(!approx_eq!(f64, sum_freq, 0., F64Margin::default()));
assert!(!approx_eq!(f64, sum_freq2, 0., F64Margin::default()));
assert!(approx_eq!(f64, sum_bl, sum_freq, F64Margin::default()));
assert!(approx_eq!(f64, sum_freq, sum_freq2, F64Margin::default()));
let result = context.read_by_frequency_into_buffer(10, 10, &mut mwalib_hdu_data_by_freq2);
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
matches!(
error,
GpuboxError::NoDataForTimeStepCoarseChannel {
timestep_index: _,
coarse_chan_index: _
}
),
"Error was {:?}",
error
);
let result = context.read_by_frequency_into_buffer(999, 0, &mut mwalib_hdu_data_by_freq2);
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
matches!(error, GpuboxError::InvalidTimeStepIndex(55)),
"Error was {:?}",
error
);
let result = context.read_by_frequency_into_buffer(0, 999, &mut mwalib_hdu_data_by_freq2);
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
matches!(error, GpuboxError::InvalidCoarseChanIndex(23)),
"Error was {:?}",
error
);
}
#[test]
fn test_get_fits_filename_and_batch_and_hdu() {
let mwax_metafits_filename = "test_files/1101503312_1_timestep/1101503312.metafits";
let mwax_filename =
"test_files/1101503312_1_timestep/1101503312_20141201210818_gpubox01_00.fits";
let gpuboxfiles = vec![mwax_filename];
let context = CorrelatorContext::new(mwax_metafits_filename, &gpuboxfiles)
.expect("Failed to create CorrelatorContext");
let result = context.get_fits_filename_and_batch_and_hdu(0, 0);
assert!(result.is_ok());
let result = context.get_fits_filename_and_batch_and_hdu(999, 0);
let error = result.unwrap_err();
assert!(
matches!(error, GpuboxError::InvalidTimeStepIndex(55)),
"Error was {:?}",
error
);
let result = context.get_fits_filename_and_batch_and_hdu(0, 999);
let error = result.unwrap_err();
assert!(
matches!(error, GpuboxError::InvalidCoarseChanIndex(23)),
"Error was {:?}",
error
);
let result = context.get_fits_filename_and_batch_and_hdu(10, 0);
let error = result.unwrap_err();
assert!(
matches!(
error,
GpuboxError::NoDataForTimeStepCoarseChannel {
timestep_index: _,
coarse_chan_index: _
}
),
"Error was {:?}",
error
);
let result = context.get_fits_filename_and_batch_and_hdu(0, 10);
let error = result.unwrap_err();
assert!(
matches!(
error,
GpuboxError::NoDataForTimeStepCoarseChannel {
timestep_index: _,
coarse_chan_index: _
}
),
"Error was {:?}",
error
);
}
#[test]
fn test_context_legacy_v1_get_fine_chan_feqs_one_coarse_chan() {
let metafits_filename = "test_files/1101503312_1_timestep/1101503312.metafits";
let filename = "test_files/1101503312_1_timestep/1101503312_20141201210818_gpubox01_00.fits";
let gpuboxfiles = vec![filename];
let context = CorrelatorContext::new(metafits_filename, &gpuboxfiles)
.expect("Failed to create mwalibContext");
let coarse_channels: Vec<usize> = vec![0];
let fine_chan_freqs: Vec<f64> = context.get_fine_chan_freqs_hz_array(&coarse_channels);
assert_eq!(fine_chan_freqs.len(), 128);
assert!(approx_eq!(
f64,
fine_chan_freqs[0],
138_880_000.0,
F64Margin::default()
));
}
#[test]
fn test_context_legacy_v1_get_fine_chan_feqs_some_coarse_chans() {
let metafits_filename = "test_files/1101503312_1_timestep/1101503312.metafits";
let filename = "test_files/1101503312_1_timestep/1101503312_20141201210818_gpubox01_00.fits";
let gpuboxfiles = vec![filename];
let context = CorrelatorContext::new(metafits_filename, &gpuboxfiles)
.expect("Failed to create mwalibContext");
let coarse_channels: Vec<usize> = vec![10, 20];
let fine_chan_freqs: Vec<f64> = context.get_fine_chan_freqs_hz_array(&coarse_channels);
assert_eq!(fine_chan_freqs.len(), 256);
assert!(approx_eq!(
f64,
fine_chan_freqs[0],
151_680_000.0,
F64Margin::default()
));
assert!(
approx_eq!(
f64,
fine_chan_freqs[128],
164_480_000.0,
F64Margin::default()
),
"calc value: {}",
fine_chan_freqs[128]
);
}
#[test]
fn test_read_weights_by_baseline_invalid_inputs() {
let mwax_metafits_filename = "test_files/1244973688_1_timestep/1244973688.metafits";
let mwax_filename = "test_files/1244973688_1_timestep/1244973688_20190619100110_ch114_000.fits";
let gpuboxfiles = vec![mwax_filename];
let context = CorrelatorContext::new(mwax_metafits_filename, &gpuboxfiles)
.expect("Failed to create CorrelatorContext");
let result_invalid_timestep = context.read_by_baseline(99999, 10);
assert!(matches!(
result_invalid_timestep.unwrap_err(),
GpuboxError::InvalidTimeStepIndex(_)
));
let result_invalid_coarse_chan = context.read_by_baseline(0, 99999);
assert!(matches!(
result_invalid_coarse_chan.unwrap_err(),
GpuboxError::InvalidCoarseChanIndex(_)
));
let result = context.read_weights_by_baseline(10, 0);
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
matches!(
error,
GpuboxError::NoDataForTimeStepCoarseChannel {
timestep_index: _,
coarse_chan_index: _
}
),
"Error was {:?}",
error
);
}
#[test]
fn test_read_weights_by_baseline_into_buffer_legacy() {
let mwax_metafits_filename = "test_files/1101503312_1_timestep/1101503312.metafits";
let mwax_filename =
"test_files/1101503312_1_timestep/1101503312_20141201210818_gpubox01_00.fits";
let gpuboxfiles = vec![mwax_filename];
let context = CorrelatorContext::new(mwax_metafits_filename, &gpuboxfiles)
.expect("Failed to create CorrelatorContext");
let mut mwalib_hdu_weights_by_bl1: Vec<f32> =
vec![0.; context.num_timestep_coarse_chan_weight_floats];
let result_read_bl_buffer =
context.read_weights_by_baseline_into_buffer(0, 0, &mut mwalib_hdu_weights_by_bl1);
assert!(result_read_bl_buffer.is_ok());
let mwalib_hdu_weights_by_bl2_result = context.read_weights_by_baseline(0, 0);
assert!(mwalib_hdu_weights_by_bl2_result.is_ok());
let mwalib_hdu_weights_by_bl2 = mwalib_hdu_weights_by_bl2_result.unwrap();
let expected_weights_by_bl: Vec<f32> =
vec![1.0; context.num_timestep_coarse_chan_weight_floats];
assert_eq!(mwalib_hdu_weights_by_bl1, expected_weights_by_bl);
assert_eq!(mwalib_hdu_weights_by_bl2, expected_weights_by_bl);
}
#[test]
fn test_read_weights_by_baseline_into_buffer_mwax() {
let mwax_metafits_filename = "test_files/1244973688_1_timestep/1244973688.metafits";
let mwax_filename = "test_files/1244973688_1_timestep/1244973688_20190619100110_ch114_000.fits";
let gpuboxfiles = vec![mwax_filename];
let context = CorrelatorContext::new(mwax_metafits_filename, &gpuboxfiles)
.expect("Failed to create CorrelatorContext");
assert_eq!(8256 * 4, context.num_timestep_coarse_chan_weight_floats);
let mut mwalib_hdu_weights_by_bl1: Vec<f32> =
vec![0.; context.num_timestep_coarse_chan_weight_floats];
let result_read_bl_buffer =
context.read_weights_by_baseline_into_buffer(0, 10, &mut mwalib_hdu_weights_by_bl1);
assert!(result_read_bl_buffer.is_ok());
let mwalib_hdu_weights_by_bl2_result = context.read_weights_by_baseline(0, 10);
assert!(mwalib_hdu_weights_by_bl2_result.is_ok());
let mwalib_hdu_weights_by_bl2 = mwalib_hdu_weights_by_bl2_result.unwrap();
let expected_weights_by_bl: Vec<f32> =
vec![1.0; context.num_timestep_coarse_chan_weight_floats];
assert_eq!(mwalib_hdu_weights_by_bl1, expected_weights_by_bl);
assert_eq!(mwalib_hdu_weights_by_bl2, expected_weights_by_bl);
}