00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifdef HAVE_CONFIG_H
00022 #include <config.h>
00023 #endif
00024
00025
00026
00027
00028
00029 #ifndef _XOPEN_SOURCE
00030 #define _XOPEN_SOURCE 600
00031 #endif
00032
00033 #ifndef ESO_COVERAGE_BUILD
00034 #define ESO_COVERAGE_BUILD 0
00035 #endif
00036
00037 #include "visir_recipe.h"
00038
00039 #include "visir_utils.h"
00040 #include "irplib_utils.h"
00041 #include <cxlist.h>
00042 #include <string.h>
00043 #include <stdio.h>
00044 #include <stdlib.h>
00045
00046 #include <strings.h>
00047
00048 int visir_util_repack_get_info(cpl_pluginlist *);
00049 int visir_util_detect_shift_get_info(cpl_pluginlist *);
00050 int visir_util_clip_get_info(cpl_pluginlist *);
00051 int visir_util_run_swarp_get_info(cpl_pluginlist *);
00052 int visir_util_qc_get_info(cpl_pluginlist *);
00053 int visir_old_img_phot_get_info(cpl_pluginlist *);
00054 int visir_util_join_get_info(cpl_pluginlist *);
00055 static cpl_error_code visir_img_reduce_fill_parameterlist(cpl_parameterlist *);
00056 static int visir_img_reduce(cpl_frameset *,
00057 const cpl_parameterlist *);
00058
00059
00060
00061
00062
00063
00064 #define RECIPE_STRING "visir_img_reduce"
00065 #define DEFAULT_CONFIG VISIR_CONFIG_PATH "/visir_default.swarp"
00066
00067
00068
00069
00070
00071
00072
00073 static int visir_img_reduce_create(cpl_plugin * plugin)
00074 {
00075 cpl_recipe * recipe = (cpl_recipe *)plugin;
00076 cpl_errorstate prestate = cpl_errorstate_get();
00077
00078
00079
00080 return cpl_recipedefine_create(plugin)
00081 || cpl_recipedefine_create_is_ok(prestate,
00082 visir_img_reduce_fill_parameterlist(recipe->parameters))
00083 ? (int)cpl_error_set_where(cpl_func) : 0;
00084 }
00085
00086
00087
00100
00101 static int visir_img_reduce_exec(cpl_plugin * plugin)
00102 {
00103 char * progname = getenv("_");
00104 char * classpath = getenv("CLASSPATH");
00105 cpl_msg_debug(cpl_func, "Program name: %s", progname);
00106 cpl_msg_debug(cpl_func, "CLASSPATH: %s", classpath);
00107 if ((progname && strstr(progname, "gasgano")) ||
00108 (classpath && strstr(classpath, "gasgano.jar"))) {
00109 cpl_msg_info(cpl_func, "Running under gasgano, disabling OpenMP");
00110 setenv("OMP_NUM_THREADS", "0", 1);
00111 return visir_tmpdir_exec(RECIPE_STRING, plugin, visir_img_reduce);
00112 }
00113 else if (ESO_COVERAGE_BUILD || getenv("VISIR_NO_FORK") != NULL) {
00114
00115 return cpl_recipedefine_exec(plugin, visir_img_reduce)
00116 ? (int)cpl_error_set_where(cpl_func) : 0;
00117 }
00118 else
00119 return visir_forking_exec(RECIPE_STRING, plugin, visir_img_reduce);
00120 }
00121
00122
00123
00124 static int visir_img_reduce_destroy(cpl_plugin * plugin)
00125 {
00126
00127 return cpl_recipedefine_destroy(plugin)
00128 ? (int)cpl_error_set_where(cpl_func) : 0;
00129 }
00130
00131 int cpl_plugin_get_info(cpl_pluginlist * list)
00132 {
00133
00134 return cpl_recipedefine_init(list, CPL_VERSION_CODE,
00135 VISIR_BINARY_VERSION,
00136 "visir_img_reduce",
00137 "Combines a stack of chopped, jittered and/or "
00138 "nodded exposures and can compute the "
00139 "sensitivity for standard star observations",
00140 "This recipe recombines the data observed in "
00141 "chopping/nodding or\n"
00142 "chopping or nodding modes into one combined image using "
00143 "optionally\n"
00144 "cross-correlation methods.\n"
00145 "The files listed in the Set Of Frames (sof-file) "
00146 "must be tagged:\n"
00147 "VISIR-observation-file.fits " VISIR_IMG_COMBINE_CNJ " or\n"
00148 "VISIR-observation-file.fits " VISIR_IMG_COMBINE_CJ " or\n"
00149 "VISIR-observation-file.fits " VISIR_IMG_COMBINE_NJ " or\n"
00150 "VISIR-observation-file.fits " VISIR_IMG_COMBINE_DJ " or\n"
00151 "VISIR-observation-file.fits BURST\n"
00152 "VISIR-Standard-star-catalog " VISIR_CALIB_STDSTAR_IMG " (optional)\n"
00153 "VISIR-linearty-table.fits "VISIR_CALIB_LIN" (optional)"
00154 MAN_VISIR_CALIB_BPM_IMG,
00155 "Julian Taylor",
00156 "jtaylor@partner.eso.org",
00157 cpl_get_license(PACKAGE_NAME, "2015"),
00158 visir_img_reduce_create,
00159 visir_img_reduce_exec,
00160 visir_img_reduce_destroy)
00161 ? ((void)cpl_error_set_where(cpl_func), 1) : 0;
00162 }
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00179
00180
00181
00182
00183
00184
00185
00193
00194 static cpl_error_code
00195 visir_img_reduce_fill_parameterlist(cpl_parameterlist * self)
00196 {
00197 cpl_pluginlist * plugins = cpl_pluginlist_new();
00198 const char * context = PACKAGE ".visir_img_reduce";
00199
00200 cpl_recipe * repack = visir_init_recipe("visir_util_repack",
00201 &visir_util_repack_get_info,
00202 plugins);
00203 cpl_recipe * shift = visir_init_recipe("visir_util_detect_shift",
00204 &visir_util_detect_shift_get_info,
00205 plugins);
00206 cpl_recipe * clip = visir_init_recipe("visir_util_clip",
00207 &visir_util_clip_get_info,
00208 plugins);
00209 cpl_recipe * swarp = visir_init_recipe("visir_util_run_swarp",
00210 &visir_util_run_swarp_get_info,
00211 plugins);
00212 cpl_recipe * phot = visir_init_recipe("visir_old_img_phot",
00213 &visir_old_img_phot_get_info,
00214 plugins);
00215
00216 cpl_plugin_get_init(&repack->interface)(&repack->interface);
00217 cpl_plugin_get_init(&shift->interface)(&shift->interface);
00218 cpl_plugin_get_init(&clip->interface)(&clip->interface);
00219 cpl_plugin_get_init(&swarp->interface)(&swarp->interface);
00220 cpl_plugin_get_init(&phot->interface)(&phot->interface);
00221 cpl_parameterlist * repack_par = repack->parameters;
00222 cpl_parameterlist * clip_par = clip->parameters;
00223 cpl_parameterlist * shift_par = shift->parameters;
00224 cpl_parameterlist * swarp_par = swarp->parameters;
00225 cpl_parameterlist * phot_par = phot->parameters;
00226 skip_if(0);
00227
00228 for (cpl_parameter * p = cpl_parameterlist_get_first(repack_par);
00229 p != NULL; p = cpl_parameterlist_get_next(repack_par)) {
00230 const char * name = cpl_parameter_get_name(p);
00231 if (strstr(name, "bkgcorrect"))
00232 continue;
00233 if (strstr(name, "normalize"))
00234 continue;
00235 if (strstr(name, "compress"))
00236 continue;
00237 if (strstr(name, "ncycles"))
00238 continue;
00239 cpl_parameterlist_append(self, visir_parameter_duplicate(p));
00240 }
00241
00242 skip_if(0);
00243
00244 for (cpl_parameter * p = cpl_parameterlist_get_first(shift_par);
00245 p != NULL; p = cpl_parameterlist_get_next(shift_par)) {
00246 cpl_parameterlist_append(self, visir_parameter_duplicate(p));
00247 }
00248
00249 skip_if(0);
00250
00251 for (cpl_parameter * p = cpl_parameterlist_get_first(clip_par);
00252 p != NULL; p = cpl_parameterlist_get_next(clip_par)) {
00253 const char * name = cpl_parameter_get_name(p);
00254 if (strstr(name, "error-out-type"))
00255 continue;
00256 cpl_parameterlist_append(self, visir_parameter_duplicate(p));
00257 }
00258
00259 skip_if(0);
00260
00261 for (cpl_parameter * p = cpl_parameterlist_get_first(swarp_par);
00262 p != NULL; p = cpl_parameterlist_get_next(swarp_par)) {
00263 cpl_parameterlist_append(self, visir_parameter_duplicate(p));
00264 }
00265
00266 skip_if(0);
00267
00268 for (cpl_parameter * p = cpl_parameterlist_get_first(phot_par);
00269 p != NULL; p = cpl_parameterlist_get_next(phot_par)) {
00270 const char * name = cpl_parameter_get_name(p);
00271 if (strstr(name, "jy_val") || strstr(name, "radii"))
00272 cpl_parameterlist_append(self, visir_parameter_duplicate(p));
00273 }
00274
00275 skip_if(irplib_parameterlist_set_bool(self, PACKAGE, RECIPE_STRING,
00276 "delete-temp", CPL_TRUE, NULL,
00277 context, "Delete temporary files "
00278 "created during processing"));
00279 end_skip;
00280
00281 cpl_parameterlist_delete(repack->parameters);
00282 cpl_parameterlist_delete(shift->parameters);
00283 cpl_parameterlist_delete(clip->parameters);
00284 cpl_parameterlist_delete(swarp->parameters);
00285 cpl_parameterlist_delete(phot->parameters);
00286 cpl_plugin_delete(&repack->interface);
00287 cpl_plugin_delete(&shift->interface);
00288 cpl_plugin_delete(&clip->interface);
00289 cpl_plugin_delete(&swarp->interface);
00290 cpl_plugin_delete(&phot->interface);
00291 cpl_pluginlist_delete(plugins);
00292
00293 return cpl_error_get_code();
00294 }
00295
00296 static cpl_error_code
00297 util_repack_set_parameters(cpl_parameterlist * rec_pars,
00298 const cpl_parameterlist * chain_pars)
00299 {
00300 cpl_parameter * par;
00301
00302 skip_if(visir_copy_parameters(rec_pars, chain_pars));
00303
00304 par = cpl_parameterlist_find(rec_pars, PACKAGE".visir_util_repack.bkgcorrect");
00305
00306 if (par)
00307 cpl_parameter_set_string(par, "chopnod");
00308
00309 par = cpl_parameterlist_find(rec_pars, PACKAGE".visir_util_repack.normalize");
00310
00311 if (par)
00312 cpl_parameter_set_bool(par, CPL_TRUE);
00313
00314 par = cpl_parameterlist_find(rec_pars, PACKAGE".visir_util_repack.compress");
00315
00316 if (par)
00317 cpl_parameter_set_bool(par, CPL_TRUE);
00318
00319 end_skip;
00320
00321 return cpl_error_get_code();
00322 }
00323
00324
00325 static cpl_error_code
00326 check_swarp(void)
00327 {
00328 int ret = system(VISIR_SWARP_BIN " -v > /dev/null 2>/dev/null");
00329 if (ret != 0) {
00330 cpl_error_set_message(cpl_func, CPL_ERROR_UNSUPPORTED_MODE,
00331 "swarp not found in PATH");
00332 return CPL_ERROR_UNSUPPORTED_MODE;
00333 }
00334 return CPL_ERROR_NONE;
00335 }
00336
00337
00338 static cpl_frame *
00339 run_phot(cpl_recipe * phot, cpl_frameset *photset,
00340 const cpl_parameterlist * parlist,
00341 cpl_frame * imgf_, cpl_frame * wgtf_,
00342 cpl_frame * qcf_,
00343 const int idx)
00344 {
00345 cpl_frame * imgf = cpl_frame_duplicate(imgf_);
00346 cpl_frame * wgtf = cpl_frame_duplicate(wgtf_);
00347 cpl_frame * qcf = cpl_frame_duplicate(qcf_);
00348 cpl_frame * res = NULL;
00349 char buffer[128];
00350
00351 skip_if(0);
00352
00353 cpl_frame_set_tag(imgf, VISIR_IMG_CAL_PHOT_PP);
00354 cpl_frameset_insert(photset, imgf);
00355 cpl_frame_set_tag(wgtf, VISIR_UTIL_WEIGHT_MAP_PROCATG);
00356 cpl_frameset_insert(photset, wgtf);
00357 cpl_frame_set_group(qcf, CPL_FRAME_GROUP_RAW);
00358 cpl_frame_set_tag(qcf, VISIR_UTIL_QC_PROCATG);
00359 cpl_frameset_insert(photset, qcf);
00360
00361 skip_if(visir_run_recipe(phot, photset, parlist, &visir_copy_parameters));
00362 res = cpl_frameset_find(photset, VISIR_IMG_PHOT_COMBINED_PROCATG);
00363 if (res == NULL)
00364 res = cpl_frameset_find(photset, VISIR_IMG_PHOT_ONEBEAM_PROCATG);
00365
00366 sprintf(buffer, "visir_img_phot_%03d.fits", idx);
00367 skip_if(rename(cpl_frame_get_filename(res), buffer) == -1);
00368 cpl_frame_set_filename(res, buffer);
00369
00370 end_skip;
00371
00372 return res;
00373 }
00374
00375
00382
00383 static int visir_img_reduce(cpl_frameset * framelist,
00384 const cpl_parameterlist * parlist)
00385 {
00386 cpl_errorstate cleanstate = cpl_errorstate_get();
00387 cpl_frameset * repackset = cpl_frameset_new();
00388 cpl_frameset * photset = cpl_frameset_new();
00389 cpl_recipe * repack = NULL;
00390 cpl_recipe * shift = NULL;
00391 cpl_recipe * clip = NULL;
00392 cpl_recipe * qc = NULL;
00393 cpl_recipe * swarp = NULL;
00394 cpl_recipe * join = NULL;
00395 cpl_recipe * phot = NULL;
00396 cpl_pluginlist * plugins = cpl_pluginlist_new();
00397 cpl_frameset * usedframes = cpl_frameset_new();
00398 cpl_frame * meanfrm = NULL;
00399
00400 skip_if(check_swarp());
00401
00402
00403 repack = visir_init_recipe("visir_util_repack",
00404 &visir_util_repack_get_info, plugins);
00405 shift = visir_init_recipe("visir_util_detect_shift",
00406 &visir_util_detect_shift_get_info, plugins);
00407 clip = visir_init_recipe("visir_util_clip",
00408 &visir_util_clip_get_info, plugins);
00409 qc = visir_init_recipe("visir_util_qc",
00410 &visir_util_qc_get_info, plugins);
00411 swarp = visir_init_recipe("visir_util_run_swarp",
00412 &visir_util_run_swarp_get_info, plugins);
00413 join = visir_init_recipe("visir_util_join",
00414 &visir_util_join_get_info, plugins);
00415
00416 visir_dfs_set_groups(framelist);
00417
00418 FOR_EACH_FRAMESET(frame_, framelist) {
00419 cpl_frame * frame = cpl_frame_duplicate(frame_);
00420 cpl_frameset_insert(usedframes, cpl_frame_duplicate(frame));
00421 if (strcmp(cpl_frame_get_tag(frame), VISIR_IMA_STD_CAT_PROCATG) == 0)
00422 cpl_frameset_insert(photset, frame);
00423 else
00424 cpl_frameset_insert(repackset, frame);
00425 }
00426 skip_if(visir_run_recipe(repack, repackset, parlist,
00427 &util_repack_set_parameters));
00428 meanfrm = cpl_frame_duplicate(cpl_frameset_find(repackset,
00429 VISIR_UTIL_REPACK_MEAN_PROCATG));
00430
00431
00432 cpl_frameset * shiftset = visir_prepare_frameset(repackset, NULL, 0,
00433 CPL_TRUE);
00434
00435
00436 shiftset = visir_remove_modified_calib(shiftset);
00437 cpl_frameset_delete(repackset);
00438 repackset = NULL;
00439 skip_if(visir_run_recipe(shift, shiftset, parlist, &visir_copy_parameters));
00440 shiftset = visir_remove_modified_calib(shiftset);
00441
00442
00443 const char * tagmap[] = {VISIR_UTIL_DETECT_SHIFT_PROCATG, VISIR_UTIL_INPUTS_RAW};
00444 cpl_frameset * clipset =
00445 visir_prepare_frameset(shiftset, tagmap, ARRAY_LEN(tagmap), CPL_FALSE);
00446 skip_if(visir_run_recipe(clip, clipset, parlist, &visir_copy_parameters));
00447
00448
00449 const char * qctagmap[] = {VISIR_UTIL_DETECT_SHIFT_PROCATG, VISIR_UTIL_CORRECTED};
00450 cpl_frameset * qcset = visir_prepare_frameset(shiftset, qctagmap,
00451 ARRAY_LEN(qctagmap),
00452 CPL_FALSE);
00453 skip_if(visir_run_recipe(qc, qcset, parlist, &visir_copy_parameters));
00454
00455
00456 const char * swarptagmap[] = {VISIR_UTIL_DETECT_SHIFT_PROCATG, VISIR_UTIL_CORRECTED};
00457 cpl_frameset * swarpset = visir_prepare_frameset(shiftset, swarptagmap,
00458 ARRAY_LEN(swarptagmap),
00459 CPL_FALSE);
00460 cpl_frameset_delete(shiftset);
00461 shiftset = NULL;
00462 FOR_EACH_FRAMESET(frm, clipset) {
00463 if (strcmp(cpl_frame_get_tag(frm), VISIR_UTIL_ERROR_MAP) != 0)
00464 continue;
00465 cpl_frame * frame = cpl_frame_duplicate(frm);
00466 cpl_frame_set_group(frame, CPL_FRAME_GROUP_RAW);
00467 cpl_frameset_insert(swarpset, frame);
00468 }
00469 cpl_frameset_delete(clipset);
00470 clipset = NULL;
00471 skip_if(visir_run_recipe(swarp, swarpset, parlist, &visir_copy_parameters));
00472 irplib_framelist * swarpfl = irplib_framelist_cast(swarpset);
00473 irplib_framelist * qcfl = irplib_framelist_cast(qcset);
00474
00475 irplib_framelist * imgs = irplib_framelist_extract(swarpfl, "COADDED_IMAGE");
00476 irplib_framelist * wgts = irplib_framelist_extract(swarpfl, "COADDED_WEIGHT");
00477 irplib_framelist * qcs = irplib_framelist_extract(qcfl, VISIR_UTIL_QC_PROCATG);
00478 if (cpl_error_get_code() == CPL_ERROR_DATA_NOT_FOUND) {
00479 imgs = irplib_framelist_new();
00480 wgts = irplib_framelist_new();
00481 qcs = irplib_framelist_new();
00482 cpl_errorstate_set(cleanstate);
00483 }
00484 cpl_frame * coadd_imgf = cpl_frameset_find(swarpset, VISIR_IMG_COADDED_IMG);
00485 cpl_frame * coadd_wgtf = cpl_frameset_find(swarpset, VISIR_IMG_COADDED_WGT);
00486 skip_if(coadd_imgf == NULL || coadd_wgtf == NULL);
00487
00488
00489 if (cpl_frameset_get_size(photset) != 0) {
00490 phot = visir_init_recipe("visir_old_img_phot",
00491 &visir_old_img_phot_get_info, plugins);
00492 cpl_frameset *orig_phot = cpl_frameset_duplicate(photset);
00493 run_phot(phot, photset, parlist, coadd_imgf, coadd_wgtf,
00494 cpl_frameset_find(qcset, VISIR_UTIL_QC_PROCATG"_COMBINED"), 0);
00495 skip_if(0);
00496
00497 for (int i = 0; i < irplib_framelist_get_size(imgs); i++) {
00498 cpl_frame * imgf = irplib_framelist_get(imgs, i);
00499 cpl_frame * wgtf = irplib_framelist_get(wgts, i);
00500 cpl_frame * qcf = irplib_framelist_get(qcs, i);
00501 cpl_frameset *copy = cpl_frameset_duplicate(orig_phot);
00502 cpl_frame * res = run_phot(phot, copy, parlist, imgf, wgtf, qcf, i + 1);
00503 cpl_frameset_insert(photset, res);
00504 skip_if(0);
00505 }
00506 }
00507
00508 {
00509 cpl_frame * wgtf = cpl_frame_duplicate(coadd_wgtf);
00510 cpl_frameset * joinset = cpl_frameset_new();
00511 if (cpl_frameset_get_size(photset) != 0) {
00512 FOR_EACH_FRAMESET(frm, photset) {
00513 if (strcmp(cpl_frame_get_tag(frm),
00514 VISIR_IMG_PHOT_COMBINED_PROCATG) == 0 ||
00515 strcmp(cpl_frame_get_tag(frm),
00516 VISIR_IMG_PHOT_ONEBEAM_PROCATG) == 0) {
00517 cpl_frame * dfrm = cpl_frame_duplicate(frm);
00518 cpl_frameset_insert(joinset, dfrm);
00519 }
00520 }
00521
00522 }
00523 else {
00524 cpl_frame * imgf = cpl_frame_duplicate(coadd_imgf);
00525 cpl_frame * qcf =
00526 cpl_frameset_find(qcset, VISIR_UTIL_QC_PROCATG"_COMBINED");
00527 qcf = cpl_frame_duplicate(qcf);
00528 cpl_frameset_insert(joinset, imgf);
00529 for (int i = 0; i < irplib_framelist_get_size(imgs); i++) {
00530 imgf = cpl_frame_duplicate(irplib_framelist_get(imgs, i));
00531 cpl_frameset_insert(joinset, imgf);
00532 }
00533 cpl_frame_set_tag(qcf, VISIR_UTIL_QC_PROCATG);
00534 cpl_frame_set_group(qcf, CPL_FRAME_GROUP_RAW);
00535 cpl_frameset_insert(joinset, qcf);
00536 for (int i = 0; i < irplib_framelist_get_size(qcs); i++) {
00537 qcf = cpl_frame_duplicate(irplib_framelist_get(qcs, i));
00538 cpl_frame_set_group(qcf, CPL_FRAME_GROUP_RAW);
00539 cpl_frameset_insert(joinset, qcf);
00540 }
00541 }
00542
00543 cpl_frame_set_tag(wgtf, VISIR_UTIL_WEIGHT_MAP_PROCATG);
00544 cpl_frameset_insert(joinset, wgtf);
00545 for (int i = 0; i < irplib_framelist_get_size(wgts); i++) {
00546 wgtf = cpl_frame_duplicate(irplib_framelist_get(wgts, i));
00547 cpl_frame_set_tag(wgtf, VISIR_UTIL_WEIGHT_MAP_PROCATG);
00548 cpl_frameset_insert(joinset, wgtf);
00549 }
00550
00551 skip_if(visir_run_recipe(join, joinset, parlist,
00552 &visir_copy_parameters));
00553
00554 FOR_EACH_FRAMESET(frm, joinset)
00555 if (cpl_frame_get_group(frm) == CPL_FRAME_GROUP_PRODUCT)
00556 cpl_frameset_insert(framelist, cpl_frame_duplicate(frm));
00557 cpl_frameset_delete(joinset);
00558 cpl_frameset_insert(framelist, meanfrm);
00559 meanfrm = NULL;
00560 skip_if(0);
00561 }
00562
00563 end_skip;
00564
00565 {
00566 cpl_recipe * recipes[] = {repack, shift, clip, qc, swarp, phot, join};
00567 for (size_t i = 0; i < ARRAY_LEN(recipes); i++)
00568 if (recipes[i])
00569 cpl_plugin_delete(&(recipes[i]->interface));
00570 }
00571 cpl_pluginlist_delete(plugins);
00572
00573 cpl_frame_delete(meanfrm);
00574 cpl_frameset_delete(photset);
00575 cpl_frameset_delete(usedframes);
00576
00577 return cpl_error_get_code();
00578 }