27 #include <boost/algorithm/string/trim.hpp>
31 #include <wcslib/wcs.h>
32 #include <wcslib/wcsfix.h>
33 #include <wcslib/wcshdr.h>
34 #include <wcslib/wcsprintf.h>
39 namespace SourceXtractor {
50 case WCSHDRERR_SUCCESS:
52 case WCSHDRERR_MEMORY:
54 case WCSHDRERR_PARSER:
64 logger.error() << err->file <<
":" << err->line_no <<
" " << err->function;
65 logger.error() << err->msg;
73 if (ret_code != WCSERR_SUCCESS) {
93 for (
const char *p = header; *p !=
'\0' && number_of_records; --number_of_records, p += 80) {
103 static void wcsCheckHeaders(
const wcsprm *wcs,
const char *headers_str,
int number_of_records) {
131 logger.warn() <<
"WCS generated some errors in strict mode. This may be OK.";
132 logger.warn() <<
"Will run in relaxed mode.";
135 eol =
strchr(err_buffer,
'\n');
138 err_buffer = eol + 1;
152 static int wrapped_wcssub(
int alloc,
const struct wcsprm* wcssrc,
int* nsub,
int axes[],
struct wcsprm* wcsdst) {
156 return wcssub(alloc, wcssrc, nsub, axes, wcsdst);
160 int number_of_records = 0;
161 auto fits_headers = fits_image_source.
getFitsHeaders(number_of_records);
163 init(&(*fits_headers)[0], number_of_records);
171 int number_of_records;
174 if (wcshdo(WCSHDO_none, original.
m_wcs.
get(), &number_of_records, &raw_header) != 0) {
175 throw Elements::Exception() <<
"Failed to get the FITS headers for the WCS coordinate system when copying WCS";
178 init(raw_header, number_of_records);
187 int nreject = 0, nwcs = 0, nreject_strict = 0;
191 wcsprintf_set(
nullptr);
202 int ret = wcspih(headers, number_of_records, WCSHDR_all, 0, &nreject, &nwcs, &wcs);
209 m_wcs = decltype(
m_wcs)(wcs, [nwcs](wcsprm* ptr) {
210 int nwcs_copy = nwcs;
212 wcsvfree(&nwcs_copy, &ptr);
237 double pc_array[2] {image_coordinate.
m_x + 1, image_coordinate.
m_y + 1};
239 double ic_array[2] {0, 0};
240 double wc_array[2] {0, 0};
244 int ret_val = wcsp2s(&wcs_copy, 1, 1, pc_array, ic_array, &phi, &theta, wc_array, &status);
257 double pc_array[2] {0, 0};
258 double ic_array[2] {0, 0};
259 double wc_array[2] {world_coordinate.
m_alpha, world_coordinate.
m_delta};
263 int ret_val = wcss2p(&wcs_copy, 1, 1, wc_array, &phi, &theta, ic_array, pc_array, &status);
274 if (wcshdo(WCSHDO_none,
m_wcs.
get(), &nkeyrec, &raw_header) != 0) {
275 throw Elements::Exception() <<
"Failed to get the FITS headers for the WCS coordinate system";
279 for (
int i = 0; i < nkeyrec; ++i) {
280 char *hptr = &raw_header[80 * i];
static Logging getLogger(const std::string &name="")