66 static cpl_apertures *
67 image_fwhm_cplapertures_extract(cpl_image *aImage, cpl_vector *aSigmas,
70 cpl_ensure(aImage && aSigmas, CPL_ERROR_NULL_INPUT, NULL);
71 cpl_apertures *aperts = NULL;
72 cpl_errorstate prestate = cpl_errorstate_get();
73 cpl_size i, n = cpl_vector_get_size(aSigmas);
74 for (i = 0; i < n; i++) {
75 const double sigma = cpl_vector_get(aSigmas, i);
81 double mdev, median = cpl_image_get_median_dev(aImage, &mdev),
82 threshold = median + sigma * mdev;
84 cpl_mask *selection = cpl_mask_threshold_image_create(aImage, threshold,
87 cpl_image *labels = cpl_image_labelise_mask_create(selection, &nlabels);
88 cpl_mask_delete(selection);
90 aperts = cpl_apertures_new_from_image(aImage, labels);
91 cpl_image_delete(labels);
97 cpl_ensure(aperts, CPL_ERROR_DATA_NOT_FOUND, NULL);
99 cpl_errorstate_set(prestate);
106 #define PRINT_USAGE(rc) \
107 fprintf(stderr, "Usage: %s [ -s sigma ] [ -x extindex | -n extname] " \
108 "IMAGE\n", argv[0]); \
109 cpl_end(); return (rc);
111 int main(
int argc,
char **argv)
113 cpl_init(CPL_INIT_DEFAULT);
127 for (i = 1; i < argc; i++) {
128 if (strncmp(argv[i],
"-s", 3) == 0) {
132 sigma = atof(argv[i]);
139 }
else if (strncmp(argv[i],
"-x", 3) == 0) {
143 iext = atoi(argv[i]);
150 }
else if (strncmp(argv[i],
"-n", 3) == 0) {
158 }
else if (strncmp(argv[i],
"-", 1) == 0) {
167 if (extname && iext >= 0) {
171 int next = cpl_fits_count_extensions(iname);
176 iext = cpl_fits_find_extension(iname, extname);
178 cpl_image *image = NULL;
180 image = cpl_image_load(iname, CPL_TYPE_UNSPECIFIED, 0, iext);
182 cpl_errorstate ps = cpl_errorstate_get();
184 image = cpl_image_load(iname, CPL_TYPE_UNSPECIFIED, 0, ++iext);
185 }
while (!image && iext <= next);
186 cpl_errorstate_set(ps);
191 cpl_propertylist *header = cpl_propertylist_load(iname, iext);
192 int nx = cpl_image_get_size_x(image),
193 ny = cpl_image_get_size_y(image);
194 char *extdisp = NULL;
195 if (cpl_propertylist_has(header,
"EXTNAME")) {
196 extdisp = cpl_strdup(cpl_propertylist_get_string(header,
"EXTNAME"));
198 extdisp = cpl_sprintf(
"%d", iext);
201 cpl_image_reject_value(image, CPL_VALUE_NAN);
202 int nrej = cpl_image_count_rejected(image);
203 printf(
"# Input image \"%s[%s]\" (size %dx%d, rejected %d)\n", iname, extdisp,
207 cpl_vector *vsigmas = NULL;
209 vsigmas = cpl_vector_new(1);
210 cpl_vector_set(vsigmas, 0, sigma);
212 vsigmas = cpl_vector_new(6);
213 cpl_vector_set(vsigmas, 0, 50.);
214 cpl_vector_set(vsigmas, 1, 30.);
215 cpl_vector_set(vsigmas, 2, 20.);
216 cpl_vector_set(vsigmas, 3, 10.);
217 cpl_vector_set(vsigmas, 4, 8.);
218 cpl_vector_set(vsigmas, 5, 5.);
220 cpl_size isigma = -1;
221 cpl_errorstate prestate = cpl_errorstate_get();
222 cpl_apertures *apertures = image_fwhm_cplapertures_extract(image, vsigmas, &isigma);
223 if (!apertures || !cpl_errorstate_is_equal(prestate)) {
224 cpl_image_delete(image);
225 fprintf(stderr,
"%s: no sources found for FWHM measurement down to %.1f "
226 "sigma limit!\n", argv[0],
227 cpl_vector_get(vsigmas, cpl_vector_get_size(vsigmas) - 1));
228 cpl_vector_delete(vsigmas);
231 int ndet = cpl_apertures_get_size(apertures);
232 printf(
"# %s: computing FWHM QC parameters for %d source%s found down to the "
233 "%.1f sigma threshold\n", argv[0], ndet, ndet == 1 ?
"" :
"s",
234 cpl_vector_get(vsigmas, isigma));
235 cpl_vector_delete(vsigmas);
239 double cd11 = kMuseSpaxelSizeX_WFM, cd12 = 0., cd21 = 0.,
240 cd22 = kMuseSpaxelSizeY_WFM;
241 cpl_wcs *wcs = cpl_wcs_new_from_propertylist(header);
243 !strncasecmp(cpl_propertylist_get_string(header,
"CTYPE1"),
"PIXEL", 5)) {
244 printf(
"# %s: FWHM parameter estimation (%d sources): simple conversion "
245 "to arcsec (CTYPE=%s/%s)!\n", argv[0], ndet,
246 cpl_propertylist_get_string(header,
"CTYPE1"),
247 cpl_propertylist_get_string(header,
"CTYPE2"));
249 cd11 = kMuseSpaxelSizeX_WFM;
250 cd22 = kMuseSpaxelSizeY_WFM;
253 const cpl_matrix *cd = cpl_wcs_get_cd(wcs);
255 cd11 = fabs(cpl_matrix_get(cd, 0, 0)) * 3600.,
256 cd12 = fabs(cpl_matrix_get(cd, 0, 1)) * 3600.,
257 cd21 = fabs(cpl_matrix_get(cd, 1, 0)) * 3600.,
258 cd22 = fabs(cpl_matrix_get(cd, 1, 1)) * 3600.;
259 printf(
"# %s: FWHM parameter estimation (%d sources): full "
260 "conversion to arcsec (CD=%.2f,%.2f,%.2f,%.2f)\n", argv[0], ndet,
261 cd11, cd12, cd21, cd22);
266 cpl_vector *vfwhm = cpl_vector_new(ndet),
267 *vgfwhm = cpl_vector_new(ndet);
268 printf(
"#index xPOS yPOS xFWHM yFWHM xgFWHM ygFWHM\n");
270 for (n = 1; n <= ndet; n++) {
271 double xcen = cpl_apertures_get_centroid_x(apertures, n),
272 ycen = cpl_apertures_get_centroid_y(apertures, n);
273 if (xcen < 2 || nx - xcen < 2 || ycen < 2 || ny - ycen < 2) {
274 fprintf(stderr,
"#bad %4d %7.3f %7.3f too close to the edge\n",
281 cpl_image_get_fwhm(image, lround(xcen), lround(ycen), &xfwhm, &yfwhm);
284 cpl_array *params = cpl_array_new(7, CPL_TYPE_DOUBLE);
285 cpl_array_set_double(params, 0, cpl_apertures_get_min(apertures, n));
286 cpl_array_set_double(params, 1, cpl_apertures_get_flux(apertures, n));
287 cpl_array_set_double(params, 2, 0);
288 cpl_array_set_double(params, 3, xcen);
289 cpl_array_set_double(params, 4, ycen);
290 cpl_array_set_double(params, 5, xfwhm > 0 ? xfwhm / CPL_MATH_FWHM_SIG : 1.);
291 cpl_array_set_double(params, 6, yfwhm > 0 ? yfwhm / CPL_MATH_FWHM_SIG : 1.);
292 cpl_size xsize = cpl_apertures_get_right(apertures, n)
293 - cpl_apertures_get_left(apertures, n) + 1,
294 ysize = cpl_apertures_get_top(apertures, n)
295 - cpl_apertures_get_bottom(apertures, n) + 1;
296 xsize = xsize < 4 ? 4 : xsize;
297 ysize = ysize < 4 ? 4 : ysize;
298 cpl_error_code rc = cpl_fit_image_gaussian(image, NULL,
299 cpl_apertures_get_pos_x(apertures, n),
300 cpl_apertures_get_pos_y(apertures, n),
301 xsize, ysize, params, NULL, NULL,
302 NULL, NULL, NULL, NULL, NULL, NULL,
304 double xgfwhm = cpl_array_get(params, 5, NULL) * CPL_MATH_FWHM_SIG,
305 ygfwhm = cpl_array_get(params, 6, NULL) * CPL_MATH_FWHM_SIG;
306 cpl_array_delete(params);
308 #define MAX_AXIS_RATIO 5.
309 #define MAX_FWHM_RATIO 4.
310 if (rc != CPL_ERROR_NONE || xgfwhm > nx || ygfwhm > ny ||
311 fabs(xgfwhm/ygfwhm) > MAX_AXIS_RATIO || fabs(ygfwhm/xgfwhm) > MAX_AXIS_RATIO ||
312 fabs(xgfwhm/xfwhm) > MAX_FWHM_RATIO || fabs(ygfwhm/yfwhm) > MAX_FWHM_RATIO ||
313 fabs(xfwhm/xgfwhm) > MAX_FWHM_RATIO || fabs(yfwhm/ygfwhm) > MAX_FWHM_RATIO) {
314 fprintf(stderr,
"#bad %4d %7.3f %7.3f %5.2f %5.2f %5.2f %5.2f "
315 "rc = %d: %s\n", n, xcen, ycen, xfwhm, yfwhm, xgfwhm, ygfwhm,
316 rc, cpl_error_get_message());
322 xfwhm = cd11 * xfwhm + cd12 * yfwhm;
323 yfwhm = cd22 * yfwhm + cd21 * xfwhm;
324 xgfwhm = cd11 * xgfwhm + cd12 * ygfwhm;
325 ygfwhm = cd22 * ygfwhm + cd21 * xgfwhm;
326 printf(
"%6d %7.3f %7.3f %5.2f %5.2f %5.2f %5.2f\n",
327 n, xcen, ycen, xfwhm, yfwhm, xgfwhm, ygfwhm);
330 cpl_vector_set(vfwhm, idx, (xfwhm + yfwhm) / 2.);
331 cpl_vector_set(vgfwhm, idx++, (xgfwhm + ygfwhm) / 2.);
333 cpl_apertures_delete(apertures);
334 cpl_vector_set_size(vfwhm, idx);
335 cpl_vector_set_size(vgfwhm, idx);
336 printf(
"#Summary:\n#\tdirect FWHM %.3f +/- %.3f (%.3f) arcsec\n"
337 "#\tGaussian FWHM %.3f +/- %.3f (%.3f) arcsec\n", cpl_vector_get_mean(vfwhm),
338 cpl_vector_get_stdev(vfwhm), cpl_vector_get_median(vfwhm),
339 cpl_vector_get_mean(vgfwhm), cpl_vector_get_stdev(vgfwhm),
340 cpl_vector_get_median(vgfwhm));
341 cpl_vector_delete(vfwhm);
342 cpl_vector_delete(vgfwhm);
344 cpl_image_delete(image);
muse_ins_mode muse_pfits_get_mode(const cpl_propertylist *aHeaders)
find out the observation mode