00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifdef HAVE_CONFIG_H
00030 # include <config.h>
00031 #endif
00032
00033
00034
00035 #include "sinfo_bp_norm.h"
00036 #include "sinfo_image_ops.h"
00037 #include "sinfo_detlin.h"
00038 #include "sinfo_badnorm_ini_by_cpl.h"
00039 #include "sinfo_baddist_ini_by_cpl.h"
00040 #include "sinfo_pro_save.h"
00041 #include "sinfo_functions.h"
00042 #include "sinfo_pro_types.h"
00043 #include "sinfo_hidden.h"
00044 #include "sinfo_error.h"
00045 #include "sinfo_utils_wrappers.h"
00052
00053
00054
00055
00056
00057
00096 int
00097 sinfo_new_bp_search_normal (const char* plugin_id,
00098 cpl_parameterlist* config,
00099 cpl_frameset* sof,
00100 cpl_frameset* ref_set,
00101 const char* procatg)
00102 {
00103 bad_config * cfg =NULL;
00104 cpl_imagelist * image_list =NULL;
00105 cpl_image ** med=NULL ;
00106 cpl_image * medImage =NULL;
00107 cpl_image * medIm =NULL;
00108 cpl_image * colImage =NULL;
00109 cpl_image * compImage =NULL;
00110 cpl_image * maskImage =NULL;
00111 cpl_image * threshIm =NULL;
00112
00113
00114 Stats * stats =NULL;
00115
00116 cpl_parameter *p=NULL;
00117
00118 int no=0;
00119 float lo_cut=0.;
00120 float hi_cut=0.;
00121
00122 int i=0;
00123 int n=0;
00124 int half_box_size=0 ;
00125
00126 cpl_frameset* raw=NULL;
00127 cpl_table* qclog_tbl=NULL;
00128 char key_value[FILE_NAME_SZ];
00129
00130
00131
00132
00133 sinfo_check_rec_status(0);
00134 check_nomsg(raw=cpl_frameset_new());
00135 sinfo_check_rec_status(1);
00136 if (strcmp(procatg,PRO_BP_MAP_NO) == 0) {
00137 cknull(cfg = sinfo_parse_cpl_input_badnorm(config,sof,procatg,&raw),
00138 "could not parse cpl input!");
00139 } else if (strcmp(procatg,PRO_BP_MAP_DI) == 0) {
00140 cknull(cfg = sinfo_parse_cpl_input_baddist(config,sof,procatg,&raw),
00141 "could not parse cpl input!");
00142 } else if (strcmp(procatg,PRO_DEFAULT) == 0) {
00143 cknull(cfg = sinfo_parse_cpl_input_badnorm(config,sof,procatg,&raw),
00144 "could not parse cpl input!");
00145 } else {
00146 sinfo_msg_error("Error: PRO.CATG %s, not supported!",procatg);
00147 goto cleanup;
00148 }
00149 sinfo_check_rec_status(2);
00150
00151 sinfo_msg("Takes a clean mean of the frames");
00152
00153 check_nomsg(image_list = cpl_imagelist_new());
00154 sinfo_check_rec_status(3);
00155
00156 for ( i = 0 ; i < cfg->nframes ; i++ ){
00157 if(sinfo_is_fits_file (cfg->framelist[i]) != 1) {
00158 sinfo_msg_error("Input file %s is not FITS",cfg->framelist[i] );
00159 goto cleanup;
00160 }
00161
00162 check_nomsg(cpl_imagelist_set(image_list,
00163 cpl_image_load(cfg->framelist[i],CPL_TYPE_FLOAT,0,0),i));
00164
00165 }
00166
00167
00168
00169
00170 check_nomsg(no=cpl_imagelist_get_size(image_list));
00171 lo_cut=(floor)(cfg->loReject*no+0.5);
00172 hi_cut=(floor)(cfg->hiReject*no+0.5);
00173 cknull(medImage=cpl_imagelist_collapse_minmax_create(image_list,
00174 lo_cut,
00175 hi_cut),
00176 "error in sinfo_average_with_rejection") ;
00177
00178
00179 sinfo_free_imagelist(&image_list) ;
00180
00181
00182
00183
00184
00185 cknull(medIm = sinfo_new_thresh_image(medImage, cfg->mincut, cfg->maxcut),
00186 "error sinfo_new_thresh_image");
00187 cknull(colImage = sinfo_new_col_tilt( medIm, cfg->sigmaFactor ),
00188 "sinfo_colTilt failed" ) ;
00189
00190
00191 cknull(stats = sinfo_new_image_stats_on_rectangle(colImage,
00192 cfg->loReject,
00193 cfg->hiReject,
00194 cfg->llx,
00195 cfg->lly,
00196 cfg->urx,
00197 cfg->ury),
00198 " sinfo_get_image_stats_on_vig failed") ;
00199 if(stats!=NULL) {
00200 sinfo_msg("Clean stdev: %f\n", stats->cleanstdev ) ;
00201 sinfo_msg("Clean mean: %f\n", stats->cleanmean ) ;
00202 }
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226 if (cfg->threshInd == 1) {
00227 cknull(threshIm = sinfo_new_thresh_image(colImage,
00228 stats->cleanmean-cfg->meanfactor*stats->cleanstdev,
00229 stats->cleanmean+cfg->meanfactor*stats->cleanstdev),
00230 " sinfo_threshImage failed" ) ;
00231
00232 }
00233
00234 if (cfg->threshInd == 0 ) {
00235 threshIm = colImage ;
00236 }
00237
00238 med = (cpl_image**) cpl_calloc (cfg -> iterations, sizeof(cpl_image*)) ;
00239
00240
00241
00242
00243
00244 sinfo_msg("Apply sinfo_median filter on pixel nearest neighbors");
00245 if (cfg->methodInd == 1) {
00246 if (cfg->factor>0) {
00247 cknull(med[0]=sinfo_new_median_image(threshIm,
00248 -cfg->factor*stats->cleanstdev),
00249 " sinfo_medianImage failed (1)" ) ;
00250
00251 for ( i = 0 ; i < cfg->iterations - 1 ; i++ ) {
00252 cknull(med[i+1]=sinfo_new_median_image(med[i],
00253 -cfg->factor*stats->cleanstdev),
00254 "sinfo_medianImage failed (2)");
00255 }
00256
00257 } else {
00258 cknull(med[0] = sinfo_new_median_image(threshIm, -cfg->factor),
00259 " sinfo_medianImage failed (1)" ) ;
00260
00261 for ( i = 0 ; i < cfg->iterations - 1 ; i++ ) {
00262 cknull(med[i+1] = sinfo_new_median_image(med[i], -cfg->factor),
00263 " sinfo_medianImage failed (%d)",i ) ;
00264 }
00265 }
00266 } else if (cfg->methodInd == 2) {
00267
00268 cknull(med[0] = sinfo_new_abs_dist_image(threshIm, -cfg->factor),
00269 " sinfo_absDistImage failed (1)" ) ;
00270
00271 for ( i = 0 ; i < cfg->iterations -1 ; i++ ) {
00272 cknull(med[i+1] = sinfo_new_abs_dist_image(med[i], -cfg->factor),
00273 " sinfo_absDistImage failed (2)" ) ;
00274 }
00275 } else if (cfg->methodInd == 3) {
00276 cknull(med[0] = sinfo_new_mean_image_in_spec(threshIm,
00277 -cfg->factor*stats->cleanstdev),
00278 "sinfo_meanImageInSpec failed (1)");
00279 for ( i = 0 ; i < cfg->iterations - 1 ; i++ ) {
00280 cknull(med[i+1] = sinfo_new_mean_image_in_spec(med[i],
00281 -cfg->factor*stats->cleanstdev),
00282 " sinfo_meanImageInSpec failed (2)");
00283 }
00284 } else if (cfg->methodInd == 4) {
00285 half_box_size = (cfg->urx - cfg->llx) / 2 ;
00286 cknull(med[0] = sinfo_new_local_median_image(threshIm,
00287 -cfg->factor,
00288 cfg->loReject,
00289 cfg->hiReject,
00290 half_box_size),
00291 " sinfo_localMedianImage failed (1)" ) ;
00292
00293 for ( i = 0 ; i < cfg->iterations - 1 ; i++ ) {
00294 cknull(med[i+1] = sinfo_new_local_median_image(med[i],
00295 -cfg->factor,
00296 cfg->loReject,
00297 cfg->hiReject,
00298 half_box_size),
00299 " sinfo_localMedianImage failed (2)" ) ;
00300 }
00301 } else {
00302 sinfo_msg_error (" wrong indicator methodInd !" ) ;
00303 goto cleanup ;
00304 }
00305
00306
00307 cknull(compImage = sinfo_new_compare_images(threshIm,
00308 med[cfg->iterations - 1],
00309 medImage),
00310 " sinfo_compareImages failed" ) ;
00311
00312
00313 sinfo_msg("Generates bad pixel map");
00314 cknull(maskImage = sinfo_new_promote_image_to_mask( compImage, &n ),
00315 " error in sinfo_promoteImageToMask" ) ;
00316 sinfo_msg("No of bad pixels: %d\n", n ) ;
00317
00318 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
00319 check_nomsg(p = cpl_parameterlist_find(config, "sinfoni.bp.method"));
00320 snprintf(key_value, MAX_NAME_SIZE-1,"%s", cpl_parameter_get_string(p));
00321
00322 ck0_nomsg(sinfo_qclog_add_string(qclog_tbl,"QC BP-MAP METHOD",
00323 key_value,"BP search method","%s"));
00324
00325 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,"QC BP-MAP NBADPIX",n,
00326 "No of bad pixels","%d"));
00327
00328 ck0(sinfo_pro_save_ima(maskImage,ref_set,sof,cfg->outName,
00329 procatg,qclog_tbl,plugin_id,config),
00330 "cannot save ima %s", cfg->outName);
00331
00332 sinfo_free_table(&qclog_tbl);
00333 sinfo_free_image(&maskImage);
00334 sinfo_free_image(&compImage);
00335 sinfo_free_image_array(&med,cfg->iterations);
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348 if (stats != NULL) {
00349 cpl_free(stats) ;
00350 stats=NULL;
00351 }
00352 sinfo_free_image(&medIm);
00353 sinfo_free_image(&medImage);
00354 sinfo_free_image(&colImage);
00355 if (cfg->threshInd == 1 ) {
00356 sinfo_free_image(&threshIm);
00357 }
00358 sinfo_badnorm_free(&cfg) ;
00359 sinfo_free_frameset(&raw);
00360 return 0;
00361
00362 cleanup:
00363
00364 sinfo_free_image_array(&med,cfg->iterations);
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377 sinfo_free_image(&compImage) ;
00378 sinfo_free_image(&maskImage) ;
00379 sinfo_free_image(&threshIm) ;
00380 sinfo_free_table(&qclog_tbl);
00381 sinfo_free_image(&threshIm) ;
00382 if (stats != NULL) {
00383 cpl_free(stats) ;
00384 stats=NULL;
00385 }
00386
00387 sinfo_free_image(&medIm);
00388 sinfo_free_image(&medImage);
00389 sinfo_free_image(&colImage);
00390 sinfo_free_imagelist(&image_list) ;
00391 sinfo_free_frameset(&raw);
00392 sinfo_badnorm_free(&cfg);
00393
00394 return -1;
00395
00396 }
00397