37 #include "vircam_utils.h"
38 #include "vircam_dfs.h"
39 #include "vircam_fits.h"
40 #include "vircam_mods.h"
44 static int vircam_defringe_create(cpl_plugin *) ;
45 static int vircam_defringe_exec(cpl_plugin *) ;
46 static int vircam_defringe_destroy(cpl_plugin *) ;
47 static int vircam_defringe_test(cpl_parameterlist *, cpl_frameset *) ;
48 static int vircam_defringe_save(cpl_frameset *framelist,
49 cpl_parameterlist *parlist);
50 static int vircam_defringe_lastbit(
int jext, cpl_frameset *framelist,
51 cpl_parameterlist *parlist);
52 static void vircam_defringe_init(
void);
53 static void vircam_defringe_tidy(
int level);
62 } vircam_defringe_config;
75 static cpl_frame *product_frame = NULL;
77 static char vircam_defringe_description[] =
78 "vircam_defringe -- VIRCAM defringe test recipe.\n\n"
79 "Defringe an input frame using a master fringe frame\n\n"
80 "The program accepts the following files in the SOF:\n\n"
82 " -----------------------------------------------------------------------\n"
83 " %-21s A input uncorrected image\n"
84 " %-21s A master fringe frame\n"
85 " %-21s Optional master bad pixel map or\n"
86 " %-21s Optional master confidence map\n"
148 int cpl_plugin_get_info(cpl_pluginlist *list) {
149 cpl_recipe *recipe = cpl_calloc(1,
sizeof(*recipe));
150 cpl_plugin *plugin = &recipe->interface;
151 char alldesc[SZ_ALLDESC];
152 (void)snprintf(alldesc,SZ_ALLDESC,vircam_defringe_description,
153 VIRCAM_TEST_SCIENCE_RAW,VIRCAM_CAL_FRINGE,VIRCAM_CAL_BPM,
156 cpl_plugin_init(plugin,
158 VIRCAM_BINARY_VERSION,
159 CPL_PLUGIN_TYPE_RECIPE,
161 "VIRCAM fringe correction test recipe [test]",
166 vircam_defringe_create,
167 vircam_defringe_exec,
168 vircam_defringe_destroy);
170 cpl_pluginlist_append(list,plugin);
186 static int vircam_defringe_create(cpl_plugin *plugin) {
192 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
193 recipe = (cpl_recipe *)plugin;
199 recipe->parameters = cpl_parameterlist_new();
203 p = cpl_parameter_new_value(
"vircam.vircam_defringe.nbsize",
205 "Cell size in pixels",
206 "vircam.vircam_defringe",128);
207 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"nbsize");
208 cpl_parameterlist_append(recipe->parameters,p);
212 p = cpl_parameter_new_range(
"vircam.vircam_defringe.extenum",
214 "Extension number to be done, 0 == all",
215 "vircam.vircam_defringe",1,0,16);
216 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ext");
217 cpl_parameterlist_append(recipe->parameters,p);
232 static int vircam_defringe_exec(cpl_plugin *plugin) {
237 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
238 recipe = (cpl_recipe *)plugin;
242 return(vircam_defringe_test(recipe->parameters,recipe->frames));
253 static int vircam_defringe_destroy(cpl_plugin *plugin) {
258 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
259 recipe = (cpl_recipe *)plugin;
263 cpl_parameterlist_delete(recipe->parameters);
276 static int vircam_defringe_test(cpl_parameterlist *parlist,
277 cpl_frameset *framelist) {
278 const char *fctid=
"vircam_defringe";
280 int jst,jfn,status,j,retval,nx,ny;
285 if (framelist == NULL || cpl_frameset_get_size(framelist) <= 0) {
286 cpl_msg_error(fctid,
"Input framelist NULL or has no input data");
292 vircam_defringe_init();
296 p = cpl_parameterlist_find(parlist,
"vircam.vircam_defringe.nbsize");
297 vircam_defringe_config.nbsize = cpl_parameter_get_int(p);
298 p = cpl_parameterlist_find(parlist,
"vircam.vircam_defringe.extenum");
299 vircam_defringe_config.extenum = cpl_parameter_get_int(p);
304 cpl_msg_error(fctid,
"Cannot identify RAW and CALIB frames");
305 vircam_defringe_tidy(2);
313 cpl_msg_error(fctid,
"Cannot labelise the input frames");
314 vircam_defringe_tidy(2);
318 VIRCAM_TEST_SCIENCE_RAW)) == NULL) {
319 cpl_msg_info(fctid,
"No raw image found -- cannot continue");
320 vircam_defringe_tidy(2);
324 VIRCAM_CAL_FRINGE)) == NULL) {
325 cpl_msg_info(fctid,
"No fringe image found -- cannot continue");
326 vircam_defringe_tidy(2);
340 if (jst == -1 || jfn == -1) {
341 cpl_msg_error(fctid,
"Unable to continue");
342 vircam_defringe_tidy(2);
349 for (j = jst; j <= jfn; j++) {
350 isfirst = (j == jst);
356 if (ps.img == NULL || ps.fringef == NULL) {
357 cpl_msg_info(fctid,
"Extension %" CPL_SIZE_FORMAT
" frame wouldn't load",
360 retval = vircam_defringe_lastbit(j,framelist,parlist);
376 cpl_msg_info(fctid,
"Doing the fringe correction for extension %" CPL_SIZE_FORMAT,
379 vircam_defringe_config.nbsize,&status);
380 if (status != VIR_OK) {
381 cpl_msg_info(fctid,
"Extension %" CPL_SIZE_FORMAT
" defringe failed",
384 retval = vircam_defringe_lastbit(j,framelist,parlist);
391 retval = vircam_defringe_lastbit(j,framelist,parlist);
395 vircam_defringe_tidy(2);
408 static int vircam_defringe_save(cpl_frameset *framelist,
409 cpl_parameterlist *parlist) {
410 const char *fctid =
"vircam_defringe_save";
411 const char *outfile =
"defringe.fits";
412 const char *recipeid =
"vircam_defringe";
413 cpl_propertylist *plist;
422 product_frame = cpl_frame_new();
423 cpl_frame_set_filename(product_frame,outfile);
424 cpl_frame_set_tag(product_frame,VIRCAM_PRO_SIMPLE_TEST);
425 cpl_frame_set_type(product_frame,CPL_FRAME_TYPE_IMAGE);
426 cpl_frame_set_group(product_frame,CPL_FRAME_GROUP_PRODUCT);
427 cpl_frame_set_level(product_frame,CPL_FRAME_LEVEL_FINAL);
433 parlist,(
char *)recipeid,
434 "?Dictionary?",NULL,0);
438 if (cpl_image_save(NULL,outfile,CPL_TYPE_UCHAR,plist,
439 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
440 cpl_msg_error(fctid,
"Cannot save product PHU");
441 cpl_frame_delete(product_frame);
444 cpl_frameset_insert(framelist,product_frame);
454 (
char *)recipeid,
"?Dictionary?",NULL);
461 plist,CPL_IO_EXTEND) != CPL_ERROR_NONE) {
462 cpl_msg_error(fctid,
"Cannot save product image extension");
479 static int vircam_defringe_lastbit(
int jext, cpl_frameset *framelist,
480 cpl_parameterlist *parlist) {
482 const char *fctid=
"vircam_defringe_lastbit";
486 cpl_msg_info(fctid,
"Saving products for extension %" CPL_SIZE_FORMAT,
488 retval = vircam_defringe_save(framelist,parlist);
490 vircam_defringe_tidy(2);
496 vircam_defringe_tidy(1);
507 static void vircam_defringe_init(
void) {
522 static void vircam_defringe_tidy(
int level) {
524 freefits(ps.fringef);
530 freeframe(ps.fringe);
531 freespace(ps.labels);