TMC SubArrayNode
Overview
Sub-array configuration and scan control is achieved via communication with a TMC SubArrayNode Tango device. The diagram below shows the packages and high-level object model used for telescope configuration and control.
High-level object model for communication with a TMC SubArrayNode device.
Classes in the configure package model the arguments for the
SubArrayNode.Configure() command.
Classes in the scan.py module model the arguments for the
SubArrayNode.Scan() command.
configure
High-level overview of the configure package
The configuration JSON is complex, the module is split between several
modules. The configure package contains seven modules:
__init__.py references sub-modules in the main ConfigureRequest object, as
illustrated in the diagram above.
In the context of a full JSON example object, __init__.py defines the a basic container object, while the sub-modules define the details.
# JSON modelled specifically by __init__.py
{
"interface": "https://schema.skao.int/ska-tmc-configure/6.1",
"transaction_id": "txn-....-00001",
"dish": {
... # see dish.py
},
"pointing": {
... # see core.py
},
"tmc": {
... # see tmc.py
},
"dish": {
... # see core.py
},
"mccs": {
... # see mccs.py
},
"csp": {
... # see csp.py
"pss": {
... # see pss.py
},
"pst": {
... # see pst.py
}
},
"sdp": {
... # see sdp.py
}
}
core.py
core.py object model
The core.py module models receptor pointing and receiver band JSON
elements. In the context of a full CDM JSON object, the elements this maps to
are:
# JSON modelled specifically by core.py
{
...
"pointing": {
"target": {
"reference_frame":"ICRS",
"name": "NGC6251",
"ra": 1.0,
"dec": 1.0
},
"correction": "UPDATE",
"ca_offset_arcsec": 5.0,
"ie_offset_arcsec": 0.0,
"groups": [
... # see receptorgroup.py
]
},
...
}
dish.py
dish.py object model
The dish.py module models Dish configuration and SPFRx configuration. An
example of the JSON this module maps to is given below.
# JSON modelled specifically by dish.py
{
...
"dish": {
"interface": "https://schema.skao.int/ska-dish-configure/1.0",
"receiver_band": "5b",
"band5_downconversion_subband": "1",
"spfrx_processing_parameters": [
{
"dishes": ["SKA001"],
"sync_pps": False,
"attenuation_pol_x": 1.0,
"attenuation_pol_y": 4.0,
"saturation_threshold": 0.7,
"noise_diode": {
"pseudo_random": {
"binary_polynomial": 2,
"seed": 2,
"dwell": 2,
},
},
},
{
"dishes": ["SKA002"],
"sync_pps": True,
"attenuation_1_pol_x": 1.0,
"attenuation_2_pol_x": 2.0,
"attenuation_1_pol_y": 3.0,
"attenuation_2_pol_y": 4.0,
"saturation_threshold": 0.7,
"noise_diode": {
"periodic": {
"period": 1,
"duty_cycle": 2,
"phase_shift": 3,
}
},
},
]
}
...
}
receptorgroup.py
receptorgroup.py object model
The receptorgroup.py module models receptor pointing and tracking in an
ADR-63 and ADR-106 compliant way. An example of the JSON these classes
represent is given is:
# Example of JSON modelled specifically by receptorgroup.py
{
... # pointing.groups array contains a Receptorgroup object like below
{
"receptors": ["SKA001", "SKA002"],
"field": {
"target_name": "Cen-A",
"reference_frame": "icrs",
"attrs": {
"c1": 201.365,
"c2": -43.0191667,
},
},
"trajectory": {
"name": "fixed",
"attrs": {
"x": -5.0,
"y": 5.0
},
},
"projection": {"name": "SSN", "alignment": "ICRS"},
}
...
}
tmc.py
tmc.py object model
The tmc.py module models TMC configuration JSON elements. Below is an
example JSON command argument that this code can model.
# JSON modelled specifically by tmc.py
{
"tmc": {
"scan_duration": 10.0,
"partial_configuration": true,
}
}
csp.py
csp.py object model
The csp.py module models CSP configuration JSON elements. In the context
of a full CDM JSON object, the elements this maps to for MID are:
{
...
"csp": {
"interface": "https://schema.skao.int/ska-csp-configurescan/4.0",
"common": {
"config_id": "sbi-mvp01-20200325-00001-science_A",
"frequency_band": "1"
},
"midcbf": {
"frequency_band_offset_stream1": 80,
"correlation": {
"processing_regions": [{
"fsp_ids": [1, 2, 3, 4],
"receptors": ["SKA063", "SKA001", "SKA100"],
"start_freq": 350000000,
"channel_width": 13440,
"channel_count": 52080,
"sdp_start_channel_id": 0,
"integration_factor": 1
}, {
"fsp_ids": [1],
"start_freq": 548437600,
"channel_width": 13440,
"channel_count": 14880,
"sdp_start_channel_id": 1,
"integration_factor": 10
}]
},
"vlbi": {}
...
}
And for LOW are:
{
"interface": "https://schema.skao.int/ska-low-csp-configure/7.3",
"transaction_id": "txn-....-00001",
"subarray": {
"subarray_name": "science period 23"
},
"common": {
"config_id": "sbi-mvp01-20200325-00001-science_A",
"subarray_id": 1,
"eb_id": "eb-x449-20231105-34696"
},
"lowcbf": {
"stations": {
"stns": [
[1, 1],
[2, 1],
[3, 1],
[4, 1],
[5, 1],
[6, 1]
],
"stn_beams": [{
"beam_id": 1,
"freq_ids": [400],
"delay_poly": "tango://delays.skao.int/low/stn-beam/1"
}]
},
"vis": {
"firmware": "vis",
"stn_beams": [{
"stn_beam_id": 1,
"host": [
[0, "192.168.1.0"]
],
"port": [
[0, 9000, 1]
],
"mac": [
[0, "02-03-04-0a-0b-0c"]
],
"integration_ms": 849
}]
},
"timing_beams": {
"firmware": "pst",
"beams": [{
"pst_beam_id": 1,
"stn_beam_id": 1,
"stn_weights": [0.9, 1.0, 1.0, 1.0, 0.9, 1.0],
"delay_poly": "tango://delays.skao.int/low/stn-beam/1",
"jones": "tango://jones.skao.int/low/stn-beam/1"
}]
},
"search_beams": {
"firmware": "pss",
"beams": [{
"pss_beam_id": 1,
"stn_beam_id": 1,
"stn_weights": [0.9, 1.0, 1.0, 1.0, 0.9, 1.0],
"delay_poly": "tango://delays.skao.int/low/stn-beam/1",
"jones": "tango://jones.skao.int/low/stn-beam/1"
}]
},
"coarse_zooms": {
"firmware": "vis",
"stn_beams": [{
"zoom_window_id": 1,
"zoom_resolution_hz": 227,
"centre_frequency_hz": 312500000,
"zoom_bandwidth_hz": 3000,
"stn_beam_id": 1,
"host": [
[0, "192.168.1.01"]
],
"port": [
[0, 10000, 1]
],
"mac": [
[0, "02-03-04-0a-0b-0c"]
],
"integration_ms": 849
}]
}
},
"pss": {
"transaction_id": "txn-control-00001",
"beam": [{
"beam_id": 1,
"reference_frame": "ICRS",
"ra": 82.75,
"dec": 21.0,
"centre_frequency": 1400.0,
"beam_delay_centre": 0.0,
"dest_host": "192.168.178.25",
"dest_port": 9021
}, {
"beam_id": 2,
"reference_frame": "ICRS",
"ra": 84.25,
"dec": 21.5,
"centre_frequency": 1400.0,
"beam_delay_centre": 0.0,
"dest_host": "192.168.178.26",
"dest_port": 9021
}],
"config_id": 1,
"cheetah": [{
"cheetah_id": 1,
"beams": [{
"beam": {
"active": true,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam1",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam1",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank1.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 1
}
}, {
"beam": {
"active": false,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam2",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam2",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank2.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 2
}
}, {
"beam": {
"active": false,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam3",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam3",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank3.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 3
}
}],
"psbc": {
"dump_time": 540
},
"acceleration": {
"fdas": {
"pool_id": "default",
"priority": 0,
"active": false,
"labyrinth": {
"active": true,
"threshold": 10.0
}
}
},
"sift": {
"pool_id": "default",
"priority": 2,
"strong_sift": {
"active": false,
"num_candidate_harmonics": 8,
"match_factor": 0.001,
"dm_match_range": 2
}
}
}, {
"cheetah_id": 3,
"beams": [{
"beam": {
"active": true,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam1",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam1",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank1.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 1
}
}, {
"beam": {
"active": false,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam2",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam2",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank2.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 2
}
}, {
"beam": {
"active": false,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam3",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam3",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank3.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 3
}
}],
"psbc": {
"dump_time": 540
},
"acceleration": {
"fdas": {
"pool_id": "default",
"priority": 0,
"active": false,
"labyrinth": {
"active": true,
"threshold": 10.0
}
}
},
"sift": {
"pool_id": "default",
"priority": 2,
"strong_sift": {
"active": false,
"num_candidate_harmonics": 8,
"match_factor": 0.001,
"dm_match_range": 2
}
}
}, {
"cheetah_id": 5,
"beams": [{
"beam": {
"active": true,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam1",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam1",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank1.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 1
}
}, {
"beam": {
"active": false,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam2",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam2",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank2.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 2
}
}, {
"beam": {
"active": false,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam3",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam3",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank3.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 3
}
}],
"psbc": {
"dump_time": 540
},
"acceleration": {
"fdas": {
"pool_id": "default",
"priority": 0,
"active": false,
"labyrinth": {
"active": true,
"threshold": 10.0
}
}
},
"sift": {
"pool_id": "default",
"priority": 2,
"strong_sift": {
"active": false,
"num_candidate_harmonics": 8,
"match_factor": 0.001,
"dm_match_range": 2
}
}
}],
"ddtr": {
"cpu": {
"active": false
},
"fpga": {
"active": false
},
"gpu_bruteforce": {
"active": false,
"copy_dmtrials_to_host": true
},
"klotski": {
"active": true
},
"klotski_bruteforce": {
"active": false
},
"dedispersion": [{
"start": 0.0,
"end": 100.0,
"step": 0.1
}, {
"start": 100.0,
"end": 300.0,
"step": 0.2
}, {
"start": 300.0,
"end": 700.0,
"step": 0.4
}, {
"start": 700.0,
"end": 1500.0,
"step": 0.8
}, {
"start": 1500.0,
"end": 3100.0,
"step": 1.6
}],
"dedispersion_samples": 131072
},
"sps": {
"cpu": {
"active": false,
"samples_per_iteration": 1,
"number_of_widths": 1
},
"threshold": 8.0,
"klotski": {
"active": true,
"pulse_widths": "1,2,4,8,16,32,64,128"
},
"klotski_bruteforce": {
"active": false,
"pulse_widths": "1,2,4,8,16,32,64,128"
}
}
},
"pst": {
"beams": [{
"beam_id": 1,
"scan": {
"centre_frequency": 100000000.0,
"total_bandwidth": 1562500.0,
"observer_id": "jdoe",
"project_id": "project1",
"receiver_id": "receiver3",
"max_scan_length": 20000.0,
"subint_duration": 30.0,
"receptors": ["SKA001", "SKA036"],
"receptor_weights": [0.4, 0.6],
"pst_processing_mode": "VOLTAGE_RECORDER",
"delay_centre": [5109360.133, 2006852.586, -3238948.127],
"target": {
"target_name": "J1921+2153",
"reference_frame": "icrs",
"attrs": {
"c1": 290.43672917,
"c2": 21.884,
"epoch": 2000.0
}
}
}
}]
}
}
pst.py
pst.py object model
The pst.py module models PST configuration JSON elements. In the context
of a full CDM JSON object, the elements this maps to for MID are:
.. code:
{
"interface": "https://schema.skao.int/ska-pst-configure/3.0",
"common": {
"config_id": "sbi-mvp01-20240111-pulsar-timing",
"subarray_id": 1,
"eb_id": "eb-x321-20240111-10012",
"frequency_band": "5b"
},
"pst": {
"scan": {
"timing_beam_id": "1",
"centre_frequency": 10550000000.0,
"total_bandwidth": 2496345600.0,
"observer_id": "jdoe",
"project_id": "project1",
"receiver_id": "receiver3",
"max_scan_length": 20000.0,
"subint_duration": 30.0,
"receptors": ["SKA001", "SKA036"],
"receptor_weights": [0.4, 0.6],
"pst_processing_mode": "PULSAR_TIMING",
"delay_centre": [5109360.133, 2006852.586, -3238948.127],
"target": {
"target_name": "J1921+2153",
"reference_frame": "icrs",
"attrs": {
"c1": 290.43672917,
"c2": 21.884,
"epoch": 2000.0
}
},
"pt": {
"dispersion_measure": 100.0,
"rotation_measure": 0.0,
"ephemeris": "",
"pulsar_phase_predictor": "",
"output_frequency_channels": 1,
"output_phase_bins": 64,
"num_sk_config": 1,
"sk_config": [{
"sk_range": [0.8, 0.9],
"sk_integration_limit": 100,
"sk_excision_limit": 25.0
}],
"target_snr": 0.0
}
}
}
}
And for LOW are:
{
"interface": "https://schema.skao.int/ska-pst-configure/3.0",
"common": {
"config_id": "sbi-mvp01-20240111-pulsar-timing",
"subarray_id": 1,
"eb_id": "eb-x321-20240111-10012",
"frequency_band": "low"
},
"pst": {
"scan": {
"centre_frequency": 100000000.0,
"total_bandwidth": 1562500.0,
"timing_beam_id": "1",
"observer_id": "jdoe",
"project_id": "project1",
"receiver_id": "receiver3",
"max_scan_length": 20000.0,
"subint_duration": 30.0,
"receptors": ["SKA001", "SKA036"],
"receptor_weights": [0.4, 0.6],
"pst_processing_mode": "PULSAR_TIMING",
"delay_centre": [5109360.133, 2006852.586, -3238948.127],
"target": {
"target_name": "J1921+2153",
"reference_frame": "icrs",
"attrs": {
"c1": 290.43672917,
"c2": 21.884,
"epoch": 2000.0
}
},
"pt": {
"dispersion_measure": 100.0,
"rotation_measure": 0.0,
"ephemeris": "",
"pulsar_phase_predictor": "",
"output_frequency_channels": 1,
"output_phase_bins": 64,
"num_sk_config": 1,
"sk_config": [{
"sk_range": [0.8, 0.9],
"sk_integration_limit": 100,
"sk_excision_limit": 25.0
}],
"target_snr": 0.0
}
}
}
}
pss.py
pss.py object model
The pss.py module models PSS configuration JSON elements. In the context
of a full CDM JSON object, the elements this maps to are:
{
"interface": "https://schema.skao.int/ska-pss-configure/1.4",
"transaction_id": "txn-control-00001",
"beam": [{
"beam_id": 1,
"reference_frame": "ICRS",
"ra": 82.75,
"dec": 21.0,
"centre_frequency": 1400.0,
"beam_delay_centre": 0.0,
"dest_host": "192.168.178.25",
"dest_port": 9021
}, {
"beam_id": 2,
"reference_frame": "ICRS",
"ra": 84.25,
"dec": 21.5,
"centre_frequency": 1400.0,
"beam_delay_centre": 0.0,
"dest_host": "192.168.178.26",
"dest_port": 9021
}],
"common": {
"config_id": "sbi-mvp01-20200325-00001-science_A",
"subarray_id": 1,
"frequency_band": "low",
"eb_id": "eb-x449-20231105-34696"
},
"config_id": 1,
"cheetah": [{
"cheetah_id": 1,
"beams": [{
"beam": {
"active": true,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam1",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam1",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank1.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 1
}
}, {
"beam": {
"active": false,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam2",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam2",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank2.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 2
}
}, {
"beam": {
"active": false,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam3",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam3",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank3.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 3
}
}],
"psbc": {
"dump_time": 540
},
"acceleration": {
"fdas": {
"pool_id": "default",
"priority": 0,
"active": false,
"labyrinth": {
"active": true,
"threshold": 10.0
}
}
},
"sift": {
"pool_id": "default",
"priority": 2,
"strong_sift": {
"active": false,
"num_candidate_harmonics": 8,
"match_factor": 0.001,
"dm_match_range": 2
}
}
}, {
"cheetah_id": 3,
"beams": [{
"beam": {
"active": true,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam1",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam1",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank1.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 1
}
}, {
"beam": {
"active": false,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam2",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam2",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank2.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 2
}
}, {
"beam": {
"active": false,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam3",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam3",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank3.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 3
}
}],
"psbc": {
"dump_time": 540
},
"acceleration": {
"fdas": {
"pool_id": "default",
"priority": 0,
"active": false,
"labyrinth": {
"active": true,
"threshold": 10.0
}
}
},
"sift": {
"pool_id": "default",
"priority": 2,
"strong_sift": {
"active": false,
"num_candidate_harmonics": 8,
"match_factor": 0.001,
"dm_match_range": 2
}
}
}, {
"cheetah_id": 5,
"beams": [{
"beam": {
"active": true,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam1",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam1",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank1.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 1
}
}, {
"beam": {
"active": false,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam2",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam2",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank2.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 2
}
}, {
"beam": {
"active": false,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam3",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam3",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank3.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 3
}
}],
"psbc": {
"dump_time": 540
},
"acceleration": {
"fdas": {
"pool_id": "default",
"priority": 0,
"active": false,
"labyrinth": {
"active": true,
"threshold": 10.0
}
}
},
"sift": {
"pool_id": "default",
"priority": 2,
"strong_sift": {
"active": false,
"num_candidate_harmonics": 8,
"match_factor": 0.001,
"dm_match_range": 2
}
}
}],
"ddtr": {
"cpu": {
"active": false
},
"fpga": {
"active": false
},
"gpu_bruteforce": {
"active": false,
"copy_dmtrials_to_host": true
},
"klotski": {
"active": true
},
"klotski_bruteforce": {
"active": false
},
"dedispersion": [{
"start": 0.0,
"end": 100.0,
"step": 0.1
}, {
"start": 100.0,
"end": 300.0,
"step": 0.2
}, {
"start": 300.0,
"end": 700.0,
"step": 0.4
}, {
"start": 700.0,
"end": 1500.0,
"step": 0.8
}, {
"start": 1500.0,
"end": 3100.0,
"step": 1.6
}],
"dedispersion_samples": 131072
},
"sps": {
"cpu": {
"active": false,
"samples_per_iteration": 1,
"number_of_widths": 1
},
"threshold": 8.0,
"klotski": {
"active": true,
"pulse_widths": "1,2,4,8,16,32,64,128"
},
"klotski_bruteforce": {
"active": false,
"pulse_widths": "1,2,4,8,16,32,64,128"
}
}
}
sdp.py
sdp.py object model
The sdp.py module models SDHP configuration JSON elements. In the context
of a full CDM JSON object, the elements this maps to are:
# JSON modelled specifically by sdp.py
{
...
"sdp": {
"scan_type": "science_A"
},
...
}
mccs.py
mccs.py object model
The mccs.py module models MCCS configuration JSON elements. In the context
of a full CDM JSON object, the elements this maps to are:
# JSON modelled specifically by mccs.py
{
"interface": "https://schema.skao.int/ska-low-tmc-assignedresources/4.0",
"mccs": {
"interface": "https://schema.skao.int/ska-low-mccs-controller-allocate/3.0"
"subarray_beams": [
{
"subarray_beam_id": 1,
"apertures": [
{
"station_id": 1,
"aperture_id": "AP001.01",
},
],
"number_of_channels": 8,
},
]
}
}
assigned_resources.py
assigned_resources.py object model
The assigned_resources.py module describes which resources have been assigned to the sub-array.
Examples below depict a populated sub-array and an empty one:
{
"interface": "https://schema.skao.int/ska-low-tmc-assignedresources/2.0",
"mccs": {
"subarray_beam_ids": [1],
"station_ids": [[1,2]],
"channel_blocks": [3]
}
}
{
"interface": "https://schema.skao.int/ska-low-tmc-assignedresources/2.0",
"mccs": {
"subarray_beam_ids": [],
"station_ids": [],
"channel_blocks": []
}
}
scan.py
scan.py object model
The scan.py module models the argument for the SubArrayNode.scan() command.
Below is an example JSON command argument that this code can model.
// For MID
{
"interface": "https://schema.skao.int/ska-tmc-scan/2.2",
"transaction_id": "txn-12345",
"scan_id": 2
"start_time": "2025-12-23T08:25:00.412Z"
}
// For LOW
{
"interface": "https://schema.skao.int/ska-low-tmc-scan/4.1",
"transaction_id": "txn-....-00001",
"subarray_id": 1,
"scan_id": 1
"start_time": "2025-12-23T08:25:00.412Z"
}
Example configuration JSON for MID
{
"interface": "https://schema.skao.int/ska-tmc-configure/4.2",
"transaction_id": "txn-....-00001",
"pointing": {
"wrap_sector": -1,
"ie_offset_arcsec": 3.0,
"ca_offset_arcsec": -3.0,
"groups": [
{
"field": {
"attrs": {
"c1": 201.365,
"c2": -43.0191667
},
"reference_frame": "icrs",
"target_name": "Cen-A"
},
"projection": {
"alignment": "ICRS",
"name": "SSN"
},
"receptors": ["SKA001", "SKA002"],
"trajectory": {
"attrs": {
"x_offsets": [5, 5, 5, 0, 0, 0, -5, -5, -5],
"y_offsets": [5, 0, -5, 5, 0, -5, 5, 0, -5]
},
"name": "mosaic"
}
}
]
},
"csp": {
"interface": "https://schema.skao.int/ska-csp-configurescan/4.0",
"common": {
"config_id": "sbi-mvp01-20200325-00001-science_A",
"frequency_band": "1"
},
"midcbf": {
"correlation": {
"processing_regions": [
{
"channel_count": 52080,
"channel_width": 13440,
"fsp_ids": [1],
"integration_factor": 1,
"receptors": ["SKA001", "SKA002"],
"sdp_start_channel_id": 0,
"start_freq": 350000000
}, {
"channel_count": 14880,
"channel_width": 13440,
"fsp_ids": [1],
"integration_factor": 10,
"receptors": ["SKA001", "SKA002"],
"sdp_start_channel_id": 1,
"start_freq": 548437600
}
]
},
"frequency_band_offset_stream1": 80,
"frequency_band_offset_stream2": 80,
"vlbi": {}
}
},
"dish": {
"receiver_band": "1"
},
"sdp": {
"interface": "https://schema.skao.int/ska-sdp-configure/0.4",
"scan_type": "science_A"
},
"tmc": {
"scan_duration": 10.0
}
}
Example configuration JSON for LOW
{
"interface": "https://schema.skao.int/ska-low-tmc-configure/6.0",
"transaction_id": "txn-....-00001",
"mccs": {
"subarray_beams": [{
"subarray_beam_id": 1,
"update_rate": 0.0,
"logical_bands": [{
"start_channel": 80,
"number_of_channels": 16
}, {
"start_channel": 384,
"number_of_channels": 16
}],
"apertures": [{
"aperture_id": "AP001.01",
"weighting_key_ref": "default",
"calibration_id": "default"
}, {
"aperture_id": "AP001.02",
"weighting_key_ref": "default",
"calibration_id": "default"
}, {
"aperture_id": "AP002.01",
"weighting_key_ref": "default",
"calibration_id": "default"
}, {
"aperture_id": "AP002.02",
"weighting_key_ref": "default",
"calibration_id": "default"
}, {
"aperture_id": "AP003.01",
"weighting_key_ref": "default",
"calibration_id": "default"
}],
"field": {
"target_name": "Polaris Australis",
"reference_frame": "icrs",
"attrs": {
"c1": 317.199,
"c2": -88.95636
}
}
}]
},
"sdp": {
"interface": "https://schema.skao.int/ska-sdp-configure/1.1",
"scan_type": "target:a"
},
"csp": {
"interface": "https://schema.skao.int/ska-low-csp-configure/7.3",
"common": {
"config_id": "sbi-mvp01-20200325-00001-science_A",
"eb_id": "eb-test-20220916-00000"
},
"lowcbf": {
"stations": {
"stns": [
[1, 1],
[2, 1],
[3, 1],
[4, 1],
[5, 1],
[6, 1]
],
"stn_beams": [{
"beam_id": 1,
"freq_ids": [400]
}]
},
"vis": {
"fsp": {
"firmware": "vis",
"fsp_ids": [1]
},
"stn_beams": [{
"stn_beam_id": 1,
"integration_ms": 849
}]
},
"timing_beams": {
"firmware": "pst",
"beams": [{
"pst_beam_id": 1,
"field": {
"target_name": "PSR J0024-7204R",
"reference_frame": "icrs",
"attrs": {
"c1": 6.023625,
"c2": -72.08128333,
"pm_c1": 4.8,
"pm_c2": -3.3
}
},
"stn_beam_id": 1,
"stn_weights": [0.9, 1.0, 1.0, 1.0, 0.9, 1.0]
}]
},
"search_beams": {
"firmware": "pss",
"beams": [{
"pss_beam_id": 1,
"stn_beam_id": 1,
"stn_weights": [0.9, 1.0, 1.0, 1.0, 0.9, 1.0]
}]
}
},
"pst": {
"beams": [{
"beam_id": 1,
"scan": {
"centre_frequency": 200000000.0,
"total_bandwidth": 1562500.0,
"pst_processing_mode": "VOLTAGE_RECORDER",
"observer_id": "jdoe",
"project_id": "project1",
"target": {
"target_name": "J1921+2153",
"reference_frame": "icrs",
"attrs": {
"c1": 6.023625,
"c2": -72.08128333,
"epoch": 2000.0
}
},
"receiver_id": "receiver3",
"max_scan_length": 20000.0,
"subint_duration": 30.0,
"receptors": ["receptor1", "receptor2"],
"receptor_weights": [0.4, 0.6],
"rfi_frequency_masks": []
}
}, {
"beam_id": 2,
"scan": {
"centre_frequency": 200000000.0,
"total_bandwidth": 1562500.0,
"pst_processing_mode": "VOLTAGE_RECORDER",
"observer_id": "jdoe",
"project_id": "project1",
"target": {
"target_name": "J1921+2153",
"reference_frame": "icrs",
"attrs": {
"c1": 6.023625,
"c2": -72.08128333,
"epoch": 2000.0
}
},
"receiver_id": "receiver3",
"max_scan_length": 20000.0,
"subint_duration": 30.0,
"receptors": ["receptor1", "receptor2"],
"receptor_weights": [0.4, 0.6],
"rfi_frequency_masks": []
}
}]
},
"pss": {
"beam": [{
"beam_id": 1,
"reference_frame": "ICRS",
"ra": 82.75,
"dec": 21.0,
"centre_frequency": 1400.0
}],
"config_id": 1,
"cheetah": [{
"cheetah_id": 1,
"beams": [{
"beam": {
"active": true,
"sinks": {
"channels": {
"sps_events": {
"active": true,
"sink": [{
"sink_id": "spccl_files"
}, {
"sink_id": "candidate_files"
}]
}
},
"sink_configs": {
"spccl_files": {
"extension": ".spccl",
"dir": "/tmp/beam1",
"sink_id": "spccl_files"
},
"spccl_sigproc_files": {
"spectra_per_file": 0,
"dir": "/tmp/beam1",
"extension": ".fil",
"candidate_window": {
"ms_before": 500.0,
"ms_after": 1000.0
},
"sink_id": "candidate_files"
}
}
},
"source": {
"sigproc": {
"file": "filterbank1.fil",
"chunk_samples": 1024,
"default-nbits": 8,
"active": true
},
"udp_low": {
"number_of_threads": 2,
"spectra_per_chunk": 2048,
"number_of_channels": 7776,
"max_buffers": 1,
"active": false
},
"udp_low_lite": {
"number_of_threads": 10,
"spectra_per_chunk": 32768,
"number_of_channels": 432,
"max_buffers": 3,
"active": false
}
},
"beam_id": 1
}
}],
"psbc": {
"dump_time": 540
},
"acceleration": {
"fdas": {
"pool_id": "default",
"priority": 0,
"active": false,
"labyrinth": {
"active": true,
"threshold": 10.0
}
}
},
"sift": {
"pool_id": "default",
"priority": 2,
"strong_sift": {
"active": true,
"num_candidate_harmonics": 8,
"match_factor": 0.001,
"dm_match_range": 2
}
}
}],
"ddtr": {
"cpu": {
"active": false
},
"fpga": {
"active": false
},
"gpu_bruteforce": {
"active": false,
"copy_dmtrials_to_host": true
},
"klotski": {
"active": true
},
"klotski_bruteforce": {
"active": false
},
"dedispersion": [{
"start": 0.0,
"end": 100.0,
"step": 0.1
}, {
"start": 100.0,
"end": 300.0,
"step": 0.2
}, {
"start": 300.0,
"end": 700.0,
"step": 0.4
}, {
"start": 700.0,
"end": 1500.0,
"step": 0.8
}, {
"start": 1500.0,
"end": 3100.0,
"step": 1.6
}],
"dedispersion_samples": 131072
},
"sps": {
"cpu": {
"active": false,
"samples_per_iteration": 1,
"number_of_widths": 1
},
"threshold": 8.0,
"klotski": {
"active": false,
"pulse_widths": "1,2,4,8,16,32,64,128"
},
"klotski_bruteforce": {
"active": false,
"pulse_widths": "1,2,4,8,16,32,64,128"
}
}
}
},
"tmc": {
"scan_duration": 10.0
}
}