MCCS Calibration Architecture

The diagram below attempts to describes the calibration architecture.

Calibration architecture

Calibration architecture as currently implemented 0.17.0

  • observational_context: Currently consists of station_id and channel

  • solutions: Currently gain solutions.

  • observational_name: Currently the path of the hdf5 file dumped

  • field_conditions: Currently the outsideTemperature as reported by FieldStation

Application of Solutions

The calibration solutions are applied to each allocated station during the Subarray` Configure command. If no solution is found a unit calibration will be applied as a default.

Below is the current sequence diagram:


@startuml

participant TM as TM
participant MccsSubarray as Subarray
participant MccsStation as Station
participant MccsStationCalibrator as StationCalibrator
participant MccsCalibrationStore as MccsCalibrationStore
participant SelectionRule as SelectionRule
participant postgresql as postgresql
participant SpsStation as SpsStation
participant MccsTile as MccsTile

TM -> Subarray: Configure()

loop stations

Subarray -> Station: ApplyConfiguration()
Station -> SpsStation: SetBeamformerTable()

loop tiles
SpsStation -> MccsTile: SetBeamformerRegions()
end

Station -> StationCalibrator: GetCalibration()
StationCalibrator -> MccsCalibrationStore: GetSolution()
MccsCalibrationStore -> SelectionRule: GetSolution()
SelectionRule -> postgresql: sql
postgresql -> SelectionRule: solution
SelectionRule -> MccsCalibrationStore: solution
MccsCalibrationStore -> StationCalibrator: solution
StationCalibrator -> Station: solution

loop antennas
Station -> SpsStation: LoadCalibrationCoefficients()
SpsStation -> MccsTile: LoadCalibrationCoefficients()
end

Station -> SpsStation: ApplyCalibration()

loop tiles
SpsStation -> MccsTile: ApplyCalibration()
end

end

@enduml

Storing of Solutions

The MccsStationCalibrator is responsible for orchestrating the retrieval and storage of calibration solutions.

See sequence diagram for an overview of the internals:

@startuml

participant TangoUser as TangoUser
participant MccsStationCalibrator as StationCalibrator
participant MccsStation as Station
participant MccsCalibrationStore as MccsCalibrationStore
participant StationCalibrationSolverDevice as solver
participant postgresql as postgresql
participant SpsStation as SpsStation
participant MccsTile as MccsTile
participant MccsDaq as MccsDaq
participant ArtefactRepository as ArtefactRepository

TangoUser -> StationCalibrator: StartCalibrationLoop

loop channels

StationCalibrator -> Station: AcquireDataForCalibration(channel)
Station -> SpsStation: AcquireDataForCalibration(channel)
SpsStation -> MccsDaq: Configure()
SpsStation -> MccsDaq: Start()
SpsStation -> MccsTile: SetLmcDownload()
SpsStation -> MccsTile: SendDataSamples()
MccsDaq -> ArtefactRepository: dump_hdf5()
MccsDaq -> SpsStation: hdf5_data_path
SpsStation -> Station: hdf5_data_path
Station -> StationCalibrator: hdf5_data_path
StationCalibrator -> solver: Solve(\n\thdf5_data_path,\n\tsolution_path)
solver -> ArtefactRepository: write(gain_solution, metadata)
StationCalibrator->MccsCalibrationStore: StoreSolution(\n\tsolution_path,\n\tmetadata)
MccsCalibrationStore->postgresql: Store(gain_solution, metadata)

end

@enduml

Database schema

The following schema is used by mccs.

@startuml
' --- Configuration ---
hide circle
skinparam linetype ortho
skinparam packageStyle rectangle

' --- Table: frequency_sweep ---
entity "frequency_sweep" as e01 {
  *sweep_id : SERIAL PRIMARY KEY
  --
  *station_id : SMALLINT
  *channel_start : SMALLINT
  *channel_stop : SMALLINT
  path_to_data : TEXT <<unique>>
  start_time : TIMESTAMP
  correlator_samples : TIMESTAMP
  nof_samples : INTEGER
  initial_static_delays : FLOAT8[]
}

' --- Table: calibration_job ---
entity "calibration_job" as e02 {
  *id : SERIAL <<generated>>
  --
  *sweep_id : INTEGER <<FK>>
  *initial_mask : FLOAT8[]
  *calibration_parameters : JSON
  *user_friendly_name : TEXT <<unique>>
  preferred : BOOLEAN
}

' --- Table: calibration_per_channel ---
entity "calibration_per_channel" as e04 {
  *id : SERIAL <<generated>>
  --
  *creation_time : TIMESTAMP
  *frequency_channel : SMALLINT
  *station_id : SMALLINT
  preferred : BOOLEAN
  calibration_path : TEXT
  acquisition_time : FLOAT8
  solution : FLOAT8[]
  corrcoeff : FLOAT8[]
  residual_max : FLOAT8[]
  residual_std : FLOAT8[]
  xy_phase : FLOAT8
  n_masked_initial : INTEGER
  n_masked_final : INTEGER
  lst : FLOAT8
  galactic_centre_elevation : FLOAT8
  sun_elevation : FLOAT8
  sun_adjustment_factor : FLOAT8
  masked_antennas : TEXT[]
  job_id : INTEGER <<FK>>
  solution_type : TEXT
}

' --- Table: calibration_per_sweep ---
entity "calibration_per_sweep" as e03 {
  *id : SERIAL <<generated>>
  --
  *job_id : INTEGER <<FK, unique>>
  *final_mask : TEXT[]
  mean_amplitude : DOUBLE PRECISION[256]
  *phase : DOUBLE PRECISION
  *phase_gradient : DOUBLE PRECISION
  *amplitude_fit_cost : DOUBLE PRECISION
  phase_fit_cost : DOUBLE PRECISION
  phase_fit_covariance : DOUBLE PRECISION
}

' --- Relationships (Information Engineering notation) ---

e01 "0..*" -- "1" e02
e02 "0..*" -- "0..1" e04
e02 "1" -- "1" e03

@enduml