00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef MUSE_WCS_H
00023 #define MUSE_WCS_H
00024
00025
00026
00027
00028 #include <cpl.h>
00029 #include <math.h>
00030
00031 #include "muse_cplwrappers.h"
00032 #include "muse_datacube.h"
00033 #include "muse_pixtable.h"
00034 #include "muse_resampling.h"
00035
00036
00037
00038
00048 #define MUSE_WCS_KEYS "^C(TYPE|UNIT|RPIX|RVAL|DELT|SYER|RDER)|^CD[0-9]+_[0-9]+|" \
00049 "^WCSAXES$|^L[OA][NT]POLE$"
00050
00056 #define MUSE_WCS_DETIMAGE_EXTNAME "ASTROMETRY_DETECTION"
00057
00058
00059
00060
00061 extern const muse_cpltable_def muse_wcs_reference_def[];
00062
00063
00064
00069
00070 typedef struct {
00071
00072 muse_datacube *cube;
00073
00074 double xcenter, ycenter;
00075
00076 double ra, dec;
00077
00078 double crpix1, crpix2;
00079
00080 cpl_table *detected;
00081
00082 cpl_propertylist *wcs;
00083 } muse_wcs_object;
00084
00085
00089
00090 typedef enum {
00091 MUSE_WCS_CENTROID_GAUSSIAN = 0,
00092 MUSE_WCS_CENTROID_MOFFAT,
00093 MUSE_WCS_CENTROID_BOX
00094 } muse_wcs_centroid_type;
00095
00096
00104
00105 typedef struct {
00106 double crpix1, crpix2;
00107 double crval1, crval2;
00108 double cd11, cd12, cd21, cd22;
00109 double cddet;
00112 cpl_boolean iscelsph;
00113 } muse_wcs;
00114
00115
00116
00117
00118
00119
00136
00137 static inline void
00138 muse_wcs_celestial_from_pixel_fast(muse_wcs *aWCS, double aX, double aY,
00139 double *aRA, double *aDEC)
00140 {
00141
00142 double x = aWCS->cd11 * (aX - aWCS->crpix1) + aWCS->cd12 * (aY - aWCS->crpix2),
00143 y = aWCS->cd22 * (aY - aWCS->crpix2) + aWCS->cd21 * (aX - aWCS->crpix1);
00144
00145 double phi = atan2(x, -y),
00146 theta = atan(CPL_MATH_DEG_RAD / sqrt(x*x + y*y));
00147
00148
00149 double dec = aWCS->crval2 / CPL_MATH_DEG_RAD;
00150 *aRA = aWCS->crval1 + atan2(cos(theta) * sin(phi),
00151 sin(theta) * cos(dec) + cos(theta) * sin(dec) * cos(phi))
00152 * CPL_MATH_DEG_RAD;
00153 *aDEC = asin(sin(theta) * sin(dec) - cos(theta) * cos(dec) * cos(phi))
00154 * CPL_MATH_DEG_RAD;
00155 }
00156
00157
00174
00175 static inline void
00176 muse_wcs_pixel_from_celestial_fast(muse_wcs *aWCS, double aRA, double aDEC,
00177 double *aX, double *aY)
00178 {
00179
00180
00181
00182 double phi = atan2(-cos(aDEC) * sin(aRA - aWCS->crval1),
00183 sin(aDEC) * cos(aWCS->crval2)
00184 - cos(aDEC) * sin(aWCS->crval2) * cos(aRA - aWCS->crval1))
00185 + 180 / CPL_MATH_DEG_RAD,
00186 theta = asin(sin(aDEC) * sin(aWCS->crval2)
00187 + cos(aDEC) * cos(aWCS->crval2) * cos(aRA - aWCS->crval1)),
00188 R_theta = CPL_MATH_DEG_RAD / tan(theta);
00189
00190 double x = R_theta * sin(phi),
00191 y = -R_theta * cos(phi);
00192
00193 *aX = (aWCS->cd22 * x - aWCS->cd12 * y) / aWCS->cddet + aWCS->crpix1;
00194 *aY = (aWCS->cd11 * y - aWCS->cd21 * x) / aWCS->cddet + aWCS->crpix2;
00195 }
00196
00197
00214
00215 static inline void
00216 muse_wcs_projplane_from_pixel_fast(muse_wcs *aWCS, double aX, double aY,
00217 double *aXOut, double *aYOut)
00218 {
00219
00220 *aXOut = aWCS->cd11 * (aX - aWCS->crpix1) + aWCS->cd12 * (aY - aWCS->crpix2)
00221 + aWCS->crval1;
00222 *aYOut = aWCS->cd22 * (aY - aWCS->crpix2) + aWCS->cd21 * (aX - aWCS->crpix1)
00223 + aWCS->crval2;
00224 }
00225
00226
00243
00244 static inline void
00245 muse_wcs_pixel_from_projplane_fast(muse_wcs *aWCS, double aX, double aY,
00246 double *aXOut, double *aYOut)
00247 {
00248
00249 *aXOut = (aWCS->cd22 * (aX - aWCS->crval1) - aWCS->cd12 * (aY - aWCS->crval2))
00250 / aWCS->cddet + aWCS->crpix1;
00251 *aYOut = (aWCS->cd11 * (aY - aWCS->crval2) - aWCS->cd21 * (aX - aWCS->crval1))
00252 / aWCS->cddet + aWCS->crpix2;
00253 }
00254
00257
00258
00259
00260 muse_wcs_object *muse_wcs_object_new(void);
00261 void muse_wcs_object_delete(muse_wcs_object *);
00262
00263 cpl_table *muse_wcs_centroid_stars(muse_image *, float, muse_wcs_centroid_type);
00264 cpl_error_code muse_wcs_locate_sources(muse_pixtable *, float, muse_wcs_centroid_type, muse_wcs_object *);
00265 cpl_error_code muse_wcs_solve(muse_wcs_object *, cpl_table *, float, float, int, float);
00266 cpl_error_code muse_wcs_optimize_solution(muse_wcs_object *, float, muse_wcs_centroid_type, cpl_table *, float, float, int, float);
00267 cpl_propertylist *muse_wcs_create_default(void);
00268 cpl_propertylist *muse_wcs_apply_cd(const cpl_propertylist *, const cpl_propertylist *);
00269 cpl_error_code muse_wcs_project_tan(muse_pixtable *, const cpl_propertylist *);
00270 cpl_error_code muse_wcs_position_celestial(muse_pixtable *, double, double);
00271
00272 cpl_error_code muse_wcs_celestial_from_pixel(cpl_propertylist *, double, double, double *, double *);
00273 cpl_error_code muse_wcs_pixel_from_celestial(cpl_propertylist *, double, double, double *, double *);
00274 cpl_error_code muse_wcs_projplane_from_celestial(cpl_propertylist *, double, double, double *, double *);
00275 cpl_error_code muse_wcs_projplane_from_pixel(cpl_propertylist *, double, double, double *, double *);
00276 cpl_error_code muse_wcs_pixel_from_projplane(cpl_propertylist *, double, double, double *, double *);
00277
00278 cpl_error_code muse_wcs_get_angles(cpl_propertylist *, double *, double *);
00279 cpl_error_code muse_wcs_get_scales(cpl_propertylist *, double *, double *);
00280
00281 muse_wcs *muse_wcs_new(cpl_propertylist *);
00282
00283 #endif