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