====== StepData ====== Created Monday 20 June 2011 ===== Assumptions and Prerequisities ===== The data structures are expressed here in C-style pseudo-code, though they would be implemented using the Generic System Interface (resulting in generated C code which may well differ from that below). The array dimensions are given in row-major order i.e. fastest-varying index at the right. ==== New datatypes required ==== * Double precision complex number, e.g.: typedef struct { double real; double imag; } Complex; * Multidimensional array ==== Configuration data ==== The following are strictly constant (UPPER_CASE_WITH_UNDERSCORES): #define MAX_DLS 10 The following metadata (lower_case_with_underscores) are derived from the current MROI configuration, and are not expected to change during the night. I've included typical values in some cases: int num_gd_trials; /**< Number of trial group delays */ int num_bas; /**< Number of baselines measured by FT (up to 9) */ int num_channels = 5; /**< Number of spectral channels used for fringe tracking */ int num_output; /**< Total number of combiner outputs in use */ int num_win = 5; /**< Number of windows (subframes) per camera :TODO: not needed? */ int win_length = 5; /**< Window size parallel to spectral dispersion /pix */ int win_width = 1; /**< Window size perpendicular to spectral dispersion /pix */ String baseline[num_bas]; /**< Baseline role identifiers */ int baseline_modulator[num_bas]; /**< Mapping from baseline to corresponding modulator */ int baseline_dl[num_bas][2]; /**< Mapping from baseline to corresponding two delay lines :TODO: sign convention */ int baseline_num_output[num_bas]; /** Number of outputs in use for each baseline (1 or 2) :TODO: common value for all baselines?*/ int baseline_output[num_bas][2]; /**< Mapping from baseline to combiner output(s) */ int output_baseline[num_output]; /**< Mapping from combiner output to baseline */ One way to expose the baseline_* metadata would be to define a Baseline class. ===== Monitor Data ===== /** * Pixel data at a modulator position from all cameras. * The reset level has been subtracted and the data have been averaged over multiple reads. */ typedef struct { MROITime t[num_output]; /**< Mean timestamp of multiple reads */ unsigned short int pixel[num_output][win_width][win_length]; /**< Average pixel value over multiple reads /ADU */ } FTPixels; We may also wish to publish copies of the other inputs to the Fringe Engine i.e. modulator positions and delay line positions. /** * Outputs from processing pixel data for a complete set of modulator steps A-B-C-D or AC-BD. * A new instance is generated following each modulator step. */ typedef struct { MROITime t[num_bas]; /**< Mean time of ABCD fringe measurement */ Complex groupDelaySpectrum[num_bas][num_gd_trials]; /**< GD spectrum from latest coherent integration */ Complex avgGroupDelaySpectrum[num_bas][num_gd_trials]; /**< Running average GD spectrum (i.e. after incoherent integration) */ double estDelay[num_bas]; /**< Delay estimated from centroid of avgGroupDelaySpectrum */ FringeOffset delayCommand[MAX_DLS]; /**< Offsets (with valid flags) sent to DLs - see EBS memo */ /* :TODO: The following are not yet calculated by the FT Simulator: */ bool fringesPresent[num_bas]; /**< Fringes detected? :TODO: publish separately from struct? */ float visibility[num_bas]; /**< Fringe contrast :TODO: or [num_bas][num_channels] ? */ float flux[num_bas][num_channels]; /**< Incoherent flux /ADU */' float phaseJitter[num_bas]; /**< Variance of fringe phase */ float fringeSNR[num_bas][num_channels]; /**< Signal-to-noise of fringes */ } FTData;