37 #include "vircam_utils.h"
38 #include "vircam_dfs.h"
39 #include "vircam_fits.h"
40 #include "vircam_mods.h"
44 static int vircam_gaincor_create(cpl_plugin *) ;
45 static int vircam_gaincor_exec(cpl_plugin *) ;
46 static int vircam_gaincor_destroy(cpl_plugin *) ;
47 static int vircam_gaincor_test(cpl_parameterlist *, cpl_frameset *) ;
48 static int vircam_gaincor_save(cpl_frameset *framelist,
49 cpl_parameterlist *parlist);
50 static void vircam_gaincor_init(
void);
51 static void vircam_gaincor_tidy(
void);
59 } vircam_gaincor_config;
71 static cpl_frame *product_frame = NULL;
73 static char vircam_gaincor_description[] =
74 "vircam_gaincor -- VIRCAM gain correction test recipe.\n\n"
75 "Gain correct an input frame using a master flat frame\n\n"
76 "The program accepts the following files in the SOF:\n\n"
78 " -----------------------------------------------------------------------\n"
79 " %-21s A input uncorrected image\n"
80 " %-21s A master flat field frame\n"
140 int cpl_plugin_get_info(cpl_pluginlist *list) {
141 cpl_recipe *recipe = cpl_calloc(1,
sizeof(*recipe));
142 cpl_plugin *plugin = &recipe->interface;
143 char alldesc[SZ_ALLDESC];
144 (void)snprintf(alldesc,SZ_ALLDESC,vircam_gaincor_description,
145 VIRCAM_TEST_SCIENCE_RAW,VIRCAM_CAL_TWILIGHT_FLAT);
147 cpl_plugin_init(plugin,
149 VIRCAM_BINARY_VERSION,
150 CPL_PLUGIN_TYPE_RECIPE,
152 "VIRCAM gain correction test recipe [test]",
157 vircam_gaincor_create,
159 vircam_gaincor_destroy);
161 cpl_pluginlist_append(list,plugin);
177 static int vircam_gaincor_create(cpl_plugin *plugin) {
183 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
184 recipe = (cpl_recipe *)plugin;
190 recipe->parameters = cpl_parameterlist_new();
194 p = cpl_parameter_new_range(
"vircam.vircam_gaincor.extenum",
196 "Extension number to be done, 0 == all",
197 "vircam.vircam_gaincor",1,0,16);
198 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ext");
199 cpl_parameterlist_append(recipe->parameters,p);
214 static int vircam_gaincor_exec(cpl_plugin *plugin) {
219 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
220 recipe = (cpl_recipe *)plugin;
224 return(vircam_gaincor_test(recipe->parameters,recipe->frames));
236 static int vircam_gaincor_destroy(cpl_plugin *plugin) {
241 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
242 recipe = (cpl_recipe *)plugin;
246 cpl_parameterlist_delete(recipe->parameters);
259 static int vircam_gaincor_test(cpl_parameterlist *parlist,
260 cpl_frameset *framelist) {
261 const char *fctid=
"vircam_gaincor";
263 int jst,jfn,status,j;
269 if (framelist == NULL || cpl_frameset_get_size(framelist) <= 0) {
270 cpl_msg_error(fctid,
"Input framelist NULL or has no input data");
276 vircam_gaincor_init();
280 p = cpl_parameterlist_find(parlist,
"vircam.vircam_gaincor.extenum");
281 vircam_gaincor_config.extenum = cpl_parameter_get_int(p);
286 cpl_msg_error(fctid,
"Cannot identify RAW and CALIB frames");
287 vircam_gaincor_tidy();
295 cpl_msg_error(fctid,
"Cannot labelise the input frames");
296 vircam_gaincor_tidy();
300 VIRCAM_CAL_TWILIGHT_FLAT)) == NULL) {
301 cpl_msg_info(fctid,
"No master flat found -- cannot continue");
302 vircam_gaincor_tidy();
306 VIRCAM_TEST_SCIENCE_RAW)) == NULL) {
307 cpl_msg_info(fctid,
"No raw image found -- cannot continue");
308 vircam_gaincor_tidy();
316 cpl_msg_error(fctid,
"Error calculating gain corrections");
317 vircam_gaincor_tidy();
327 if (jst == -1 || jfn == -1) {
328 cpl_msg_error(fctid,
"Unable to continue");
329 vircam_gaincor_tidy();
336 for (j = jst; j <= jfn; j++) {
337 isfirst = (j == jst);
338 gaincor_fac = (ps.gaincors)[j-1];
344 if (ps.img == NULL || ps.flatf == NULL) {
345 vircam_gaincor_tidy();
351 cpl_msg_info(fctid,
"Doing the flat fielding for extension %" CPL_SIZE_FORMAT,
354 if (status != VIR_OK) {
355 vircam_gaincor_tidy();
361 cpl_msg_info(fctid,
"Saving results for extension %" CPL_SIZE_FORMAT,
363 if (vircam_gaincor_save(framelist,parlist) != 0) {
364 vircam_gaincor_tidy();
373 vircam_gaincor_tidy();
387 static int vircam_gaincor_save(cpl_frameset *framelist,
388 cpl_parameterlist *parlist) {
389 const char *fctid =
"vircam_gaincor_save";
390 const char *outfile =
"gaincor.fits";
391 const char *recipeid =
"vircam_gaincor";
392 cpl_propertylist *plist;
401 product_frame = cpl_frame_new();
402 cpl_frame_set_filename(product_frame,outfile);
403 cpl_frame_set_tag(product_frame,VIRCAM_PRO_SIMPLE_TEST);
404 cpl_frame_set_type(product_frame,CPL_FRAME_TYPE_IMAGE);
405 cpl_frame_set_group(product_frame,CPL_FRAME_GROUP_PRODUCT);
406 cpl_frame_set_level(product_frame,CPL_FRAME_LEVEL_FINAL);
412 parlist,(
char *)recipeid,
413 "?Dictionary?",NULL,0);
417 if (cpl_image_save(NULL,outfile,CPL_TYPE_UCHAR,plist,
418 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
419 cpl_msg_error(fctid,
"Cannot save product PHU");
420 cpl_frame_delete(product_frame);
423 cpl_frameset_insert(framelist,product_frame);
433 (
char *)recipeid,
"?Dictionary?",NULL);
438 plist,CPL_IO_EXTEND) != CPL_ERROR_NONE) {
439 cpl_msg_error(fctid,
"Cannot save product image extension");
453 static void vircam_gaincor_init(
void) {
469 static void vircam_gaincor_tidy(
void) {
470 freespace(ps.labels);
475 freespace(ps.gaincors);