38 #include <casu_utils.h>
39 #include <casu_mods.h>
40 #include <casu_mask.h>
42 #include "vircam_utils.h"
43 #include "vircam_dfs.h"
44 #include "vircam_mods.h"
48 static int vircam_imcombine_create(cpl_plugin *) ;
49 static int vircam_imcombine_exec(cpl_plugin *) ;
50 static int vircam_imcombine_destroy(cpl_plugin *) ;
51 static int vircam_imcombine_test(cpl_parameterlist *, cpl_frameset *) ;
52 static int vircam_imcombine_save(cpl_frameset *framelist,
53 cpl_parameterlist *parlist);
54 static void vircam_imcombine_init(
void);
55 static void vircam_imcombine_tidy(
void);
69 } vircam_imcombine_config;
74 cpl_frameset *imagelist;
81 static cpl_frame *product_frame = NULL;
83 static char vircam_imcombine_description[] =
84 "vircam_imcombine -- VIRCAM test imcombine recipe.\n\n"
85 "Combine a list of frames into a mean frame.\n\n"
86 "The program accepts the following files in the SOF:\n\n"
88 " -----------------------------------------------------------------------\n"
89 " %-21s A list of images\n"
160 int cpl_plugin_get_info(cpl_pluginlist *list) {
161 cpl_recipe *recipe = cpl_calloc(1,
sizeof(*recipe));
162 cpl_plugin *plugin = &recipe->interface;
163 char alldesc[SZ_ALLDESC];
164 (void)snprintf(alldesc,SZ_ALLDESC,vircam_imcombine_description,
165 VIRCAM_TEST_SCIENCE_RAW);
167 cpl_plugin_init(plugin,
169 VIRCAM_BINARY_VERSION,
170 CPL_PLUGIN_TYPE_RECIPE,
172 "VIRCAM test image combination recipe [test]",
177 vircam_imcombine_create,
178 vircam_imcombine_exec,
179 vircam_imcombine_destroy);
181 cpl_pluginlist_append(list,plugin);
197 static int vircam_imcombine_create(cpl_plugin *plugin) {
203 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
204 recipe = (cpl_recipe *)plugin;
210 recipe->parameters = cpl_parameterlist_new();
214 p = cpl_parameter_new_range(
"vircam.vircam_imcombine.combtype",
216 "1 == Median,\n 2 == Mean",
217 "vircam.vircam_imcombine",
219 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"comb");
220 cpl_parameterlist_append(recipe->parameters,p);
224 p = cpl_parameter_new_range(
"vircam.vircam_imcombine.scaletype",
226 "0 == none,\n 1 == additive offset,\n 2 == multiplicative offset,\n 3 == exposure time scaling + additive offset",
227 "vircam.vircam_imcombine",
229 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"scale");
230 cpl_parameterlist_append(recipe->parameters,p);
234 p = cpl_parameter_new_value(
"vircam.vircam_imcombine.xrej",
236 "True if using extra rejection cycle",
237 "vircam.vircam_imcombine",
239 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"xrej");
240 cpl_parameterlist_append(recipe->parameters,p);
244 p = cpl_parameter_new_value(
"vircam.vircam_imcombine.thresh",
246 "Rejection threshold in sigma above background",
247 "vircam.vircam_imcombine",5.0);
248 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"thr");
249 cpl_parameterlist_append(recipe->parameters,p);
253 p = cpl_parameter_new_range(
"vircam.vircam_imcombine.extenum",
255 "Extension number to be done, 0 == all",
256 "vircam.vircam_imcombine",
258 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ext");
259 cpl_parameterlist_append(recipe->parameters,p);
275 static int vircam_imcombine_exec(cpl_plugin *plugin) {
280 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
281 recipe = (cpl_recipe *)plugin;
285 return(vircam_imcombine_test(recipe->parameters,recipe->frames));
296 static int vircam_imcombine_destroy(cpl_plugin *plugin) {
301 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
302 recipe = (cpl_recipe *)plugin;
306 cpl_parameterlist_delete(recipe->parameters);
319 static int vircam_imcombine_test(cpl_parameterlist *parlist,
320 cpl_frameset *framelist) {
321 const char *fctid=
"vircam_imcombine";
322 int j,jst,jfn,retval,status;
325 unsigned char *rejmask,*rejplus;
326 cpl_propertylist *drs;
330 if (framelist == NULL || cpl_frameset_get_size(framelist) <= 0) {
331 cpl_msg_error(fctid,
"Input framelist NULL or has no input data");
337 vircam_imcombine_init();
341 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcombine.combtype");
342 vircam_imcombine_config.combtype = cpl_parameter_get_int(p);
343 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcombine.scaletype");
344 vircam_imcombine_config.scaletype = cpl_parameter_get_int(p);
345 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcombine.xrej");
346 vircam_imcombine_config.xrej = cpl_parameter_get_bool(p);
347 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcombine.thresh");
348 vircam_imcombine_config.thresh = (float)cpl_parameter_get_double(p);
349 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcombine.extenum");
350 vircam_imcombine_config.extenum = cpl_parameter_get_int(p);
355 cpl_msg_error(fctid,
"Cannot identify RAW and CALIB frames");
356 vircam_imcombine_tidy();
364 cpl_msg_error(fctid,
"Cannot labelise the input frames");
365 vircam_imcombine_tidy();
369 VIRCAM_TEST_SCIENCE_RAW)) == NULL) {
370 cpl_msg_error(fctid,
"Cannot find images in input frameset");
371 vircam_imcombine_tidy();
374 ps.nimages = cpl_frameset_get_size(ps.imagelist);
381 (
const cpl_frame *)cpl_frameset_get_position(ps.imagelist,0),
383 if (jst == -1 || jfn == -1) {
384 cpl_msg_error(fctid,
"Unable to continue");
385 vircam_imcombine_tidy();
392 for (j = jst; j <= jfn; j++) {
393 isfirst = (j == jst);
401 cpl_msg_info(fctid,
"Doing combination for extension %" CPL_SIZE_FORMAT,
404 vircam_imcombine_config.combtype,
405 vircam_imcombine_config.scaletype,
406 vircam_imcombine_config.xrej,
407 vircam_imcombine_config.thresh,
"EXPTIME",
408 &(ps.outimage),NULL,&rejmask,&rejplus,
412 freepropertylist(drs);
413 if (status != CASU_OK) {
414 vircam_imcombine_tidy();
420 cpl_msg_info(fctid,
"Saving combined image extension %" CPL_SIZE_FORMAT,
422 retval = vircam_imcombine_save(framelist,parlist);
424 vircam_imcombine_tidy();
427 freefitslist(ps.images,ps.nimages);
428 freeimage(ps.outimage);
430 vircam_imcombine_tidy();
444 static int vircam_imcombine_save(cpl_frameset *framelist,
445 cpl_parameterlist *parlist) {
446 cpl_propertylist *plist;
447 const char *recipeid =
"vircam_imcombine";
448 const char *fctid =
"vircam_imcombine_save";
449 const char *outfile =
"comb.fits";
458 product_frame = cpl_frame_new();
459 cpl_frame_set_filename(product_frame,outfile);
460 cpl_frame_set_tag(product_frame,VIRCAM_PRO_SIMPLE_TEST);
461 cpl_frame_set_type(product_frame,CPL_FRAME_TYPE_IMAGE);
462 cpl_frame_set_group(product_frame,CPL_FRAME_GROUP_PRODUCT);
463 cpl_frame_set_level(product_frame,CPL_FRAME_LEVEL_FINAL);
469 parlist,(
char *)recipeid,
470 "?Dictionary?",NULL,0);
473 if (cpl_image_save(NULL,outfile,CPL_TYPE_UCHAR,plist,
474 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
475 cpl_msg_error(fctid,
"Cannot save product PHU");
476 cpl_frame_delete(product_frame);
479 cpl_frameset_insert(framelist,product_frame);
489 parlist,(
char *)recipeid,
490 "?Dictionary?",NULL);
494 if (cpl_image_save(ps.outimage,outfile,CPL_TYPE_FLOAT,plist,
495 CPL_IO_EXTEND) != CPL_ERROR_NONE) {
496 cpl_msg_error(fctid,
"Cannot save product image extension");
511 static void vircam_imcombine_init(
void) {
524 static void vircam_imcombine_tidy(
void) {
525 freespace(ps.labels);
526 freeframeset(ps.imagelist);
527 freefitslist(ps.images,ps.nimages);
528 freeimage(ps.outimage);
casu_fits ** casu_fits_load_list(cpl_frameset *f, cpl_type type, int exten)
cpl_propertylist * casu_fits_get_phu(casu_fits *p)
cpl_propertylist * casu_fits_get_ehu(casu_fits *p)
int casu_imcombine(casu_fits **fset, casu_fits **fsetv, int nfits, int combtype, int scaletype, int xrej, float thresh, const char *expkey, cpl_image **outimage, cpl_image **outvimage, unsigned char **rejmask, unsigned char **rejplus, cpl_propertylist **drs, int *status)
Stack images into a mean or median image with rejection.
int casu_compare_tags(const cpl_frame *frame1, const cpl_frame *frame2)
Compare input tags.
cpl_frameset * casu_frameset_subgroup(cpl_frameset *frameset, cpl_size *labels, cpl_size nlab, const char *tag)
Extract a frameset from another frameset.
int vircam_dfs_set_groups(cpl_frameset *set)
void vircam_dfs_set_product_primary_header(cpl_propertylist *plist, cpl_frame *frame, cpl_frameset *frameset, cpl_parameterlist *parlist, char *recipeid, const char *dict, cpl_frame *inherit, int synch)
void vircam_dfs_set_product_exten_header(cpl_propertylist *plist, cpl_frame *frame, cpl_frameset *frameset, cpl_parameterlist *parlist, char *recipeid, const char *dict, cpl_frame *inherit)
const char * vircam_get_license(void)
void vircam_exten_range(int inexten, const cpl_frame *fr, int *out1, int *out2)