sinfo_bp_norm.c

00001 /*
00002  * This file is part of the ESO SINFONI Pipeline
00003  * Copyright (C) 2004,2005 European Southern Observatory
00004  *
00005  * This program is free software; you can redistribute it and/or modify
00006  * it under the terms of the GNU General Public License as published by
00007  * the Free Software Foundation; either version 2 of the License, or
00008  * (at your option) any later version.
00009  *
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  * GNU General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public License
00016  * along with this program; if not, write to the Free Software
00017  * Foundation, 51 Franklin St, Fifth Floor, Boston, MA  02111-1307  USA
00018  */
00019 /*----------------------------------------------------------------------------
00020    
00021    File name    :       sinfo_bp_norm.c
00022    Author       :    J. Schreiber
00023    Created on   :    May 5, 2003
00024    Description  :    Different methods for searching for bad pixels
00025                         used in the recipe sinfo_rec_mflat 
00026 
00027  ---------------------------------------------------------------------------*/
00028 
00029 #ifdef HAVE_CONFIG_H
00030 #  include <config.h>
00031 #endif
00032 /*----------------------------------------------------------------------------
00033                                 Includes
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                                 Defines
00054  ---------------------------------------------------------------------------*/
00055 /*----------------------------------------------------------------------------
00056                              Function Definitions
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   /* parse the file names and parameters to the bad_config data structure 
00131        cfg */
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   /* take a clean mean of the frames */
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   /* finally take the average image of the cube by 
00168      rejecting the extreme values */
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   /* free memory */
00179   sinfo_free_imagelist(&image_list) ;
00180 
00181   /*----------------------------------------------
00182    * remove the intensity tilt from every column
00183    * and compute the standard deviation on a rectangular zone
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     cknull_nomsg(qclog_tbl = sinfo_qclog_init());
00208     ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,"QC ICTILT STDEV",
00209                                      stats->cleanstdev,
00210                                      "Intensity column clean stdev","%g"));
00211  
00212     ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,"QC ICTILT MEAN",
00213                                      stats->cleanmean,
00214                                      "Intensity column clean mean","%g"));
00215 
00216     ck0(sinfo_pro_save_ima(colImage,raw,sof,
00217                            (char*) BP_NORM_INT_COL_TILT_CORR_OUT_FILENAME,
00218                            PRO_INT_COL_TILT_COR,qclog_tbl,plugin_id,config),
00219                            "cannot save ima %s",
00220                            BP_NORM_INT_COL_TILT_CORR_OUT_FILENAME);
00221 
00222     sinfo_free_table(&qclog_tbl);
00223   */
00224     
00225   /* indicate pixels with great deviations from the clean mean as bad */
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   /* AMO here invalid fread? */
00238   med = (cpl_image**) cpl_calloc (cfg -> iterations, sizeof(cpl_image*)) ;
00239     
00240 
00241   /* filter iteratively the images by a sinfo_median filter of the nearest 
00242      neighbors under the condition of a deviation greater than a factor 
00243      times the standard deviation */
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   /* compare the filtered image with the input image */
00307   cknull(compImage = sinfo_new_compare_images(threshIm, 
00308                                               med[cfg->iterations - 1], 
00309                                               medImage),
00310                                               " sinfo_compareImages failed" ) ;
00311     
00312   /* generate the bad pixel mask */
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   if (med != NULL) {
00338     for ( i = 0 ; i < cfg->iterations ; i++ ) {
00339       if(med[i] != NULL) {
00340     cpl_image_delete(med[i]) ;
00341     med[i]=NULL;
00342       }
00343     }
00344     cpl_free(med) ; 
00345     med=NULL;
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   if (med != NULL) {
00367     for ( i = 0 ; i < cfg->iterations ; i++ ) {
00368       if(med[i] != NULL) {
00369     cpl_image_delete(med[i]) ;
00370     med[i]=NULL;
00371       }
00372     }
00373     cpl_free(med) ; 
00374          med=NULL;
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 

Generated on 3 Mar 2013 for SINFONI Pipeline Reference Manual by  doxygen 1.6.1