Skip to content

Domain model

This shows the core domain-driven-design (DDD) aggregates (groups of domain concepts treated as a unit) and domain services (performs domain operations) that are part of starbox.

Aggregate roots

  • Telescope
  • Observation
  • SkyModel

Aggregates

  • Station (inside Telescope)
  • AntennaElement (inside Station)

Value objects

  • ExperimentConfig
  • ObservationConfig
  • TelescopeConfig
  • TelescopeSiteConfig
  • SkyModelConfig
  • CorruptionsConfig
  • SolverConfig

Strategies

  • Corruptions
  • BeamModel

Services

  • Solver
  • Imager
  • predict
  • viz
  • io
  • lmn
  • uvw
  • factory

Derived artifacts

  • VisibilitySet
  • Solutions
classDiagram
    TelescopeConfig --> TelescopeSiteConfig
    TelescopeConfig --> Telescope
    Telescope *-- Station
    Station *-- AntennaElement
    Station --> BeamModel

    predict ..> Telescope
    predict ..> Observation
    predict ..> SkyModel
    predict ..> lmn
    predict ..> uvw

    viz ..> SkyModel
    viz ..> Telescope
    viz ..> uvw
    viz ..> Solutions
    viz ..> Imager

    SkyModelConfig --> SkyModel

    CorruptionsConfig --> Corruptions
    class Corruptions {
        applies station phase gain
        adds thermal noise
    }

    Imager ..> VisibilitySet
    Solver ..> VisibilitySet
    Solver ..> Solutions
    Solver ..> SolverConfig

    io ..> ExperimentConfig
    factory ..> CorruptionsConfig
    factory ..> TelescopeConfig
    factory ..> ObservationConfig
    factory ..> SolverConfig
    factory ..> SkyModelConfig

    ExperimentConfig *-- TelescopeConfig
    ExperimentConfig *-- SkyModelConfig
    ExperimentConfig *-- ObservationConfig
    ExperimentConfig *-- CorruptionsConfig
    ExperimentConfig *-- SolverConfig

    class ExperimentConfig {
        +str name
        +str description
        +TelescopeConfig telescope
        +SkyModelConfig skymodel
        +ObservationConfig observation
        +CorruptionsConfig corruptions
        +SolverConfig solver
    }

    class TelescopeSiteConfig {
        +float latitude_deg
        +float longitude_deg
        +float altitude_m
    }
    class TelescopeConfig{
        +int num_stations
        +float diameter
        +int seed
        +TelescopeSiteConfig site

    }
    class Telescope{
        +string name
        +TelescopeConfig config
        +np.Generator rng
        +int num_stations
        +int num_baselines
        +np.array station_positions
        +np.array station_ids
        +np.array baselines_ecef
    }

    class Station{
      +string name
      +float diameter_m
      +tuple position_enu_m
      +BeamModel beam_model
      +list~AntennaElement~ antenna_elements
    }

    class AntennaElement{
      +tuple element_position_enu_m
      +float element_rotation_angle
    }

    class SkyModelConfig{
        +int num_sources
        +float max_flux_jy
        +tuple[float,float] field_centre_deg
        +float fov_deg
        +int seed
    }

    class SkyModel{
        +SkyModelConfig config
        +string name
        +as_arrays()
        +as_arrays_rad()
        +equals()
    }

    class ObservationConfig{
        +float start_time_mjd
        +float observation_length
        +int num_timesteps
        +float start_frequency
        +int num_channels
        +float total_bandwidth
        +float phase_centre_ra
        +float phase_centre_dec
        +float pointing_centre_ra
        +float pointing_centre_dec
    }

    class Observation{
        +ObservationConfig config
        +float channel_width
        +nd.array times_mjd
        +nd.array frequencies_hz
        +int num_times
        +int num_channels
        phase_centre_rad()
        pointing_centre_rad()
        gmst_rad()
    }

    class predict{
        +predict_visibilities(telescope, observation, skymodel) VisibilitySet
        +generate_psf_visibilities(visibility_set) VisibilitySet
    }

    class VisibilitySet{
        +nd.array vis
        +nd.array uvw_m
        +nd.array station1
        +nd.array station2
        +nd.array times_mjd
        +nd.array freqs_hz
        +nd.array weights
        +station_ids()
        +num_stations()
    }

    class SolverConfig {
        +float solution_interval_seconds
        +float solution_interval_hz
    }

    class Solver{
        +SolverConfig config
        +solve(observed_visibilities, model_visibilities, n_stations) Solutions
    }

    class Solutions{
        +nd.array station_phase_gains
        +apply(visibility_set) VisibilitySet
    }

    class BeamModel{
        +string name
        +voltage_response(l, m, freqs_hz, times_mjd)
    }

    class CorruptionsConfig{
        +int seed
        +float rms_noise
        +float rms_phase_gain
        +float phase_time_correlation
        +float phase_frequency_correlation
    }
    class Corruptions{
        +CorruptionsConfig config
        +np.Generator rng
        +apply(visibility_set) VisibilitySet
    }

    class lmn {
            +calculate_lmn(ra_dec_rad, phase_centre_rad)
    }
    class uvw {
            +calculate_uvw(gmst_rad, phase_centre_rad, baselines_ecef_m)
    }

    class Imager {
        +int grid_size
        +float fov_deg
        +grid(visibilities) np.array
        +ifft(gridded_visibilities) np.array
        +image(visibilities) np.array
    }

    class io {
        +save(experiment_config, config_dir)
    }

    class factory {
        +build_corruptions(config)
        +build_observation(config)
        +build_skymodel(config)
        +build_solver(config)
        +build_telescope(config)
    }

    class viz {
        +plot_uv_coverage(uvw_coordinates, freqs_hz, title, max_timesteps)
        +plot_sky_model(sky_model)
        +plot_telescope(telescope)
        +plot_gains(solutions, station_index)
        +plot_image(image, title, fov_deg, height, zmin, zmax, colour_continuous_scale)
    }
Hold "Alt" / "Option" to enable pan & zoom