Function birli::io::write_uvfits

source ·
pub fn write_uvfits<T: AsRef<Path>>(
    path: T,
    corr_ctx: &CorrelatorContext,
    jones_array: ArrayView3<'_, Jones<f32>>,
    weight_array: ArrayView3<'_, f32>,
    timestep_range: &Range<usize>,
    coarse_chan_range: &Range<usize>,
    baseline_idxs: &[usize],
    array_pos: Option<LatLngHeight>,
    phase_centre: Option<RADec>,
    avg_time: usize,
    avg_freq: usize
) -> Result<(), IOError>
Expand description

Write the given ndarrays of flags and Jones matrix visibilities to a uvfits file.

mwalib timestep, coarse channel and baseline indices are needed to map between indices in the arrays and indices according to mwalib, which are not the same.

Examples

use tempfile::tempdir;
use birli::{
    FlagContext,
    marlu::mwalib::CorrelatorContext,
    get_weight_factor,
    flag_to_weight_array,
    VisSelection, io::{read_mwalib, write_uvfits}
};

// define our input files
let metafits_path = "tests/data/1196175296_mwa_ord/1196175296.metafits";
let gpufits_paths = vec![
    "tests/data/1196175296_mwa_ord/1196175296_20171201145440_gpubox01_00.fits",
];

// define a temporary directory for output files
let tmp_dir = tempdir().unwrap();

// define our output flag file template
let uvfits_out = tmp_dir.path().join("synthetic.uvfits");

// Create an mwalib::CorrelatorContext for accessing visibilities.
let corr_ctx = CorrelatorContext::new(metafits_path, &gpufits_paths).unwrap();

// Determine which timesteps and coarse channels we want to use
let vis_sel = VisSelection::from_mwalib(&corr_ctx).unwrap();

// Create a blank array to store flags and visibilities
let fine_chans_per_coarse = corr_ctx.metafits_context.num_corr_fine_chans_per_coarse;
let mut flag_array = vis_sel.allocate_flags(fine_chans_per_coarse).unwrap();
let mut jones_array = vis_sel.allocate_jones(fine_chans_per_coarse).unwrap();

// read visibilities out of the gpubox files
read_mwalib(&vis_sel, &corr_ctx, jones_array.view_mut(), flag_array.view_mut(), false)
    .unwrap();

// write the visibilities to disk as .uvfits
let num_pols = corr_ctx.metafits_context.num_visibility_pols;
let weight_factor = get_weight_factor(&corr_ctx);
let weight_array = flag_to_weight_array(flag_array.view(), weight_factor);

write_uvfits(
    uvfits_out.as_path(),
    &corr_ctx,
    jones_array.view(),
    weight_array.view(),
    &vis_sel.timestep_range,
    &vis_sel.coarse_chan_range,
    &vis_sel.baseline_idxs,
    None,
    None,
    1,
    1,
)
.unwrap();

Errors

See: UvfitsWriter

TODO: reduce number of arguments.