37 #include <casu_utils.h>
38 #include <casu_mods.h>
39 #include <catalogue/imcore.h>
41 #include "vircam_utils.h"
42 #include "vircam_dfs.h"
43 #include "vircam_mods.h"
44 #include "vircam_pfits.h"
48 static int vircam_imcore_create(cpl_plugin *) ;
49 static int vircam_imcore_exec(cpl_plugin *) ;
50 static int vircam_imcore_destroy(cpl_plugin *) ;
51 static int vircam_imcore_test(cpl_parameterlist *, cpl_frameset *) ;
52 static int vircam_imcore_save(cpl_frameset *framelist,
53 cpl_parameterlist *parlist);
54 static void vircam_imcore_init(
void);
55 static void vircam_imcore_tidy(
void);
77 } vircam_imcore_config ;
89 static cpl_frame *product_frame = NULL;
91 #define BUZZ_OFF {vircam_imcore_tidy(); return(-1);}
93 static char vircam_imcore_description[] =
94 "vircam_imcore -- VIRCAM catalogue generation recipe.\n\n"
95 "Extract objects from an image and write the catalogue to a FITS table.\n\n"
96 "If more than one file of each type is specified in the SOF only the \n"
97 "first will be used and the rest will be ingored\n"
98 "The program requires the following files in the SOF:\n\n"
100 " -----------------------------------------------------------------------\n"
101 " %-21s An input image\n"
102 " %-21s A master confidence maps\n"
169 int cpl_plugin_get_info(cpl_pluginlist *list) {
170 cpl_recipe *recipe = cpl_calloc(1,
sizeof(*recipe));
171 cpl_plugin *plugin = &recipe->interface;
172 char alldesc[SZ_ALLDESC];
173 (void)snprintf(alldesc,SZ_ALLDESC,vircam_imcore_description,
174 VIRCAM_TEST_SCIENCE_RAW,VIRCAM_CAL_CONF);
177 cpl_plugin_init(plugin,
179 VIRCAM_BINARY_VERSION,
180 CPL_PLUGIN_TYPE_RECIPE,
182 "VIRCAM recipe to extract objects from a frame [test]",
187 vircam_imcore_create,
189 vircam_imcore_destroy);
191 cpl_pluginlist_append(list,plugin);
208 static int vircam_imcore_create(cpl_plugin *plugin) {
214 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
215 recipe = (cpl_recipe *)plugin;
221 recipe->parameters = cpl_parameterlist_new();
225 p = cpl_parameter_new_value(
"vircam.vircam_imcore.ipix",
227 "Minimum pixel area for each detected object",
228 "vircam.vircam_imcore",5);
229 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ipix");
230 cpl_parameterlist_append(recipe->parameters,p);
234 p = cpl_parameter_new_value(
"vircam.vircam_imcore.thresh",
236 "Detection threshold in sigma above sky",
237 "vircam.vircam_imcore",2.0);
238 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"thr");
239 cpl_parameterlist_append(recipe->parameters,p);
243 p = cpl_parameter_new_value(
"vircam.vircam_imcore.icrowd",
244 CPL_TYPE_BOOL,
"Use deblending?",
245 "vircam.vircam_imcore",0);
246 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"icrowd");
247 cpl_parameterlist_append(recipe->parameters,p);
251 p = cpl_parameter_new_value(
"vircam.vircam_imcore.rcore",
252 CPL_TYPE_DOUBLE,
"Value of Rcore in pixels",
253 "vircam.vircam_imcore",4.0);
254 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"rcore");
255 cpl_parameterlist_append(recipe->parameters,p);
259 p = cpl_parameter_new_value(
"vircam.vircam_imcore.nbsize",
260 CPL_TYPE_INT,
"Background smoothing box size",
261 "vircam.vircam_imcore",64);
262 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"nb");
263 cpl_parameterlist_append(recipe->parameters,p);
267 p = cpl_parameter_new_value(
"vircam.vircam_imcore.filtfwhm",
269 "FWHM of smoothing kernel in pixels",
270 "vircam.vircam_imcore",2.0);
271 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"filtfwhm");
272 cpl_parameterlist_append(recipe->parameters,p);
276 p = cpl_parameter_new_enum(
"vircam.vircam_imcore.cattype",
277 CPL_TYPE_INT,
"Catalogue type",
278 "vircam.vircam_imcore",2,5,1,2,3,4,6);
279 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"cattype");
280 cpl_parameterlist_append(recipe->parameters,p);
284 p = cpl_parameter_new_range(
"vircam.vircam_imcore.extenum",
286 "Extension number to be done, 0 == all",
287 "vircam.vircam_imcore",
289 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ext");
290 cpl_parameterlist_append(recipe->parameters,p);
305 static int vircam_imcore_destroy(cpl_plugin *plugin) {
310 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
311 recipe = (cpl_recipe *)plugin;
315 cpl_parameterlist_delete(recipe->parameters);
327 static int vircam_imcore_exec(cpl_plugin *plugin) {
332 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
333 recipe = (cpl_recipe *)plugin;
337 return(vircam_imcore_test(recipe->parameters,recipe->frames));
349 static int vircam_imcore_test(cpl_parameterlist *parlist,
350 cpl_frameset *framelist) {
351 const char *fctid=
"vircam_imcore";
353 int j,jst,jfn,retval,ipix,icrowd,nbsize,mcattype,status;
355 float thresh,rcore,filtfwhm,gain;
359 vircam_imcore_init();
363 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcore.ipix");
364 vircam_imcore_config.ipix = cpl_parameter_get_int(p);
365 ipix = vircam_imcore_config.ipix;
366 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcore.thresh");
367 vircam_imcore_config.threshold = (float)cpl_parameter_get_double(p);
368 thresh = vircam_imcore_config.threshold;
369 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcore.icrowd");
370 vircam_imcore_config.icrowd = cpl_parameter_get_bool(p);
371 icrowd = vircam_imcore_config.icrowd;
372 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcore.rcore");
373 vircam_imcore_config.rcore = (float)cpl_parameter_get_double(p);
374 rcore = vircam_imcore_config.rcore;
375 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcore.filtfwhm");
376 vircam_imcore_config.filtfwhm = (float)cpl_parameter_get_double(p);
377 filtfwhm = vircam_imcore_config.filtfwhm;
378 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcore.nbsize");
379 vircam_imcore_config.nbsize = cpl_parameter_get_int(p);
380 nbsize = vircam_imcore_config.nbsize;
381 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcore.cattype");
382 vircam_imcore_config.cattype = cpl_parameter_get_int(p);
383 mcattype = vircam_imcore_config.cattype;
384 p = cpl_parameterlist_find(parlist,
"vircam.vircam_imcore.extenum");
385 vircam_imcore_config.extenum = cpl_parameter_get_int(p);
390 cpl_msg_error(fctid,
"Cannot identify RAW and CALIB frames");
391 vircam_imcore_tidy();
399 cpl_msg_error(fctid,
"Cannot labelise the input frameset");
403 VIRCAM_TEST_SCIENCE_RAW)) == NULL) {
404 cpl_msg_error(fctid,
"Cannot find any image frames in input frameset");
408 VIRCAM_CAL_CONF)) == NULL) {
409 cpl_msg_info(fctid,
"No confidence map specified. Proceding without one");
417 if (jst == -1 || jfn == -1) {
418 cpl_msg_error(fctid,
"Unable to continue");
419 vircam_imcore_tidy();
422 for (j = jst; j <= jfn; j++) {
423 cpl_msg_info(fctid,
"Processing extension %" CPL_SIZE_FORMAT,
426 isfirst = (j == jst);
431 if (ps.imgf == NULL) {
432 vircam_imcore_tidy();
441 (void)
casu_imcore(ps.imgf,ps.conff,ipix,thresh,icrowd,rcore,
442 nbsize,mcattype,filtfwhm,&(ps.outcat),gain,&status);
443 if (status != CASU_OK) {
444 cpl_msg_error(fctid,
"Error extracting objects in extension %" CPL_SIZE_FORMAT,
454 retval = vircam_imcore_save(framelist,parlist);
456 cpl_msg_error(fctid,
"Error saving products in extension %" CPL_SIZE_FORMAT,
463 freetfits(ps.outcat);
467 vircam_imcore_tidy();
480 static int vircam_imcore_save(cpl_frameset *framelist,
481 cpl_parameterlist *parlist) {
482 const char *recipeid =
"vircam_imcore";
483 const char *fctid =
"vircam_imcore_save";
484 const char *outfile =
"imcoretab.fits";
485 cpl_propertylist *elist,*plist;
493 product_frame = cpl_frame_new();
494 cpl_frame_set_filename(product_frame,outfile);
495 cpl_frame_set_tag(product_frame,VIRCAM_PRO_OBJCAT_TEST);
496 cpl_frame_set_type(product_frame,CPL_FRAME_TYPE_TABLE);
497 cpl_frame_set_group(product_frame,CPL_FRAME_GROUP_PRODUCT);
498 cpl_frame_set_level(product_frame,CPL_FRAME_LEVEL_FINAL);
504 parlist,(
char *)recipeid,
505 "?Dictionary?",NULL,0);
511 parlist,(
char *)recipeid,
512 "?Dictionary?",NULL);
517 outfile,CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
518 cpl_msg_error(fctid,
"Cannot save product table");
519 cpl_frame_delete(product_frame);
522 cpl_frameset_insert(framelist,product_frame);
532 parlist,(
char *)recipeid,
533 "?Dictionary?",NULL);
538 outfile,CPL_IO_EXTEND) != CPL_ERROR_NONE) {
539 cpl_msg_error(fctid,
"Cannot save product table");
553 static void vircam_imcore_init(
void) {
568 static void vircam_imcore_tidy(
void) {
569 freespace(ps.labels);
574 freetfits(ps.outcat);
casu_fits * casu_fits_load(cpl_frame *frame, cpl_type type, int nexten)
cpl_propertylist * casu_fits_get_phu(casu_fits *p)
cpl_propertylist * casu_fits_get_ehu(casu_fits *p)
int casu_imcore(casu_fits *infile, casu_fits *conf, int ipix, float threshold, int icrowd, float rcore, int nbsize, int cattype, float filtfwhm, casu_tfits **outtab, float gainloc, int *status)
Generate object catalogues from input images.
cpl_table * casu_tfits_get_table(casu_tfits *p)
cpl_propertylist * casu_tfits_get_phu(casu_tfits *p)
cpl_propertylist * casu_tfits_get_ehu(casu_tfits *p)
casu_tfits * casu_tfits_wrap(cpl_table *tab, casu_tfits *model, cpl_propertylist *phu, cpl_propertylist *ehu)
cpl_frame * casu_frameset_subgroup_1(cpl_frameset *frameset, cpl_size *labels, cpl_size nlab, const char *tag)
Extract a frame of a given label from a frameset.
int casu_compare_tags(const cpl_frame *frame1, const cpl_frame *frame2)
Compare input tags.
cpl_table * casu_dummy_catalogue(int type)
Create a dummy catalogue of a given type with no rows.
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)
int vircam_pfits_get_gain(const cpl_propertylist *plist, float *gain)
Get the value of the detector gain.
const char * vircam_get_license(void)
void vircam_exten_range(int inexten, const cpl_frame *fr, int *out1, int *out2)