36#include "irplib_wcs.h"
46static cpl_error_code irplib_wcs_is_iso8601(
int,
int,
int,
int,
int,
double);
49#define IRPLIB_ISO8601_FORMAT "%4d-%2d-%2dT%2d:%2d:%lf"
66irplib_wcs_xytoradec(
const cpl_wcs *wcs,
73 cpl_matrix *radec = NULL;
74 cpl_array *status = NULL;
77 cpl_ensure_code(ra != NULL, CPL_ERROR_NULL_INPUT);
78 cpl_ensure_code(dec != NULL, CPL_ERROR_NULL_INPUT);
81 xy = cpl_matrix_new(1, 2);
82 cpl_matrix_set(xy, 0, 0, x);
83 cpl_matrix_set(xy, 0, 1, y);
86 error = cpl_wcs_convert(wcs, xy, &radec, &status, CPL_WCS_PHYS2WORLD);
88 cpl_matrix_delete(xy);
92 *ra = cpl_matrix_get(radec, 0, 0);
93 *dec = cpl_matrix_get(radec, 0, 1);
97 cpl_matrix_delete(radec);
98 cpl_array_delete(status);
100 return cpl_error_set_where(cpl_func);
116irplib_wcs_radectoxy(
const cpl_wcs *wcs,
123 cpl_matrix *xy = NULL;
124 cpl_array *status = NULL;
125 cpl_error_code error;
127 cpl_ensure_code(x != NULL, CPL_ERROR_NULL_INPUT);
128 cpl_ensure_code(y != NULL, CPL_ERROR_NULL_INPUT);
131 radec = cpl_matrix_new(1, 2);
132 cpl_matrix_set(radec, 0, 0, ra);
133 cpl_matrix_set(radec, 0, 1, dec);
135 error = cpl_wcs_convert(wcs, radec, &xy, &status, CPL_WCS_WORLD2PHYS);
137 cpl_matrix_delete(radec);
140 *x = cpl_matrix_get(xy, 0, 0);
141 *y = cpl_matrix_get(xy, 0, 1);
145 cpl_array_delete(status);
146 cpl_matrix_delete(xy);
148 return cpl_error_set_where(cpl_func);
163irplib_wcs_great_circle_dist(
double ra1,
double dec1,
double ra2,
double dec2)
166 const double dra = sin(CPL_MATH_RAD_DEG * (ra2 - ra1) / 2.0);
167 const double ddec = sin(CPL_MATH_RAD_DEG * (dec2 - dec1) / 2.0);
169 dec1 *= CPL_MATH_RAD_DEG;
170 dec2 *= CPL_MATH_RAD_DEG;
172 return 2.0 * asin(sqrt(ddec * ddec + cos(dec1) * cos(dec2) * dra * dra)) *
193irplib_wcs_mjd_from_iso8601(
double *pmjd,
201 cpl_ensure_code(pmjd != NULL, CPL_ERROR_NULL_INPUT);
202 cpl_ensure_code(!irplib_wcs_is_iso8601(year, month, day, hour, minute,
204 cpl_error_get_code());
207 *pmjd = (double)((1461 * (year - (12 - month) / 10 + 4712)) / 4 +
208 (306 * ((month + 9) % 12) + 5) / 10 -
209 (3 * ((year - (12 - month) / 10 + 4900) / 100)) / 4 + day -
211 (hour + (minute + second / 60.0) / 60.0) / 24.0;
213 return CPL_ERROR_NONE;
235irplib_wcs_iso8601_from_string(
int *pyear,
245 cpl_ensure_code(pyear != NULL, CPL_ERROR_NULL_INPUT);
246 cpl_ensure_code(pmonth != NULL, CPL_ERROR_NULL_INPUT);
247 cpl_ensure_code(pday != NULL, CPL_ERROR_NULL_INPUT);
248 cpl_ensure_code(phour != NULL, CPL_ERROR_NULL_INPUT);
249 cpl_ensure_code(pminute != NULL, CPL_ERROR_NULL_INPUT);
250 cpl_ensure_code(psecond != NULL, CPL_ERROR_NULL_INPUT);
251 cpl_ensure_code(iso8601 != NULL, CPL_ERROR_NULL_INPUT);
253 nret = sscanf(iso8601, IRPLIB_ISO8601_FORMAT, pyear, pmonth, pday, phour,
257 return cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_INPUT,
259 " %d != 6: input %s is not in format %s",
260 nret, iso8601, IRPLIB_ISO8601_FORMAT);
263 return irplib_wcs_is_iso8601(*pyear, *pmonth, *pday, *phour, *pminute,
265 ? cpl_error_set_where(cpl_func)
281irplib_wcs_mjd_from_string(
double *pmjd,
const char *iso8601)
283 int year, day, month, hour, minute;
286 return irplib_wcs_iso8601_from_string(&year, &month, &day, &hour, &minute,
288 irplib_wcs_mjd_from_iso8601(pmjd, year, month, day, hour,
290 ? cpl_error_set_where(cpl_func)
311irplib_wcs_iso8601_from_mjd(
int *pyear,
322 cpl_ensure_code(pyear != NULL, CPL_ERROR_NULL_INPUT);
323 cpl_ensure_code(pmonth != NULL, CPL_ERROR_NULL_INPUT);
324 cpl_ensure_code(pday != NULL, CPL_ERROR_NULL_INPUT);
325 cpl_ensure_code(phour != NULL, CPL_ERROR_NULL_INPUT);
326 cpl_ensure_code(pminute != NULL, CPL_ERROR_NULL_INPUT);
327 cpl_ensure_code(psecond != NULL, CPL_ERROR_NULL_INPUT);
331 jd = 2400001 + (int)mjd;
333 n4 = 4 * (jd + ((2 * ((4 * jd - 17918) / 146097) * 3) / 4 + 1) / 2 - 37);
334 dd = 10 * (((n4 - 237) % 1461) / 4) + 5;
336 *pyear = n4 / 1461 - 4712;
337 *pmonth = (2 + dd / 306) % 12 + 1;
338 *pday = (dd % 306) / 10 + 1;
344 t = 60.0 * (t - *phour);
346 *psecond = 60.0 * (t - *pminute);
349 cpl_ensure_code(!irplib_wcs_is_iso8601(*pyear, *pmonth, *pday, *phour,
351 CPL_ERROR_UNSPECIFIED);
353 return CPL_ERROR_NONE;
373irplib_wcs_is_iso8601(
int year,
380 const cpl_boolean is_leap = (year % 4) ? CPL_FALSE : CPL_TRUE;
382 0, 31, is_leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
384 cpl_ensure_code(month > 0, CPL_ERROR_ILLEGAL_INPUT);
385 cpl_ensure_code(month <= 12, CPL_ERROR_ILLEGAL_INPUT);
387 cpl_ensure_code(day > 0, CPL_ERROR_ILLEGAL_INPUT);
388 cpl_ensure_code(day <= mlen[month], CPL_ERROR_ILLEGAL_INPUT);
390 cpl_ensure_code(minute < 60, CPL_ERROR_ILLEGAL_INPUT);
391 cpl_ensure_code(minute >= 0, CPL_ERROR_ILLEGAL_INPUT);
393 cpl_ensure_code(second < 60.0, CPL_ERROR_ILLEGAL_INPUT);
394 cpl_ensure_code(second >= 0.0, CPL_ERROR_ILLEGAL_INPUT);
396 cpl_ensure_code(hour >= 0, CPL_ERROR_ILLEGAL_INPUT);
398 cpl_ensure_code(hour <= (minute > 0 || second > 0.0 ? 23 : 24),
399 CPL_ERROR_ILLEGAL_INPUT);
401 return CPL_ERROR_NONE;