1 /*
2 * Copyright (c) 2015-2021, The OSKAR Developers.
3 * See the LICENSE file at the top-level directory of this distribution.
4 */
5
6 #include "vis/private_vis_header.h"
7 #include "vis/oskar_vis_header.h"
8
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12
13
oskar_vis_header_telescope_path(oskar_VisHeader * vis)14 oskar_Mem* oskar_vis_header_telescope_path(oskar_VisHeader* vis)
15 {
16 return vis->telescope_path;
17 }
18
oskar_vis_header_telescope_path_const(const oskar_VisHeader * vis)19 const oskar_Mem* oskar_vis_header_telescope_path_const(const oskar_VisHeader* vis)
20 {
21 return vis->telescope_path;
22 }
23
oskar_vis_header_settings(oskar_VisHeader * vis)24 oskar_Mem* oskar_vis_header_settings(oskar_VisHeader* vis)
25 {
26 return vis->settings;
27 }
28
oskar_vis_header_settings_const(const oskar_VisHeader * vis)29 const oskar_Mem* oskar_vis_header_settings_const(const oskar_VisHeader* vis)
30 {
31 return vis->settings;
32 }
33
oskar_vis_header_num_tags_header(const oskar_VisHeader * vis)34 int oskar_vis_header_num_tags_header(const oskar_VisHeader* vis)
35 {
36 return vis->num_tags_header;
37 }
38
oskar_vis_header_num_tags_per_block(const oskar_VisHeader * vis)39 int oskar_vis_header_num_tags_per_block(const oskar_VisHeader* vis)
40 {
41 return vis->num_tags_per_block;
42 }
43
oskar_vis_header_write_auto_correlations(const oskar_VisHeader * vis)44 int oskar_vis_header_write_auto_correlations(const oskar_VisHeader* vis)
45 {
46 return vis->write_autocorr;
47 }
48
oskar_vis_header_write_cross_correlations(const oskar_VisHeader * vis)49 int oskar_vis_header_write_cross_correlations(const oskar_VisHeader* vis)
50 {
51 return vis->write_crosscorr;
52 }
53
oskar_vis_header_amp_type(const oskar_VisHeader * vis)54 int oskar_vis_header_amp_type(const oskar_VisHeader* vis)
55 {
56 return vis->amp_type;
57 }
58
oskar_vis_header_coord_precision(const oskar_VisHeader * vis)59 int oskar_vis_header_coord_precision(const oskar_VisHeader* vis)
60 {
61 return vis->coord_precision;
62 }
63
oskar_vis_header_max_times_per_block(const oskar_VisHeader * vis)64 int oskar_vis_header_max_times_per_block(const oskar_VisHeader* vis)
65 {
66 return vis->max_times_per_block;
67 }
68
oskar_vis_header_max_channels_per_block(const oskar_VisHeader * vis)69 int oskar_vis_header_max_channels_per_block(const oskar_VisHeader* vis)
70 {
71 return vis->max_channels_per_block;
72 }
73
oskar_vis_header_num_blocks(const oskar_VisHeader * vis)74 int oskar_vis_header_num_blocks(const oskar_VisHeader* vis)
75 {
76 const int t = (vis->num_times_total + vis->max_times_per_block - 1) /
77 vis->max_times_per_block;
78 const int c = (vis->num_channels_total + vis->max_channels_per_block - 1) /
79 vis->max_channels_per_block;
80 return t * c;
81 }
82
oskar_vis_header_num_channels_total(const oskar_VisHeader * vis)83 int oskar_vis_header_num_channels_total(const oskar_VisHeader* vis)
84 {
85 return vis->num_channels_total;
86 }
87
oskar_vis_header_num_elements_in_station(const oskar_VisHeader * vis,int station)88 int oskar_vis_header_num_elements_in_station(
89 const oskar_VisHeader* vis, int station)
90 {
91 if (station >= vis->num_stations) return 0;
92 return (int) oskar_mem_length(vis->element_enu_metres[0][station]);
93 }
94
oskar_vis_header_num_times_total(const oskar_VisHeader * vis)95 int oskar_vis_header_num_times_total(const oskar_VisHeader* vis)
96 {
97 return vis->num_times_total;
98 }
99
oskar_vis_header_num_stations(const oskar_VisHeader * vis)100 int oskar_vis_header_num_stations(const oskar_VisHeader* vis)
101 {
102 return vis->num_stations;
103 }
104
oskar_vis_header_pol_type(const oskar_VisHeader * vis)105 int oskar_vis_header_pol_type(const oskar_VisHeader* vis)
106 {
107 return vis->pol_type;
108 }
109
oskar_vis_header_phase_centre_coord_type(const oskar_VisHeader * vis)110 int oskar_vis_header_phase_centre_coord_type(const oskar_VisHeader* vis)
111 {
112 return vis->phase_centre_type;
113 }
114
oskar_vis_header_phase_centre_longitude_deg(const oskar_VisHeader * vis)115 double oskar_vis_header_phase_centre_longitude_deg(const oskar_VisHeader* vis)
116 {
117 return vis->phase_centre_deg[0];
118 }
119
oskar_vis_header_phase_centre_latitude_deg(const oskar_VisHeader * vis)120 double oskar_vis_header_phase_centre_latitude_deg(const oskar_VisHeader* vis)
121 {
122 return vis->phase_centre_deg[1];
123 }
124
oskar_vis_header_phase_centre_ra_deg(const oskar_VisHeader * vis)125 double oskar_vis_header_phase_centre_ra_deg(const oskar_VisHeader* vis)
126 {
127 return vis->phase_centre_deg[0];
128 }
129
oskar_vis_header_phase_centre_dec_deg(const oskar_VisHeader * vis)130 double oskar_vis_header_phase_centre_dec_deg(const oskar_VisHeader* vis)
131 {
132 return vis->phase_centre_deg[1];
133 }
134
oskar_vis_header_freq_start_hz(const oskar_VisHeader * vis)135 double oskar_vis_header_freq_start_hz(const oskar_VisHeader* vis)
136 {
137 return vis->freq_start_hz;
138 }
139
oskar_vis_header_freq_inc_hz(const oskar_VisHeader * vis)140 double oskar_vis_header_freq_inc_hz(const oskar_VisHeader* vis)
141 {
142 return vis->freq_inc_hz;
143 }
144
oskar_vis_header_channel_bandwidth_hz(const oskar_VisHeader * vis)145 double oskar_vis_header_channel_bandwidth_hz(const oskar_VisHeader* vis)
146 {
147 return vis->channel_bandwidth_hz;
148 }
149
oskar_vis_header_time_start_mjd_utc(const oskar_VisHeader * vis)150 double oskar_vis_header_time_start_mjd_utc(const oskar_VisHeader* vis)
151 {
152 return vis->time_start_mjd_utc;
153 }
154
oskar_vis_header_time_inc_sec(const oskar_VisHeader * vis)155 double oskar_vis_header_time_inc_sec(const oskar_VisHeader* vis)
156 {
157 return vis->time_inc_sec;
158 }
159
oskar_vis_header_time_average_sec(const oskar_VisHeader * vis)160 double oskar_vis_header_time_average_sec(const oskar_VisHeader* vis)
161 {
162 return vis->time_average_sec;
163 }
164
oskar_vis_header_telescope_lon_deg(const oskar_VisHeader * vis)165 double oskar_vis_header_telescope_lon_deg(const oskar_VisHeader* vis)
166 {
167 return vis->telescope_centre_lon_deg;
168 }
169
oskar_vis_header_telescope_lat_deg(const oskar_VisHeader * vis)170 double oskar_vis_header_telescope_lat_deg(const oskar_VisHeader* vis)
171 {
172 return vis->telescope_centre_lat_deg;
173 }
174
oskar_vis_header_telescope_alt_metres(const oskar_VisHeader * vis)175 double oskar_vis_header_telescope_alt_metres(const oskar_VisHeader* vis)
176 {
177 return vis->telescope_centre_alt_m;
178 }
179
oskar_vis_header_station_offset_ecef_metres(oskar_VisHeader * vis,int dim)180 oskar_Mem* oskar_vis_header_station_offset_ecef_metres(oskar_VisHeader* vis, int dim)
181 {
182 if (dim >= 3) return 0;
183 return vis->station_offset_ecef_metres[dim];
184 }
185
oskar_vis_header_station_offset_ecef_metres_const(const oskar_VisHeader * vis,int dim)186 const oskar_Mem* oskar_vis_header_station_offset_ecef_metres_const(
187 const oskar_VisHeader* vis, int dim)
188 {
189 if (dim >= 3) return 0;
190 return vis->station_offset_ecef_metres[dim];
191 }
192
oskar_vis_header_element_enu_metres(oskar_VisHeader * vis,int dim,int station)193 oskar_Mem* oskar_vis_header_element_enu_metres(
194 oskar_VisHeader* vis, int dim, int station)
195 {
196 if (dim >= 3 || station >= vis->num_stations) return 0;
197 return vis->element_enu_metres[dim][station];
198 }
199
oskar_vis_header_element_enu_metres_const(const oskar_VisHeader * vis,int dim,int station)200 const oskar_Mem* oskar_vis_header_element_enu_metres_const(
201 const oskar_VisHeader* vis, int dim, int station)
202 {
203 if (dim >= 3 || station >= vis->num_stations) return 0;
204 return vis->element_enu_metres[dim][station];
205 }
206
oskar_vis_header_set_freq_start_hz(oskar_VisHeader * vis,double value)207 void oskar_vis_header_set_freq_start_hz(oskar_VisHeader* vis, double value)
208 {
209 vis->freq_start_hz = value;
210 }
211
oskar_vis_header_set_freq_inc_hz(oskar_VisHeader * vis,double value)212 void oskar_vis_header_set_freq_inc_hz(oskar_VisHeader* vis, double value)
213 {
214 vis->freq_inc_hz = value;
215 }
216
oskar_vis_header_set_channel_bandwidth_hz(oskar_VisHeader * vis,double value)217 void oskar_vis_header_set_channel_bandwidth_hz(oskar_VisHeader* vis,
218 double value)
219 {
220 vis->channel_bandwidth_hz = value;
221 }
222
oskar_vis_header_set_time_start_mjd_utc(oskar_VisHeader * vis,double value)223 void oskar_vis_header_set_time_start_mjd_utc(oskar_VisHeader* vis,
224 double value)
225 {
226 vis->time_start_mjd_utc = value;
227 }
228
oskar_vis_header_set_time_inc_sec(oskar_VisHeader * vis,double value)229 void oskar_vis_header_set_time_inc_sec(oskar_VisHeader* vis, double value)
230 {
231 vis->time_inc_sec = value;
232 }
233
oskar_vis_header_set_time_average_sec(oskar_VisHeader * vis,double value)234 void oskar_vis_header_set_time_average_sec(oskar_VisHeader* vis, double value)
235 {
236 vis->time_average_sec = value;
237 }
238
oskar_vis_header_set_phase_centre(oskar_VisHeader * vis,int coord_type,double longitude_deg,double latitude_deg)239 void oskar_vis_header_set_phase_centre(oskar_VisHeader* vis,
240 int coord_type, double longitude_deg, double latitude_deg)
241 {
242 vis->phase_centre_type = coord_type;
243 vis->phase_centre_deg[0] = longitude_deg;
244 vis->phase_centre_deg[1] = latitude_deg;
245 }
246
oskar_vis_header_set_telescope_centre(oskar_VisHeader * vis,double longitude_deg,double latitude_deg,double alt_metres)247 void oskar_vis_header_set_telescope_centre(oskar_VisHeader* vis,
248 double longitude_deg, double latitude_deg, double alt_metres)
249 {
250 vis->telescope_centre_lon_deg = longitude_deg;
251 vis->telescope_centre_lat_deg = latitude_deg;
252 vis->telescope_centre_alt_m = alt_metres;
253 }
254
oskar_vis_header_set_pol_type(oskar_VisHeader * vis,int value,int * status)255 void oskar_vis_header_set_pol_type(oskar_VisHeader* vis, int value,
256 int* status)
257 {
258 if (oskar_type_is_matrix(vis->amp_type))
259 {
260 if (value == OSKAR_VIS_POL_TYPE_STOKES_I_Q_U_V ||
261 value == OSKAR_VIS_POL_TYPE_LINEAR_XX_XY_YX_YY)
262 {
263 vis->pol_type = value;
264 }
265 else
266 {
267 *status = OSKAR_ERR_TYPE_MISMATCH;
268 }
269 }
270 else
271 {
272 if (value == OSKAR_VIS_POL_TYPE_STOKES_I ||
273 value == OSKAR_VIS_POL_TYPE_STOKES_Q ||
274 value == OSKAR_VIS_POL_TYPE_STOKES_U ||
275 value == OSKAR_VIS_POL_TYPE_STOKES_V ||
276 value == OSKAR_VIS_POL_TYPE_LINEAR_XX ||
277 value == OSKAR_VIS_POL_TYPE_LINEAR_XY ||
278 value == OSKAR_VIS_POL_TYPE_LINEAR_YX ||
279 value == OSKAR_VIS_POL_TYPE_LINEAR_YY)
280 {
281 vis->pol_type = value;
282 }
283 else
284 {
285 *status = OSKAR_ERR_TYPE_MISMATCH;
286 }
287 }
288 }
289
290 #ifdef __cplusplus
291 }
292 #endif
293