30 #define _XOPEN_SOURCE 600
33 #include "visir_recipe.h"
35 #include "visir_utils.h"
36 #include "irplib_utils.h"
44 int visir_util_repack_get_info(cpl_pluginlist *);
45 int visir_util_detect_shift_get_info(cpl_pluginlist *);
46 int visir_util_clip_get_info(cpl_pluginlist *);
47 int visir_util_run_swarp_get_info(cpl_pluginlist *);
48 int visir_util_qc_get_info(cpl_pluginlist *);
49 int visir_old_img_phot_get_info(cpl_pluginlist *);
50 int visir_util_join_get_info(cpl_pluginlist *);
51 static cpl_error_code visir_img_reduce_fill_parameterlist(cpl_parameterlist *);
52 static int visir_img_reduce(cpl_frameset *,
53 const cpl_parameterlist *);
60 #define RECIPE_STRING "visir_img_reduce"
61 #define DEFAULT_CONFIG VISIR_CONFIG_PATH "/visir_default.swarp"
69 static int visir_img_reduce_create(cpl_plugin * plugin)
71 cpl_recipe * recipe = (cpl_recipe *)plugin;
72 cpl_errorstate prestate = cpl_errorstate_get();
76 return cpl_recipedefine_create(plugin)
77 || cpl_recipedefine_create_is_ok(prestate,
78 visir_img_reduce_fill_parameterlist(recipe->parameters))
79 ? (int)cpl_error_set_where(cpl_func) : 0;
97 static int visir_img_reduce_exec(cpl_plugin * plugin)
99 char * progname = getenv(
"_");
100 char * classpath = getenv(
"CLASSPATH");
101 cpl_msg_debug(cpl_func,
"Program name: %s", progname);
102 cpl_msg_debug(cpl_func,
"CLASSPATH: %s", classpath);
103 if ((progname && strstr(progname,
"gasgano")) ||
104 (classpath && strstr(classpath,
"gasgano.jar"))) {
105 cpl_msg_info(cpl_func,
"Running under gasgano, disabling OpenMP");
106 setenv(
"OMP_NUM_THREADS",
"0", 1);
107 return visir_tmpdir_exec(RECIPE_STRING, plugin, visir_img_reduce);
109 else if (getenv(
"VISIR_NO_FORK") != NULL) {
111 return cpl_recipedefine_exec(plugin, visir_img_reduce)
112 ? (int)cpl_error_set_where(cpl_func) : 0;
115 return visir_forking_exec(RECIPE_STRING, plugin, visir_img_reduce);
120 static int visir_img_reduce_destroy(cpl_plugin * plugin)
123 return cpl_recipedefine_destroy(plugin)
124 ? (int)cpl_error_set_where(cpl_func) : 0;
127 int cpl_plugin_get_info(cpl_pluginlist * list)
130 return cpl_recipedefine_init(list, CPL_VERSION_CODE,
131 VISIR_BINARY_VERSION,
133 "Combines a stack of chopped, jittered and/or "
134 "nodded exposures and can compute the "
135 "sensitivity for standard star observations",
136 "This recipe recombines the data observed in "
137 "chopping/nodding or\n"
138 "chopping or nodding modes into one combined image using "
140 "cross-correlation methods.\n"
141 "The files listed in the Set Of Frames (sof-file) "
143 "VISIR-observation-file.fits " VISIR_IMG_COMBINE_CNJ
" or\n"
144 "VISIR-observation-file.fits " VISIR_IMG_COMBINE_CJ
" or\n"
145 "VISIR-observation-file.fits " VISIR_IMG_COMBINE_NJ
" or\n"
146 "VISIR-observation-file.fits " VISIR_IMG_COMBINE_DJ
" or\n"
147 "VISIR-observation-file.fits BURST\n"
148 "VISIR-Standard-star-catalog " VISIR_CALIB_STDSTAR_IMG
" (optional)\n"
149 "VISIR-linearty-table.fits "VISIR_CALIB_LIN
" (optional)"
150 MAN_VISIR_CALIB_BPM_IMG,
152 "jtaylor@partner.eso.org",
153 cpl_get_license(PACKAGE_NAME,
"2015"),
154 visir_img_reduce_create,
155 visir_img_reduce_exec,
156 visir_img_reduce_destroy)
157 ? ((void)cpl_error_set_where(cpl_func), 1) : 0;
190 static cpl_error_code
191 visir_img_reduce_fill_parameterlist(cpl_parameterlist *
self)
193 cpl_pluginlist * plugins = cpl_pluginlist_new();
194 const char * context = PACKAGE
".visir_img_reduce";
196 cpl_recipe * repack = visir_init_recipe(
"visir_util_repack",
197 &visir_util_repack_get_info,
199 cpl_recipe * shift = visir_init_recipe(
"visir_util_detect_shift",
200 &visir_util_detect_shift_get_info,
202 cpl_recipe * clip = visir_init_recipe(
"visir_util_clip",
203 &visir_util_clip_get_info,
205 cpl_recipe * swarp = visir_init_recipe(
"visir_util_run_swarp",
206 &visir_util_run_swarp_get_info,
208 cpl_recipe * phot = visir_init_recipe(
"visir_old_img_phot",
209 &visir_old_img_phot_get_info,
212 cpl_plugin_get_init(&repack->interface)(&repack->interface);
213 cpl_plugin_get_init(&shift->interface)(&shift->interface);
214 cpl_plugin_get_init(&clip->interface)(&clip->interface);
215 cpl_plugin_get_init(&swarp->interface)(&swarp->interface);
216 cpl_plugin_get_init(&phot->interface)(&phot->interface);
217 cpl_parameterlist * repack_par = repack->parameters;
218 cpl_parameterlist * clip_par = clip->parameters;
219 cpl_parameterlist * shift_par = shift->parameters;
220 cpl_parameterlist * swarp_par = swarp->parameters;
221 cpl_parameterlist * phot_par = phot->parameters;
224 for (cpl_parameter * p = cpl_parameterlist_get_first(repack_par);
225 p != NULL; p = cpl_parameterlist_get_next(repack_par)) {
226 const char * name = cpl_parameter_get_name(p);
227 if (strstr(name,
"bkgcorrect"))
229 if (strstr(name,
"normalize"))
231 if (strstr(name,
"compress"))
233 cpl_parameterlist_append(
self, visir_parameter_duplicate(p));
238 for (cpl_parameter * p = cpl_parameterlist_get_first(shift_par);
239 p != NULL; p = cpl_parameterlist_get_next(shift_par)) {
240 cpl_parameterlist_append(
self, visir_parameter_duplicate(p));
245 for (cpl_parameter * p = cpl_parameterlist_get_first(clip_par);
246 p != NULL; p = cpl_parameterlist_get_next(clip_par)) {
247 const char * name = cpl_parameter_get_name(p);
248 if (strstr(name,
"error-out-type"))
250 cpl_parameterlist_append(
self, visir_parameter_duplicate(p));
255 for (cpl_parameter * p = cpl_parameterlist_get_first(swarp_par);
256 p != NULL; p = cpl_parameterlist_get_next(swarp_par)) {
257 cpl_parameterlist_append(
self, visir_parameter_duplicate(p));
262 for (cpl_parameter * p = cpl_parameterlist_get_first(phot_par);
263 p != NULL; p = cpl_parameterlist_get_next(phot_par)) {
264 const char * name = cpl_parameter_get_name(p);
265 if (strstr(name,
"jy_val") || strstr(name,
"radii"))
266 cpl_parameterlist_append(
self, visir_parameter_duplicate(p));
269 skip_if(irplib_parameterlist_set_bool(
self, PACKAGE, RECIPE_STRING,
270 "delete-temp", CPL_TRUE, NULL,
271 context,
"Delete temporary files "
272 "created during processing"));
275 cpl_parameterlist_delete(repack->parameters);
276 cpl_parameterlist_delete(shift->parameters);
277 cpl_parameterlist_delete(clip->parameters);
278 cpl_parameterlist_delete(swarp->parameters);
279 cpl_parameterlist_delete(phot->parameters);
280 cpl_plugin_delete(&repack->interface);
281 cpl_plugin_delete(&shift->interface);
282 cpl_plugin_delete(&clip->interface);
283 cpl_plugin_delete(&swarp->interface);
284 cpl_plugin_delete(&phot->interface);
285 cpl_pluginlist_delete(plugins);
287 return cpl_error_get_code();
290 static cpl_error_code
291 util_repack_set_parameters(cpl_parameterlist * rec_pars,
292 const cpl_parameterlist * chain_pars)
296 skip_if(visir_copy_parameters(rec_pars, chain_pars));
298 par = cpl_parameterlist_find(rec_pars, PACKAGE
".visir_util_repack.bkgcorrect");
301 cpl_parameter_set_string(par,
"chopnod");
303 par = cpl_parameterlist_find(rec_pars, PACKAGE
".visir_util_repack.normalize");
306 cpl_parameter_set_bool(par, CPL_TRUE);
308 par = cpl_parameterlist_find(rec_pars, PACKAGE
".visir_util_repack.compress");
311 cpl_parameter_set_bool(par, CPL_TRUE);
315 return cpl_error_get_code();
319 static cpl_error_code
322 int ret = system(VISIR_SWARP_BIN
" -v > /dev/null 2>/dev/null");
324 cpl_error_set_message(cpl_func, CPL_ERROR_UNSUPPORTED_MODE,
325 "swarp not found in PATH");
326 return CPL_ERROR_UNSUPPORTED_MODE;
328 return CPL_ERROR_NONE;
333 run_phot(cpl_recipe * phot, cpl_frameset *photset,
334 const cpl_parameterlist * parlist,
335 cpl_frame * imgf_, cpl_frame * wgtf_,
339 cpl_frame * imgf = cpl_frame_duplicate(imgf_);
340 cpl_frame * wgtf = cpl_frame_duplicate(wgtf_);
341 cpl_frame * qcf = cpl_frame_duplicate(qcf_);
342 cpl_frame * res = NULL;
347 cpl_frame_set_tag(imgf,
"IM_CAL_PHOT_PREPROCESSED");
348 cpl_frameset_insert(photset, imgf);
349 cpl_frame_set_tag(wgtf, VISIR_UTIL_WEIGHT_MAP_PROCATG);
350 cpl_frameset_insert(photset, wgtf);
351 cpl_frame_set_group(qcf, CPL_FRAME_GROUP_RAW);
352 cpl_frame_set_tag(qcf, VISIR_UTIL_QC_PROCATG);
353 cpl_frameset_insert(photset, qcf);
355 skip_if(visir_run_recipe(phot, photset, parlist, &visir_copy_parameters));
356 res = cpl_frameset_find(photset, VISIR_IMG_PHOT_COMBINED_PROCATG);
358 res = cpl_frameset_find(photset, VISIR_IMG_PHOT_ONEBEAM_PROCATG);
360 sprintf(buffer,
"visir_img_phot_%03d.fits", idx);
361 skip_if(rename(cpl_frame_get_filename(res), buffer) == -1);
362 cpl_frame_set_filename(res, buffer);
377 static int visir_img_reduce(cpl_frameset * framelist,
378 const cpl_parameterlist * parlist)
380 cpl_errorstate cleanstate = cpl_errorstate_get();
381 cpl_frameset * repackset = cpl_frameset_new();
382 cpl_frameset * photset = cpl_frameset_new();
383 cpl_recipe * repack = NULL;
384 cpl_recipe * shift = NULL;
385 cpl_recipe * clip = NULL;
386 cpl_recipe * qc = NULL;
387 cpl_recipe * swarp = NULL;
388 cpl_recipe * join = NULL;
389 cpl_recipe * phot = NULL;
390 cpl_pluginlist * plugins = cpl_pluginlist_new();
391 cpl_frameset * usedframes = cpl_frameset_new();
392 cpl_frame * meanfrm = NULL;
394 skip_if(check_swarp());
397 repack = visir_init_recipe(
"visir_util_repack",
398 &visir_util_repack_get_info, plugins);
399 shift = visir_init_recipe(
"visir_util_detect_shift",
400 &visir_util_detect_shift_get_info, plugins);
401 clip = visir_init_recipe(
"visir_util_clip",
402 &visir_util_clip_get_info, plugins);
403 qc = visir_init_recipe(
"visir_util_qc",
404 &visir_util_qc_get_info, plugins);
405 swarp = visir_init_recipe(
"visir_util_run_swarp",
406 &visir_util_run_swarp_get_info, plugins);
407 join = visir_init_recipe(
"visir_util_join",
408 &visir_util_join_get_info, plugins);
412 FOR_EACH_FRAMESET(frame_, framelist) {
413 cpl_frame * frame = cpl_frame_duplicate(frame_);
414 cpl_frameset_insert(usedframes, cpl_frame_duplicate(frame));
415 if (strcmp(cpl_frame_get_tag(frame), VISIR_IMA_STD_CAT_PROCATG) == 0)
416 cpl_frameset_insert(photset, frame);
418 cpl_frameset_insert(repackset, frame);
420 skip_if(visir_run_recipe(repack, repackset, parlist,
421 &util_repack_set_parameters));
422 meanfrm = cpl_frame_duplicate(cpl_frameset_find(repackset,
"MEAN"));
425 cpl_frameset * shiftset = visir_prepare_frameset(repackset, NULL, 0,
429 shiftset = visir_remove_modified_calib(shiftset);
430 cpl_frameset_delete(repackset);
432 skip_if(visir_run_recipe(shift, shiftset, parlist, &visir_copy_parameters));
433 shiftset = visir_remove_modified_calib(shiftset);
436 const char * tagmap[] = {
"BEAM_DETECTED", VISIR_UTIL_INPUTS_RAW};
437 cpl_frameset * clipset =
438 visir_prepare_frameset(shiftset, tagmap, ARRAY_LEN(tagmap), CPL_FALSE);
439 skip_if(visir_run_recipe(clip, clipset, parlist, &visir_copy_parameters));
442 const char * qctagmap[] = {
"BEAM_DETECTED", VISIR_UTIL_CORRECTED};
443 cpl_frameset * qcset = visir_prepare_frameset(shiftset, qctagmap,
446 skip_if(visir_run_recipe(qc, qcset, parlist, &visir_copy_parameters));
449 const char * swarptagmap[] = {
"BEAM_DETECTED", VISIR_UTIL_CORRECTED};
450 cpl_frameset * swarpset = visir_prepare_frameset(shiftset, swarptagmap,
451 ARRAY_LEN(swarptagmap),
453 cpl_frameset_delete(shiftset);
455 FOR_EACH_FRAMESET(frm, clipset) {
456 if (strcmp(cpl_frame_get_tag(frm), VISIR_UTIL_ERROR_MAP) != 0)
458 cpl_frame * frame = cpl_frame_duplicate(frm);
459 cpl_frame_set_group(frame, CPL_FRAME_GROUP_RAW);
460 cpl_frameset_insert(swarpset, frame);
462 cpl_frameset_delete(clipset);
464 skip_if(visir_run_recipe(swarp, swarpset, parlist, &visir_copy_parameters));
471 if (cpl_error_get_code() == CPL_ERROR_DATA_NOT_FOUND) {
475 cpl_errorstate_set(cleanstate);
477 cpl_frame * coadd_imgf = cpl_frameset_find(swarpset,
"COADDED_IMAGE_COMBINED");
478 cpl_frame * coadd_wgtf = cpl_frameset_find(swarpset,
"COADDED_WEIGHT_COMBINED");
479 skip_if(coadd_imgf == NULL || coadd_wgtf == NULL);
482 if (cpl_frameset_get_size(photset) != 0) {
483 phot = visir_init_recipe(
"visir_old_img_phot",
484 &visir_old_img_phot_get_info, plugins);
485 cpl_frameset *orig_phot = cpl_frameset_duplicate(photset);
486 run_phot(phot, photset, parlist, coadd_imgf, coadd_wgtf,
487 cpl_frameset_find(qcset, VISIR_UTIL_QC_PROCATG
"_COMBINED"), 0);
494 cpl_frameset *copy = cpl_frameset_duplicate(orig_phot);
495 cpl_frame * res = run_phot(phot, copy, parlist, imgf, wgtf, qcf, i + 1);
496 cpl_frameset_insert(photset, res);
502 cpl_frame * wgtf = cpl_frame_duplicate(coadd_wgtf);
503 cpl_frameset * joinset = cpl_frameset_new();
504 if (cpl_frameset_get_size(photset) != 0) {
505 FOR_EACH_FRAMESET(frm, photset) {
506 if (strcmp(cpl_frame_get_tag(frm),
507 VISIR_IMG_PHOT_COMBINED_PROCATG) == 0 ||
508 strcmp(cpl_frame_get_tag(frm),
509 VISIR_IMG_PHOT_ONEBEAM_PROCATG) == 0) {
510 cpl_frame * dfrm = cpl_frame_duplicate(frm);
511 cpl_frameset_insert(joinset, dfrm);
517 cpl_frame * imgf = cpl_frame_duplicate(coadd_imgf);
519 cpl_frameset_find(qcset, VISIR_UTIL_QC_PROCATG
"_COMBINED");
520 qcf = cpl_frame_duplicate(qcf);
521 cpl_frameset_insert(joinset, imgf);
524 cpl_frameset_insert(joinset, imgf);
526 cpl_frame_set_tag(qcf, VISIR_UTIL_QC_PROCATG);
527 cpl_frame_set_group(qcf, CPL_FRAME_GROUP_RAW);
528 cpl_frameset_insert(joinset, qcf);
531 cpl_frame_set_group(qcf, CPL_FRAME_GROUP_RAW);
532 cpl_frameset_insert(joinset, qcf);
536 cpl_frame_set_tag(wgtf, VISIR_UTIL_WEIGHT_MAP_PROCATG);
537 cpl_frameset_insert(joinset, wgtf);
540 cpl_frame_set_tag(wgtf, VISIR_UTIL_WEIGHT_MAP_PROCATG);
541 cpl_frameset_insert(joinset, wgtf);
544 skip_if(visir_run_recipe(join, joinset, parlist,
545 &visir_copy_parameters));
547 FOR_EACH_FRAMESET(frm, joinset)
548 if (cpl_frame_get_group(frm) == CPL_FRAME_GROUP_PRODUCT)
549 cpl_frameset_insert(framelist, cpl_frame_duplicate(frm));
550 cpl_frameset_delete(joinset);
551 cpl_frameset_insert(framelist, meanfrm);
559 cpl_recipe * recipes[] = {repack, shift, clip, qc, swarp, phot, join};
560 for (
size_t i = 0; i < ARRAY_LEN(recipes); i++)
562 cpl_plugin_delete(&(recipes[i]->interface));
564 cpl_pluginlist_delete(plugins);
566 cpl_frame_delete(meanfrm);
567 cpl_frameset_delete(photset);
568 cpl_frameset_delete(usedframes);
570 return cpl_error_get_code();
cpl_frame * irplib_framelist_get(irplib_framelist *self, int pos)
Get the specified frame from the framelist.
irplib_framelist * irplib_framelist_extract(const irplib_framelist *self, const char *tag)
Extract the frames with the given tag from a framelist.
int visir_dfs_set_groups(cpl_frameset *set)
Set the group as RAW or CALIB in a frameset.
irplib_framelist * irplib_framelist_cast(const cpl_frameset *frameset)
Create an irplib_framelist from a cpl_framelist.
irplib_framelist * irplib_framelist_new(void)
Create an empty framelist.
int irplib_framelist_get_size(const irplib_framelist *self)
Get the size of a framelist.