From 63f2a7553d550c8d5294f63949f2c06289b819dc Mon Sep 17 00:00:00 2001 From: Greg Sleap Date: Thu, 17 Aug 2023 11:11:54 +1000 Subject: [PATCH] Refactored voltage context tests, add more oversampling support, updated CI --- .github/workflows/coverage.yml | 2 +- .github/workflows/releases.yml | 2 +- .github/workflows/test_linux.yml | 2 +- .github/workflows/test_macos.yml | 2 +- .gitignore | 3 + src/ffi/test.rs | 54 +- src/metafits_context/mod.rs | 8 + src/voltage_context/mod.rs | 23 +- src/voltage_context/test.rs | 491 +++++++++++------- .../1101503312_mwax_vcs/1101503312.metafits | 1 + test_files/1101503312_mwax_vcs/README.md | 1 + test_files/1101503312_vcs/1101503312.metafits | 1 + .../1101503312_vcs/1101503312.metafits128 | 35 ++ test_files/1101503312_vcs/README.md | 2 + .../1370755832_metafits.fits | 1 + test_files/1370755832_mwax_vcs_os/README.md | 1 + 16 files changed, 400 insertions(+), 229 deletions(-) create mode 100644 test_files/1101503312_mwax_vcs/1101503312.metafits create mode 100644 test_files/1101503312_mwax_vcs/README.md create mode 100644 test_files/1101503312_vcs/1101503312.metafits create mode 100644 test_files/1101503312_vcs/1101503312.metafits128 create mode 100644 test_files/1101503312_vcs/README.md create mode 100644 test_files/1370755832_mwax_vcs_os/1370755832_metafits.fits create mode 100644 test_files/1370755832_mwax_vcs_os/README.md diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index d9b8b93..dad0e34 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -11,7 +11,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install dependencies run: | diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index aed2ca9..18d7182 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install stable toolchain uses: actions-rs/toolchain@v1 diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml index 3077d4a..8e01f32 100644 --- a/.github/workflows/test_linux.yml +++ b/.github/workflows/test_linux.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install stable toolchain uses: actions-rs/toolchain@v1 diff --git a/.github/workflows/test_macos.yml b/.github/workflows/test_macos.yml index 144b76b..b59e982 100644 --- a/.github/workflows/test_macos.yml +++ b/.github/workflows/test_macos.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install stable toolchain uses: actions-rs/toolchain@v1 diff --git a/.gitignore b/.gitignore index bb9caae..102f930 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,6 @@ include/ /test_files/1101503312_1_timestep/*.sub /test_files/1101503312_1_timestep/*.dat ccov.zip +/test_files/1101503312_mwax_vcs/*.sub +/test_files/1101503312_vcs/*.dat +/test_files/1370755832_mwax_vcs_os/*.sub \ No newline at end of file diff --git a/src/ffi/test.rs b/src/ffi/test.rs index 062ccb9..84777e6 100644 --- a/src/ffi/test.rs +++ b/src/ffi/test.rs @@ -168,7 +168,8 @@ fn get_test_ffi_correlator_context_mwax() -> *mut CorrelatorContext { /// /// # Arguments /// -/// * None +/// * 'mwa_version' - Enum of the type of MWA data +/// * 'oversampled' - bool - is this an oversampled observation (oversampled only applies to MWAXVCSv2) /// /// /// # Returns @@ -176,14 +177,9 @@ fn get_test_ffi_correlator_context_mwax() -> *mut CorrelatorContext { /// * a raw pointer to an instantiated VoltageContext for the test metafits and voltage file /// #[cfg(test)] -fn get_test_ffi_voltage_context(mwa_version: MWAVersion) -> *mut VoltageContext { +fn get_test_ffi_voltage_context(mwa_version: MWAVersion, oversampled: bool) -> *mut VoltageContext { // This returns a a valid voltage context - let mut context = get_test_voltage_context(mwa_version); - - // - // In order for our smaller voltage files to work with this test we need to reset the voltage_block_size_bytes - // - context.voltage_block_size_bytes /= 128; + let context = get_test_voltage_context(mwa_version, oversampled); Box::into_raw(Box::new(context)) } @@ -1162,13 +1158,12 @@ fn test_mwalib_voltage_context_new_valid_mwaxv2() { let error_message = CString::new(" ".repeat(error_len)).unwrap(); let error_message_ptr = error_message.as_ptr() as *const c_char; - let metafits_file = - CString::new("test_files/1101503312_1_timestep/1101503312.metafits").unwrap(); + let metafits_file = CString::new("test_files/1101503312_mwax_vcs/1101503312.metafits").unwrap(); let metafits_file_ptr = metafits_file.as_ptr(); // Setup files let created_voltage_files = - voltage_context::test::get_test_voltage_files(MWAVersion::VCSMWAXv2); + voltage_context::test::get_test_voltage_files(MWAVersion::VCSMWAXv2, false); let voltage_file = CString::new(created_voltage_files[0].clone()).unwrap(); let voltage_files: Vec<*const c_char> = vec![voltage_file.as_ptr()]; @@ -1221,12 +1216,12 @@ fn test_mwalib_voltage_context_new_invalid() { let error_message_ptr = error_message.as_ptr() as *const c_char; let metafits_file = - CString::new("test_files/1101503312_1_timestep/invalid_filename.metafits").unwrap(); + CString::new("test_files/1101503312_mwax_vcs/invalid_filename.metafits").unwrap(); let metafits_file_ptr = metafits_file.as_ptr(); // Setup files let created_voltage_files = - voltage_context::test::get_test_voltage_files(MWAVersion::VCSMWAXv2); + voltage_context::test::get_test_voltage_files(MWAVersion::VCSMWAXv2, false); let voltage_file = CString::new(created_voltage_files[0].clone()).unwrap(); let voltage_files: Vec<*const c_char> = vec![voltage_file.as_ptr()]; @@ -1265,7 +1260,7 @@ fn test_mwalib_voltage_context_new_invalid() { #[test] fn test_mwalib_voltage_context_display() { let voltage_context_ptr: *mut VoltageContext = - get_test_ffi_voltage_context(MWAVersion::VCSLegacyRecombined); + get_test_ffi_voltage_context(MWAVersion::VCSLegacyRecombined, false); let error_len: size_t = 128; let error_message = CString::new(" ".repeat(error_len)).unwrap(); @@ -1298,7 +1293,7 @@ fn test_mwalib_voltage_context_display_null_ptr() { #[test] fn test_mwalib_voltage_context_legacy_read_file_valid() { let voltage_context_ptr: *mut VoltageContext = - get_test_ffi_voltage_context(MWAVersion::VCSLegacyRecombined); + get_test_ffi_voltage_context(MWAVersion::VCSLegacyRecombined, false); let error_message_length: size_t = 128; let error_message = CString::new(" ".repeat(error_message_length)).unwrap(); @@ -1308,7 +1303,7 @@ fn test_mwalib_voltage_context_legacy_read_file_valid() { let coarse_chan_index = 14; // 2 pols x 128 fine chans x 1 tile * 10000 samples - let buffer_len = 2 * 128 * 10000; + let buffer_len = 2 * 128 * 1 * 10000; unsafe { let in_buffer: Vec = vec![0; buffer_len]; @@ -1383,8 +1378,9 @@ fn test_mwalib_voltage_context_legacy_read_file_valid() { #[test] fn test_mwalib_voltage_context_mwaxv2_read_file_valid() { + // Read data from a critically sampled MWAXv2 VCS obs let voltage_context_ptr: *mut VoltageContext = - get_test_ffi_voltage_context(MWAVersion::VCSMWAXv2); + get_test_ffi_voltage_context(MWAVersion::VCSMWAXv2, false); let error_message_length: size_t = 128; let error_message = CString::new(" ".repeat(error_message_length)).unwrap(); @@ -1477,7 +1473,7 @@ fn test_mwalib_voltage_context_mwaxv2_read_file_valid() { #[test] fn test_mwalib_voltage_context_get_fine_chan_freqs_hz_array_valid() { let voltage_context_ptr: *mut VoltageContext = - get_test_ffi_voltage_context(MWAVersion::VCSLegacyRecombined); + get_test_ffi_voltage_context(MWAVersion::VCSLegacyRecombined, false); let error_message_length: size_t = 128; let error_message = CString::new(" ".repeat(error_message_length)).unwrap(); @@ -1523,7 +1519,7 @@ fn test_mwalib_voltage_context_get_fine_chan_freqs_hz_array_valid() { #[test] fn test_mwalib_voltage_context_get_fine_chan_freqs_hz_array_invalid_buffer_len() { let voltage_context_ptr: *mut VoltageContext = - get_test_ffi_voltage_context(MWAVersion::VCSLegacyRecombined); + get_test_ffi_voltage_context(MWAVersion::VCSLegacyRecombined, false); let error_message_length: size_t = 128; let error_message = CString::new(" ".repeat(error_message_length)).unwrap(); @@ -1610,7 +1606,7 @@ fn test_mwalib_voltage_context_get_fine_chan_freqs_hz_array_null_context() { #[test] fn test_mwalib_voltage_context_get_fine_chan_freqs_hz_array_null_coarse_chans() { let voltage_context_ptr: *mut VoltageContext = - get_test_ffi_voltage_context(MWAVersion::VCSLegacyRecombined); + get_test_ffi_voltage_context(MWAVersion::VCSLegacyRecombined, false); let error_message_length: size_t = 128; let error_message = CString::new(" ".repeat(error_message_length)).unwrap(); @@ -1643,7 +1639,7 @@ fn test_mwalib_voltage_context_get_fine_chan_freqs_hz_array_null_coarse_chans() #[test] fn test_mwalib_voltage_context_get_fine_chan_freqs_hz_array_null_buffer() { let voltage_context_ptr: *mut VoltageContext = - get_test_ffi_voltage_context(MWAVersion::VCSLegacyRecombined); + get_test_ffi_voltage_context(MWAVersion::VCSLegacyRecombined, false); let error_message_length: size_t = 128; let error_message = CString::new(" ".repeat(error_message_length)).unwrap(); @@ -2019,7 +2015,7 @@ fn test_mwalib_metafits_metadata_get_from_voltage_context_valid() { unsafe { // Create a VoltageContext let voltage_context_ptr: *mut VoltageContext = - get_test_ffi_voltage_context(MWAVersion::VCSLegacyRecombined); + get_test_ffi_voltage_context(MWAVersion::VCSLegacyRecombined, false); // Check we got valid MetafitsContext pointer let context_ptr = voltage_context_ptr.as_mut(); @@ -2054,15 +2050,11 @@ fn test_mwalib_metafits_metadata_get_from_voltage_context_valid() { let items: Vec = ffi_boxed_slice_to_array(metafits_metadata.antennas, metafits_metadata.num_ants); - assert_eq!(items.len(), 128, "Array length is not correct"); + assert_eq!(items.len(), 1, "Array length is not correct"); - for item in items { - if item.tile_id == 154 { - assert_eq!(item.rfinput_y, 1); - } else if item.tile_id == 104 { - assert_eq!(item.rfinput_y, 0); - } - } + assert_eq!(items[0].tile_id, 11); + assert_eq!(items[0].rfinput_y, 0); + assert_eq!(items[0].rfinput_x, 1); // Note- don't try to do any free's here since, in order to test, we have had to reconstituded some of the arrays which will result in a double free } @@ -2203,7 +2195,7 @@ fn test_mwalib_voltage_metadata_get_valid() { unsafe { // Create a VoltageContext let voltage_context_ptr: *mut VoltageContext = - get_test_ffi_voltage_context(MWAVersion::VCSLegacyRecombined); + get_test_ffi_voltage_context(MWAVersion::VCSLegacyRecombined, false); // Check we got valid MetafitsContext pointer let context_ptr = voltage_context_ptr.as_mut(); diff --git a/src/metafits_context/mod.rs b/src/metafits_context/mod.rs index 7ce86e2..70c99e5 100644 --- a/src/metafits_context/mod.rs +++ b/src/metafits_context/mod.rs @@ -1140,6 +1140,8 @@ impl fmt::Display for MetafitsContext { Num coarse channels: {ncc}, Coarse Channels: {cc:?}, + Oversampled coarse chans: {os}, + Deripple applied: {dr} ({dr_param}), Num fine channels: {nfc}, Fine Channels (kHz): {fc:?}, @@ -1199,6 +1201,12 @@ impl fmt::Display for MetafitsContext { nts = self.metafits_timesteps.len(), cc = self.metafits_coarse_chans, ncc = self.metafits_coarse_chans.len(), + os = self.oversampled, + dr = self.deripple_applied, + dr_param = match self.deripple_applied { + true => self.deripple_param.to_string(), + false => String::from("N/A"), + }, nfc = self.metafits_fine_chan_freqs_hz.len(), fc = self .metafits_fine_chan_freqs_hz diff --git a/src/voltage_context/mod.rs b/src/voltage_context/mod.rs index 2a8ca9d..2c1f8dc 100644 --- a/src/voltage_context/mod.rs +++ b/src/voltage_context/mod.rs @@ -366,7 +366,10 @@ impl VoltageContext { let num_samples_per_rf_chain_fine_chan_in_a_voltage_block: u64 = match voltage_info.mwa_version { MWAVersion::VCSLegacyRecombined => 10_000, - MWAVersion::VCSMWAXv2 => 64_000, // 64000 per rf_inpit x real|imag (no fine chans) + MWAVersion::VCSMWAXv2 => match metafits_context.oversampled { + true => 81_920, + false => 64_000, + }, // critically sampled = 64000 per rf_inpit x real|imag (no fine chans), or 81920 if oversampled _ => { return Err(MwalibError::Voltage(VoltageFileError::InvalidMwaVersion { mwa_version: voltage_info.mwa_version, @@ -643,13 +646,6 @@ impl VoltageContext { )); } - // Calculate expected data file size (for use later) - // normally we would compare the file len to context.expected_voltage_data_file_size_bytes, - // but in our unit tests we override the voltage_block_size_bytes because our test files only have 1 tile - let calc_file_size = self.data_file_header_size_bytes - + self.delay_block_size_bytes - + (self.voltage_block_size_bytes * self.num_voltage_blocks_per_timestep); - // Work out how much to read at once let chunk_size: usize = self.voltage_block_size_bytes as usize; // This will be the size of a voltage block @@ -692,11 +688,11 @@ impl VoltageContext { let metadata = std::fs::metadata(filename).expect("unable to read metadata"); // Check file is as big as we expect - if metadata.len() != calc_file_size { + if metadata.len() != self.expected_voltage_data_file_size_bytes { return Err(VoltageFileError::InvalidVoltageFileSize( metadata.len(), String::from(filename), - calc_file_size, + self.expected_voltage_data_file_size_bytes, )); } @@ -862,7 +858,12 @@ impl VoltageContext { metadata.len(), self.data_file_header_size_bytes + self.delay_block_size_bytes - + (self.voltage_block_size_bytes * self.num_voltage_blocks_per_timestep) + + (self.voltage_block_size_bytes * self.num_voltage_blocks_per_timestep), + "header={} + delay={} + vb_size={} + vb_per_ts={}", + self.data_file_header_size_bytes, + self.delay_block_size_bytes, + self.voltage_block_size_bytes, + self.num_voltage_blocks_per_timestep ); // Check buffer is big enough diff --git a/src/voltage_context/test.rs b/src/voltage_context/test.rs index 6a112d9..3f0e050 100644 --- a/src/voltage_context/test.rs +++ b/src/voltage_context/test.rs @@ -12,9 +12,10 @@ use std::io::{Error, Write}; use std::path::PathBuf; use std::sync::Once; -// Define two static "once" variables to control creation of VCS test data (so it only happens once, the first time it's needed) +// Define three static "once" variables to control creation of VCS test data (so it only happens once, the first time it's needed) pub(crate) static VCS_LEGACY_TEST_DATA_CREATED: Once = Once::new(); pub(crate) static VCS_MWAXV2_TEST_DATA_CREATED: Once = Once::new(); +pub(crate) static VCS_MWAXV2_OS_TEST_DATA_CREATED: Once = Once::new(); /// Helper fuctions to generate (small-sh) test voltage files /// for mwax test files they contain an incrememting byte for the real in each samples and decrementing byte value for the imag value. @@ -24,8 +25,6 @@ pub(crate) static VCS_MWAXV2_TEST_DATA_CREATED: Once = Once::new(); fn generate_test_voltage_file( filename: &str, mwa_version: MWAVersion, - header_bytes: usize, - delay_block_bytes: usize, num_voltage_blocks: usize, samples_per_block: usize, rf_inputs: usize, @@ -37,25 +36,32 @@ fn generate_test_voltage_file( let mut output_file: File = File::create(filename)?; // Write out header if one is needed - if header_bytes > 0 { - let header_buffer: Vec = vec![0x01; header_bytes]; - output_file - .write_all(&header_buffer) - .expect("Cannot write header!"); + match mwa_version { + MWAVersion::VCSMWAXv2 => { + let header_buffer: Vec = vec![0x01; 4096]; + output_file + .write_all(&header_buffer) + .expect("Cannot write header!"); + } + _ => {} } + // Each voltage_block has samples_per_rf_fine for each combination of rfinputs x fine_chans + let num_bytes_per_voltage_block = samples_per_block * rf_inputs * fine_chans * bytes_per_sample; + // Write out delay block if one is needed - if delay_block_bytes > 0 { - let delay_buffer: Vec = vec![0x02; delay_block_bytes]; - output_file - .write_all(&delay_buffer) - .expect("Cannot write delay block!"); + match mwa_version { + MWAVersion::VCSMWAXv2 => { + let delay_buffer: Vec = vec![0x02; num_bytes_per_voltage_block]; + output_file + .write_all(&delay_buffer) + .expect("Cannot write delay block!"); + } + _ => {} } // Write out num_voltage_blocks // - // Each voltage_block has samples_per_rf_fine for each combination of rfinputs x fine_chans - let num_bytes_per_voltage_block = samples_per_block * rf_inputs * fine_chans * bytes_per_sample; // Loop for each voltage block // legacy: 1 blocks per file @@ -132,8 +138,6 @@ pub(crate) fn generate_test_voltage_file_legacy_recombined( generate_test_voltage_file( filename, MWAVersion::VCSLegacyRecombined, - 0, - 0, 1, 10000, 2, @@ -143,6 +147,127 @@ pub(crate) fn generate_test_voltage_file_legacy_recombined( ) } +#[cfg(test)] +pub(crate) fn generate_test_voltage_file_mwax( + filename: &str, + initial_value: u8, +) -> Result { + // Note we are only producing data for 2 rfinputs (ant0 X and ant0 Y) + // The initial value is used to differentiate different timesteps and coarse channels + generate_test_voltage_file( + filename, + MWAVersion::VCSMWAXv2, + 160, + 64_000, + 2, + 1, + 2, + initial_value, + ) +} + +#[cfg(test)] +pub(crate) fn generate_test_voltage_file_mwax_os( + filename: &str, + initial_value: u8, +) -> Result { + // Note we are only producing data for 2 rfinputs (ant0 X and ant0 Y) + // The initial value is used to differentiate different timesteps and coarse channels + generate_test_voltage_file( + filename, + MWAVersion::VCSMWAXv2, + 160, + 81_920, + 2, + 1, + 2, + initial_value, + ) +} + +#[cfg(test)] +pub(crate) fn get_test_voltage_files(mwa_version: MWAVersion, oversampled: bool) -> Vec { + // Create some test files + // Populate vector of filenames + let test_filenames: Vec; + + match mwa_version { + MWAVersion::VCSMWAXv2 => { + match oversampled { + true => { + // Now for the oversampled case + test_filenames = vec![ + String::from( + "test_files/1370755832_mwax_vcs_os/1370755832_1370755832_123.sub", + ), + String::from( + "test_files/1370755832_mwax_vcs_os/1370755832_1370755832_124.sub", + ), + String::from( + "test_files/1370755832_mwax_vcs_os/1370755832_1370755840_123.sub", + ), + String::from( + "test_files/1370755832_mwax_vcs_os/1370755832_1370755840_124.sub", + ), + ]; + + // This ensure the test data is created once only + VCS_MWAXV2_OS_TEST_DATA_CREATED.call_once(|| { + // Create this test data, but only once! + for (i, f) in test_filenames.iter().enumerate() { + generate_test_voltage_file_mwax_os(f, i as u8).unwrap(); + } + }); + } + false => { + test_filenames = vec![ + String::from( + "test_files/1101503312_mwax_vcs/1101503312_1101503312_123.sub", + ), + String::from( + "test_files/1101503312_mwax_vcs/1101503312_1101503312_124.sub", + ), + String::from( + "test_files/1101503312_mwax_vcs/1101503312_1101503320_123.sub", + ), + String::from( + "test_files/1101503312_mwax_vcs/1101503312_1101503320_124.sub", + ), + ]; + + // This ensure the test data is created once only + VCS_MWAXV2_TEST_DATA_CREATED.call_once(|| { + // Create this test data, but only once! + for (i, f) in test_filenames.iter().enumerate() { + generate_test_voltage_file_mwax(f, i as u8).unwrap(); + } + }); + } + } + } + MWAVersion::VCSLegacyRecombined => { + test_filenames = vec![ + String::from("test_files/1101503312_vcs/1101503312_1101503312_ch123.dat"), + String::from("test_files/1101503312_vcs/1101503312_1101503312_ch124.dat"), + String::from("test_files/1101503312_vcs/1101503312_1101503313_ch123.dat"), + String::from("test_files/1101503312_vcs/1101503312_1101503313_ch124.dat"), + ]; + + // This ensure the test data is created once only + VCS_LEGACY_TEST_DATA_CREATED.call_once(|| { + for (i, f) in test_filenames.iter().enumerate() { + generate_test_voltage_file_legacy_recombined(f, i as u8).unwrap(); + } + }); + } + _ => { + panic!("Other mwa_version values are not supported for VCS"); + } + } + + test_filenames +} + #[cfg(test)] pub(crate) fn get_index_for_location_in_test_voltage_file_legacy( sample_index: usize, @@ -198,80 +323,49 @@ pub(crate) fn get_index_for_location_in_test_voltage_file_mwaxv2( } #[cfg(test)] -pub(crate) fn generate_test_voltage_file_mwax( - filename: &str, - initial_value: u8, -) -> Result { - // Note we are only producing data for 2 rfinputs (ant0 X and ant0 Y) - // The initial value is used to differentiate different timesteps and coarse channels - generate_test_voltage_file( - filename, - MWAVersion::VCSMWAXv2, - 4096, - 32_768_000, - 160, - 64_000, - 2, - 1, - 2, - initial_value, - ) -} +pub(crate) fn get_index_for_location_in_test_voltage_file_mwaxv2_os( + voltage_block_index: usize, + rfinput_index: usize, + sample_index: usize, + value_index: usize, +) -> usize { + let num_finechan = 1; + let num_rfinputs = 2; -#[cfg(test)] -pub(crate) fn get_test_voltage_files(mwa_version: MWAVersion) -> Vec { - // Create some test files - // Populate vector of filenames - let test_filenames: Vec; + let bytes_per_fine_chan = 81920 * 2; - match mwa_version { - MWAVersion::VCSMWAXv2 => { - test_filenames = vec![ - String::from("test_files/1101503312_1_timestep/1101503312_1101503312_123.sub"), - String::from("test_files/1101503312_1_timestep/1101503312_1101503312_124.sub"), - String::from("test_files/1101503312_1_timestep/1101503312_1101503320_123.sub"), - String::from("test_files/1101503312_1_timestep/1101503312_1101503320_124.sub"), - ]; + let bytes_per_rfinput = num_finechan * bytes_per_fine_chan; - // This ensure the test data is created once only - VCS_MWAXV2_TEST_DATA_CREATED.call_once(|| { - // Create this test data, but only once! - for (i, f) in test_filenames.iter().enumerate() { - generate_test_voltage_file_mwax(f, i as u8).unwrap(); - } - }); - } - MWAVersion::VCSLegacyRecombined => { - test_filenames = vec![ - String::from("test_files/1101503312_1_timestep/1101503312_1101503312_ch123.dat"), - String::from("test_files/1101503312_1_timestep/1101503312_1101503312_ch124.dat"), - String::from("test_files/1101503312_1_timestep/1101503312_1101503313_ch123.dat"), - String::from("test_files/1101503312_1_timestep/1101503312_1101503313_ch124.dat"), - ]; + let bytes_per_voltage_block = num_rfinputs * bytes_per_rfinput; - // This ensure the test data is created once only - VCS_LEGACY_TEST_DATA_CREATED.call_once(|| { - for (i, f) in test_filenames.iter().enumerate() { - generate_test_voltage_file_legacy_recombined(f, i as u8).unwrap(); - } - }); - } - _ => { - panic!("Other mwa_version values are not supported for VCS"); - } - } + // This will position us at the correct block + let vb = voltage_block_index * bytes_per_voltage_block; - test_filenames + // Now within the block, move to the correct rf_input + let rf = rfinput_index * bytes_per_rfinput; + + // Return the correct index + vb + rf + (sample_index * 2) + value_index } #[cfg(test)] -pub(crate) fn get_test_voltage_context(mwa_version: MWAVersion) -> VoltageContext { - // Open the test mwax file - let metafits_filename = "test_files/1101503312_1_timestep/1101503312.metafits"; +pub(crate) fn get_test_voltage_context( + mwa_version: MWAVersion, + oversampled: bool, +) -> VoltageContext { + // Open the test metafits file + let metafits_filename = match mwa_version { + MWAVersion::VCSMWAXv2 => match oversampled { + true => "test_files/1370755832_mwax_vcs_os/1370755832_metafits.fits", + false => "test_files/1101503312_mwax_vcs/1101503312.metafits", + }, + MWAVersion::VCSLegacyRecombined => "test_files/1101503312_vcs/1101503312.metafits", + _ => "", + }; // Create some test files // Populate vector of filenames - let generated_filenames = get_test_voltage_files(mwa_version); + let generated_filenames = get_test_voltage_files(mwa_version, oversampled); let temp_strings = generated_filenames.iter().map(String::as_str); let test_filenames: Vec<&str> = temp_strings.collect(); @@ -290,12 +384,18 @@ pub(crate) fn get_test_voltage_context(mwa_version: MWAVersion) -> VoltageContex let metadata = std::fs::metadata(test_filenames[0]).expect("unable to read metadata"); // Also check our test file is the right size! - // Note our test files have 2 rfinputs, not 256, so we divide the block size by 128! assert_eq!( metadata.len(), context.data_file_header_size_bytes + context.delay_block_size_bytes - + ((context.voltage_block_size_bytes / 128) * context.num_voltage_blocks_per_timestep) + + (context.voltage_block_size_bytes * context.num_voltage_blocks_per_timestep), + "mwa_v={} header={} + delay={} + (voltage_block={} * vbs per ts={} * finech={})", + context.mwa_version, + context.data_file_header_size_bytes, + context.delay_block_size_bytes, + context.voltage_block_size_bytes, + context.num_voltage_blocks_per_timestep, + context.num_fine_chans_per_coarse ); context @@ -303,7 +403,7 @@ pub(crate) fn get_test_voltage_context(mwa_version: MWAVersion) -> VoltageContex #[test] fn test_context_new_missing_voltage_files() { - let metafits_filename = "test_files/1101503312_1_timestep/1101503312.metafits"; + let metafits_filename = "test_files/1101503312_vcs/1101503312.metafits"; let voltagefiles: Vec = Vec::new(); // No gpubox files provided @@ -317,7 +417,7 @@ fn test_context_new_missing_voltage_files() { #[test] fn test_context_new_invalid_metafits() { let metafits_filename = "invalid.metafits"; - let filename = "test_files/1101503312_1_timestep/1101503312_1101503312_ch123.dat"; + let filename = "test_files/1101503312_vcs/1101503312_1101503312_ch123.dat"; let voltage_files = vec![filename]; // No gpubox files provided @@ -332,7 +432,7 @@ fn test_context_legacy_v1() { // Read the observation using mwalib // // Open a context and load in a test metafits and gpubox file - let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined); + let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined, false); // Test the properties of the context object match what we expect // MWA version: v1 Legacy, @@ -380,13 +480,13 @@ fn test_context_legacy_v1() { // Number of samples in each voltage_blocks for each second of data per rf_input * fine_chans * real|imag assert_eq!(context.num_samples_per_voltage_block, 10_000); // The size of each voltage block - assert_eq!(context.voltage_block_size_bytes, 327_680_000); + assert_eq!(context.voltage_block_size_bytes, 2_560_000); // Number of bytes used to store delays - for MWAX this is the same as a voltage block size, for legacy it is 0 assert_eq!(context.delay_block_size_bytes, 0); // The amount of bytes to skip before getting into real data within the voltage files assert_eq!(context.data_file_header_size_bytes, 0); // Expected voltage file size - assert_eq!(context.expected_voltage_data_file_size_bytes, 327_680_000); + assert_eq!(context.expected_voltage_data_file_size_bytes, 2_560_000); // Check batches assert_eq!(context.voltage_batches.len(), 2); @@ -406,6 +506,27 @@ fn test_context_legacy_v1() { // Now compare this copy with the 'real' rf_inputs assert_eq!(&rf_input_copy, &context.metafits_context.rf_inputs); // Ensure the antenna->rf_input mapping is still in tact + assert_eq!(context.metafits_context.antennas[0].rfinput_x.vcs_order, 93); + assert_eq!(context.metafits_context.antennas[0].rfinput_y.vcs_order, 89); +} + +#[test] +fn test_context_legacy_v1_128_tiles() { + // Create some test files + // Populate vector of filenames + let generated_filenames = get_test_voltage_files(MWAVersion::VCSLegacyRecombined, false); + + let temp_strings = generated_filenames.iter().map(String::as_str); + let test_filenames: Vec<&str> = temp_strings.collect(); + + // Open a context and load in a test metafits + let context = VoltageContext::new( + "test_files/1101503312_vcs/1101503312.metafits128", + &test_filenames, + ) + .expect("Failed to create VoltageContext"); + + // Ensure the antenna->rf_input mapping is still in tact (voltage context reorders them from the metafits) for i in 0..128 { if context.metafits_context.antennas[i].tile_id == 154 { assert_eq!(context.metafits_context.antennas[i].rfinput_y.vcs_order, 1); @@ -420,12 +541,7 @@ fn test_context_legacy_v1() { #[test] fn test_context_legacy_v1_read_file_no_data_for_timestep() { // Open a context and load in a test metafits and gpubox file - let mut context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined); - - // - // In order for our smaller voltage files to work with this test we need to reset the voltage_block_size_bytes - // - context.voltage_block_size_bytes /= 128; + let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined, false); // // Now do a read of the data from time 0, channel 0 @@ -459,12 +575,7 @@ fn test_context_legacy_v1_read_file_no_data_for_timestep() { #[test] fn test_context_legacy_v1_read_file() { // Open a context and load in a test metafits and gpubox file - let mut context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined); - - // - // In order for our smaller voltage files to work with this test we need to reset the voltage_block_size_bytes - // - context.voltage_block_size_bytes /= 128; + let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined, false); // // Now do a read of the data from time 0, channel 0 @@ -656,7 +767,7 @@ fn test_context_legacy_v1_read_file() { #[test] fn test_context_mwax_v2() { // Create voltage context - let context = get_test_voltage_context(MWAVersion::VCSMWAXv2); + let context = get_test_voltage_context(MWAVersion::VCSMWAXv2, false); // Test the properties of the context object match what we expect // MWA version: v2 mwax, @@ -671,7 +782,7 @@ fn test_context_mwax_v2() { // Actual duration: 16 s, assert_eq!(context.common_duration_ms, 16_000); - // num timesteps: 14, + // num timesteps: 14, (what the metafits says) assert_eq!(context.num_timesteps, 14); // timesteps: @@ -703,7 +814,7 @@ fn test_context_mwax_v2() { // Number of samples in each voltage_blocks for each second of data per rf_input * fine_chans * real|imag assert_eq!(context.num_samples_per_voltage_block, 64_000); // The size of each voltage block - assert_eq!(context.voltage_block_size_bytes, 32_768_000); + assert_eq!(context.voltage_block_size_bytes, 256_000); // Number of bytes used to store delays - for MWAX this is the same as a voltage block size, for legacy it is 0 assert_eq!( context.delay_block_size_bytes, @@ -712,7 +823,7 @@ fn test_context_mwax_v2() { // The amount of bytes to skip before getting into real data within the voltage files assert_eq!(context.data_file_header_size_bytes, 4096); // Expected voltage file size - assert_eq!(context.expected_voltage_data_file_size_bytes, 5_275_652_096); + assert_eq!(context.expected_voltage_data_file_size_bytes, 41_220_096); // Check number of batches assert_eq!(context.voltage_batches.len(), 2); @@ -726,12 +837,7 @@ fn test_context_mwax_v2() { #[test] fn test_context_mwaxv2_read_file_no_data_for_timestep() { // Open a context and load in a test metafits and gpubox file - let mut context = get_test_voltage_context(MWAVersion::VCSMWAXv2); - - // - // In order for our smaller voltage files to work with this test we need to reset the voltage_block_size_bytes - // - context.voltage_block_size_bytes /= 128; + let context = get_test_voltage_context(MWAVersion::VCSMWAXv2, false); // // Now do a read of the data from time 0, channel 0 @@ -765,12 +871,7 @@ fn test_context_mwaxv2_read_file_no_data_for_timestep() { #[test] fn test_context_mwax_v2_read_file() { // Create voltage context - let mut context = get_test_voltage_context(MWAVersion::VCSMWAXv2); - - // - // In order for our smaller voltage files to work with this test we need to reset the voltage_block_size_bytes - // - context.voltage_block_size_bytes /= 128; + let context = get_test_voltage_context(MWAVersion::VCSMWAXv2, false); // Create output buffer let mut buffer: Vec = vec![ @@ -969,7 +1070,7 @@ fn test_context_mwax_v2_read_file() { #[test] fn test_validate_gps_time_parameters_legacy() { // Create test files and a test Voltage Context - let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined); + let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined, false); let result = VoltageContext::validate_gps_time_parameters(&context, 1_101_503_312, 1); @@ -981,7 +1082,7 @@ fn test_validate_gps_time_parameters_legacy() { #[test] fn test_validate_gps_time_parameters_mwax_v2() { // Create test files and a test Voltage Context - let context = get_test_voltage_context(MWAVersion::VCSMWAXv2); + let context = get_test_voltage_context(MWAVersion::VCSMWAXv2, false); let result = VoltageContext::validate_gps_time_parameters(&context, 1_101_503_312, 10); @@ -993,7 +1094,7 @@ fn test_validate_gps_time_parameters_mwax_v2() { #[test] fn test_validate_gps_time_parameters_invalid_gps_second_start_legacy() { // Create test files and a test Voltage Context - let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined); + let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined, false); let result = VoltageContext::validate_gps_time_parameters(&context, 1_101_503_311, 1); @@ -1014,7 +1115,7 @@ fn test_validate_gps_time_parameters_invalid_gps_second_start_legacy() { fn test_validate_gps_time_parameters_invalid_gps_second_count_legacy() { // This test obs starts at 1_101_503_312 and has 112 seconds. // Create test files and a test Voltage Context - let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined); + let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined, false); let result = VoltageContext::validate_gps_time_parameters(&context, 1_101_503_424, 3); @@ -1034,7 +1135,7 @@ fn test_validate_gps_time_parameters_invalid_gps_second_count_legacy() { #[test] fn test_validate_gps_time_parameters_invalid_gps_second_start_mwax_v2() { // Create test files and a test Voltage Context - let context = get_test_voltage_context(MWAVersion::VCSMWAXv2); + let context = get_test_voltage_context(MWAVersion::VCSMWAXv2, false); let result = VoltageContext::validate_gps_time_parameters(&context, 1_101_503_311, 1); @@ -1054,7 +1155,7 @@ fn test_validate_gps_time_parameters_invalid_gps_second_start_mwax_v2() { #[test] fn test_validate_gps_time_parameters_invalid_gps_second_count_mwax_v2() { // Create test files and a test Voltage Context - let context = get_test_voltage_context(MWAVersion::VCSMWAXv2); + let context = get_test_voltage_context(MWAVersion::VCSMWAXv2, false); let result = VoltageContext::validate_gps_time_parameters(&context, 1_101_503_312, 118); @@ -1074,12 +1175,7 @@ fn test_validate_gps_time_parameters_invalid_gps_second_count_mwax_v2() { #[test] fn test_context_read_second_invalid_coarse_chan_index() { // Open a context and load in a test metafits and gpubox file - let mut context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined); - - // - // In order for our smaller voltage files to work with this test we need to reset the voltage_block_size_bytes - // - context.voltage_block_size_bytes /= 128; + let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined, false); // Create output buffer let mut buffer: Vec = vec![ @@ -1114,12 +1210,7 @@ fn test_context_read_second_invalid_coarse_chan_index() { #[test] fn test_context_read_second_invalid_buffer_size() { // Open a context and load in a test metafits and gpubox file - let mut context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined); - - // - // In order for our smaller voltage files to work with this test we need to reset the voltage_block_size_bytes - // - context.voltage_block_size_bytes /= 128; + let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined, false); let gps_second_start = 1_101_503_312; let gps_second_count: usize = 1; @@ -1160,17 +1251,10 @@ fn test_context_read_second_invalid_buffer_size() { #[test] fn test_context_read_second_legacy_invalid_data_file_size() { // Open a context and load in a test metafits and gpubox file - let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined); + let mut context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined, false); - // - // In order for our smaller voltage files to work with this test we need to reset the voltage_block_size_bytes - // - // In our other tests the below line is uncommented, so the context knows about our smaller test files. - // But for this test we want to LEAVE it commented out so it will be expecting the 'real'/full file size - // - // ** important! ** This is commented out on purpose for this test - // context.voltage_block_size_bytes /= 128; - // ** important! ** + // Alter the context values so we generate an invalid file size error + context.expected_voltage_data_file_size_bytes += 1; let gps_second_start = 1_101_503_312; let gps_second_count: usize = 1; @@ -1209,17 +1293,10 @@ fn test_context_read_second_legacy_invalid_data_file_size() { #[test] fn test_context_read_second_mwaxv2_invalid_data_file_size() { // Open a context and load in a test metafits and gpubox file - let context = get_test_voltage_context(MWAVersion::VCSMWAXv2); + let mut context = get_test_voltage_context(MWAVersion::VCSMWAXv2, false); - // - // In order for our smaller voltage files to work with this test we need to reset the voltage_block_size_bytes - // - // In our other tests the below line is uncommented, so the context knows about our smaller test files. - // But for this test we want to LEAVE it commented out so it will be expecting the 'real'/full file size - // - // ** important! ** Next line is commented out on purpose for this test - // context.voltage_block_size_bytes /= 128; - // ** important! ** + // Alter the context values so we generate an invalid file size error + context.expected_voltage_data_file_size_bytes += 1; let gps_second_start = 1_101_503_312; let gps_second_count: usize = 1; @@ -1258,9 +1335,7 @@ fn test_context_read_second_mwaxv2_invalid_data_file_size() { #[test] fn test_context_read_second_legacy_no_data_for_gpstime() { // Open a context and load in a test metafits and gpubox file - let mut context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined); - - context.voltage_block_size_bytes /= 128; + let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined, false); let gps_second_start = 1_101_503_350; // No data at this timestep let gps_second_count: usize = 1; @@ -1305,9 +1380,7 @@ fn test_context_read_second_legacy_no_data_for_gpstime() { #[test] fn test_context_read_second_mwaxv2_no_data_for_gpstime() { // Open a context and load in a test metafits and gpubox file - let mut context = get_test_voltage_context(MWAVersion::VCSMWAXv2); - - context.voltage_block_size_bytes /= 128; + let context = get_test_voltage_context(MWAVersion::VCSMWAXv2, false); let gps_second_start = 1_101_503_350; // No data at this timestep let gps_second_count: usize = 1; @@ -1360,17 +1433,7 @@ fn test_context_read_second_legacyv1_valid() { // which is 1_101_503_312, 1_101_503_313 // Open a context and load in a test metafits and gpubox file - let mut context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined); - - // - // In order for our smaller voltage files to work with this test we need to reset the voltage_block_size_bytes - // - // In our other tests the below line is uncommented, so the context knows about our smaller test files. - // But for this test we want to LEAVE it commented out so it will be expecting the 'real'/full file size - // - // ** important! ** - context.voltage_block_size_bytes /= 128; - // ** important! ** + let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined, false); let gps_second_start = 1_101_503_312; let gps_second_count: usize = 2; @@ -1439,17 +1502,7 @@ fn test_context_read_second_mwaxv2_valid() { // which is 1_101_503_318, 1_101_503_319, 1_101_503_320, 1_101_503_321 // Open a context and load in a test metafits and gpubox file - let mut context = get_test_voltage_context(MWAVersion::VCSMWAXv2); - - // - // In order for our smaller voltage files to work with this test we need to reset the voltage_block_size_bytes - // - // In our other tests the below line is uncommented, so the context knows about our smaller test files. - // But for this test we want to LEAVE it commented out so it will be expecting the 'real'/full file size - // - // ** important! ** - context.voltage_block_size_bytes /= 128; - // ** important! ** + let context = get_test_voltage_context(MWAVersion::VCSMWAXv2, false); let gps_second_start = 1_101_503_318; let gps_second_count: usize = 4; @@ -1557,7 +1610,7 @@ fn test_context_read_second_mwaxv2_valid() { #[test] fn test_context_legacy_v1_get_fine_chan_feqs_one_coarse_chan() { - let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined); + let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined, false); // Get fine channel freqs let coarse_channels: Vec = vec![0]; @@ -1574,7 +1627,7 @@ fn test_context_legacy_v1_get_fine_chan_feqs_one_coarse_chan() { #[test] fn test_context_legacy_v1_get_fine_chan_feqs_some_coarse_chans() { - let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined); + let context = get_test_voltage_context(MWAVersion::VCSLegacyRecombined, false); // Get fine channel freqs let coarse_channels: Vec = vec![10, 20]; @@ -1595,3 +1648,75 @@ fn test_context_legacy_v1_get_fine_chan_feqs_some_coarse_chans() { F64Margin::default() )); } + +// +// Oversampled tests +// +#[test] +fn test_context_mwax_v2_oversampled() { + // Create voltage context + let context = get_test_voltage_context(MWAVersion::VCSMWAXv2, true); + + // Test the properties of the context object match what we expect + // MWA version: v2 mwax, + assert_eq!(context.mwa_version, MWAVersion::VCSMWAXv2); + + // Actual gps start time: 1_370_755_832, + assert_eq!(context.common_start_gps_time_ms, 1_370_755_832_000); + + // Actual gps end time: 1_370_755_848, + assert_eq!(context.common_end_gps_time_ms, 1_370_755_848_000); + + // Actual duration: 16 s, + assert_eq!(context.common_duration_ms, 16_000); + + // num timesteps: 4, (from metafits) + assert_eq!(context.num_timesteps, 4); + + // timesteps: + assert_eq!(context.timesteps[0].gps_time_ms, 1_370_755_832_000); + assert_eq!(context.timesteps[1].gps_time_ms, 1_370_755_840_000); + + // num coarse channels, 2, + assert_eq!(context.num_coarse_chans, 24); + + // observation bandwidth: 3.256_000 MHz, + assert_eq!(context.common_bandwidth_hz, 1_280_000 * 2); + + // coarse channels: + assert_eq!(context.coarse_chans[14].rec_chan_number, 123); + assert_eq!(context.coarse_chans[14].chan_centre_hz, 157_440_000); + assert_eq!(context.coarse_chans[15].rec_chan_number, 124); + assert_eq!(context.coarse_chans[15].chan_centre_hz, 158_720_000); + // fine channel resolution: 1.6384 MHz, + assert_eq!(context.fine_chan_width_hz, 1_280_000); + // num fine channels/coarse: 1, + assert_eq!(context.num_fine_chans_per_coarse, 1); + // Number of bytes in each sample + assert_eq!(context.sample_size_bytes, 2); + // Number of voltage blocks per timestep + assert_eq!(context.num_voltage_blocks_per_timestep, 160); + // Number of voltage blocks of samples in each second of data + assert_eq!(context.num_voltage_blocks_per_second, 20); + // Number of samples in each voltage_blocks for each second of data per rf_input * fine_chans * real|imag + assert_eq!(context.num_samples_per_voltage_block, 81_920); + // The size of each voltage block + assert_eq!(context.voltage_block_size_bytes, 327_680); + // Number of bytes used to store delays - for MWAX this is the same as a voltage block size, for legacy it is 0 + assert_eq!( + context.delay_block_size_bytes, + context.voltage_block_size_bytes + ); + // The amount of bytes to skip before getting into real data within the voltage files + assert_eq!(context.data_file_header_size_bytes, 4096); + // Expected voltage file size + assert_eq!(context.expected_voltage_data_file_size_bytes, 52_760_576); + // Check number of batches + assert_eq!(context.voltage_batches.len(), 2); + + // Check rfinput order (for Legacy it is vcs_order, mwax is subfile_order) + let mut rf_input_copy = context.metafits_context.rf_inputs.clone(); + rf_input_copy.sort_by_key(|k| k.subfile_order); + // Now compare this copy with the 'real' rf_inputs + assert_eq!(&rf_input_copy, &context.metafits_context.rf_inputs); +} diff --git a/test_files/1101503312_mwax_vcs/1101503312.metafits b/test_files/1101503312_mwax_vcs/1101503312.metafits new file mode 100644 index 0000000..26b061b --- /dev/null +++ b/test_files/1101503312_mwax_vcs/1101503312.metafits @@ -0,0 +1 @@ +SIMPLE = T / conforms to FITS standard BITPIX = 8 / array data type NAXIS = 0 / number of array dimensions EXTEND = T GPSTIME = 1101503312 / [s] GPS time of observation start EXPOSURE= 112 / [s] duration of observation FILENAME= 'FDS_DEC-26.7_121' / Name of observation MJD = 56992.88074074074 / [days] MJD of observation DATE-OBS= '2014-12-01T21:08:16' / [UT] Date and time of observation LST = 144.381251875516 / [deg] LST HA = '-00:00:00.00' / [hours] hour angle of pointing center AZIMUTH = 0.0 / [deg] Azimuth of pointing center ALTITUDE= 90.0 / [deg] Altitude of pointing center RA = 144.2107504850443 / [deg] RA of pointing center DEC = -26.63403125476213 / [deg] Dec of pointing center ATTEN_DB= 1.0 / [dB] global analogue attenuation, in dB SUN-DIST= 91.5322277557315 / [deg] Distance from pointing center to Sun MOONDIST= 131.880015235607 / [deg] Distance from pointing center to Moon JUP-DIST= 41.401684338269 / [deg] Distance from pointing center to Jupiter GRIDNAME= 'sweet ' / Pointing grid name GRIDNUM = 0 / Pointing grid number CREATOR = 'Randall ' / Observation creator PROJECT = 'G0009 ' / Project ID MODE = 'HW_LFILES' / Observation mode RECVRS = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16' / Active receivers DELAYS = '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0' / Beamformer delays CALIBRAT= F / Intended for calibration CENTCHAN= 121 / Center coarse channel CHANNELS= '109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125&'CONTINUE ',126,127,128,129,130,131,132&' CONTINUE '' / Coarse channels CHANSEL = '0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23' / IndiSUN-ALT = -1.53222775573148 / [deg] Altitude of Sun FINECHAN= 10 / [kHz] Fine channel width - correlator freq_res INTTIME = 2.0 / [s] Individual integration time NAV_FREQ= 1 / Assumed frequency averaging NSCANS = 56 / Number of time instants in correlation productsNINPUTS = 2 / Number of inputs into the correlation products NCHANS = 3072 / Number of (averaged) fine channels in spectrum BANDWDTH= 30.72 / [MHz] Total bandwidth FREQCENT= 154.24 / [MHz] Center frequency of observation TIMEOFF = 0 / [s] Deprecated, use QUACKTIM or GOODTIME DATESTRT= '2014-12-01T21:08:16' / [UT] Date and time of correlations start VERSION = 2.0 / METAFITS version number TELESCOP= 'MWA ' INSTRUME= '128T ' QUACKTIM= 2.0 / Seconds of bad data after observation starts GOODTIME= 1417468098.0 / OBSID+QUACKTIME as Unix timestamp DATE = '2020-02-14T06:41:23' / UT Date of file creation COMMENT After an observation starts, the receiver hardware changes take a COMMENT few seconds to stabilise. The 24 GPU boxes start saving data to COMMENT their output files anywhere from a second _before_ the start of COMMENT the observation to a few seconds after, and not necessarily at the COMMENT same time on each gpubox. COMMENT QUACKTIM and GOODTIME represent the start of the first uncontaminated COMMENT data, rounded up to the next time-averaged data packet. Note that this COMMENT time may be before the first actual data in some or all gpubox files. HISTORY Created by user apache HISTORY Created on host mwa-django01p.curtin.edu.au HISTORY Command: "mod_wsgi" END XTENSION= 'BINTABLE' / binary table extension BITPIX = 8 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 143 / length of dimension 1 NAXIS2 = 2 / length of dimension 2 PCOUNT = 0 / number of group parameters GCOUNT = 1 / number of groups TFIELDS = 17 / number of table fields TTYPE1 = 'Input ' TFORM1 = 'I ' TTYPE2 = 'Antenna ' TFORM2 = 'I ' TTYPE3 = 'Tile ' TFORM3 = 'I ' TTYPE4 = 'TileName' TFORM4 = '8A ' TTYPE5 = 'Pol ' TFORM5 = 'A ' TTYPE6 = 'Rx ' TFORM6 = 'I ' TTYPE7 = 'Slot ' TFORM7 = 'I ' TTYPE8 = 'Flag ' TFORM8 = 'I ' TTYPE9 = 'Length ' TFORM9 = '14A ' TTYPE10 = 'North ' TFORM10 = 'E ' TUNIT10 = 'm ' TTYPE11 = 'East ' TFORM11 = 'E ' TUNIT11 = 'm ' TTYPE12 = 'Height ' TFORM12 = 'E ' TUNIT12 = 'm ' TTYPE13 = 'Gains ' TFORM13 = '24I ' TTYPE14 = 'BFTemps ' TFORM14 = 'E ' TUNIT14 = 'degC ' TTYPE15 = 'Delays ' TFORM15 = '16I ' TTYPE16 = 'VCSOrder' TFORM16 = 'I ' TTYPE17 = 'Flavors ' TFORM17 = '10A ' EXTNAME = 'TILEDATA' / extension name HISTORY File modified by user 'gsleap' with fv on 2023-08-16T17:00:49 END V Tile011YEL_-656.14C1ChMMMMLJIGFEEEDDCBA@@@@@AAAΥYRG6_90W Tile011XEL_-656.14C1ChMMMMLJIGFEEEDDCBA@@@@@AAAΥ]RG6_90 \ No newline at end of file diff --git a/test_files/1101503312_mwax_vcs/README.md b/test_files/1101503312_mwax_vcs/README.md new file mode 100644 index 0000000..aa0da85 --- /dev/null +++ b/test_files/1101503312_mwax_vcs/README.md @@ -0,0 +1 @@ +This directory of test files contains a modified metafits file which only has 2 rf_inputs for the purposes of testing non-oversampled MWAX VCS voltage context functionality. Limiting to 2 rfinputs (1 tile) reduces the test file size generated by the tests. diff --git a/test_files/1101503312_vcs/1101503312.metafits b/test_files/1101503312_vcs/1101503312.metafits new file mode 100644 index 0000000..7ab308e --- /dev/null +++ b/test_files/1101503312_vcs/1101503312.metafits @@ -0,0 +1 @@ +SIMPLE = T / conforms to FITS standard BITPIX = 8 / array data type NAXIS = 0 / number of array dimensions EXTEND = T GPSTIME = 1101503312 / [s] GPS time of observation start EXPOSURE= 112 / [s] duration of observation FILENAME= 'FDS_DEC-26.7_121' / Name of observation MJD = 56992.88074074074 / [days] MJD of observation DATE-OBS= '2014-12-01T21:08:16' / [UT] Date and time of observation LST = 144.381251875516 / [deg] LST HA = '-00:00:00.00' / [hours] hour angle of pointing center AZIMUTH = 0.0 / [deg] Azimuth of pointing center ALTITUDE= 90.0 / [deg] Altitude of pointing center RA = 144.2107504850443 / [deg] RA of pointing center DEC = -26.63403125476213 / [deg] Dec of pointing center ATTEN_DB= 1.0 / [dB] global analogue attenuation, in dB SUN-DIST= 91.5322277557315 / [deg] Distance from pointing center to Sun MOONDIST= 131.880015235607 / [deg] Distance from pointing center to Moon JUP-DIST= 41.401684338269 / [deg] Distance from pointing center to Jupiter GRIDNAME= 'sweet ' / Pointing grid name GRIDNUM = 0 / Pointing grid number CREATOR = 'Randall ' / Observation creator PROJECT = 'G0009 ' / Project ID MODE = 'HW_LFILES' / Observation mode RECVRS = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16' / Active receivers DELAYS = '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0' / Beamformer delays CALIBRAT= F / Intended for calibration CENTCHAN= 121 / Center coarse channel CHANNELS= '109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125&'CONTINUE ',126,127,128,129,130,131,132&' CONTINUE '' / Coarse channels CHANSEL = '0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23' / IndiSUN-ALT = -1.53222775573148 / [deg] Altitude of Sun FINECHAN= 10 / [kHz] Fine channel width - correlator freq_res INTTIME = 2.0 / [s] Individual integration time NAV_FREQ= 1 / Assumed frequency averaging NSCANS = 56 / Number of time instants in correlation productsNINPUTS = '2 ' / Number of inputs into the correlation products NCHANS = 3072 / Number of (averaged) fine channels in spectrum BANDWDTH= 30.72 / [MHz] Total bandwidth FREQCENT= 154.24 / [MHz] Center frequency of observation TIMEOFF = 0 / [s] Deprecated, use QUACKTIM or GOODTIME DATESTRT= '2014-12-01T21:08:16' / [UT] Date and time of correlations start VERSION = 2.0 / METAFITS version number TELESCOP= 'MWA ' INSTRUME= '128T ' QUACKTIM= 2.0 / Seconds of bad data after observation starts GOODTIME= 1417468098.0 / OBSID+QUACKTIME as Unix timestamp DATE = '2020-02-14T06:41:23' / UT Date of file creation COMMENT After an observation starts, the receiver hardware changes take a COMMENT few seconds to stabilise. The 24 GPU boxes start saving data to COMMENT their output files anywhere from a second _before_ the start of COMMENT the observation to a few seconds after, and not necessarily at the COMMENT same time on each gpubox. COMMENT QUACKTIM and GOODTIME represent the start of the first uncontaminated COMMENT data, rounded up to the next time-averaged data packet. Note that this COMMENT time may be before the first actual data in some or all gpubox files. HISTORY Created by user apache HISTORY Created on host mwa-django01p.curtin.edu.au HISTORY Command: "mod_wsgi" END XTENSION= 'BINTABLE' / binary table extension BITPIX = 8 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 143 / length of dimension 1 NAXIS2 = 2 / length of dimension 2 PCOUNT = 0 / number of group parameters GCOUNT = 1 / number of groups TFIELDS = 17 / number of table fields TTYPE1 = 'Input ' TFORM1 = 'I ' TTYPE2 = 'Antenna ' TFORM2 = 'I ' TTYPE3 = 'Tile ' TFORM3 = 'I ' TTYPE4 = 'TileName' TFORM4 = '8A ' TTYPE5 = 'Pol ' TFORM5 = 'A ' TTYPE6 = 'Rx ' TFORM6 = 'I ' TTYPE7 = 'Slot ' TFORM7 = 'I ' TTYPE8 = 'Flag ' TFORM8 = 'I ' TTYPE9 = 'Length ' TFORM9 = '14A ' TTYPE10 = 'North ' TFORM10 = 'E ' TUNIT10 = 'm ' TTYPE11 = 'East ' TFORM11 = 'E ' TUNIT11 = 'm ' TTYPE12 = 'Height ' TFORM12 = 'E ' TUNIT12 = 'm ' TTYPE13 = 'Gains ' TFORM13 = '24I ' TTYPE14 = 'BFTemps ' TFORM14 = 'E ' TUNIT14 = 'degC ' TTYPE15 = 'Delays ' TFORM15 = '16I ' TTYPE16 = 'VCSOrder' TFORM16 = 'I ' TTYPE17 = 'Flavors ' TFORM17 = '10A ' EXTNAME = 'TILEDATA' / extension name HISTORY File modified by user 'gsleap' with fv on 2023-08-17T10:29:36 END V Tile011YEL_-656.14C1ChMMMMLJIGFEEEDDCBA@@@@@AAAΥYRG6_90W Tile011XEL_-656.14C1ChMMMMLJIGFEEEDDCBA@@@@@AAAΥ]RG6_90 \ No newline at end of file diff --git a/test_files/1101503312_vcs/1101503312.metafits128 b/test_files/1101503312_vcs/1101503312.metafits128 new file mode 100644 index 0000000..c948798 --- /dev/null +++ b/test_files/1101503312_vcs/1101503312.metafits128 @@ -0,0 +1,35 @@ +SIMPLE = T / conforms to FITS standard BITPIX = 8 / array data type NAXIS = 0 / number of array dimensions EXTEND = T GPSTIME = 1101503312 / [s] GPS time of observation start EXPOSURE= 112 / [s] duration of observation FILENAME= 'FDS_DEC-26.7_121' / Name of observation MJD = 56992.88074074074 / [days] MJD of observation DATE-OBS= '2014-12-01T21:08:16' / [UT] Date and time of observation LST = 144.381251875516 / [deg] LST HA = '-00:00:00.00' / [hours] hour angle of pointing center AZIMUTH = 0.0 / [deg] Azimuth of pointing center ALTITUDE= 90.0 / [deg] Altitude of pointing center RA = 144.2107504850443 / [deg] RA of pointing center DEC = -26.63403125476213 / [deg] Dec of pointing center ATTEN_DB= 1.0 / [dB] global analogue attenuation, in dB SUN-DIST= 91.5322277557315 / [deg] Distance from pointing center to Sun MOONDIST= 131.880015235607 / [deg] Distance from pointing center to Moon JUP-DIST= 41.401684338269 / [deg] Distance from pointing center to Jupiter GRIDNAME= 'sweet ' / Pointing grid name GRIDNUM = 0 / Pointing grid number CREATOR = 'Randall ' / Observation creator PROJECT = 'G0009 ' / Project ID MODE = 'HW_LFILES' / Observation mode RECVRS = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16' / Active receivers DELAYS = '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0' / Beamformer delays CALIBRAT= F / Intended for calibration CENTCHAN= 121 / Center coarse channel CHANNELS= '109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125&'CONTINUE ',126,127,128,129,130,131,132&' CONTINUE '' / Coarse channels CHANSEL = '0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23' / IndiSUN-ALT = -1.53222775573148 / [deg] Altitude of Sun FINECHAN= 10 / [kHz] Fine channel width - correlator freq_res INTTIME = 2.0 / [s] Individual integration time NAV_FREQ= 1 / Assumed frequency averaging NSCANS = 56 / Number of time instants in correlation productsNINPUTS = 256 / Number of inputs into the correlation products NCHANS = 3072 / Number of (averaged) fine channels in spectrum BANDWDTH= 30.72 / [MHz] Total bandwidth FREQCENT= 154.24 / [MHz] Center frequency of observation TIMEOFF = 0 / [s] Deprecated, use QUACKTIM or GOODTIME DATESTRT= '2014-12-01T21:08:16' / [UT] Date and time of correlations start VERSION = 2.0 / METAFITS version number TELESCOP= 'MWA ' INSTRUME= '128T ' QUACKTIM= 2.0 / Seconds of bad data after observation starts GOODTIME= 1417468098.0 / OBSID+QUACKTIME as Unix timestamp DATE = '2020-02-14T06:41:23' / UT Date of file creation COMMENT After an observation starts, the receiver hardware changes take a COMMENT few seconds to stabilise. The 24 GPU boxes start saving data to COMMENT their output files anywhere from a second _before_ the start of COMMENT the observation to a few seconds after, and not necessarily at the COMMENT same time on each gpubox. COMMENT QUACKTIM and GOODTIME represent the start of the first uncontaminated COMMENT data, rounded up to the next time-averaged data packet. Note that this COMMENT time may be before the first actual data in some or all gpubox files. HISTORY Created by user apache HISTORY Created on host mwa-django01p.curtin.edu.au HISTORY Command: "mod_wsgi" END XTENSION= 'BINTABLE' / binary table extension BITPIX = 8 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 143 / length of dimension 1 NAXIS2 = 256 / length of dimension 2 PCOUNT = 0 / number of group parameters GCOUNT = 1 / number of groups TFIELDS = 17 / number of table fields TTYPE1 = 'Input ' TFORM1 = 'I ' TTYPE2 = 'Antenna ' TFORM2 = 'I ' TTYPE3 = 'Tile ' TFORM3 = 'I ' TTYPE4 = 'TileName' TFORM4 = '8A ' TTYPE5 = 'Pol ' TFORM5 = 'A ' TTYPE6 = 'Rx ' TFORM6 = 'I ' TTYPE7 = 'Slot ' TFORM7 = 'I ' TTYPE8 = 'Flag ' TFORM8 = 'I ' TTYPE9 = 'Length ' TFORM9 = '14A ' TTYPE10 = 'North ' TFORM10 = 'E ' TUNIT10 = 'm ' TTYPE11 = 'East ' TFORM11 = 'E ' TUNIT11 = 'm ' TTYPE12 = 'Height ' TFORM12 = 'E ' TUNIT12 = 'm ' TTYPE13 = 'Gains ' TFORM13 = '24I ' TTYPE14 = 'BFTemps ' TFORM14 = 'E ' TUNIT14 = 'degC ' TTYPE15 = 'Delays ' TFORM15 = '16I ' TTYPE16 = 'VCSOrder' TFORM16 = 'I ' TTYPE17 = 'Flavors ' TFORM17 = '10A ' EXTNAME = 'TILEDATA' / extension name END KhTile104Y +EL_-756.49\k3C#JIIHGFDCBAAABBAA@@@AABCDA2LMR400_524KhTile104X +EL_-756.49\k3C#JIIHGFDCBAAABBAA@@@AABCDA2LMR400_524JgTile103Y +EL_-1191.96CρCRRQONLJHFFEEDDCBA@@@AAABATaRG6_150JgTile103X +EL_-1191.96CρCRRQONLJHFFEEDDCBA@@@AAABATa RG6_150IfTile102Y +EL_-900.98D$ZCtNNMLJIGEDCCCCBBA@@@AABCCALMR400_400IfTile102X +EL_-900.98D$ZCtNNMLJIGEDCCCCBBA@@@AABCCALMR400_400HeTile101Y +EL_-903.11D 1CMPNNMLJIGEDCCCCBBA@@@AABCCAMLMR400_400HeTile101X +EL_-903.11D 1CMPNNMLJIGEDCCCCBBA@@@AABCCAMLMR400_400OlTile108Y +EL_-757.49DĀB=CJIIHGFDCBAAABBAA@@@AABCDA LMR400_524 OlTile108X +EL_-757.49DĀB=CJIIHGFDCBAAABBAA@@@AABCDA$LMR400_524 +NkTile107Y +EL_-756.95B 7Ć3C'JIIHGFDCBAAABBAA@@@AABCDA(LMR400_524 NkTile107X +EL_-756.95B 7Ć3C'JIIHGFDCBAAABBAA@@@AABCDA ,LMR400_524 MjTile106Y +EL_-1192.31CT++AC5RRQONLJHFFEEDDCBA@@@AAABAt0RG6_150 MjTile106X +EL_-1192.31CT++AC5RRQONLJHFFEEDDCBA@@@AAABAt4RG6_150LiTile105Y +EL_-1095.55CAH#]C;#NNMLJIGEDDCCCCBA@@@AABCCA2 8RG6_230LiTile105X +EL_-1095.55CAH#]C;#NNMLJIGEDDCCCCBA@@@AABCCA2LMR400_52403JTile074YEL_-1096.750uCNNMLJIGEDDCCCCBA@@@AABCCARG6_23013JTile074XEL_-1096.750uCNNMLJIGEDDCCCCBA@@@AABCCARG6_23022ITile073YEL_-757.72D.VÎ:CsTJIIHGFDCBAAABBAA@@@AABCDAl LMR400_52432ITile073XEL_-757.72D.VÎ:CsTJIIHGFDCBAAABBAA@@@AABCDAl LMR400_52441HTile072YEL_-1096.00BLF1CNNMLJIGEDDCCCCBA@@@AABCCARG6_23051HTile072XEL_-1096.00BLF1CNNMLJIGEDDCCCCBA@@@AABCCARG6_23060GTile071YEL_-1097.16C=˅CCNNMLJIGEDDCCCCBA@@@AABCCAMRG6_23070GTile071XEL_-1097.16C=˅CCNNMLJIGEDDCCCCBA@@@AABCCAMRG6_23087NTile078YEL_-1192.71C=øCRRQONLJHFFEEDDCBA@@@AAABA #RG6_15097NTile078XEL_-1192.71C=øCRRQONLJHFFEEDDCBA@@@AAABA 'RG6_150:6MTile077YEL_-1266.70C7öCCޘMMMMLJIGFEEEDDCBA@@@@@AAA+RG6_90;6MTile077XEL_-1266.70C7öCCޘMMMMLJIGFEEEDDCBA@@@@@AAA /RG6_90<5LTile076YEL_-1096.26C9/hC`BNNMLJIGEDDCCCCBA@@@AABCCA3RG6_230=5LTile076XEL_-1096.26C9/hC`BNNMLJIGEDDCCCCBA@@@AABCCA7RG6_230>4KTile075YEL_-1096.79~WC5NNMLJIGEDDCCCCBA@@@AABCCA;RG6_230?4KTile075XEL_-1096.79~WC5NNMLJIGEDDCCCCBA@@@AABCCA ?RG6_230@ Tile024YEL_-593.60C¹+CRRQONLJHFFEEDDCBA@@@AAABA` @RG6_150A Tile024XEL_-593.60C¹+CRRQONLJHFFEEDDCBA@@@AAABA` DRG6_150B +Tile023YEL_-666.11CmPUCfMMMMLJIGFEEEDDCBA@@@@@AAA\]HRG6_90C +Tile023XEL_-666.11CmPUCfMMMMLJIGFEEEDDCBA@@@@@AAA\]LRG6_90D Tile022YEL_-667.52C CNMMMMLJIGFEEEDDCBA@@@@@AAAK^ PRG6_90E Tile022XEL_-667.52C CNMMMMLJIGFEEEDDCBA@@@@@AAAK^TRG6_90FTile021YEL_-667.01CN5bCBMMMMLJIGFEEEDDCBA@@@@@AAA<XRG6_90GTile021XEL_-667.01CN5bCBMMMMLJIGFEEEDDCBA@@@@@AAA<\RG6_90HTile028YEL_-666.70C0COMMMMLJIGFEEEDDCBA@@@@@AAA`RG6_90ITile028XEL_-666.70C0COMMMMLJIGFEEEDDCBA@@@@@AAAdRG6_90JTile027YEL_-593.76CQ™C%RRQONLJHFFEEDDCBA@@@AAABAhshRG6_150KTile027XEL_-593.76CQ™C%RRQONLJHFFEEDDCBA@@@AAABAhslRG6_150L Tile026YEL_-594.23C¦CfRRQONLJHFFEEDDCBA@@@AAABA pRG6_150M Tile026XEL_-594.23C¦CfRRQONLJHFFEEDDCBA@@@AAABAtRG6_150N Tile025YEL_-593.87Ckd›CbRRQONLJHFFEEDDCBA@@@AAABADxRG6_150O Tile025XEL_-593.87Ckd›CbRRQONLJHFFEEDDCBA@@@AAABAD|RG6_150PTile014YEL_-583.00C7+e`C?RRQONLJHFFEEDDCBA@@@AAABAARG6_150QTile014XEL_-583.00C7+e`C?RRQONLJHFFEEDDCBA@@@AAABAERG6_150R Tile013YEL_-582.91C±%CRRQONLJHFFEEDDCBA@@@AAABA$ IRG6_150S Tile013XEL_-582.91C±%CRRQONLJHFFEEDDCBA@@@AAABA$ MRG6_150T Tile012YEL_-655.66C¾C{MMMMLJIGFEEEDDCBA@@@@@AAAjQRG6_90U Tile012XEL_-655.66C¾C{MMMMLJIGFEEEDDCBA@@@@@AAAjURG6_90V Tile011YEL_-656.14C1ChMMMMLJIGFEEEDDCBA@@@@@AAAΥYRG6_90W Tile011XEL_-656.14C1ChMMMMLJIGFEEEDDCBA@@@@@AAAΥ]RG6_90XTile018YEL_-655.39C\E`T{CdMMMMLJIGFEEEDDCBA@@@@@AAAIRaRG6_90YTile018XEL_-655.39C\E`T{CdMMMMLJIGFEEEDDCBA@@@@@AAAIReRG6_90ZTile017YEL_-583.32CrGmº'CRRQONLJHFFEEDDCBA@@@AAABAAiRG6_150[Tile017XEL_-583.32CrGmº'CRRQONLJHFFEEDDCBA@@@AAABAA mRG6_150\Tile016YEL_-656.34CțfCMMMMLJIGFEEEDDCBA@@@@@AAAXqRG6_90]Tile016XEL_-656.34CțfCMMMMLJIGFEEEDDCBA@@@@@AAAXuRG6_90^Tile015YEL_-583.02Cxs­HCdRRQONLJHFFEEDDCBA@@@AAABAyRG6_150_Tile015XEL_-583.02Cxs­HCdRRQONLJHFFEEDDCBA@@@AAABA}RG6_150`C^Tile094Y EL_-497.08C:7LCNNMLJIGEDDCCCCBA@@@AABCCAUBRG6_230aC^Tile094X EL_-497.08C:7LCNNMLJIGEDDCCCCBA@@@AABCCAUFRG6_230bB]Tile093Y EL_-593.79Ck Cr-RRQONLJHFFEEDDCBA@@@AAABAJRG6_150cB]Tile093X EL_-593.79Ck Cr-RRQONLJHFFEEDDCBA@@@AAABANRG6_150dA\Tile092Y EL_-497.18CARC-lCNNMLJIGEDDCCCCBA@@@AABCCAJXRRG6_230eA\Tile092X EL_-497.18CARC-lCNNMLJIGEDDCCCCBA@@@AABCCAJX VRG6_230f@[Tile091Y EL_-398.60CKC CQPPNMKIGFEEDDDCBA@@AABBCAZLMR400_320g@[Tile091X EL_-398.60CKC CQPPNMKIGFEEDDDCBA@@AABBCA^LMR400_320hGbTile098Y EL_-497.40DBC(1NNMLJIGEDDCCCCBA@@@AABCCA#bRG6_230iGbTile098X EL_-497.40DBC(1NNMLJIGEDDCCCCBA@@@AABCCA#fRG6_230jFaTile097Y EL_-497.70D +-BH C+NNMLJIGEDDCCCCBA@@@AABCCAZ jRG6_230kFaTile097X EL_-497.70D +-BH C+NNMLJIGEDDCCCCBA@@@AABCCAZ nRG6_230lE`Tile096Y EL_-497.59C%C|NNMLJIGEDDCCCCBA@@@AABCCA9$rRG6_230mE`Tile096X EL_-497.59C%C|NNMLJIGEDDCCCCBA@@@AABCCA9$vRG6_230nD_Tile095Y EL_-497.36C`bCNNMLJIGEDDCCCCBA@@@AABCCAzRG6_230oD_Tile095X EL_-497.36C`bCNNMLJIGEDDCCCCBA@@@AABCCA ~RG6_230p;TTile084YEL_-479.65C'vFCNNMLJIGEDDCCCCBA@@@AABCCA CRG6_230q;TTile084XEL_-479.65C'vFCNNMLJIGEDDCCCCBA@@@AABCCA GRG6_230r:STile083YEL_-481.56C‹CNNMLJIGEDDCCCCBA@@@AABCCA KRG6_230s:STile083XEL_-481.56C‹CNNMLJIGEDDCCCCBA@@@AABCCAORG6_230t9RTile082YEL_-577.51C?; CHRRQONLJHFFEEDDCBA@@@AAABAGSRG6_150u9RTile082XEL_-577.51C?; CHRRQONLJHFFEEDDCBA@@@AAABAGWRG6_150v8QTile081YEL_-481.45DM? w +CbNNMLJIGEDDCCCCBA@@@AABCCAq[RG6_230w8QTile081XEL_-481.45DM? w +CbNNMLJIGEDDCCCCBA@@@AABCCAq_RG6_230x?XTile088YEL_-649.84C£ÃC7MMMMLJIGFEEEDDCBA@@@@@AAA cRG6_90y?XTile088XEL_-649.84C£ÃC7MMMMLJIGFEEEDDCBA@@@@@AAA gRG6_90z>WTile087YEL_-480.85CuŹCANNMLJIGEDDCCCCBA@@@AABCCA5 kRG6_230{>WTile087XEL_-480.85CuŹCANNMLJIGEDDCCCCBA@@@AABCCA5oRG6_230|=VTile086YEL_-481.50CrXCNNMLJIGEDDCCCCBA@@@AABCCAsRG6_230}=VTile086XEL_-481.50CrXCNNMLJIGEDDCCCCBA@@@AABCCAwRG6_230~<UTile085YEL_-481.51CtCfNNMLJIGEDDCCCCBA@@@AABCCA@O{RG6_230<UTile085XEL_-481.51CtCfNNMLJIGEDDCCCCBA@@@AABCCA@ORG6_230[|Tile124Y EL_-1673.73DLVCcC߾QPPNMKIGFEEDDDCBA@@AABBCAfLMR400_320[|Tile124X EL_-1673.73DLVCcC߾QPPNMKIGFEEDDDCBA@@AABBCAfLMR400_320Z{Tile123Y EL_-1578.62D@oCnO\C +NNMLJIGEDCCCCBBA@@@AABCCAgLMR400_400Z{Tile123X EL_-1578.62D@oCnO\C +NNMLJIGEDCCCCBBA@@@AABCCAgLMR400_400YzTile122Y EL_-1434.47DCsC'JIIHGFDCBAAABBAA@@@AABCDA: LMR400_524YzTile122X EL_-1434.47DCsC'JIIHGFDCBAAABBAA@@@AABCDA:LMR400_524XyTile121Y EL_-1435.63DRD3'CMJIIHGFDCBAAABBAA@@@AABCDAFLMR400_524XyTile121X EL_-1435.63DRD3'CMJIIHGFDCBAAABBAA@@@AABCDAF LMR400_524_Tile128Y EL_-1434.03D?CLJIIHGFDCBAAABBAA@@@AABCDAGLMR400_524_Tile128X EL_-1434.03D?CLJIIHGFDCBAAABBAA@@@AABCDAGLMR400_524^Tile127Y EL_-1578.28Dm}B `C#3NNMLJIGEDCCCCBBA@@@AABCCALMR400_400^Tile127X EL_-1578.28Dm}B `C#3NNMLJIGEDCCCCBBA@@@AABCCALMR400_400]~Tile126Y EL_-1434.37DJk~CJIIHGFDCBAAABBAA@@@AABCDA, LMR400_524]~Tile126X EL_-1434.37DJk~CJIIHGFDCBAAABBAA@@@AABCDA,LMR400_524\}Tile125Y EL_-1435.33DKRBuŢC!JIIHGFDCBAAABBAA@@@AABCDALMR400_524\}Tile125X EL_-1435.33DKRBuŢC!JIIHGFDCBAAABBAA@@@AABCDALMR400_524SrTile114Y EL_-1582.82D_RÀyCNNMLJIGEDCCCCBBA@@@AABCCAQLMR400_400SrTile114X EL_-1582.82D_RÀyCNNMLJIGEDCCCCBBA@@@AABCCAQ LMR400_400RqTile113Y EL_-1435.76DCh-CJIIHGFDCBAAABBAA@@@AABCDALMR400_524RqTile113X EL_-1435.76DCh-CJIIHGFDCBAAABBAA@@@AABCDA LMR400_524QpTile112Y EL_-1582.47D`Bc&CNNMLJIGEDCCCCBBA@@@AABCCALMR400_400QpTile112X EL_-1582.47D`Bc&CNNMLJIGEDCCCCBBA@@@AABCCALMR400_400PoTile111Y EL_-1436.83Dϗ\æCJIIHGFDCBAAABBAA@@@AABCDAOLMR400_524PoTile111X EL_-1436.83Dϗ\æCJIIHGFDCBAAABBAA@@@AABCDAO LMR400_524WvTile118Y EL_-1436.90D{^^%C0JIIHGFDCBAAABBAA@@@AABCDAqvLMR400_524WvTile118X EL_-1436.90D{^^%C0JIIHGFDCBAAABBAA@@@AABCDAqvLMR400_524VuTile117Y EL_-1437.65D0ÖYCJIIHGFDCBAAABBAA@@@AABCDA*LMR400_524VuTile117X EL_-1437.65D0ÖYCJIIHGFDCBAAABBAA@@@AABCDA*LMR400_524UtTile116Y EL_-1437.09D6`yCJIIHGFDCBAAABBAA@@@AABCDALMR400_524UtTile116X EL_-1437.09D6`yCJIIHGFDCBAAABBAA@@@AABCDALMR400_524TsTile115Y EL_-1436.89D>'CC JIIHGFDCBAAABBAA@@@AABCDAJLMR400_524TsTile115X EL_-1436.89D>'CC JIIHGFDCBAAABBAA@@@AABCDAJLMR400_524kTile144YEL_-1440.91CCCOJIIHGFDCBAAABBAA@@@AABCDALMR400_524kTile144XEL_-1440.91CCCOJIIHGFDCBAAABBAA@@@AABCDALMR400_524jTile143YEL_-1680.89ÄLCPC)QPPNMKIGFEEDDDCBA@@AABBCA̘ LMR400_320jTile143XEL_-1680.89ÄLCPC)QPPNMKIGFEEDDDCBA@@AABBCA̘LMR400_320iTile142YEL_-1441.58ݠD$)C)JIIHGFDCBAAABBAA@@@AABCDALMR400_524iTile142XEL_-1441.58ݠD$)C)JIIHGFDCBAAABBAA@@@AABCDALMR400_524hTile141YEL_-1441.96CDCRJIIHGFDCBAAABBAA@@@AABCDA$LMR400_524hTile141XEL_-1441.96CDCRJIIHGFDCBAAABBAA@@@AABCDA$ LMR400_524oTile148YEL_-1586.04BDCNwNNMLJIGEDCCCCBBA@@@AABCCAILMR400_400oTile148XEL_-1586.04BDCNwNNMLJIGEDCCCCBBA@@@AABCCAILMR400_400nTile147YEL_-1586.05MCeCfNNMLJIGEDCCCCBBA@@@AABCCALMR400_400nTile147XEL_-1586.05MCeCfNNMLJIGEDCCCCBBA@@@AABCCALMR400_400mTile146YEL_-1681.79¶MDCgQPPNMKIGFEEDDDCBA@@AABBCALMR400_320mTile146XEL_-1681.79¶MDCgQPPNMKIGFEEDDDCBA@@AABBCALMR400_320lTile145YEL_-1441.63CRC+JIIHGFDCBAAABBAA@@@AABCDAWLMR400_524lTile145XEL_-1441.63CRC+JIIHGFDCBAAABBAA@@@AABCDAWLMR400_524cTile134Y EL_-1585.29Ct|)D C$ZNNMLJIGEDCCCCBBA@@@AABCCA LMR400_400cTile134X EL_-1585.29Ct|)D C$ZNNMLJIGEDCCCCBBA@@@AABCCA LMR400_400bTile133Y EL_-1439.87D +WD3C-PJIIHGFDCBAAABBAA@@@AABCDA LMR400_524bTile133X EL_-1439.87D +WD3C-PJIIHGFDCBAAABBAA@@@AABCDA LMR400_524aTile132Y EL_-1439.30DVsD)HCJIIHGFDCBAAABBAA@@@AABCDALMR400_524aTile132X EL_-1439.30DVsD)HCJIIHGFDCBAAABBAA@@@AABCDALMR400_524`Tile131Y EL_-1440.65DwDQZCYJIIHGFDCBAAABBAA@@@AABCDAѷ LMR400_524`Tile131X EL_-1440.65DwDQZCYJIIHGFDCBAAABBAA@@@AABCDAѷLMR400_524gTile138Y EL_-1439.32D#7LCC !JIIHGFDCBAAABBAA@@@AABCDALMR400_524gTile138X EL_-1439.32D#7LCC !JIIHGFDCBAAABBAA@@@AABCDA LMR400_524fTile137Y EL_-1678.93DjD&FCdQPPNMKIGFEEDDDCBA@@AABBCA2LMR400_320fTile137X EL_-1678.93DjD&FCdQPPNMKIGFEEDDDCBA@@AABBCA2LMR400_320eTile136Y EL_-1585.44C}qCmC{NNMLJIGEDCCCCBBA@@@AABCCAf LMR400_400eTile136X EL_-1585.44C}qCmC{NNMLJIGEDCCCCBBA@@@AABCCAf LMR400_400dTile135Y EL_-1678.64CDCA'QPPNMKIGFEEDDDCBA@@AABBCAALMR400_320dTile135X EL_-1678.64CDCA'QPPNMKIGFEEDDDCBA@@AABBCAALMR400_320"Tile034YEL_-215.98CmZCRRQONLJHFFEEDDCBA@@@AAABA:^RG6_150"Tile034XEL_-215.98CmZCRRQONLJHFFEEDDCBA@@@AAABA:^ RG6_150!Tile033YEL_-287.79Ck+!C{MMMMLJIGFEEEDDCBA@@@@@AAA?RG6_90!Tile033XEL_-287.79Ck+!C{MMMMLJIGFEEEDDCBA@@@@@AAA?RG6_90 Tile032YEL_-288.76C^Z^jCoMMMMLJIGFEEEDDCBA@@@@@AAAPRG6_90 Tile032XEL_-288.76C^Z^jCoMMMMLJIGFEEEDDCBA@@@@@AAAPRG6_90Tile031YEL_-288.35CICg +MMMMLJIGFEEEDDCBA@@@@@AAAJRG6_90Tile031XEL_-288.35CICg +MMMMLJIGFEEEDDCBA@@@@@AAAJ RG6_90&Tile038YEL_-215.34CEJ9CRRQONLJHFFEEDDCBA@@@AAABARG6_150&Tile038XEL_-215.34CEJ9CRRQONLJHFFEEDDCBA@@@AAABARG6_150%Tile037YEL_-215.29Cևp:^C +RRQONLJHFFEEDDCBA@@@AAABARG6_150%Tile037XEL_-215.29Cևp:^C +RRQONLJHFFEEDDCBA@@@AAABARG6_150$Tile036YEL_-215.40CuŒ&fC RRQONLJHFFEEDDCBA@@@AAABA4RG6_150$Tile036XEL_-215.40CuŒ&fC RRQONLJHFFEEDDCBA@@@AAABA4RG6_150#Tile035YEL_-215.97Cz!CRRQONLJHFFEEDDCBA@@@AAABARG6_150#Tile035XEL_-215.97Cz!CRRQONLJHFFEEDDCBA@@@AAABARG6_150,Tile044YEL_-214.35C\6(CsRRQONLJHFFEEDDCBA@@@AAABAGRG6_150,Tile044XEL_-214.35C\6(CsRRQONLJHFFEEDDCBA@@@AAABAGRG6_150+Tile043YEL_-214.25ChCBRRQONLJHFFEEDDCBA@@@AAABA4RG6_150+Tile043XEL_-214.25ChCBRRQONLJHFFEEDDCBA@@@AAABA4 RG6_150*Tile042YEL_-214.52Cp;dCRRQONLJHFFEEDDCBA@@@AAABAÖRG6_150*Tile042XEL_-214.52Cp;dCRRQONLJHFFEEDDCBA@@@AAABAÖRG6_150)Tile041YEL_-214.26C/‡C5RRQONLJHFFEEDDCBA@@@AAABARG6_150)Tile041XEL_-214.26C/‡C5RRQONLJHFFEEDDCBA@@@AAABARG6_1500Tile048YEL_-286.78C\nffCt{MMMMLJIGFEEEDDCBA@@@@@AAARG6_900Tile048XEL_-286.78C\nffCt{MMMMLJIGFEEEDDCBA@@@@@AAARG6_90/Tile047YEL_-214.48C${\cTC+RRQONLJHFFEEDDCBA@@@AAABA҉RG6_150/Tile047XEL_-214.48C${\cTC+RRQONLJHFFEEDDCBA@@@AAABA҉RG6_150.Tile046YEL_-287.51CECyXMMMMLJIGFEEEDDCBA@@@@@AAAqRG6_90.Tile046XEL_-287.51CECyXMMMMLJIGFEEEDDCBA@@@@@AAAqRG6_90-Tile045YEL_-215.48C"NTCRRQONLJHFFEEDDCBA@@@AAABARG6_150-Tile045XEL_-215.48C"NTCRRQONLJHFFEEDDCBA@@@AAABARG6_150+@Tile064YEL_-212.49Cn ŸCRRQONLJHFFEEDDCBA@@@AAABA+6RG6_150+@Tile064XEL_-212.49Cn ŸCRRQONLJHFFEEDDCBA@@@AAABA+6RG6_150*?Tile063YEL_-212.31CeVF£CRRQONLJHFFEEDDCBA@@@AAABA RG6_150*?Tile063XEL_-212.31CeVF£CRRQONLJHFFEEDDCBA@@@AAABA RG6_150)>Tile062YEL_-212.86Cf)y\CHRRQONLJHFFEEDDCBA@@@AAABA0RG6_150)>Tile062XEL_-212.86Cf)y\CHRRQONLJHFFEEDDCBA@@@AAABA0RG6_150(=Tile061YEL_-213.19CY.ҏCRRQONLJHFFEEDDCBA@@@AAABA!RG6_150(=Tile061XEL_-213.19CY.ҏCRRQONLJHFFEEDDCBA@@@AAABA!RG6_150/DTile068YEL_-212.55C]JÖCRRQONLJHFFEEDDCBA@@@AAABARG6_150/DTile068XEL_-212.55C]JÖCRRQONLJHFFEEDDCBA@@@AAABA RG6_150.CTile067YEL_-212.60CdzDCRRQONLJHFFEEDDCBA@@@AAABARG6_150.CTile067XEL_-212.60CdzDCRRQONLJHFFEEDDCBA@@@AAABARG6_150-BTile066YEL_-212.34CkŽCRRQONLJHFFEEDDCBA@@@AAABA?RG6_150-BTile066XEL_-212.34CkŽCRRQONLJHFFEEDDCBA@@@AAABA?RG6_150,ATile065YEL_-117.36Cw–=qCNNMLJIGEDDCCCCBA@@@AABCCARG6_230,ATile065XEL_-117.36Cw–=qCNNMLJIGEDDCCCCBA@@@AABCCARG6_230#6Tile054YEL_-17.97¡!HB5CHQPPNMKIGFEEDDDCBA@@AABBCAWLMR400_320#6Tile054XEL_-17.97¡!HB5CHQPPNMKIGFEEDDDCBA@@AABBCAWLMR400_320"5Tile053YEL_-287.15BC,MMMMLJIGFEEEDDCBA@@@@@AAAkQRG6_90"5Tile053XEL_-287.15BC,MMMMLJIGFEEEDDCBA@@@@@AAAkQRG6_90!4Tile052YEL_75.60- C1wCNNMLJIGEDCCCCBBA@@@AABCCA_LMR400_400!4Tile052XEL_75.60- C1wCNNMLJIGEDCCCCBBA@@@AABCCA_LMR400_400 3Tile051YEL_-287.05B^=qCfMMMMLJIGFEEEDDCBA@@@@@AAAARG6_90 3Tile051XEL_-287.05B^=qCfMMMMLJIGFEEEDDCBA@@@@@AAAARG6_90':Tile058YEL_-287.14Bd¯1CMMMMLJIGFEEEDDCBA@@@@@AAA*RG6_90':Tile058XEL_-287.14Bd¯1CMMMMLJIGFEEEDDCBA@@@@@AAA*RG6_90&9Tile057YEL_-117.60}CNNMLJIGEDDCCCCBA@@@AABCCA̘RG6_230&9Tile057XEL_-117.60}CNNMLJIGEDDCCCCBA@@@AABCCA̘RG6_230%8Tile056YEL_-117.85T‡)CfNNMLJIGEDDCCCCBA@@@AABCCAdRG6_230%8Tile056XEL_-117.85T‡)CfNNMLJIGEDDCCCCBA@@@AABCCAdRG6_230$7Tile055YEL_220.70ÁC3C<JIIHGFDCBAAABBAA@@@AABCDALMR400_524$7Tile055XEL_220.70ÁC3C<JIIHGFDCBAAABBAA@@@AABCDALMR400_524 \ No newline at end of file diff --git a/test_files/1101503312_vcs/README.md b/test_files/1101503312_vcs/README.md new file mode 100644 index 0000000..f695366 --- /dev/null +++ b/test_files/1101503312_vcs/README.md @@ -0,0 +1,2 @@ +This directory of test files contains a modified metafits file which only has 2 rf_inputs (1101503312.metafits) for the purposes of testingLegacy VCS voltage context functionality. Limiting to 2 rfinputs (1 tile) reduces the test file size generated by the tests. +There is also an unmodified metafits: 1101503312.metafits128 which is only used once to test for the ordering of antennas and rfinputs. diff --git a/test_files/1370755832_mwax_vcs_os/1370755832_metafits.fits b/test_files/1370755832_mwax_vcs_os/1370755832_metafits.fits new file mode 100644 index 0000000..e42bd1d --- /dev/null +++ b/test_files/1370755832_mwax_vcs_os/1370755832_metafits.fits @@ -0,0 +1 @@ +SIMPLE = T / conforms to FITS standard BITPIX = 8 / array data type NAXIS = 0 / number of array dimensions EXTEND = T GPSTIME = 1370755832 / [s] GPS time of observation start EXPOSURE= 32 / [s] duration of observation FILENAME= 'Oversamp-VCS_Sun_Ch121' / Name of observation MJD = 60109.2293287037 / [days] MJD of observation DATE-OBS= '2023-06-14T05:30:14' / [UT] Date and time of observation LST = 101.557235133708 / [deg] LST HA = '-25:29:45.58' / [hours] hour angle of pointing center AZIMUTH = 333.435 / [deg] Azimuth of pointing center ALTITUDE= 37.3163 / [deg] Altitude of pointing center RA = 78.75511367401865 / [deg] RA of pointing center DEC = 21.26115899040381 / [deg] Dec of pointing center RAPHASE = 81.9556515522782 / [deg] RA of desired phase center DECPHASE= 23.2320328646447 / [deg] DEC of desired phase center DELAYMOD= 'NODELAYS' / MWAX correlator delay mode CABLEDEL= 0 GEODEL = 0 CALIBDEL= 0 DELDESC = 'No delays applied' ATTEN_DB= 10.0 / [dB] global analogue attenuation, in dB SUN-DIST= 3.55126616310887 / [deg] Distance from pointing center to Sun SUN-ALT = 36.6913318053527 / [deg] Altitude of Sun MOONDIST= 44.4693428539762 / [deg] Distance from pointing center to Moon JUP-DIST= 43.706154209215 / [deg] Distance from pointing center to Jupiter GRIDNAME= 'sweet ' / Pointing grid name GRIDNUM = 144 / Pointing grid number CREATOR = 'andrew ' / Observation creator PROJECT = 'C001 ' / Project ID MODE = 'MWAX_VCS' / Observation mode RECVRS = '17,18 ' / Active receivers DELAYS = '27,24,21,18,21,18,15,12,15,12,9,6,9,6,3,0' / Beamformer delays CALIBRAT= F / Not intended for calibration CENTCHAN= 121 / Center coarse channel CHANNELS= '109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125&'CONTINUE ',126,127,128,129,130,131,132&' CONTINUE '' / Coarse channels CHANSEL = '0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23' / IndiFINECHAN= 10.0 / [kHz] Fine channel width - correlator freq_res INTTIME = 0.5 / [s] Individual integration time NAV_FREQ= 50 / # of 200Hz chans avgd to make each fine chan NSCANS = 64 / Number of time instants in correlation productsNINPUTS = 2 / Number of inputs into the correlation products NCHANS = 3072 / Number of (averaged) fine channels in spectrum BANDWDTH= 30.72 / [MHz] Total bandwidth DERIPPLE= 0 / Deripple: 0=OFF, 1=ON OVERSAMP= 1 / Oversampling: 0=OFF, 1=ON MWAXSTAT= 'MWAX Status: GOOD' MWB_ENAB= '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24' MWB_LIVE= '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24' FREQCENT= 154.24 / [MHz] Center frequency of observation TIMEOFF = 0 / [s] Deprecated, use QUACKTIM or GOODTIME DATESTRT= '2023-06-14T05:30:14' / [UT] Date and time of correlations start RAWSCALE= 0.003 / Raw visibilities multiplied by this value VERSION = 2.2 / METAFITS version number TELESCOP= 'MWA ' INSTRUME= 'MWAX ' QUACKTIM= 3.0 / Seconds of bad data after observation starts GOODTIME= 1686720617.0 / OBSID+QUACKTIME as Unix timestamp DATE = '2023-08-02T04:59:57' / UT Date of file creation COMMENT After an observation starts, the receiver hardware changes take a COMMENT few seconds to stabilise. COMMENT QUACKTIM and GOODTIME represent the start of the first uncontaminated COMMENT data, rounded up to the next time-averaged data packet. Note that this COMMENT time may be before the first actual data in some or all gpubox files. COMMENT See metafits file documentation here: COMMENT https://wiki.mwatelescope.org/display/MP/Metafits+files COMMENT https://wiki.mwatelescope.org/display/MP/MWAX+Metafits+Changes HISTORY Created by user apache HISTORY Created on host mwa-django01p.curtin.edu.au HISTORY Command: "mod_wsgi" END XTENSION= 'BINTABLE' / binary table extension BITPIX = 8 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 243 / length of dimension 1 NAXIS2 = 2 / length of dimension 2 PCOUNT = 0 / number of group parameters GCOUNT = 1 / number of groups TFIELDS = 19 / number of table fields TTYPE1 = 'Input ' TFORM1 = 'I ' TTYPE2 = 'Antenna ' TFORM2 = 'I ' TTYPE3 = 'Tile ' TFORM3 = 'I ' TTYPE4 = 'TileName' TFORM4 = '8A ' TTYPE5 = 'Pol ' TFORM5 = 'A ' TTYPE6 = 'Rx ' TFORM6 = 'I ' TTYPE7 = 'Slot ' TFORM7 = 'I ' TTYPE8 = 'Flag ' TFORM8 = 'I ' TTYPE9 = 'Length ' TFORM9 = '14A ' TTYPE10 = 'North ' TFORM10 = 'E ' TUNIT10 = 'm ' TTYPE11 = 'East ' TFORM11 = 'E ' TUNIT11 = 'm ' TTYPE12 = 'Height ' TFORM12 = 'E ' TUNIT12 = 'm ' TTYPE13 = 'Gains ' TFORM13 = '24I ' TTYPE14 = 'BFTemps ' TFORM14 = 'E ' TUNIT14 = 'degC ' TTYPE15 = 'Delays ' TFORM15 = '16I ' TTYPE16 = 'VCSOrder' TFORM16 = 'I ' TTYPE17 = 'Flavors ' TFORM17 = '10A ' TTYPE18 = 'Calib_Delay' TFORM18 = 'E ' TUNIT18 = 'm ' TTYPE19 = 'Calib_Gains' TFORM19 = '24E ' EXTNAME = 'TILEDATA' / extension name HISTORY File modified by user 'gsleap' with fv on 2023-08-16T15:51:38 END  LBG4YEL_-1808.80İDIsCB    RFOF-NI???????????????????????? LBG4XEL_-1808.80İDIsCB    RFOF-NI???????????????????????? \ No newline at end of file diff --git a/test_files/1370755832_mwax_vcs_os/README.md b/test_files/1370755832_mwax_vcs_os/README.md new file mode 100644 index 0000000..9723200 --- /dev/null +++ b/test_files/1370755832_mwax_vcs_os/README.md @@ -0,0 +1 @@ +This directory of test files contains a modified metafits file which only has 2 rf_inputs for the purposes of testing oversampled MWAX VCS voltage context functionality. Limiting to 2 rfinputs (1 tile) reduces the test file size generated by the tests.