35 #include "sinfo_bp_norm.h"
36 #include "sinfo_image_ops.h"
37 #include "sinfo_detlin.h"
38 #include "sinfo_badnorm_ini_by_cpl.h"
39 #include "sinfo_baddist_ini_by_cpl.h"
40 #include "sinfo_pro_save.h"
41 #include "sinfo_functions.h"
42 #include "sinfo_pro_types.h"
43 #include "sinfo_hidden.h"
44 #include "sinfo_error.h"
45 #include "sinfo_utils_wrappers.h"
96 sinfo_new_bp_search_normal(
const char* plugin_id, cpl_parameterlist* config,
97 cpl_frameset* sof, cpl_frameset* ref_set,
100 bad_config * cfg = NULL;
101 cpl_imagelist * image_list = NULL;
102 cpl_image ** med = NULL;
103 cpl_image * medImage = NULL;
104 cpl_image * medIm = NULL;
105 cpl_image * colImage = NULL;
106 cpl_image * compImage = NULL;
107 cpl_image * maskImage = NULL;
108 cpl_image * threshIm = NULL;
110 Stats * stats = NULL;
112 cpl_parameter *p = NULL;
120 int half_box_size = 0;
122 cpl_frameset* raw = NULL;
123 cpl_table* qclog_tbl = NULL;
124 char key_value[FILE_NAME_SZ];
129 sinfo_check_rec_status(0);
130 check_nomsg(raw = cpl_frameset_new());
131 sinfo_check_rec_status(1);
132 if (strcmp(procatg, PRO_BP_MAP_NO) == 0) {
133 cknull(cfg = sinfo_parse_cpl_input_badnorm(config, sof, procatg, &raw),
134 "could not parse cpl input!");
136 else if (strcmp(procatg, PRO_BP_MAP_DI) == 0) {
137 cknull(cfg = sinfo_parse_cpl_input_baddist(config, sof, procatg, &raw),
138 "could not parse cpl input!");
140 else if (strcmp(procatg, PRO_DEFAULT) == 0) {
141 cknull(cfg = sinfo_parse_cpl_input_badnorm(config, sof, procatg, &raw),
142 "could not parse cpl input!");
148 sinfo_check_rec_status(2);
150 sinfo_msg(
"Takes a clean mean of the frames");
152 check_nomsg(image_list = cpl_imagelist_new());
153 sinfo_check_rec_status(3);
155 for (i = 0; i < cfg->nframes; i++) {
156 if (sinfo_is_fits_file(cfg->framelist[i]) != 1) {
162 cpl_imagelist_set(image_list,
163 cpl_image_load(cfg->framelist[i],
164 CPL_TYPE_FLOAT, 0, 0),
172 check_nomsg(no = cpl_imagelist_get_size(image_list));
173 lo_cut = (floor)(cfg->loReject * no + 0.5);
174 hi_cut = (floor)(cfg->hiReject * no + 0.5);
175 cknull(medImage=cpl_imagelist_collapse_minmax_create(image_list,
178 "error in sinfo_average_with_rejection");
181 sinfo_free_imagelist(&image_list);
187 cknull(medIm = sinfo_new_thresh_image(medImage, cfg->mincut, cfg->maxcut),
188 "error sinfo_new_thresh_image");
189 cknull(colImage = sinfo_new_col_tilt( medIm, cfg->sigmaFactor ),
190 "sinfo_colTilt failed" );
192 cknull(stats = sinfo_new_image_stats_on_rectangle(colImage,
199 " sinfo_get_image_stats_on_vig failed");
200 if (stats != NULL ) {
201 sinfo_msg(
"Clean stdev: %f\n", stats->cleanstdev );
202 sinfo_msg(
"Clean mean: %f\n", stats->cleanmean );
225 if (cfg->threshInd == 1) {
226 cknull(threshIm = sinfo_new_thresh_image(colImage,
227 stats->cleanmean-cfg->meanfactor*stats->cleanstdev,
228 stats->cleanmean+cfg->meanfactor*stats->cleanstdev),
229 " sinfo_threshImage failed" );
233 if (cfg->threshInd == 0) {
237 med = (cpl_image**) cpl_calloc(cfg->iterations,
sizeof(cpl_image*));
242 sinfo_msg(
"Apply sinfo_median filter on pixel nearest neighbors");
243 if (cfg->methodInd == 1) {
244 if (cfg->factor > 0) {
245 cknull(med[0]=sinfo_new_median_image(threshIm,
246 -cfg->factor*stats->cleanstdev),
247 " sinfo_medianImage failed (1)" );
249 for (i = 0; i < cfg->iterations - 1; i++) {
250 cknull(med[i + 1] = sinfo_new_median_image(med[i],
251 -cfg->factor* stats->cleanstdev),
252 "sinfo_medianImage failed (2)");
257 cknull(med[0] = sinfo_new_median_image(threshIm, -cfg->factor),
258 " sinfo_medianImage failed (1)" );
260 for (i = 0; i < cfg->iterations - 1; i++) {
261 cknull(med[i+1] = sinfo_new_median_image(med[i], -cfg->factor),
262 " sinfo_medianImage failed (%d)",i );
266 else if (cfg->methodInd == 2) {
268 cknull(med[0] = sinfo_new_abs_dist_image(threshIm, -cfg->factor),
269 " sinfo_absDistImage failed (1)" );
271 for (i = 0; i < cfg->iterations - 1; i++) {
272 cknull(med[i+1] = sinfo_new_abs_dist_image(med[i], -cfg->factor),
273 " sinfo_absDistImage failed (2)" );
276 else if (cfg->methodInd == 3) {
278 med[0] = sinfo_new_mean_image_in_spec(threshIm,
279 -cfg->factor * stats->cleanstdev),
280 "sinfo_meanImageInSpec failed (1)");
281 for (i = 0; i < cfg->iterations - 1; i++) {
283 med[i + 1] = sinfo_new_mean_image_in_spec(med[i],
284 -cfg->factor * stats->cleanstdev),
285 " sinfo_meanImageInSpec failed (2)");
288 else if (cfg->methodInd == 4) {
289 half_box_size = (cfg->urx - cfg->llx) / 2;
290 cknull(med[0] = sinfo_new_local_median_image(threshIm,
295 " sinfo_localMedianImage failed (1)" );
297 for (i = 0; i < cfg->iterations - 1; i++) {
298 cknull(med[i+1] = sinfo_new_local_median_image(med[i],
303 " sinfo_localMedianImage failed (2)" );
312 cknull(compImage = sinfo_new_compare_images(threshIm,
313 med[cfg->iterations - 1],
315 " sinfo_compareImages failed" );
318 sinfo_msg(
"Generates bad pixel map");
319 cknull(maskImage = sinfo_new_promote_image_to_mask( compImage, &n ),
320 " error in sinfo_promoteImageToMask" );
321 sinfo_msg(
"No of bad pixels: %d\n", n );
323 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
324 check_nomsg(p = cpl_parameterlist_find(config,
"sinfoni.bp.method"));
325 snprintf(key_value, MAX_NAME_SIZE - 1,
"%s", cpl_parameter_get_string(p));
328 sinfo_qclog_add_string(qclog_tbl,
"QC BP-MAP METHOD",
329 key_value,
"BP search method",
"%s"));
332 sinfo_qclog_add_int(qclog_tbl,
"QC BP-MAP NBADPIX", n,
333 "No of bad pixels",
"%d"));
336 sinfo_pro_save_ima(maskImage, ref_set, sof, cfg->outName,
337 procatg, qclog_tbl, plugin_id, config),
338 "cannot save ima %s", cfg->outName);
340 sinfo_free_table(&qclog_tbl);
341 sinfo_free_image(&maskImage);
342 sinfo_free_image(&compImage);
343 sinfo_free_image_array(&med, cfg->iterations);
356 if (stats != NULL ) {
360 sinfo_free_image(&medIm);
361 sinfo_free_image(&medImage);
362 sinfo_free_image(&colImage);
363 if (cfg->threshInd == 1) {
364 sinfo_free_image(&threshIm);
366 sinfo_badnorm_free(&cfg);
367 sinfo_free_frameset(&raw);
372 sinfo_free_image_array(&med, cfg->iterations);
385 sinfo_free_image(&compImage);
386 sinfo_free_image(&maskImage);
387 sinfo_free_image(&threshIm);
388 sinfo_free_table(&qclog_tbl);
389 sinfo_free_image(&threshIm);
390 if (stats != NULL ) {
395 sinfo_free_image(&medIm);
396 sinfo_free_image(&medImage);
397 sinfo_free_image(&colImage);
398 sinfo_free_imagelist(&image_list);
399 sinfo_free_frameset(&raw);
400 sinfo_badnorm_free(&cfg);
#define sinfo_msg_error(...)
Print an error message.