sinfo_new_add_bp_map.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_new_add_bp_map.c
00022    Author       :   A. Modigliani
00023    Created on   :   Oct 13, 2004
00024    Description  :   Coadd different BP MAP 
00025 
00026  ---------------------------------------------------------------------------*/
00027 
00028 #ifdef HAVE_CONFIG_H
00029 #  include <config.h>
00030 #endif
00031 /*----------------------------------------------------------------------------
00032                                 Includes
00033  ---------------------------------------------------------------------------*/
00034 #include "sinfo_new_add_bp_map.h"
00035 #include "sinfo_pro_save.h"
00036 #include "sinfo_error.h"
00037 #include "sinfo_utils_wrappers.h"
00038 /* #include "image_ops.h" */
00039 #include "sinfo_pro_types.h"
00040 #include "sinfo_functions.h"
00041 #include "sinfo_detlin.h"
00042 /*----------------------------------------------------------------------------
00043                                 Prototypes
00044  ---------------------------------------------------------------------------*/
00045 
00046 
00047 /*----------------------------------------------------------------------------
00048                                 Defines
00049  ---------------------------------------------------------------------------*/
00050 
00051 
00052 /*----------------------------------------------------------------------------
00053                              Function Definitions
00054  ---------------------------------------------------------------------------*/
00072 int 
00073 sinfo_new_add_bp_map (const char* plugin_id,
00074                       cpl_parameterlist* config, cpl_frameset* sof)
00075 {
00076 
00077    int  nmsk =0;
00078    int  nmsk_ref_fits =0;
00079    int i=0;
00080    int k=0;
00081    int n_bad=0;
00082    cpl_image**  img_sum=NULL;
00083    cpl_image*   img_set=NULL;
00084    cpl_image*   img_tot=NULL;
00085    cpl_frameset* msk_set=NULL;
00086    cpl_frameset* msk_ref_fits=NULL;
00087    cpl_frame* frame=NULL;
00088   
00089    char frame_name[FILE_NAME_SZ];
00090    char out_msk[FILE_NAME_SZ];
00091       
00092    cpl_table* qclog_tbl=NULL;
00093    char * tag=NULL;
00094    char * tmp_tag=NULL;
00095  
00096    strcpy(out_msk, MASTER_BPMAP_OUT_FILENAME);
00097 
00098 
00099    /* cpl_parameterlist_dump(config); */
00100    check_nomsg(msk_set=cpl_frameset_new());
00101    ck0_nomsg(sinfo_contains_frames_kind(sof,msk_set,"BP_MAP"));
00102    check_nomsg(nmsk = cpl_frameset_get_size(msk_set));
00103    if(nmsk == 0) {
00104      sinfo_msg_warning("No bad pixel masks to add");
00105      goto cleanup;
00106    }
00107    check_nomsg(frame = cpl_frameset_get_frame(msk_set,0));
00108    strcpy(frame_name,cpl_frame_get_filename(frame));
00109    check_nomsg(tag = (char*) cpl_frame_get_tag(frame));
00110    {
00111       check_nomsg(msk_ref_fits=cpl_frameset_new());
00112       if (nmsk < 1) {
00113         sinfo_msg_error("No input frames. Nothing to do.");
00114         goto cleanup;
00115       } else if (nmsk==1) {
00116 
00117         sinfo_msg_warning("Only one input frames. Use it as master.");
00118         check_nomsg(frame = cpl_frameset_get_frame(msk_set,0));
00119         strcpy(frame_name,cpl_frame_get_filename(frame));
00120     check_nomsg(tag = (char*) cpl_frame_get_tag(frame));
00121 
00122       } else {
00123        
00124         ck0_nomsg(sinfo_contains_frames_kind(msk_set,
00125                                              msk_ref_fits,PRO_BP_MAP_NO));
00126         check_nomsg(nmsk_ref_fits = cpl_frameset_get_size(msk_ref_fits));
00127 
00128         if (nmsk_ref_fits < 1) {
00129           sinfo_msg_warning("No %s input frames. Uses %s for FITS header",
00130                              PRO_BP_MAP_NO,PRO_BP_MAP_DI);
00131 
00132           ck0_nomsg(sinfo_contains_frames_kind(msk_set,
00133                                                msk_ref_fits,PRO_BP_MAP_DI));
00134           check_nomsg(nmsk_ref_fits = cpl_frameset_get_size(msk_ref_fits));
00135 
00136 
00137           if (nmsk_ref_fits < 1) {
00138 
00139              sinfo_msg_warning("No %s input frames. Uses %s for FITS header",
00140                              PRO_BP_MAP_DI,PRO_BP_MAP_NL);
00141         
00142              ck0_nomsg(sinfo_contains_frames_kind(msk_set,
00143                                                   msk_ref_fits,PRO_BP_MAP_NL));
00144              check_nomsg(nmsk_ref_fits = cpl_frameset_get_size(msk_ref_fits));
00145 
00146              if (nmsk_ref_fits < 1) {
00147 
00148                sinfo_msg_warning("No %s input frames. Uses 1st mask in the list",
00149                              PRO_BP_MAP_NL);
00150                sinfo_free_frameset(&msk_ref_fits);
00151                check_nomsg(msk_ref_fits=cpl_frameset_duplicate(msk_set));
00152                check_nomsg(frame = cpl_frameset_get_frame(msk_set,0));
00153                check_nomsg(cpl_frameset_erase_frame(msk_set,frame));
00154            check_nomsg(tag = (char*) cpl_frame_get_tag(frame));
00155 
00156          } else {
00157                sinfo_msg("Uses as reference frame %s",PRO_BP_MAP_NL);
00158                check_nomsg(frame = cpl_frameset_get_frame(msk_ref_fits,0));
00159                strcpy(frame_name,cpl_frame_get_filename(frame));
00160                tag = (char*) PRO_BP_MAP_NL;
00161          }
00162           } else {
00163          sinfo_msg("Uses as reference frame %s",PRO_BP_MAP_DI);
00164              check_nomsg(frame = cpl_frameset_get_frame(msk_ref_fits,0));
00165              strcpy(frame_name,cpl_frame_get_filename(frame));
00166              tag = (char*) PRO_BP_MAP_DI;
00167       }
00168         } else {
00169         sinfo_msg("Uses as reference frame %s",PRO_BP_MAP_NO);
00170             check_nomsg(frame = cpl_frameset_get_frame(msk_ref_fits,0));
00171             strcpy(frame_name,cpl_frame_get_filename(frame));
00172             tag = (char*) PRO_BP_MAP_NO;
00173     }
00174       }
00175 
00176       check_nomsg(nmsk = cpl_frameset_get_size(msk_set));  
00177       cknull_nomsg(img_sum = (cpl_image**) cpl_calloc ((nmsk+1), 
00178                                                        sizeof(cpl_image*))) ;
00179       cknull_nomsg(img_sum[0]=cpl_image_load(frame_name,CPL_TYPE_FLOAT,0,0));
00180 
00181         /* here mem leak */
00182       for (i=0;i<nmsk;i++) {
00183           check_nomsg(frame = cpl_frameset_get_frame(msk_set,i));
00184           check_nomsg(strcpy(frame_name,cpl_frame_get_filename(frame)));
00185           check_nomsg(tmp_tag=(char*)cpl_frame_get_tag(frame));
00186           if(strcmp(tmp_tag,tag) == 0 ) {
00187       } else {
00188 
00189              cknull_nomsg(img_set=cpl_image_load(frame_name,CPL_TYPE_FLOAT,0,0));
00190          cknull_nomsg(img_sum[k+1]=sinfo_new_combine_masks (img_sum[k], img_set));
00191          k++;
00192          sinfo_free_image(&img_set);
00193          sinfo_free_image(&(img_sum[k-1]));
00194       }
00195     }
00196         img_tot=cpl_image_duplicate(img_sum[k]);
00197         sinfo_free_image(&(img_sum[k]));
00198     sinfo_free_array_image(&img_sum);
00199     /*
00200 
00201         frame = cpl_frameset_get_frame(msk_set,0);
00202         strcpy(frame_name,cpl_frame_get_filename(frame));
00203         img_sum=cpl_image_load(frame_name,CPL_TYPE_INT,0,0);
00204     
00205         for (i=1;i<nmsk;i++) {
00206           frame = cpl_frameset_get_frame(msk_set,i);
00207           strcpy(frame_name,cpl_frame_get_filename(frame));
00208           img_set=cpl_image_load(frame_name,CPL_TYPE_INT,0,0);
00209       cpl_mask_and(img_sum, img_set);
00210 
00211     }
00212     
00213     */
00214 
00215       n_bad = sinfo_new_count_bad_pixels(img_tot) ;
00216       sinfo_msg ("number of bad pixels: %d\n", n_bad) ;
00217       cknull_nomsg(qclog_tbl = sinfo_qclog_init());
00218      ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,"QC MBP_MAP NBADPIX",
00219             n_bad,"No of bad pixels","%d"));
00220 
00221      if (nmsk>1) {
00222       ck0(sinfo_pro_save_ima(img_tot,msk_ref_fits,sof,out_msk,
00223                  PRO_MASTER_BP_MAP,qclog_tbl,
00224                  plugin_id,config),
00225       "cannot save ima %s", out_msk);   
00226 
00227      } else {
00228       ck0(sinfo_pro_save_ima(img_tot,msk_set,sof,out_msk,
00229                  PRO_MASTER_BP_MAP,qclog_tbl,
00230                  plugin_id,config),
00231       "cannot save ima %s", out_msk);   
00232       }
00233 
00234       sinfo_free_image(&img_tot);
00235       sinfo_free_table(&qclog_tbl);
00236       sinfo_free_frameset(&msk_ref_fits);
00237       sinfo_free_frameset(&msk_set);
00238   
00239    }
00240    return 0; 
00241  cleanup:
00242 
00243    sinfo_free_image(&img_tot);
00244    if(img_sum!=NULL) {
00245      for(i=0;i<nmsk;i++) {
00246        if(img_sum[i] != NULL) {
00247          sinfo_free_image(&(img_sum[i]));
00248          img_sum[i]=NULL;         
00249        }
00250      }
00251      sinfo_free_array_image(&img_sum);
00252      img_sum=NULL;
00253    }
00254    sinfo_free_image(&img_set);
00255    sinfo_free_table(&qclog_tbl);
00256    sinfo_free_frameset(&msk_set);
00257    sinfo_free_frameset(&msk_ref_fits);
00258 
00259    return -1; 
00260 
00261 
00262 }

Generated on Wed Jan 17 08:33:43 2007 for SINFONI Pipeline Reference Manual by  doxygen 1.4.4