"""
Unit tests for the sensitivity_calculator.frontend_adapter module
"""
import numpy as np
import astropy.units as u
from astropy.coordinates import SkyCoord
from sensitivity_calculator.frontend_adapter import (
calculate_continuum_int_time,
calculate_continuum_sensitivity,
calculate_line_int_time,
calculate_line_sensitivity,
)
from sensitivity_calculator.mid import MidCalculator
target_gc = SkyCoord(l=0.0 * u.deg, b=0.0 * u.deg, frame="galactic")
target_cena = SkyCoord(frame="icrs", ra="13h25m27.6s", dec="−43d01m09s")
[docs]def test_default_continuum_sensitivity():
"""This is an end to end testing of the SC ContinuumSensitivity
component. A range of possible inputs are tried and the results
compared with expected.
'Expert' values are not set, so the SC will calculate the
standard defaults where necessary.
"""
# simulate some variation in input parameters across bands
obsfreq = 0.7e9
bandwidth = 0.7e9
chunk_centres = [0.7e9]
chunk_width = 0.7e9
continuum_resolution = 0.21e3
array_config = "full"
weathers = ["Good"]
elevation = 90.0
band = "Band 1"
int_time = 10.0
# get result via frontend. Setting 'expert' parameters to None will make the SC
# generate default values
result = calculate_continuum_sensitivity(
target_lon=target_gc.icrs.ra.hourangle,
target_lat=target_gc.icrs.dec.degree,
target_frame="icrs",
obs_band=band,
continuum_obs_freq_scaled=obsfreq,
continuum_bandwidth_scaled=bandwidth,
weathers=weathers,
elevation=elevation,
array_config=array_config,
continuum_int_time_scaled=int_time,
eta_system=None,
eta_point=None,
eta_coherence=None,
eta_digitisation=None,
eta_correlation=None,
eta_bandpass=None,
n_ska=None,
eta_dish_ska=None,
Tsys_ska=None,
Tspl_ska=None,
Trcv_ska=None,
n_meer=None,
eta_dish_meer=None,
Tsys_meer=None,
Tspl_meer=None,
Trcv_meer=None,
Tsky=None,
Tgal=None,
alpha=None,
chunk_centres=chunk_centres,
chunk_width=chunk_width,
continuum_resolution=continuum_resolution,
)
# print("result 1", result)
old = {
"Good": {
"calculator_state": {
"pwv": "5",
"etaPointing": "1",
"etaCoherence": "1",
"etaDigitisation": "0.999",
"etaCorrelation": "0.98",
"etaBandpass": "1",
"nSKA": "133",
"etaSKA": "0.826",
"nMeer": "64",
"etaMeer": "0.708",
"alpha": "2.75",
"Tsys_SKA": "221",
"Tspl_SKA": "3",
"Trcv_SKA": "15.1",
"Tsys_Meer": "208",
"Tspl_Meer": "4",
"Trcv_Meer": "10.5",
"Tsky": "198",
"Tgal": "195",
"elevation": "88.2",
},
"cont_sens": "0.00019802 Jy",
"chunk_centres": ["0.7 GHz"],
"chunk_width": "0.7 GHz",
"chunk_sensitivities": ["0.00019802 Jy"],
"cont_line_sens": "0.36153 Jy",
}
}
assert result == old
# now try with 'commissioning' Tsys set
Tsys = 25.0
result = calculate_continuum_sensitivity(
target_lon=target_gc.icrs.ra.hourangle,
target_lat=target_gc.icrs.dec.degree,
target_frame="icrs",
obs_band=band,
continuum_obs_freq_scaled=obsfreq,
continuum_bandwidth_scaled=bandwidth,
weathers=weathers,
elevation=elevation,
array_config=array_config,
continuum_int_time_scaled=int_time,
eta_system=None,
eta_point=None,
eta_coherence=None,
eta_digitisation=None,
eta_correlation=None,
eta_bandpass=None,
n_ska=None,
eta_dish_ska=None,
Tsys_ska=Tsys,
Tspl_ska=None,
Trcv_ska=None,
n_meer=None,
eta_dish_meer=None,
Tsys_meer=Tsys,
Tspl_meer=None,
Trcv_meer=None,
Tsky=None,
Tgal=None,
alpha=None,
chunk_centres=chunk_centres,
chunk_width=chunk_width,
continuum_resolution=continuum_resolution,
)
# print("result 2", result)
old = {
"Good": {
"calculator_state": {
"pwv": "5",
"etaPointing": "1",
"etaCoherence": "1",
"etaDigitisation": "0.999",
"etaCorrelation": "0.98",
"etaBandpass": "1",
"nSKA": "133",
"etaSKA": "0.826",
"nMeer": "64",
"etaMeer": "0.708",
"alpha": "2.75",
"Tsys_SKA": "25",
"Tspl_SKA": "3",
"Trcv_SKA": "15.1",
"Tsys_Meer": "25",
"Tspl_Meer": "4",
"Trcv_Meer": "10.5",
"Tsky": "198",
"Tgal": "195",
"elevation": "88.2",
},
"cont_sens": "2.2787e-05 Jy",
"chunk_centres": ["0.7 GHz"],
"chunk_width": "0.7 GHz",
"chunk_sensitivities": ["2.2787e-05 Jy"],
"cont_line_sens": "0.041604 Jy",
}
}
assert result == old
# now try with some other expert values set
Trcv = 10.0
Tspl = 20.0
Tsky = 15.0
Tgal = 50.0
alpha = 2.75
eta_dish_ska = 0.9
eta_dish_meer = 0.7
n_ska = 50
n_meer = 20
result = calculate_continuum_sensitivity(
target_lon=target_gc.icrs.ra.hourangle,
target_lat=target_gc.icrs.dec.degree,
target_frame="icrs",
obs_band=band,
continuum_obs_freq_scaled=obsfreq,
continuum_bandwidth_scaled=bandwidth,
weathers=weathers,
elevation=elevation,
array_config=array_config,
continuum_int_time_scaled=int_time,
eta_system=None,
eta_point=None,
eta_coherence=None,
eta_digitisation=None,
eta_correlation=None,
eta_bandpass=None,
n_ska=n_ska,
eta_dish_ska=eta_dish_ska,
Tsys_ska=None,
Tspl_ska=Tspl,
Trcv_ska=Trcv,
n_meer=n_meer,
eta_dish_meer=eta_dish_meer,
Tsys_meer=None,
Tspl_meer=Tspl,
Trcv_meer=Trcv,
Tsky=Tsky,
Tgal=Tgal,
alpha=alpha,
chunk_centres=chunk_centres,
chunk_width=chunk_width,
continuum_resolution=continuum_resolution,
)
# print("result 3", result)
old = {
"Good": {
"calculator_state": {
"pwv": "5",
"etaPointing": "1",
"etaCoherence": "1",
"etaDigitisation": "0.999",
"etaCorrelation": "0.98",
"etaBandpass": "1",
"nSKA": "50",
"etaSKA": "0.9",
"nMeer": "20",
"etaMeer": "0.7",
"alpha": "2.75",
"Tsys_SKA": "45",
"Tspl_SKA": "20",
"Trcv_SKA": "10",
"Tsys_Meer": "45",
"Tspl_Meer": "20",
"Trcv_Meer": "10",
"Tsky": "15",
"Tgal": "50",
"elevation": "88.2",
},
"cont_sens": "0.00010752 Jy",
"chunk_centres": ["0.7 GHz"],
"chunk_width": "0.7 GHz",
"chunk_sensitivities": ["0.00010752 Jy"],
"cont_line_sens": "0.1963 Jy",
}
}
assert result == old
[docs]def test_default_continuum_int_time():
"""This is an end to end testing of the SC ContinuumIntTime
component. A range of possible inputs are tried and the results
compared with expected.
'Expert' values are not set, so the SC will calculate the
standard defaults where necessary.
"""
# simulate some variation in input parameters across bands
obsfreq = 1.35e9
bandwidth = 0.4e9
chunk_centres = [1.2167e9, 1.35e9, 1.4833e9]
chunk_width = 0.133333e9
continuum_resolution = 0.21e3
array_config = "full"
weathers = ["Average"]
elevation = 90.0
band = "Band 2"
sensitivity = 5.0e-3
result = calculate_continuum_int_time(
target_lon=target_cena.ra.hourangle,
target_lat=target_cena.dec.degree,
target_frame="icrs",
obs_band=band,
continuum_obs_freq_scaled=obsfreq,
continuum_bandwidth_scaled=bandwidth,
weathers=weathers,
elevation=elevation,
array_config=array_config,
continuum_sensitivity_scaled=sensitivity,
eta_system=None,
eta_point=None,
eta_coherence=None,
eta_digitisation=None,
eta_correlation=None,
eta_bandpass=None,
n_ska=None,
eta_dish_ska=None,
Tsys_ska=None,
Tspl_ska=None,
Trcv_ska=None,
n_meer=None,
eta_dish_meer=None,
Tsys_meer=None,
Tspl_meer=None,
Trcv_meer=None,
Tsky=None,
Tgal=None,
alpha=None,
chunk_centres=chunk_centres,
chunk_width=chunk_width,
continuum_resolution=continuum_resolution,
)
# print("result 4", result)
old = {
"Average": {
"calculator_state": {
"pwv": "10",
"etaPointing": "1",
"etaCoherence": "1",
"etaDigitisation": "0.999",
"etaCorrelation": "0.98",
"etaBandpass": "1",
"nSKA": "133",
"etaSKA": "0.882",
"nMeer": "64",
"etaMeer": "0.762",
"alpha": "2.75",
"Tsys_SKA": "27.2",
"Tspl_SKA": "3",
"Trcv_SKA": "7.5",
"Tsys_Meer": "28.7",
"Tspl_Meer": "4",
"Trcv_Meer": "8.62",
"Tsky": "16.4",
"Tgal": "11.9",
"elevation": "77.7",
},
"cont_int_time": "0.00038813 s",
"chunk_centres": ["1.2167 GHz", "1.35 GHz", "1.4833 GHz"],
"chunk_width": "0.13333 GHz",
"chunk_int_times": ["0.0014456 s", "0.0011644 s", "0.00096991 s"],
"cont_line_int_time": "739.29 s",
}
}
assert result == old
[docs]def test_default_line_sensitivity():
"""This is an end to end testing of the SC LineSensitivity
component. A range of possible inputs are tried and the results
compared with expected.
'Expert' values are not set, so the SC will calculate the
standard defaults where necessary.
"""
array_configs = ["full"]
# simulate some variation in input parameters across bands
zoomfreqs = [6.5e9, 7.2e9, 6.1e9]
zoomres = [0.21e3, 3.36e3, 13.44e3]
array_config = "full"
weathers = ["Bad"]
elevation = 90.0
band = "Band 5a"
int_time = 10.0
result = calculate_line_sensitivity(
target_lon=target_cena.ra.hourangle,
target_lat=target_cena.dec.degree,
target_frame="icrs",
obs_band=band,
zoom_freqs_scaled=zoomfreqs,
zoom_resolutions=zoomres,
weathers=weathers,
elevation=elevation,
array_config=array_config,
line_int_time_scaled=int_time,
eta_system=None,
eta_point=None,
eta_coherence=None,
eta_digitisation=None,
eta_correlation=None,
eta_bandpass=None,
n_ska=None,
eta_dish_ska=None,
Tsys_ska=None,
Tspl_ska=None,
Trcv_ska=None,
n_meer=None,
eta_dish_meer=None,
Tsys_meer=None,
Tspl_meer=None,
Trcv_meer=None,
Tsky=None,
Tgal=None,
alpha=None,
)
# print("result 5", result)
old = {
"Bad": {
"calculator_state": {
"pwv": "20",
"etaPointing": "0.999",
"etaCoherence": "0.997",
"etaDigitisation": "0.955",
"etaCorrelation": "0.98",
"etaBandpass": "1",
"nSKA": "133",
"etaSKA": "0.88",
"nMeer": "64",
"etaMeer": "0.752",
"alpha": "2.75",
"Tsys_SKA": "16.6",
"Tspl_SKA": "3",
"Trcv_SKA": "8.61",
"Tsys_Meer": "16.5",
"Tspl_Meer": "4",
"Trcv_Meer": "7.5",
"Tsky": "5.11",
"Tgal": "0.313",
"elevation": "77.7",
},
"zoom_sensitivities": ["0.027642 Jy", "0.007095 Jy", "0.0034065 Jy"],
}
}
assert result == old
[docs]def test_default_line_int_time():
"""This is an end to end testing of the SC LineIntTime
component. A range of possible inputs are tried and the results
compared with expected.
'Expert' values are not set, so the SC will calculate the
standard defaults where necessary.
"""
zoomfreqs = [11.9e9]
zoomres = [0.21e3, 3.36e3, 13.44e3]
array_config = "full"
weathers = ["Good"]
elevation = 90.0
band = "Band 5b"
sensitivity = 5.0e-3
result = calculate_line_int_time(
target_lon=target_cena.ra.hourangle,
target_lat=target_cena.dec.degree,
target_frame="icrs",
obs_band=band,
zoom_freqs_scaled=zoomfreqs,
zoom_resolutions=zoomres,
weathers=weathers,
elevation=elevation,
array_config=array_config,
line_sensitivity_scaled=sensitivity,
eta_system=None,
eta_point=None,
eta_coherence=None,
eta_digitisation=None,
eta_correlation=None,
eta_bandpass=None,
n_ska=None,
eta_dish_ska=None,
Tsys_ska=None,
Tspl_ska=None,
Trcv_ska=None,
n_meer=None,
eta_dish_meer=None,
Tsys_meer=None,
Tspl_meer=None,
Trcv_meer=None,
Tsky=None,
Tgal=None,
alpha=None,
)
# print("result 6", result)
old = {
"Good": {
"calculator_state": {
"pwv": "5",
"etaPointing": "0.997",
"etaCoherence": "0.988",
"etaDigitisation": "0.955",
"etaCorrelation": "0.98",
"etaBandpass": "1",
"nSKA": "133",
"etaSKA": "0.856",
"nMeer": "64",
"etaMeer": "0.706",
"alpha": "2.75",
"Tsys_SKA": "20.5",
"Tspl_SKA": "3",
"Trcv_SKA": "12.6",
"Tsys_Meer": "16.4",
"Tspl_Meer": "4",
"Trcv_Meer": "7.5",
"Tsky": "5.14",
"Tgal": "0.0515",
"elevation": "77.7",
},
"zoom_int_times": ["442.78 s"],
}
}
assert result == old