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