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 #ifdef HAVE_CONFIG_H
00027 #include <config.h>
00028 #endif
00029
00030
00037
00040
00041
00042
00043
00044 #include <math.h>
00045 #include <xsh_drl.h>
00046
00047 #include <xsh_badpixelmap.h>
00048 #include <xsh_data_pre.h>
00049 #include <xsh_dfs.h>
00050 #include <xsh_pfits.h>
00051 #include <xsh_error.h>
00052 #include <xsh_msg.h>
00053 #include <xsh_data_instrument.h>
00054 #include <xsh_data_spectralformat.h>
00055 #include <cpl.h>
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00081
00082 void
00083 xsh_flat_merge_qth_d2( cpl_frame *qth_frame, cpl_frame *qth_order_tab_frame,
00084 cpl_frame *d2_frame,cpl_frame *d2_order_tab_frame,
00085 cpl_frame *qth_bkg_frame, cpl_frame *d2_bkg_frame,
00086 cpl_frame **qth_d2_flat_frame,
00087 cpl_frame **qth_d2_bkg_frame,
00088 cpl_frame **qth_d2_order_tab_frame,
00089 xsh_instrument *instrument)
00090
00091 {
00092 xsh_pre *qth_pre = NULL;
00093 xsh_pre *d2_pre = NULL;
00094
00095 float *qth_data = NULL;
00096 float *d2_data = NULL;
00097 float *qth_errs = NULL;
00098 float *d2_errs = NULL;
00099 int *qth_qual = NULL;
00100 int *d2_qual = NULL;
00101
00102 float *d2_bkg_data = NULL;
00103
00104 float *qth_bkg_data = NULL;
00105
00106
00107 xsh_order_list *qth_list = NULL;
00108 xsh_order_list *d2_list = NULL;
00109 xsh_order_list *qth_d2_list = NULL;
00110 int y;
00111 cpl_polynomial *d2_limit = NULL;
00112 cpl_polynomial *qth_limit = NULL;
00113 cpl_image* d2_bkg_ima=NULL;
00114 cpl_image* qth_bkg_ima=NULL;
00115
00116 const char* tag=NULL;
00117 const char* fname=NULL;
00118 char* name=NULL;
00119 char file_name[80];
00120 char file_tag[25];
00121
00122 double qth_flux_min=0;
00123 double qth_flux_max=0;
00124 double d2_flux_min=0;
00125 double d2_flux_max=0;
00126 double flux_min=0;
00127 double flux_max=0;
00128
00129
00130 XSH_ASSURE_NOT_NULL( qth_frame);
00131 XSH_ASSURE_NOT_NULL( qth_order_tab_frame);
00132 XSH_ASSURE_NOT_NULL( d2_frame);
00133 XSH_ASSURE_NOT_NULL( d2_order_tab_frame);
00134 XSH_ASSURE_NOT_NULL( qth_d2_flat_frame);
00135 XSH_ASSURE_NOT_NULL( qth_bkg_frame);
00136 XSH_ASSURE_NOT_NULL( d2_bkg_frame);
00137 XSH_ASSURE_NOT_NULL( qth_d2_bkg_frame);
00138 XSH_ASSURE_NOT_NULL( qth_d2_order_tab_frame);
00139 XSH_ASSURE_NOT_NULL( instrument);
00140
00141 xsh_msg_dbg_medium( "Entering xsh_flat_merge_qth_d2") ;
00142
00143
00144 check( qth_pre = xsh_pre_load( qth_frame, instrument));
00145 check( d2_pre = xsh_pre_load( d2_frame, instrument));
00146
00147
00148 check( xsh_instrument_update_lamp( instrument, XSH_LAMP_QTH));
00149 check( qth_list = xsh_order_list_load( qth_order_tab_frame, instrument));
00150 xsh_order_list_set_bin_x( qth_list, qth_pre->binx);
00151 xsh_order_list_set_bin_y( qth_list, qth_pre->biny);
00152 check( xsh_instrument_update_lamp( instrument, XSH_LAMP_D2));
00153 check( d2_list = xsh_order_list_load( d2_order_tab_frame, instrument));
00154 xsh_order_list_set_bin_x( d2_list, d2_pre->binx);
00155 xsh_order_list_set_bin_y( d2_list, d2_pre->biny);
00156
00157 check( qth_data = cpl_image_get_data_float( qth_pre->data));
00158 check( d2_data = cpl_image_get_data_float(d2_pre->data));
00159
00160 fname=cpl_frame_get_filename(qth_bkg_frame);
00161 qth_bkg_ima=cpl_image_load(fname,CPL_TYPE_FLOAT,0,0);
00162 check( qth_bkg_data = cpl_image_get_data_float(qth_bkg_ima));
00163
00164 fname=cpl_frame_get_filename(d2_bkg_frame);
00165 d2_bkg_ima=cpl_image_load(fname,CPL_TYPE_FLOAT,0,0);
00166 check( d2_bkg_data = cpl_image_get_data_float(d2_bkg_ima));
00167
00168
00169 check( qth_errs = cpl_image_get_data_float( qth_pre->errs));
00170 check( d2_errs = cpl_image_get_data_float(d2_pre->errs));
00171
00172 check( qth_qual = cpl_image_get_data_int( qth_pre->qual));
00173 check( d2_qual = cpl_image_get_data_int(d2_pre->qual));
00174
00175
00176
00177
00178 qth_limit = qth_list->list[qth_list->size-1].edglopoly;
00179 d2_limit = d2_list->list[0].edguppoly;
00180
00181 for( y=0; y < d2_pre->ny; y++){
00182 int xd2=0, xqth=0;
00183 int x_avg=0;
00184 int x;
00185
00186 check( xd2 = xsh_order_list_eval_int( d2_list, d2_limit, y+1)-1);
00187 check( xqth = xsh_order_list_eval_int( qth_list, qth_limit, y+1)-1);
00188 x_avg = floor( (xd2+xqth)/2.0);
00189 xsh_msg_dbg_medium("D2 x %d y %d", xd2, y);
00190 xsh_msg_dbg_medium("QTH x %d y %d", xqth, y);
00191 xsh_msg_dbg_medium(" x_avg = %d", x_avg);
00192 for( x=x_avg; x< d2_pre->nx; x++){
00193 d2_data[x+y*d2_pre->nx] = qth_data[x+y*d2_pre->nx];
00194 d2_errs[x+y*d2_pre->nx] = qth_errs[x+y*d2_pre->nx];
00195 d2_qual[x+y*d2_pre->nx] = qth_qual[x+y*d2_pre->nx];
00196
00197 d2_bkg_data[x+y*d2_pre->nx] = qth_bkg_data[x+y*d2_pre->nx];
00198
00199
00200 }
00201 }
00202
00203
00204 check( qth_d2_list = xsh_order_list_merge( qth_list, d2_list));
00205
00206 check( xsh_instrument_update_lamp( instrument, XSH_LAMP_UNDEFINED));
00207
00208 tag=XSH_GET_TAG_FROM_LAMP( XSH_MASTER_FLAT,instrument);
00209 XSH_NAME_LAMP_MODE_ARM( name, "MASTER_FLAT", ".fits", instrument);
00210
00211
00212
00213 check(qth_flux_min=cpl_propertylist_get_double(qth_pre->data_header,
00214 XSH_QC_FLUX_MIN));
00215 check(qth_flux_max=cpl_propertylist_get_double(qth_pre->data_header,
00216 XSH_QC_FLUX_MAX));
00217 check(d2_flux_min=cpl_propertylist_get_double(d2_pre->data_header,
00218 XSH_QC_FLUX_MIN));
00219 check(d2_flux_max=cpl_propertylist_get_double(d2_pre->data_header,
00220 XSH_QC_FLUX_MAX));
00221
00222 flux_min=(qth_flux_min<d2_flux_min)? qth_flux_min:d2_flux_min;
00223 flux_max=(qth_flux_max>d2_flux_max)? qth_flux_max:d2_flux_max;
00224
00225 check(cpl_propertylist_set_double(d2_pre->data_header,XSH_QC_FLUX_MIN,
00226 flux_min));
00227 check(cpl_propertylist_set_double(d2_pre->data_header,XSH_QC_FLUX_MAX,
00228 flux_max));
00229
00230
00231
00232 check( *qth_d2_flat_frame = xsh_pre_save( d2_pre, name, tag,1));
00233 check( cpl_frame_set_tag( *qth_d2_flat_frame, tag));
00234 XSH_REGDEBUG("save %s %s", fname, tag);
00235
00236 sprintf(file_tag,"MFLAT_BACK_%s_%s",
00237 xsh_instrument_mode_tostring(instrument),
00238 xsh_instrument_arm_tostring(instrument));
00239
00240 sprintf(file_name,"%s.fits",file_tag);
00241
00242 check(xsh_pfits_set_pcatg(d2_pre->data_header,file_tag));
00243
00244 check(cpl_image_save(d2_bkg_ima,file_name,CPL_BPP_IEEE_FLOAT,
00245 d2_pre->data_header,CPL_IO_DEFAULT));
00246
00247
00248 check(*qth_d2_bkg_frame=xsh_frame_product(file_name,file_tag,
00249 CPL_FRAME_TYPE_IMAGE,
00250 CPL_FRAME_GROUP_CALIB,
00251 CPL_FRAME_LEVEL_FINAL));
00252
00253
00254 tag= XSH_GET_TAG_FROM_LAMP( XSH_ORDER_TAB_EDGES, instrument);
00255 XSH_NAME_LAMP_MODE_ARM( name, "ORDER_TAB_EDGES", ".fits", instrument);
00256
00257 check( *qth_d2_order_tab_frame = xsh_order_list_save( qth_d2_list,instrument,
00258 name, tag,
00259 qth_pre->ny*d2_list->bin_y));
00260
00261
00262 XSH_REGDEBUG("save %s %s",name, tag);
00263
00264
00265 cleanup:
00266 XSH_FREE( name);
00267 xsh_free_image(&d2_bkg_ima);
00268 xsh_free_image(&qth_bkg_ima);
00269
00270 xsh_pre_free( &qth_pre);
00271 xsh_pre_free( &d2_pre);
00272 xsh_order_list_free( &qth_list);
00273 xsh_order_list_free( &d2_list);
00274 xsh_order_list_free( &qth_d2_list);
00275 return;
00276
00277 }
00278
00279
00280