Source code for hera_sim.visibilities.pyuvsim_wrapper
"""Wrapper for the pyuvsim simulator."""
import warnings
import numpy as np
import pyuvsim
from .simulators import ModelData, VisibilitySimulator
[docs]class UVSim(VisibilitySimulator):
"""A wrapper around the pyuvsim simulator.
Parameters
----------
quiet
If True, don't print anything.
"""
_blt_order_kws = {"order": "time", "minor_order": "baseline"}
_functions_to_profile = (pyuvsim.uvsim.run_uvdata_uvsim,)
def __init__(self, quiet: bool = True):
self.quiet = quiet
[docs] def simulate(self, data_model: ModelData):
"""Simulate the visibilities."""
beam_dict = {
ant: data_model.beam_ids[ant]
for ant in data_model.uvdata.telescope.antenna_names
}
# TODO: this can be removed once
# https://github.com/RadioAstronomySoftwareGroup/pyuvsim/pull/357
# is mereged.
if data_model.sky_model.name is not None:
data_model.sky_model.name = np.array(data_model.sky_model.name)
warnings.warn(
"UVSim requires time-ordered data. Ensuring that order in UVData...",
stacklevel=1,
)
data_model.uvdata.reorder_blts("time")
# The UVData object must have correctly ordered pols.
# TODO: either remove this when pyuvsim fixes bug with ordering
# (https://github.com/RadioAstronomySoftwareGroup/pyuvsim/issues/370) or
# at least check whether reordering is necessary once uvdata has that ability.
if np.any(data_model.uvdata.polarization_array != np.array([-5, -6, -7, -8])):
warnings.warn(
"In UVSim, polarization array must be in AIPS order. Reordering...",
stacklevel=1,
)
data_model.uvdata.reorder_pols("AIPS")
out_uv = pyuvsim.uvsim.run_uvdata_uvsim(
input_uv=data_model.uvdata,
beam_list=data_model.beams,
beam_dict=beam_dict,
catalog=pyuvsim.simsetup.SkyModelData(data_model.sky_model),
quiet=self.quiet,
)
return out_uv.data_array