.. _`SubArrayNode commands`: ================ 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. .. figure:: subarraynode.png :align: center :alt: High-level overview of SubArrayNode packages and classes 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 ========= .. figure:: init.png :align: center :alt: Overview of the configure package 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 * `core.py`_ * `dish.py`_ * `receptorgroup.py`_ * `tmc.py`_ * `csp.py`_ * `pst.py`_ * `pss.py`_ * `sdp.py`_ * `mccs.py`_ ``__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. .. code:: # 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 ------- .. figure:: core.png :align: center :alt: core.py object model 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: .. code:: # 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 ------- .. figure:: dish.png :align: center :alt: dish.py object model 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. .. code:: # 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 ---------------- .. figure:: receptorgroup.png :align: center :alt: receptorgroup.py object model 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: .. code:: # 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 ------ .. figure:: tmc.png :align: center :alt: tmc.py object model 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. .. code:: # JSON modelled specifically by tmc.py { "tmc": { "scan_duration": 10.0, "partial_configuration": true, } } csp.py ------ .. figure:: csp.png :align: center :alt: csp.py object model 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: .. code:: { ... "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: .. code:: { "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 ------ .. figure:: pst.png :align: center :alt: pst.py object model 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: .. 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": "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 ------ .. figure:: pss.png :align: center :alt: pss.py object model 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: .. code:: { "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 ------ .. figure:: sdp.png :align: center :alt: sdp.py object model 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: .. code:: # JSON modelled specifically by sdp.py { ... "sdp": { "scan_type": "science_A" }, ... } mccs.py ------- .. figure:: mccs.png :align: center :alt: mccs.py object model 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: .. code:: # 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 ===================== .. figure:: assignedresources.png :align: center :alt: assigned_resources.py object model 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: .. code:: JSON { "interface": "https://schema.skao.int/ska-low-tmc-assignedresources/2.0", "mccs": { "subarray_beam_ids": [1], "station_ids": [[1,2]], "channel_blocks": [3] } } .. code:: JSON { "interface": "https://schema.skao.int/ska-low-tmc-assignedresources/2.0", "mccs": { "subarray_beam_ids": [], "station_ids": [], "channel_blocks": [] } } scan.py ======= .. figure:: scan.png :align: center :alt: scan.py object model 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. .. code-block:: JSON // 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 ================================== .. code-block:: JSON { "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 ================================== .. code-block:: JSON { "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 } }