38 #include "vircam_utils.h"
39 #include "vircam_mask.h"
40 #include "vircam_dfs.h"
41 #include "vircam_mods.h"
42 #include "vircam_fits.h"
46 static int vircam_imcombine_create(cpl_plugin *) ;
47 static int vircam_imcombine_exec(cpl_plugin *) ;
48 static int vircam_imcombine_destroy(cpl_plugin *) ;
49 static int vircam_imcombine_test(cpl_parameterlist *, cpl_frameset *) ;
50 static int vircam_imcombine_save(cpl_frameset *framelist,
51 cpl_parameterlist *parlist);
52 static void vircam_imcombine_init(
void);
53 static void vircam_imcombine_tidy(
void);
67 } vircam_imcombine_config;
72 cpl_frameset *imagelist;
79 static cpl_frame *product_frame = NULL;
81 static char vircam_imcombine_description[] =
82 "vircam_imcombine -- VIRCAM test imcombine recipe.\n\n"
83 "Combine a list of frames into a mean frame.\n\n"
84 "The program accepts the following files in the SOF:\n\n"
86 " -----------------------------------------------------------------------\n"
87 " %-21s A list of images\n"
158 int cpl_plugin_get_info(cpl_pluginlist *list) {
159 cpl_recipe *recipe = cpl_calloc(1,
sizeof(*recipe));
160 cpl_plugin *plugin = &recipe->interface;
161 char alldesc[SZ_ALLDESC];
162 (void)snprintf(alldesc,SZ_ALLDESC,vircam_imcombine_description,
163 VIRCAM_TEST_SCIENCE_RAW);
165 cpl_plugin_init(plugin,
167 VIRCAM_BINARY_VERSION,
168 CPL_PLUGIN_TYPE_RECIPE,
170 "VIRCAM test image combination recipe [test]",
175 vircam_imcombine_create,
176 vircam_imcombine_exec,
177 vircam_imcombine_destroy);
179 cpl_pluginlist_append(list,plugin);
195 static int vircam_imcombine_create(cpl_plugin *plugin) {
201 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
202 recipe = (cpl_recipe *)plugin;
208 recipe->parameters = cpl_parameterlist_new();
212 p = cpl_parameter_new_range(
"vircam.vircam_imcombine.combtype",
214 "1 == Median,\n 2 == Mean",
215 "vircam.vircam_imcombine",
217 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"comb");
218 cpl_parameterlist_append(recipe->parameters,p);
222 p = cpl_parameter_new_range(
"vircam.vircam_imcombine.scaletype",
224 "0 == none,\n 1 == additive offset,\n 2 == multiplicative offset,\n 3 == exposure time scaling + additive offset",
225 "vircam.vircam_imcombine",
227 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"scale");
228 cpl_parameterlist_append(recipe->parameters,p);
232 p = cpl_parameter_new_value(
"vircam.vircam_imcombine.xrej",
234 "True if using extra rejection cycle",
235 "vircam.vircam_imcombine",
237 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"xrej");
238 cpl_parameterlist_append(recipe->parameters,p);
242 p = cpl_parameter_new_value(
"vircam.vircam_imcombine.thresh",
244 "Rejection threshold in sigma above background",
245 "vircam.vircam_imcombine",5.0);
246 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"thr");
247 cpl_parameterlist_append(recipe->parameters,p);
251 p = cpl_parameter_new_range(
"vircam.vircam_imcombine.extenum",
253 "Extension number to be done, 0 == all",
254 "vircam.vircam_imcombine",
256 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ext");
257 cpl_parameterlist_append(recipe->parameters,p);
273 static int vircam_imcombine_exec(cpl_plugin *plugin) {
278 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
279 recipe = (cpl_recipe *)plugin;
283 return(vircam_imcombine_test(recipe->parameters,recipe->frames));
294 static int vircam_imcombine_destroy(cpl_plugin *plugin) {
299 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
300 recipe = (cpl_recipe *)plugin;
304 cpl_parameterlist_delete(recipe->parameters);
317 static int vircam_imcombine_test(cpl_parameterlist *parlist,
318 cpl_frameset *framelist) {
319 const char *fctid=
"vircam_imcombine";
320 int j,jst,jfn,retval,status;
323 unsigned char *rejmask,*rejplus;
324 cpl_propertylist *drs;
328 if (framelist == NULL || cpl_frameset_get_size(framelist) <= 0) {
329 cpl_msg_error(fctid,
"Input framelist NULL or has no input data");
335 vircam_imcombine_init();
339 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcombine.combtype");
340 vircam_imcombine_config.combtype = cpl_parameter_get_int(p);
341 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcombine.scaletype");
342 vircam_imcombine_config.scaletype = cpl_parameter_get_int(p);
343 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcombine.xrej");
344 vircam_imcombine_config.xrej = cpl_parameter_get_bool(p);
345 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcombine.thresh");
346 vircam_imcombine_config.thresh = (float)cpl_parameter_get_double(p);
347 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcombine.extenum");
348 vircam_imcombine_config.extenum = cpl_parameter_get_int(p);
353 cpl_msg_error(fctid,
"Cannot identify RAW and CALIB frames");
354 vircam_imcombine_tidy();
362 cpl_msg_error(fctid,
"Cannot labelise the input frames");
363 vircam_imcombine_tidy();
367 VIRCAM_TEST_SCIENCE_RAW)) == NULL) {
368 cpl_msg_error(fctid,
"Cannot find images in input frameset");
369 vircam_imcombine_tidy();
372 ps.nimages = cpl_frameset_get_size(ps.imagelist);
379 (
const cpl_frame *)cpl_frameset_get_frame(ps.imagelist,0),
381 if (jst == -1 || jfn == -1) {
382 cpl_msg_error(fctid,
"Unable to continue");
383 vircam_imcombine_tidy();
390 for (j = jst; j <= jfn; j++) {
391 isfirst = (j == jst);
399 cpl_msg_info(fctid,
"Doing combination for extension %" CPL_SIZE_FORMAT,
402 vircam_imcombine_config.combtype,
403 vircam_imcombine_config.scaletype,
404 vircam_imcombine_config.xrej,
405 vircam_imcombine_config.thresh,
406 &(ps.outimage),&rejmask,&rejplus,&drs,&status);
409 freepropertylist(drs);
410 if (status != VIR_OK) {
411 vircam_imcombine_tidy();
417 cpl_msg_info(fctid,
"Saving combined image extension %" CPL_SIZE_FORMAT,
419 retval = vircam_imcombine_save(framelist,parlist);
421 vircam_imcombine_tidy();
424 freefitslist(ps.images,ps.nimages);
425 freeimage(ps.outimage);
427 vircam_imcombine_tidy();
441 static int vircam_imcombine_save(cpl_frameset *framelist,
442 cpl_parameterlist *parlist) {
443 cpl_propertylist *plist;
444 const char *recipeid =
"vircam_imcombine";
445 const char *fctid =
"vircam_imcombine_save";
446 const char *outfile =
"comb.fits";
455 product_frame = cpl_frame_new();
456 cpl_frame_set_filename(product_frame,outfile);
457 cpl_frame_set_tag(product_frame,VIRCAM_PRO_SIMPLE_TEST);
458 cpl_frame_set_type(product_frame,CPL_FRAME_TYPE_IMAGE);
459 cpl_frame_set_group(product_frame,CPL_FRAME_GROUP_PRODUCT);
460 cpl_frame_set_level(product_frame,CPL_FRAME_LEVEL_FINAL);
466 parlist,(
char *)recipeid,
467 "?Dictionary?",NULL,0);
470 if (cpl_image_save(NULL,outfile,CPL_TYPE_UCHAR,plist,
471 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
472 cpl_msg_error(fctid,
"Cannot save product PHU");
473 cpl_frame_delete(product_frame);
476 cpl_frameset_insert(framelist,product_frame);
486 parlist,(
char *)recipeid,
487 "?Dictionary?",NULL);
491 if (cpl_image_save(ps.outimage,outfile,CPL_TYPE_FLOAT,plist,
492 CPL_IO_EXTEND) != CPL_ERROR_NONE) {
493 cpl_msg_error(fctid,
"Cannot save product image extension");
508 static void vircam_imcombine_init(
void) {
521 static void vircam_imcombine_tidy(
void) {
522 freespace(ps.labels);
523 freeframeset(ps.imagelist);
524 freefitslist(ps.images,ps.nimages);
525 freeimage(ps.outimage);