# The purpose of this "X-engine metadata" file is to document the file format.
# It will be used in two contexts:
#
# 1. Every X-engine node sends this file to every FRB node, at the beginning
# of the TCP stream.
#
# 2. As a configuration file for the "fake correlator" used for testing.
#
# This is a minimal "version 0", and will be extended later.
version: 2
# Frequency channels. The observed frequency band is divided into "zones".
# Within each zone, all frequency channels have the same width, but the
# channel width may differ between zones.
# zone_nfreq: number of frequency channels in each zone.
# zone_freq_edges: frequency band edges in MHz.
# For example:
# zone_nfreq: [N] zone_freq_edges: [400,800] one zone, channel width (400/N) MHz
# zone_nfreq: [2*N,N] zone_freq_edges: [400,600,800] width (100/N), (200/N) MHz in lower/upper band
#
# In this config, we have:
# Total frequency channels: 28160
# Channel widths (MHz): [ 0.00610352, 0.012207, 0.0244141, 0.0976562, 0.195312 ]
zone_nfreq: [8192, 8192, 6144, 2048, 3584]
zone_freq_edges: [300, 350, 450, 600, 800, 1500]
# Optional: which frequency channels are present?
# A list of distinct integers 0 <= (channel_id) < (total frequency channels).
# Only makes sense in "context 1" (see above), to indicate which frequency channels
# are sent by a particular X-engine node.
freq_channels: [ 0, 10000, 20000, 28159 ]
# Data for each beam recieved by this node, all fields required. An opaque id and sky coordinates,
# given as direction cosines in the grid frame. The grid frame is defined by x & y unit vectors
# which are orthogonal and lie along (or close to) the axes of the telescope grid. Each
# beam has a skywards-directed unit vector b. The grid_x and grid_y values are the x & y direction
# cosines: b.x and b.y.
beams: [
{id: 100, grid_x: 0.0, grid_y: 0.0},
{id: 200, grid_x: 0.1, grid_y: 0.0},
{id: 300, grid_x: 0.0, grid_y: 0.1},
]
#############
# Timekeeping
#############
# Each frame from the X-engine will come with the fpga sequence number (seq) at the beginning of the frame.
# To keep time in pirate, we need to know:
# - unix_ns_at_seq_0: the epoch (the UNIX time at seq = 0, in nanoseconds).
# - dt_ns_per_seq: the rate at which seqs tick, number of nanoseconds per seq tick.
# - seq_per_frame: the number of seq ticks covered by a data frame.
#
# In Kotekan language:
# unix_nx_at_seq_0 = time0_ns
# dt_ns_per_seq = fengine_fft_length / ADC_sampling_rate_GHz
# seq_per_frame = 256 * frb_downsampling_factor (not sure if this exists)
#
# The sifter will need Earth Orientation Parameters (EOP) (which change in time and Kotekan has) and
# a precession/nutation model (which Kotekan does *not* have) to compute RA/DEC for the beams.
# Since the sifter has to do this calculation anyways, I propose we *don't* sent UT1 or EOP data
# from Kotekan to Pirate, and instead rely on the sifter to make the astropy calls itself.
#
# This means the sifter may infer a *slightly* different UT1 for the same seq number compared to
# the X-engine (if it has more up-to-date EOP data). The difference will be sub-ms, which I think is
# acceptable?
#
# unix_ns_at_seq_0 will change whenever the F-engine reboots, which will also require a reboot of
# the X-engine.
unix_ns_at_seq_0: 1772483060000000000
dt_ns_per_seq: 5120
seq_per_frame: 256
###########
# Telescope alignment and localization parameters.
###########
# Coordinate Systems
#
# Topocentric: origin at the given lat/lon. x-axis is directed exactly East (increasing Longitude),
# y-axis is directed exactly North (increasing Latitude), z-axis is directed exactly "up" (increasing
# altitude). orthogonal, Z = X x Y.
#
# Grid: origin at SW corner of Dish Array, aligned with Dish Array. x-axis directed "east-ish"
# parallel to dish "e/w" separatation vector. y-axis directed "north-ish" parallel to "n/s"
# separation vector. Z = X x Y points normal to grid plane. Dish grid lives in x-y plane at a
# constant Z. Orthogonal. Rotated by O(1) degrees from "Topocentric"
#
# Dish Elevation Axis: The axis around which the dishes pivot. positive is in the east direction.
# *Not* parallel to the dish grid "e/w" separation. "Coelevation" pointing measures an angle around
# this axis.
#
# Dish Vertical Axis: Local "up/zenith" for the dishes. The direction which has coelevation = 0.0.
# Orthogonal to the Dish Elevation axis.
# Position on the Earth in degrees
tel_origin_itrs_lat_deg: 49.32075144444
tel_origin_itrs_lon_deg: -119.62081125
# Unit vectors in the x & y grid directions, in topocentric coordinates.
tel_grid_x_axis: [ 0.999974342398359362,
-0.000037539331442772,
-0.007163318767675494]
tel_grid_y_axis: [0.000065403387739210,
0.999992433220348809,
0.003889630373557614]
# Unit vectors for the dish frame, the elevation axis and vertical axis, in
# topocentric coordinates.
tel_dish_elev_axis: [0.99999999838132391,
-0.000056897733584327,
0.0]
tel_dish_vert_axis: [0.0, 0.0, 1.0]
# The dish pointing angle, co-elevation in degrees: angle away from vertical,
# north is positive
tel_dish_coelev_deg: 0.0
# Values of dish separation in x and y directions in meters.
tel_dish_separation_x_m: 6.300156854906823
tel_dish_separation_y_m: 8.500057809796308