29#include "hdrl_maglim.h"
115 const double fwhm,
const cpl_size kernel_size_x,
116 const cpl_size kernel_size_y,
117 const hdrl_image_extend_method image_extend_method,
118 const hdrl_parameter * mode_parameter,
119 double* limiting_magnitude)
121 cpl_error_ensure(fwhm > 0, CPL_ERROR_ILLEGAL_INPUT,
return
122 CPL_ERROR_ILLEGAL_INPUT,
"fwhm must be > 0");
124 cpl_error_ensure(kernel_size_x > 0, CPL_ERROR_ILLEGAL_INPUT,
return
125 CPL_ERROR_ILLEGAL_INPUT,
"kernel_size_x must be > 0");
127 cpl_error_ensure(kernel_size_y > 0, CPL_ERROR_ILLEGAL_INPUT,
return
128 CPL_ERROR_ILLEGAL_INPUT,
"kernel_size_y must be > 0");
130 cpl_error_ensure(image_extend_method == HDRL_IMAGE_EXTEND_MIRROR ||
131 image_extend_method == HDRL_IMAGE_EXTEND_NEAREST,
132 CPL_ERROR_ILLEGAL_INPUT,
return CPL_ERROR_ILLEGAL_INPUT,
133 "image extension method can be 'HDRL_IMAGE_EXTEND_MIRROR'"
134 "or 'HDRL_IMAGE_EXTEND_NEAREST' only");
137 CPL_ERROR_INCOMPATIBLE_INPUT,
return
138 CPL_ERROR_INCOMPATIBLE_INPUT,
139 "Not a mode parameter");
141 cpl_error_ensure((kernel_size_x % 2 != 0) && (kernel_size_y % 2 != 0),
142 CPL_ERROR_INCOMPATIBLE_INPUT,
143 return CPL_ERROR_INCOMPATIBLE_INPUT,
144 "The size of the convolution kernel must be odd in x and y");
146 cpl_msg_debug(cpl_func,
"Convolution kernel: X size: %lld Y size: %lld, "
147 "FWHM: %16.14g", kernel_size_x, kernel_size_y, fwhm);
150 cpl_matrix * kernel = hdrl_maglim_kernel_create(kernel_size_x, kernel_size_y,
153 cpl_image * ima_convolved = hdrl_image_convolve(image, kernel,
154 image_extend_method);
156 cpl_matrix_delete(kernel);
160 cpl_image_delete(ima_convolved);
164 hdrl_mode_type mode_method =
173 cpl_size error_niter = 0;
176 mode_method, error_niter);
178 double mode = hmode.data;
181 cpl_msg_debug(cpl_func,
"Computing noise and limiting magnitude ...");
194 cpl_mask_or(bpm, hbpm);
196 cpl_mask_delete(bpm);
198 double arg = (1. -2. / CPL_MATH_PI);
199 double correction_factor = 1. / sqrt(arg);
203 mad = nextafter(0,1.0);
205 double noise = mad * CPL_MATH_STD_MAD * correction_factor;
207 double factor = (fwhm / CPL_MATH_FWHM_SIG );
209 norm = 4. * CPL_MATH_PI * factor;
211 *limiting_magnitude = -2.5 * log10(5. * noise * norm) + zeropoint;
213 cpl_msg_debug(cpl_func,
"Computed values: M.A.D. %g std (from M.A.D.) %g "
214 "correction_factor %g norm %g", mad, mad * CPL_MATH_STD_MAD,
215 correction_factor, norm);
216 cpl_msg_debug(cpl_func,
"Computed values: mode %16.14g stdev %16.14g "
217 "correction_factor %16.14g noise %16.14g Limiting Magnitude %10.7g", mode,
219 *limiting_magnitude);
223 return cpl_error_get_code();
double hdrl_collapse_mode_parameter_get_bin_size(const hdrl_parameter *p)
get size of the histogram bins
double hdrl_collapse_mode_parameter_get_histo_min(const hdrl_parameter *p)
get min value
double hdrl_collapse_mode_parameter_get_histo_max(const hdrl_parameter *p)
get high value
cpl_boolean hdrl_collapse_parameter_is_mode(const hdrl_parameter *self)
check if parameter is a mode parameter
hdrl_mode_type hdrl_collapse_mode_parameter_get_method(const hdrl_parameter *p)
get the mode determination method
cpl_error_code hdrl_image_reject_from_mask(hdrl_image *self, const cpl_mask *map)
set bpm of hdrl_image
hdrl_value hdrl_image_get_mode(const hdrl_image *self, double histo_min, double histo_max, double bin_size, hdrl_mode_type method, cpl_size error_niter)
computes the mode and the associated error of an image.
double hdrl_image_get_stdev(const hdrl_image *self)
computes the standard deviation of the data of an image
cpl_mask * hdrl_image_get_mask(hdrl_image *himg)
get cpl bad pixel mask from image
hdrl_image * hdrl_image_create(const cpl_image *image, const cpl_image *error)
create a new hdrl_image from to existing images by copying them
cpl_image * hdrl_image_get_image(hdrl_image *himg)
get data as cpl image
const cpl_image * hdrl_image_get_image_const(const hdrl_image *himg)
get data as cpl image
void hdrl_image_delete(hdrl_image *himg)
delete hdrl_image
cpl_error_code hdrl_maglim_compute(const cpl_image *image, const double zeropoint, const double fwhm, const cpl_size kernel_size_x, const cpl_size kernel_size_y, const hdrl_image_extend_method image_extend_method, const hdrl_parameter *mode_parameter, double *limiting_magnitude)
Computes the limiting magnitude of an image.