37 #include "vircam_utils.h"
38 #include "vircam_dfs.h"
39 #include "vircam_fits.h"
40 #include "vircam_mods.h"
41 #include "vircam_pfits.h"
45 static int vircam_lincor_create(cpl_plugin *) ;
46 static int vircam_lincor_exec(cpl_plugin *) ;
47 static int vircam_lincor_destroy(cpl_plugin *) ;
48 static int vircam_lincor_test(cpl_parameterlist *, cpl_frameset *) ;
49 static int vircam_lincor_save(cpl_frameset *framelist,
50 cpl_parameterlist *parlist);
51 static void vircam_lincor_init(
void);
52 static void vircam_lincor_tidy(
void);
60 } vircam_lincor_config;
71 static cpl_frame *product_frame = NULL;
73 static char vircam_lincor_description[] =
74 "vircam_lincor -- VIRCAM linearity correction test recipe.\n\n"
75 "Linearity correct an input frame using a pre-existing channel table\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 channel table\n"
141 int cpl_plugin_get_info(cpl_pluginlist *list) {
142 cpl_recipe *recipe = cpl_calloc(1,
sizeof(*recipe));
143 cpl_plugin *plugin = &recipe->interface;
144 char alldesc[SZ_ALLDESC];
145 (void)snprintf(alldesc,SZ_ALLDESC,vircam_lincor_description,
146 VIRCAM_TEST_SCIENCE_RAW,VIRCAM_CAL_CHANTAB);
148 cpl_plugin_init(plugin,
150 VIRCAM_BINARY_VERSION,
151 CPL_PLUGIN_TYPE_RECIPE,
153 "VIRCAM linearisation test recipe [test]",
158 vircam_lincor_create,
160 vircam_lincor_destroy);
162 cpl_pluginlist_append(list,plugin);
178 static int vircam_lincor_create(cpl_plugin *plugin) {
184 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
185 recipe = (cpl_recipe *)plugin;
191 recipe->parameters = cpl_parameterlist_new();
195 p = cpl_parameter_new_range(
"vircam.vircam_lincor.extenum",
197 "Extension number to be done, 0 == all",
198 "vircam.vircam_lincor",1,0,16);
199 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ext");
200 cpl_parameterlist_append(recipe->parameters,p);
215 static int vircam_lincor_exec(cpl_plugin *plugin) {
220 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
221 recipe = (cpl_recipe *)plugin;
225 return(vircam_lincor_test(recipe->parameters,recipe->frames));
237 static int vircam_lincor_destroy(cpl_plugin *plugin) {
242 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
243 recipe = (cpl_recipe *)plugin;
247 cpl_parameterlist_delete(recipe->parameters);
260 static int vircam_lincor_test(cpl_parameterlist *parlist,
261 cpl_frameset *framelist) {
262 const char *fctid=
"vircam_lincor";
264 int jst,jfn,status,j,ndit;
266 cpl_propertylist *pp;
270 if (framelist == NULL || cpl_frameset_get_size(framelist) <= 0) {
271 cpl_msg_error(fctid,
"Input framelist NULL or has no input data");
277 vircam_lincor_init();
281 p = cpl_parameterlist_find(parlist,
"vircam.vircam_lincor.extenum");
282 vircam_lincor_config.extenum = cpl_parameter_get_int(p);
287 cpl_msg_error(fctid,
"Cannot identify RAW and CALIB frames");
288 vircam_lincor_tidy();
296 cpl_msg_error(fctid,
"Cannot labelise the input frames");
297 vircam_lincor_tidy();
301 VIRCAM_CAL_CHANTAB)) == NULL) {
302 cpl_msg_info(fctid,
"No channel table found -- cannot continue");
303 vircam_lincor_tidy();
307 VIRCAM_TEST_SCIENCE_RAW)) == NULL) {
308 cpl_msg_info(fctid,
"No raw image found -- cannot continue");
309 vircam_lincor_tidy();
315 pp = cpl_propertylist_load(cpl_frame_get_filename(ps.img),0);
317 cpl_msg_error(fctid,
"No value for NDIT available");
318 freepropertylist(pp);
319 vircam_lincor_tidy();
322 cpl_propertylist_delete(pp);
330 if (jst == -1 || jfn == -1) {
331 cpl_msg_error(fctid,
"Unable to continue");
332 vircam_lincor_tidy();
339 for (j = jst; j <= jfn; j++) {
340 isfirst = (j == jst);
346 if (ps.img == NULL || ps.chanf == NULL) {
347 vircam_lincor_tidy();
353 cpl_msg_info(fctid,
"Doing the linearisation for extension %" CPL_SIZE_FORMAT,
356 if (status != VIR_OK) {
357 vircam_lincor_tidy();
363 cpl_msg_info(fctid,
"Saving results for extension %" CPL_SIZE_FORMAT,
365 if (vircam_lincor_save(framelist,parlist) != 0) {
366 vircam_lincor_tidy();
375 vircam_lincor_tidy();
389 static int vircam_lincor_save(cpl_frameset *framelist,
390 cpl_parameterlist *parlist) {
391 const char *recipeid =
"vircam_lincor";
392 const char *fctid =
"vircam_lincor_save";
393 const char *outfile =
"lincor.fits";
394 cpl_propertylist *plist;
403 product_frame = cpl_frame_new();
404 cpl_frame_set_filename(product_frame,outfile);
405 cpl_frame_set_tag(product_frame,VIRCAM_PRO_SIMPLE_TEST);
406 cpl_frame_set_type(product_frame,CPL_FRAME_TYPE_IMAGE);
407 cpl_frame_set_group(product_frame,CPL_FRAME_GROUP_PRODUCT);
408 cpl_frame_set_level(product_frame,CPL_FRAME_LEVEL_FINAL);
414 parlist,(
char *)recipeid,
415 "?Dictionary?",NULL,0);
419 if (cpl_image_save(NULL,outfile,CPL_TYPE_UCHAR,plist,
420 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
421 cpl_msg_error(fctid,
"Cannot save product PHU");
422 cpl_frame_delete(product_frame);
425 cpl_frameset_insert(framelist,product_frame);
435 (
char *)recipeid,
"?Dictionary?",NULL);
440 plist,CPL_IO_EXTEND) != CPL_ERROR_NONE) {
441 cpl_msg_error(fctid,
"Cannot save product image extension");
455 static void vircam_lincor_init(
void) {
470 static void vircam_lincor_tidy(
void) {
471 freespace(ps.labels);