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 <xsh_utils_image.h>
00056 #include <cpl.h>
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00082
00083 void
00084 xsh_flat_merge_qth_d2( cpl_frame *qth_frame, cpl_frame *qth_order_tab_frame,
00085 cpl_frame *d2_frame,cpl_frame *d2_order_tab_frame,
00086 cpl_frame *qth_bkg_frame, cpl_frame *d2_bkg_frame,
00087 cpl_frame **qth_d2_flat_frame,
00088 cpl_frame **qth_d2_bkg_frame,
00089 cpl_frame **qth_d2_order_tab_frame,
00090 xsh_instrument *instrument)
00091
00092 {
00093 xsh_pre *qth_pre = NULL;
00094 xsh_pre *d2_pre = NULL;
00095
00096 float *qth_data = NULL;
00097 float *d2_data = NULL;
00098 float *qth_errs = NULL;
00099 float *d2_errs = NULL;
00100 int *qth_qual = NULL;
00101 int *d2_qual = NULL;
00102
00103 float *d2_bkg_data = NULL;
00104
00105 float *qth_bkg_data = NULL;
00106
00107
00108 xsh_order_list *qth_list = NULL;
00109 xsh_order_list *d2_list = NULL;
00110 xsh_order_list *qth_d2_list = NULL;
00111 int y;
00112 cpl_polynomial *d2_limit = NULL;
00113 cpl_polynomial *qth_limit = NULL;
00114 cpl_image* d2_bkg_ima=NULL;
00115 cpl_image* qth_bkg_ima=NULL;
00116
00117 const char* tag=NULL;
00118 const char* fname=NULL;
00119 char* name=NULL;
00120 char file_name[80];
00121 char file_tag[25];
00122
00123 double qth_flux_min=0;
00124 double qth_flux_max=0;
00125 double d2_flux_min=0;
00126 double d2_flux_max=0;
00127 double flux_min=0;
00128 double flux_max=0;
00129
00130
00131 XSH_ASSURE_NOT_NULL( qth_frame);
00132 XSH_ASSURE_NOT_NULL( qth_order_tab_frame);
00133 XSH_ASSURE_NOT_NULL( d2_frame);
00134 XSH_ASSURE_NOT_NULL( d2_order_tab_frame);
00135 XSH_ASSURE_NOT_NULL( qth_d2_flat_frame);
00136 XSH_ASSURE_NOT_NULL( qth_bkg_frame);
00137 XSH_ASSURE_NOT_NULL( d2_bkg_frame);
00138 XSH_ASSURE_NOT_NULL( qth_d2_bkg_frame);
00139 XSH_ASSURE_NOT_NULL( qth_d2_order_tab_frame);
00140 XSH_ASSURE_NOT_NULL( instrument);
00141
00142 xsh_msg_dbg_medium( "Entering xsh_flat_merge_qth_d2") ;
00143
00144
00145 check( qth_pre = xsh_pre_load( qth_frame, instrument));
00146 check( d2_pre = xsh_pre_load( d2_frame, instrument));
00147
00148
00149 check( xsh_instrument_update_lamp( instrument, XSH_LAMP_QTH));
00150 check( qth_list = xsh_order_list_load( qth_order_tab_frame, instrument));
00151 xsh_order_list_set_bin_x( qth_list, qth_pre->binx);
00152 xsh_order_list_set_bin_y( qth_list, qth_pre->biny);
00153 check( xsh_instrument_update_lamp( instrument, XSH_LAMP_D2));
00154 check( d2_list = xsh_order_list_load( d2_order_tab_frame, instrument));
00155 xsh_order_list_set_bin_x( d2_list, d2_pre->binx);
00156 xsh_order_list_set_bin_y( d2_list, d2_pre->biny);
00157
00158 check( qth_data = cpl_image_get_data_float( qth_pre->data));
00159 check( d2_data = cpl_image_get_data_float(d2_pre->data));
00160
00161 fname=cpl_frame_get_filename(qth_bkg_frame);
00162 qth_bkg_ima=cpl_image_load(fname,CPL_TYPE_FLOAT,0,0);
00163 check( qth_bkg_data = cpl_image_get_data_float(qth_bkg_ima));
00164
00165 fname=cpl_frame_get_filename(d2_bkg_frame);
00166 d2_bkg_ima=cpl_image_load(fname,CPL_TYPE_FLOAT,0,0);
00167 check( d2_bkg_data = cpl_image_get_data_float(d2_bkg_ima));
00168
00169
00170 check( qth_errs = cpl_image_get_data_float( qth_pre->errs));
00171 check( d2_errs = cpl_image_get_data_float(d2_pre->errs));
00172
00173 check( qth_qual = cpl_image_get_data_int( qth_pre->qual));
00174 check( d2_qual = cpl_image_get_data_int(d2_pre->qual));
00175
00176
00177
00178
00179 qth_limit = qth_list->list[qth_list->size-1].edglopoly;
00180 d2_limit = d2_list->list[0].edguppoly;
00181
00182 for( y=0; y < d2_pre->ny; y++){
00183 int xd2=0, xqth=0;
00184 int x_avg=0;
00185 int x;
00186
00187 check( xd2 = xsh_order_list_eval_int( d2_list, d2_limit, y+1)-1);
00188 check( xqth = xsh_order_list_eval_int( qth_list, qth_limit, y+1)-1);
00189 x_avg = floor( (xd2+xqth)/2.0);
00190 xsh_msg_dbg_medium("D2 x %d y %d", xd2, y);
00191 xsh_msg_dbg_medium("QTH x %d y %d", xqth, y);
00192 xsh_msg_dbg_medium(" x_avg = %d", x_avg);
00193
00194 for( x=x_avg; x< d2_pre->nx; x++){
00195 d2_data[x+y*d2_pre->nx] = qth_data[x+y*d2_pre->nx];
00196 d2_errs[x+y*d2_pre->nx] = qth_errs[x+y*d2_pre->nx];
00197 d2_qual[x+y*d2_pre->nx] = qth_qual[x+y*d2_pre->nx];
00198
00199 d2_bkg_data[x+y*d2_pre->nx] = qth_bkg_data[x+y*d2_pre->nx];
00200
00201
00202 }
00203 }
00204
00205
00206 check( qth_d2_list = xsh_order_list_merge( qth_list, d2_list));
00207
00208 check( xsh_instrument_update_lamp( instrument, XSH_LAMP_UNDEFINED));
00209
00210 tag=XSH_GET_TAG_FROM_LAMP( XSH_MASTER_FLAT,instrument);
00211 XSH_NAME_LAMP_MODE_ARM( name, "MASTER_FLAT", ".fits", instrument);
00212
00213
00214
00215 check(qth_flux_min=cpl_propertylist_get_double(qth_pre->data_header,
00216 XSH_QC_FLUX_MIN));
00217 check(qth_flux_max=cpl_propertylist_get_double(qth_pre->data_header,
00218 XSH_QC_FLUX_MAX));
00219 check(d2_flux_min=cpl_propertylist_get_double(d2_pre->data_header,
00220 XSH_QC_FLUX_MIN));
00221 check(d2_flux_max=cpl_propertylist_get_double(d2_pre->data_header,
00222 XSH_QC_FLUX_MAX));
00223
00224 flux_min=(qth_flux_min<d2_flux_min)? qth_flux_min:d2_flux_min;
00225 flux_max=(qth_flux_max>d2_flux_max)? qth_flux_max:d2_flux_max;
00226
00227 check(cpl_propertylist_set_double(d2_pre->data_header,XSH_QC_FLUX_MIN,
00228 flux_min));
00229 check(cpl_propertylist_set_double(d2_pre->data_header,XSH_QC_FLUX_MAX,
00230 flux_max));
00231
00232
00233
00234 check( *qth_d2_flat_frame = xsh_pre_save( d2_pre, name, tag,0));
00235 check( cpl_frame_set_tag( *qth_d2_flat_frame, tag));
00236 XSH_REGDEBUG("save %s %s", fname, tag);
00237
00238 sprintf(file_tag,"MFLAT_BACK_%s_%s",
00239 xsh_instrument_mode_tostring(instrument),
00240 xsh_instrument_arm_tostring(instrument));
00241
00242 sprintf(file_name,"%s.fits",file_tag);
00243
00244 check(xsh_pfits_set_pcatg(d2_pre->data_header,file_tag));
00245
00246 check(cpl_image_save(d2_bkg_ima,file_name,CPL_BPP_IEEE_FLOAT,
00247 d2_pre->data_header,CPL_IO_DEFAULT));
00248
00249
00250 check(*qth_d2_bkg_frame=xsh_frame_product(file_name,file_tag,
00251 CPL_FRAME_TYPE_IMAGE,
00252 CPL_FRAME_GROUP_CALIB,
00253 CPL_FRAME_LEVEL_FINAL));
00254
00255
00256 tag= XSH_GET_TAG_FROM_LAMP( XSH_ORDER_TAB_EDGES, instrument);
00257 XSH_NAME_LAMP_MODE_ARM( name, "ORDER_TAB_EDGES", ".fits", instrument);
00258
00259 check( *qth_d2_order_tab_frame = xsh_order_list_save( qth_d2_list,instrument,
00260 name, tag,
00261 qth_pre->ny*d2_list->bin_y));
00262
00263
00264 XSH_REGDEBUG("save %s %s",name, tag);
00265
00266
00267 cleanup:
00268 XSH_FREE( name);
00269 xsh_free_image(&d2_bkg_ima);
00270 xsh_free_image(&qth_bkg_ima);
00271
00272 xsh_pre_free( &qth_pre);
00273 xsh_pre_free( &d2_pre);
00274 xsh_order_list_free( &qth_list);
00275 xsh_order_list_free( &d2_list);
00276 xsh_order_list_free( &qth_d2_list);
00277 return;
00278
00279 }
00280
00296
00297
00298 void
00299 xsh_flat_merge_qth_d2_smooth( cpl_frame *qth_frame, cpl_frame *qth_order_tab_frame,
00300 cpl_frame *d2_frame,cpl_frame *d2_order_tab_frame,
00301 cpl_frame *qth_bkg_frame, cpl_frame *d2_bkg_frame,
00302 cpl_frame **qth_d2_flat_frame,
00303 cpl_frame **qth_d2_bkg_frame,
00304 cpl_frame **qth_d2_order_tab_frame,
00305 xsh_instrument *instrument)
00306
00307 {
00308 xsh_pre *qth_pre = NULL;
00309 xsh_pre *d2_pre = NULL;
00310
00311 float *qth_data = NULL;
00312 float *d2_data = NULL;
00313 float *qth_errs = NULL;
00314 float *d2_errs = NULL;
00315 int *qth_qual = NULL;
00316 int *d2_qual = NULL;
00317
00318 float *d2_bkg_data = NULL;
00319
00320 float *qth_bkg_data = NULL;
00321
00322
00323 xsh_order_list *qth_list = NULL;
00324 xsh_order_list *d2_list = NULL;
00325 xsh_order_list *qth_d2_list = NULL;
00326 int y;
00327 cpl_polynomial *d2_limit = NULL;
00328 cpl_polynomial *qth_limit = NULL;
00329 cpl_image* d2_bkg_ima=NULL;
00330 cpl_image* qth_bkg_ima=NULL;
00331
00332 const char* tag=NULL;
00333 const char* fname=NULL;
00334 char* name=NULL;
00335 char file_name[80];
00336 char file_tag[25];
00337
00338 double qth_flux_min=0;
00339 double qth_flux_max=0;
00340 double d2_flux_min=0;
00341 double d2_flux_max=0;
00342 double flux_min=0;
00343 double flux_max=0;
00344
00345 cpl_image* merged=NULL;
00346 XSH_ASSURE_NOT_NULL( qth_frame);
00347 XSH_ASSURE_NOT_NULL( qth_order_tab_frame);
00348 XSH_ASSURE_NOT_NULL( d2_frame);
00349 XSH_ASSURE_NOT_NULL( d2_order_tab_frame);
00350 XSH_ASSURE_NOT_NULL( qth_d2_flat_frame);
00351 XSH_ASSURE_NOT_NULL( qth_bkg_frame);
00352 XSH_ASSURE_NOT_NULL( d2_bkg_frame);
00353 XSH_ASSURE_NOT_NULL( qth_d2_bkg_frame);
00354 XSH_ASSURE_NOT_NULL( qth_d2_order_tab_frame);
00355 XSH_ASSURE_NOT_NULL( instrument);
00356
00357 xsh_msg_dbg_medium( "Entering xsh_flat_merge_qth_d2") ;
00358
00359
00360 check( qth_pre = xsh_pre_load( qth_frame, instrument));
00361 check( d2_pre = xsh_pre_load( d2_frame, instrument));
00362
00363
00364 check( xsh_instrument_update_lamp( instrument, XSH_LAMP_QTH));
00365 check( qth_list = xsh_order_list_load( qth_order_tab_frame, instrument));
00366 xsh_order_list_set_bin_x( qth_list, qth_pre->binx);
00367 xsh_order_list_set_bin_y( qth_list, qth_pre->biny);
00368 check( xsh_instrument_update_lamp( instrument, XSH_LAMP_D2));
00369 check( d2_list = xsh_order_list_load( d2_order_tab_frame, instrument));
00370 xsh_order_list_set_bin_x( d2_list, d2_pre->binx);
00371 xsh_order_list_set_bin_y( d2_list, d2_pre->biny);
00372
00373 check( qth_data = cpl_image_get_data_float( qth_pre->data));
00374 check( d2_data = cpl_image_get_data_float(d2_pre->data));
00375
00376 fname=cpl_frame_get_filename(qth_bkg_frame);
00377 qth_bkg_ima=cpl_image_load(fname,CPL_TYPE_FLOAT,0,0);
00378 check( qth_bkg_data = cpl_image_get_data_float(qth_bkg_ima));
00379
00380 fname=cpl_frame_get_filename(d2_bkg_frame);
00381 d2_bkg_ima=cpl_image_load(fname,CPL_TYPE_FLOAT,0,0);
00382 check( d2_bkg_data = cpl_image_get_data_float(d2_bkg_ima));
00383
00384
00385 check( qth_errs = cpl_image_get_data_float( qth_pre->errs));
00386 check( d2_errs = cpl_image_get_data_float(d2_pre->errs));
00387
00388 check( qth_qual = cpl_image_get_data_int( qth_pre->qual));
00389 check( d2_qual = cpl_image_get_data_int(d2_pre->qual));
00390
00391
00392
00393
00394 qth_limit = qth_list->list[qth_list->size-1].edglopoly;
00395 d2_limit = d2_list->list[0].edguppoly;
00396
00397 for( y=0; y < d2_pre->ny; y++){
00398 int xd2=0, xqth=0;
00399 int x_avg=0;
00400 int x;
00401
00402 check( xd2 = xsh_order_list_eval_int( d2_list, d2_limit, y+1)-1);
00403 check( xqth = xsh_order_list_eval_int( qth_list, qth_limit, y+1)-1);
00404 x_avg = floor( (xd2+xqth)/2.0);
00405 xsh_msg_dbg_medium("D2 x %d y %d", xd2, y);
00406 xsh_msg_dbg_medium("QTH x %d y %d", xqth, y);
00407 xsh_msg_dbg_medium(" x_avg = %d", x_avg);
00408
00409 for( x=x_avg; x< d2_pre->nx; x++){
00410
00411 d2_errs[x+y*d2_pre->nx] = qth_errs[x+y*d2_pre->nx];
00412 d2_qual[x+y*d2_pre->nx] = qth_qual[x+y*d2_pre->nx];
00413
00414 d2_bkg_data[x+y*d2_pre->nx] = qth_bkg_data[x+y*d2_pre->nx];
00415
00416
00417 }
00418 }
00419
00420
00421 check( qth_d2_list = xsh_order_list_merge( qth_list, d2_list));
00422
00423
00424 merged=xsh_combine_flats(qth_pre->data,d2_pre->data,qth_list,d2_list,5,5);
00425 d2_pre->data=cpl_image_duplicate(merged);
00426
00427 d2_pre->data=cpl_image_duplicate(merged);
00428 xsh_free_image(&merged);
00429
00430
00431
00432
00433
00434
00435
00436 merged=xsh_combine_flats(qth_bkg_ima,d2_bkg_ima,qth_list,d2_list,5,5);
00437 d2_bkg_ima=cpl_image_duplicate(merged);
00438
00439 d2_bkg_ima=cpl_image_duplicate(merged);
00440 xsh_free_image(&merged);
00441
00442 check( xsh_instrument_update_lamp( instrument, XSH_LAMP_UNDEFINED));
00443
00444 tag=XSH_GET_TAG_FROM_LAMP( XSH_MASTER_FLAT,instrument);
00445 XSH_NAME_LAMP_MODE_ARM( name, "MASTER_FLAT", ".fits", instrument);
00446
00447
00448
00449 check(qth_flux_min=cpl_propertylist_get_double(qth_pre->data_header,
00450 XSH_QC_FLUX_MIN));
00451 check(qth_flux_max=cpl_propertylist_get_double(qth_pre->data_header,
00452 XSH_QC_FLUX_MAX));
00453 check(d2_flux_min=cpl_propertylist_get_double(d2_pre->data_header,
00454 XSH_QC_FLUX_MIN));
00455 check(d2_flux_max=cpl_propertylist_get_double(d2_pre->data_header,
00456 XSH_QC_FLUX_MAX));
00457
00458 flux_min=(qth_flux_min<d2_flux_min)? qth_flux_min:d2_flux_min;
00459 flux_max=(qth_flux_max>d2_flux_max)? qth_flux_max:d2_flux_max;
00460
00461 check(cpl_propertylist_set_double(d2_pre->data_header,XSH_QC_FLUX_MIN,
00462 flux_min));
00463 check(cpl_propertylist_set_double(d2_pre->data_header,XSH_QC_FLUX_MAX,
00464 flux_max));
00465
00466
00467
00468 check( *qth_d2_flat_frame = xsh_pre_save( d2_pre, name, tag,0));
00469 check( cpl_frame_set_tag( *qth_d2_flat_frame, tag));
00470 XSH_REGDEBUG("save %s %s", fname, tag);
00471
00472 sprintf(file_tag,"MFLAT_BACK_%s_%s",
00473 xsh_instrument_mode_tostring(instrument),
00474 xsh_instrument_arm_tostring(instrument));
00475
00476 sprintf(file_name,"%s.fits",file_tag);
00477
00478 check(xsh_pfits_set_pcatg(d2_pre->data_header,file_tag));
00479
00480 check(cpl_image_save(d2_bkg_ima,file_name,CPL_BPP_IEEE_FLOAT,
00481 d2_pre->data_header,CPL_IO_DEFAULT));
00482
00483
00484 check(*qth_d2_bkg_frame=xsh_frame_product(file_name,file_tag,
00485 CPL_FRAME_TYPE_IMAGE,
00486 CPL_FRAME_GROUP_CALIB,
00487 CPL_FRAME_LEVEL_FINAL));
00488
00489
00490 tag= XSH_GET_TAG_FROM_LAMP( XSH_ORDER_TAB_EDGES, instrument);
00491 XSH_NAME_LAMP_MODE_ARM( name, "ORDER_TAB_EDGES", ".fits", instrument);
00492
00493 check( *qth_d2_order_tab_frame = xsh_order_list_save( qth_d2_list,instrument,
00494 name, tag,
00495 qth_pre->ny*d2_list->bin_y));
00496
00497
00498 XSH_REGDEBUG("save %s %s",name, tag);
00499
00500
00501 cleanup:
00502 XSH_FREE( name);
00503 xsh_free_image(&d2_bkg_ima);
00504 xsh_free_image(&qth_bkg_ima);
00505
00506 xsh_pre_free( &qth_pre);
00507 xsh_pre_free( &d2_pre);
00508 xsh_order_list_free( &qth_list);
00509 xsh_order_list_free( &d2_list);
00510 xsh_order_list_free( &qth_d2_list);
00511 return;
00512
00513 }
00514
00515