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
00030 #ifdef HAVE_CONFIG_H
00031 #include <config.h>
00032 #endif
00033
00034 #include <stdio.h>
00035 #include <cpl.h>
00036
00037 #include "vircam_utils.h"
00038 #include "vircam_dfs.h"
00039 #include "vircam_fits.h"
00040 #include "vircam_mods.h"
00041
00042
00043
00044 static int vircam_defringe_create(cpl_plugin *) ;
00045 static int vircam_defringe_exec(cpl_plugin *) ;
00046 static int vircam_defringe_destroy(cpl_plugin *) ;
00047 static int vircam_defringe_test(cpl_parameterlist *, cpl_frameset *) ;
00048 static int vircam_defringe_save(cpl_frameset *framelist,
00049 cpl_parameterlist *parlist);
00050 static int vircam_defringe_lastbit(int jext, cpl_frameset *framelist,
00051 cpl_parameterlist *parlist);
00052 static void vircam_defringe_init(void);
00053 static void vircam_defringe_tidy(int level);
00054
00055 static struct {
00056
00057
00058
00059 int nbsize;
00060 int extenum;
00061
00062 } vircam_defringe_config;
00063
00064 static struct {
00065 int *labels;
00066 cpl_frame *fringe;
00067 cpl_frame *img;
00068 vir_fits *fringef;
00069 vir_fits *imgf;
00070 vir_mask *bpm;
00071 } ps;
00072
00073 static int isfirst;
00074 static int dummy;
00075 static cpl_frame *product_frame = NULL;
00076
00077 static char vircam_defringe_description[] =
00078 "vircam_defringe -- VIRCAM defringe test recipe.\n\n"
00079 "Defringe an input frame using a master fringe frame\n\n"
00080 "The program accepts the following files in the SOF:\n\n"
00081 " Tag Description\n"
00082 " -----------------------------------------------------------------------\n"
00083 " %-21s A input uncorrected image\n"
00084 " %-21s A master fringe frame\n"
00085 " %-21s Optional master bad pixel map or\n"
00086 " %-21s Optional master confidence map\n"
00087 "\n";
00088
00135
00136
00137
00138
00146
00147
00148 int cpl_plugin_get_info(cpl_pluginlist *list) {
00149 cpl_recipe *recipe = cpl_calloc(1,sizeof(*recipe));
00150 cpl_plugin *plugin = &recipe->interface;
00151 char alldesc[SZ_ALLDESC];
00152 (void)snprintf(alldesc,SZ_ALLDESC,vircam_defringe_description,
00153 VIRCAM_TEST_SCIENCE_RAW,VIRCAM_CAL_FRINGE,VIRCAM_CAL_BPM,
00154 VIRCAM_CAL_CONF);
00155
00156 cpl_plugin_init(plugin,
00157 CPL_PLUGIN_API,
00158 VIRCAM_BINARY_VERSION,
00159 CPL_PLUGIN_TYPE_RECIPE,
00160 "vircam_defringe",
00161 "VIRCAM fringe correction test recipe [test]",
00162 alldesc,
00163 "Jim Lewis",
00164 "jrl@ast.cam.ac.uk",
00165 vircam_get_license(),
00166 vircam_defringe_create,
00167 vircam_defringe_exec,
00168 vircam_defringe_destroy);
00169
00170 cpl_pluginlist_append(list,plugin);
00171
00172 return(0);
00173 }
00174
00175
00184
00185
00186 static int vircam_defringe_create(cpl_plugin *plugin) {
00187 cpl_recipe *recipe;
00188 cpl_parameter *p;
00189
00190
00191
00192 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00193 recipe = (cpl_recipe *)plugin;
00194 else
00195 return(-1);
00196
00197
00198
00199 recipe->parameters = cpl_parameterlist_new();
00200
00201
00202
00203 p = cpl_parameter_new_value("vircam.vircam_defringe.nbsize",
00204 CPL_TYPE_INT,
00205 "Cell size in pixels",
00206 "vircam.vircam_defringe",128);
00207 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,"nbsize");
00208 cpl_parameterlist_append(recipe->parameters,p);
00209
00210
00211
00212 p = cpl_parameter_new_range("vircam.vircam_defringe.extenum",
00213 CPL_TYPE_INT,
00214 "Extension number to be done, 0 == all",
00215 "vircam.vircam_defringe",1,0,16);
00216 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,"ext");
00217 cpl_parameterlist_append(recipe->parameters,p);
00218
00219
00220
00221 return(0);
00222 }
00223
00224
00230
00231
00232 static int vircam_defringe_exec(cpl_plugin *plugin) {
00233 cpl_recipe *recipe;
00234
00235
00236
00237 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00238 recipe = (cpl_recipe *)plugin;
00239 else
00240 return(-1);
00241
00242 return(vircam_defringe_test(recipe->parameters,recipe->frames));
00243 }
00244
00245
00251
00252
00253 static int vircam_defringe_destroy(cpl_plugin *plugin) {
00254 cpl_recipe *recipe ;
00255
00256
00257
00258 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00259 recipe = (cpl_recipe *)plugin;
00260 else
00261 return(-1);
00262
00263 cpl_parameterlist_delete(recipe->parameters);
00264 return(0);
00265 }
00266
00267
00274
00275
00276 static int vircam_defringe_test(cpl_parameterlist *parlist,
00277 cpl_frameset *framelist) {
00278 const char *fctid="vircam_defringe";
00279 cpl_parameter *p;
00280 int nlab,jst,jfn,status,j,retval,nx,ny;
00281
00282
00283
00284 if (framelist == NULL || cpl_frameset_get_size(framelist) <= 0) {
00285 cpl_msg_error(fctid,"Input framelist NULL or has no input data\n");
00286 return(-1);
00287 }
00288
00289
00290
00291 vircam_defringe_init();
00292
00293
00294
00295 p = cpl_parameterlist_find(parlist,"vircam.vircam_defringe.nbsize");
00296 vircam_defringe_config.nbsize = cpl_parameter_get_int(p);
00297 p = cpl_parameterlist_find(parlist,"vircam.vircam_defringe.extenum");
00298 vircam_defringe_config.extenum = cpl_parameter_get_int(p);
00299
00300
00301
00302 if (vircam_dfs_set_groups(framelist) != VIR_OK) {
00303 cpl_msg_error(fctid,"Cannot identify RAW and CALIB frames");
00304 vircam_defringe_tidy(2);
00305 return(-1);
00306 }
00307
00308
00309
00310 if ((ps.labels = cpl_frameset_labelise(framelist,vircam_compare_tags,
00311 &nlab)) == NULL) {
00312 cpl_msg_error(fctid,"Cannot labelise the input frames");
00313 vircam_defringe_tidy(2);
00314 return(-1);
00315 }
00316 if ((ps.img = vircam_frameset_subgroup_1(framelist,ps.labels,nlab,
00317 VIRCAM_TEST_SCIENCE_RAW)) == NULL) {
00318 cpl_msg_info(fctid,"No raw image found -- cannot continue");
00319 vircam_defringe_tidy(2);
00320 return(-1);
00321 }
00322 if ((ps.fringe = vircam_frameset_subgroup_1(framelist,ps.labels,nlab,
00323 VIRCAM_CAL_FRINGE)) == NULL) {
00324 cpl_msg_info(fctid,"No fringe image found -- cannot continue");
00325 vircam_defringe_tidy(2);
00326 return(-1);
00327 }
00328
00329
00330
00331 ps.bpm = vircam_mask_define(framelist,ps.labels,nlab);
00332
00333
00334
00335
00336
00337 vircam_exten_range(vircam_defringe_config.extenum,(const cpl_frame *)ps.img,
00338 &jst,&jfn);
00339 if (jst == -1 || jfn == -1) {
00340 cpl_msg_error(fctid,"Unable to continue");
00341 vircam_defringe_tidy(2);
00342 return(-1);
00343 }
00344
00345
00346
00347 status = VIR_OK;
00348 for (j = jst; j <= jfn; j++) {
00349 isfirst = (j == jst);
00350
00351
00352
00353 ps.imgf = vircam_fits_load(ps.img,CPL_TYPE_FLOAT,j);
00354 ps.fringef = vircam_fits_load(ps.fringe,CPL_TYPE_FLOAT,j);
00355 if (ps.img == NULL || ps.fringef == NULL) {
00356 cpl_msg_info(fctid,"Extension %d frame wouldn't load",j);
00357 dummy = 1;
00358 retval = vircam_defringe_lastbit(j,framelist,parlist);
00359 if (retval != 0)
00360 return(-1);
00361 }
00362
00363
00364
00365 nx = cpl_image_get_size_x(vircam_fits_get_image(ps.imgf));
00366 ny = cpl_image_get_size_y(vircam_fits_get_image(ps.imgf));
00367
00368
00369
00370 (void)vircam_mask_load(ps.bpm,j,nx,ny);
00371
00372
00373
00374 cpl_msg_info(fctid,"Doing the fringe correction for extension %d",j);
00375 (void)vircam_defringe(&(ps.imgf),1,&(ps.fringef),1,ps.bpm,
00376 vircam_defringe_config.nbsize,&status);
00377 if (status != VIR_OK) {
00378 cpl_msg_info(fctid,"Extension %d defringe failed",j);
00379 dummy = 1;
00380 retval = vircam_defringe_lastbit(j,framelist,parlist);
00381 if (retval != 0)
00382 return(-1);
00383 }
00384
00385
00386
00387 retval = vircam_defringe_lastbit(j,framelist,parlist);
00388 if (retval != 0)
00389 return(-1);
00390 }
00391 vircam_defringe_tidy(2);
00392 return(0);
00393 }
00394
00395
00402
00403
00404 static int vircam_defringe_save(cpl_frameset *framelist,
00405 cpl_parameterlist *parlist) {
00406 const char *fctid = "vircam_defringe_save";
00407 const char *outfile = "defringe.fits";
00408 const char *recipeid = "vircam_defringe";
00409 cpl_propertylist *plist;
00410
00411
00412
00413
00414 if (isfirst) {
00415
00416
00417
00418 product_frame = cpl_frame_new();
00419 cpl_frame_set_filename(product_frame,outfile);
00420 cpl_frame_set_tag(product_frame,VIRCAM_PRO_SIMPLE_TEST);
00421 cpl_frame_set_type(product_frame,CPL_FRAME_TYPE_IMAGE);
00422 cpl_frame_set_group(product_frame,CPL_FRAME_GROUP_PRODUCT);
00423 cpl_frame_set_level(product_frame,CPL_FRAME_LEVEL_FINAL);
00424
00425
00426
00427 plist = vircam_fits_get_phu(ps.imgf);
00428 vircam_dfs_set_product_primary_header(plist,product_frame,framelist,
00429 parlist,(char *)recipeid,
00430 "?Dictionary?");
00431
00432
00433
00434 if (cpl_image_save(NULL,outfile,CPL_BPP_8_UNSIGNED,plist,
00435 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
00436 cpl_msg_error(fctid,"Cannot save product PHU");
00437 cpl_frame_delete(product_frame);
00438 return(-1);
00439 }
00440 cpl_frameset_insert(framelist,product_frame);
00441 }
00442
00443
00444
00445 plist = vircam_fits_get_ehu(ps.imgf);
00446
00447
00448
00449 vircam_dfs_set_product_exten_header(plist,product_frame,framelist,parlist,
00450 (char *)recipeid,"?Dictionary?");
00451 if (dummy)
00452 vircam_dummy_property(plist);
00453
00454
00455
00456 if (cpl_image_save(vircam_fits_get_image(ps.imgf),outfile,CPL_BPP_IEEE_FLOAT,
00457 plist,CPL_IO_EXTEND) != CPL_ERROR_NONE) {
00458 cpl_msg_error(fctid,"Cannot save product image extension");
00459 return(-1);
00460 }
00461
00462 return(0);
00463 }
00464
00465
00473
00474
00475 static int vircam_defringe_lastbit(int jext, cpl_frameset *framelist,
00476 cpl_parameterlist *parlist) {
00477 int retval;
00478 const char *fctid="vircam_defringe_lastbit";
00479
00480
00481
00482 cpl_msg_info(fctid,"Saving products for extension %d",jext);
00483 retval = vircam_defringe_save(framelist,parlist);
00484 if (retval != 0) {
00485 vircam_defringe_tidy(2);
00486 return(-1);
00487 }
00488
00489
00490
00491 vircam_defringe_tidy(1);
00492 return(0);
00493 }
00494
00495
00496
00500
00501
00502 static void vircam_defringe_init(void) {
00503 ps.labels = NULL;
00504 ps.fringe = NULL;
00505 ps.fringef = NULL;
00506 ps.img = NULL;
00507 ps.imgf = NULL;
00508 }
00509
00510
00511
00515
00516
00517 static void vircam_defringe_tidy(int level) {
00518 freefits(ps.imgf);
00519 freefits(ps.fringef);
00520 vircam_mask_clear(ps.bpm);
00521 if (level == 1)
00522 return;
00523 freemask(ps.bpm);
00524 freeframe(ps.img);
00525 freeframe(ps.fringe);
00526 freespace(ps.labels);
00527 }
00528
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557