30 #define _XOPEN_SOURCE 600
33 #include "visir_recipe.h"
35 #include "visir_utils.h"
36 #include "irplib_utils.h"
42 int visir_util_repack_get_info(cpl_pluginlist *);
43 int visir_util_undistort_get_info(cpl_pluginlist *);
44 int visir_old_util_destripe_get_info(cpl_pluginlist *);
45 int visir_old_spc_obs_get_info(cpl_pluginlist *);
51 #define RECIPE_STRING "visir_spc_reduce"
59 static cpl_error_code visir_spc_reduce_fill_parameterlist(cpl_parameterlist *);
60 static int visir_spc_reduce(cpl_frameset *,
const cpl_parameterlist *);
62 static int visir_spc_reduce_create(cpl_plugin * plugin)
64 cpl_recipe * recipe = (cpl_recipe *)plugin;
65 cpl_errorstate prestate = cpl_errorstate_get();
69 return cpl_recipedefine_create(plugin)
70 || cpl_recipedefine_create_is_ok(prestate,
71 visir_spc_reduce_fill_parameterlist(recipe->parameters))
72 ? (int)cpl_error_set_where(cpl_func) : 0;
90 static int visir_spc_reduce_exec(cpl_plugin * plugin)
92 char * progname = getenv(
"_");
93 char * classpath = getenv(
"CLASSPATH");
94 cpl_msg_debug(cpl_func,
"Program name: %s", progname);
95 cpl_msg_debug(cpl_func,
"CLASSPATH: %s", classpath);
96 if ((progname && strstr(progname,
"gasgano")) ||
97 (classpath && strstr(classpath,
"gasgano.jar"))) {
98 cpl_msg_info(cpl_func,
"Running under gasgano, disabling OpenMP");
99 setenv(
"OMP_NUM_THREADS",
"0", 1);
100 return visir_tmpdir_exec(RECIPE_STRING, plugin, visir_spc_reduce);
102 else if (getenv(
"VISIR_NO_FORK") != NULL) {
104 return cpl_recipedefine_exec(plugin, visir_spc_reduce)
105 ? (int)cpl_error_set_where(cpl_func) : 0;
108 return visir_forking_exec(RECIPE_STRING, plugin, visir_spc_reduce);
112 static int visir_spc_reduce_destroy(cpl_plugin * plugin)
115 return cpl_recipedefine_destroy(plugin)
116 ? (int)cpl_error_set_where(cpl_func) : 0;
119 int cpl_plugin_get_info(cpl_pluginlist * list)
122 return cpl_recipedefine_init(list, CPL_VERSION_CODE,
123 VISIR_BINARY_VERSION,
125 "Spectroscopic Observation recipe",
126 "This recipe performs a wavelength calibration "
127 "followed by spectrum extraction from a combined image. "
128 "It can also compute sensitivities for standard star "
130 "It works for low and high resolution including echelle "
133 "The files listed in the Set Of Frames (sof-file) "
135 "VISIR-Long-Slit-Spectroscopy-file.fits "
136 VISIR_SPC_OBS_RAW
"\n"
137 "VISIR-Quantum-Efficiency-Calibration-file.fits "
138 VISIR_CALIB_QEFF_SPC
"\n"
139 "VISIR-Atmospheric-Emission-Lines-Calibration-file.fits "
140 VISIR_CALIB_LINES_SPC
"\n"
141 "VISIR-Standard-Star-Flux-Catalog.fits (optional)"
142 VISIR_CALIB_STDSTAR_SPC
"\n"
143 "VISIR-linearty-table.fits "VISIR_CALIB_LIN
" (optional)"
144 MAN_VISIR_CALIB_BPM_IMG,
146 "jtaylor@partner.eso.org",
147 cpl_get_license(PACKAGE_NAME,
"2015"),
148 visir_spc_reduce_create,
149 visir_spc_reduce_exec,
150 visir_spc_reduce_destroy)
151 ? ((void)cpl_error_set_where(cpl_func), 1) : 0;
184 static cpl_error_code
185 visir_spc_reduce_fill_parameterlist(cpl_parameterlist *
self)
187 cpl_pluginlist * plugins = cpl_pluginlist_new();
188 const char * context = PACKAGE
".visir_spc_reduce";
190 cpl_recipe * repack = visir_init_recipe(
"visir_util_repack",
191 &visir_util_repack_get_info,
194 cpl_recipe * undist = visir_init_recipe(
"visir_util_undistort",
195 &visir_util_undistort_get_info,
198 cpl_recipe * destripe = visir_init_recipe(
"visir_old_util_destripe",
199 &visir_old_util_destripe_get_info,
202 cpl_recipe * spcobs = visir_init_recipe(
"visir_old_spc_obs",
203 &visir_old_spc_obs_get_info,
206 cpl_plugin_get_init(&repack->interface)(&repack->interface);
207 cpl_plugin_get_init(&undist->interface)(&undist->interface);
208 cpl_plugin_get_init(&destripe->interface)(&destripe->interface);
209 cpl_plugin_get_init(&spcobs->interface)(&spcobs->interface);
210 cpl_parameterlist * repack_par = repack->parameters;
211 cpl_parameterlist * undist_par = undist->parameters;
212 cpl_parameterlist * destripe_par = destripe->parameters;
213 cpl_parameterlist * spcobs_par = spcobs->parameters;
216 for (cpl_parameter * p = cpl_parameterlist_get_first(repack_par);
217 p != NULL; p = cpl_parameterlist_get_next(repack_par)) {
218 const char * name = cpl_parameter_get_name(p);
219 if (strstr(name,
"bkgcorrect"))
221 if (strstr(name,
"normalize"))
223 if (strstr(name,
"compress"))
225 cpl_parameterlist_append(
self, visir_parameter_duplicate(p));
230 for (cpl_parameter * p = cpl_parameterlist_get_first(undist_par);
231 p != NULL; p = cpl_parameterlist_get_next(undist_par)) {
232 const char * name = cpl_parameter_get_name(p);
233 if (strstr(name,
"bkgcorrect"))
235 cpl_parameterlist_append(
self, visir_parameter_duplicate(p));
240 for (cpl_parameter * p = cpl_parameterlist_get_first(destripe_par);
241 p != NULL; p = cpl_parameterlist_get_next(destripe_par)) {
242 cpl_parameterlist_append(
self, visir_parameter_duplicate(p));
247 for (cpl_parameter * p = cpl_parameterlist_get_first(spcobs_par);
248 p != NULL; p = cpl_parameterlist_get_next(spcobs_par)) {
249 const char * name = cpl_parameter_get_name(p);
250 if (strstr(name,
"auto_bpm") ||
251 strstr(name,
"rem_glitch") ||
252 strstr(name,
"purge_bad") ||
253 strstr(name,
"union") ||
254 strstr(name,
"refine") ||
255 strstr(name,
"xcorr") ||
256 strstr(name,
"objects") ||
257 strstr(name,
"nodding") ||
258 strstr(name,
"offsets")) {
261 cpl_parameterlist_append(
self, visir_parameter_duplicate(p));
267 skip_if(irplib_parameterlist_set_bool(
self, PACKAGE, RECIPE_STRING,
268 "delete-temp", CPL_TRUE, NULL,
269 context,
"Delete temporary files "
270 "created during processing"));
272 skip_if(irplib_parameterlist_set_bool(
self, PACKAGE, RECIPE_STRING,
273 "destripe", CPL_FALSE, NULL, context,
274 "Attempt to remove stripes"));
278 cpl_parameterlist_delete(repack->parameters);
279 cpl_parameterlist_delete(undist->parameters);
280 cpl_parameterlist_delete(destripe->parameters);
281 cpl_parameterlist_delete(spcobs->parameters);
282 cpl_plugin_delete(&repack->interface);
283 cpl_plugin_delete(&undist->interface);
284 cpl_plugin_delete(&destripe->interface);
285 cpl_plugin_delete(&spcobs->interface);
286 cpl_pluginlist_delete(plugins);
288 return cpl_error_get_code();
291 static cpl_error_code
292 util_repack_set_parameters(cpl_parameterlist * rec_pars,
293 const cpl_parameterlist * chain_pars)
297 skip_if(visir_copy_parameters(rec_pars, chain_pars));
299 par = cpl_parameterlist_find(rec_pars, PACKAGE
".visir_util_repack.bkgcorrect");
302 cpl_parameter_set_string(par,
"none");
304 par = cpl_parameterlist_find(rec_pars, PACKAGE
".visir_util_repack.normalize");
307 cpl_parameter_set_bool(par, CPL_TRUE);
309 par = cpl_parameterlist_find(rec_pars, PACKAGE
".visir_util_repack.compress");
312 cpl_parameter_set_bool(par, CPL_TRUE);
316 return cpl_error_get_code();
319 static cpl_error_code
320 util_undistort_set_parameters(cpl_parameterlist * rec_pars,
321 const cpl_parameterlist * chain_pars)
325 skip_if(visir_copy_parameters(rec_pars, chain_pars));
327 par = cpl_parameterlist_find(rec_pars, PACKAGE
".visir_util_repack.bkgcorrect");
330 cpl_parameter_set_bool(par, CPL_TRUE);
334 return cpl_error_get_code();
345 static int visir_spc_reduce(cpl_frameset * framelist,
346 const cpl_parameterlist * parlist)
348 cpl_pluginlist * plugins = cpl_pluginlist_new();
349 cpl_frameset * usedframes = cpl_frameset_new();
351 cpl_recipe * repack = visir_init_recipe(
"visir_util_repack",
352 &visir_util_repack_get_info,
354 cpl_recipe * undist = visir_init_recipe(
"visir_util_undistort",
355 &visir_util_undistort_get_info,
357 cpl_recipe * destripe = visir_init_recipe(
"visir_old_util_destripe",
358 &visir_old_util_destripe_get_info,
360 cpl_recipe * spcobs = visir_init_recipe(
"visir_old_spc_obs",
361 &visir_old_spc_obs_get_info,
363 const cpl_boolean do_destripe =
364 irplib_parameterlist_get_bool(parlist, PACKAGE,
365 RECIPE_STRING,
"destripe");
367 cpl_frameset * repackset = cpl_frameset_new();
368 cpl_frameset * obsset = cpl_frameset_new();
370 const char * input_tag;
373 FOR_EACH_FRAMESET(frame_, framelist) {
374 cpl_frame * frame = cpl_frame_duplicate(frame_);
375 cpl_frameset_insert(usedframes, cpl_frame_duplicate(frame));
376 if (!strcmp(cpl_frame_get_tag(frame), VISIR_SPEC_STD_CAT_PROCATG) ||
377 !strcmp(cpl_frame_get_tag(frame), VISIR_SPEC_CAL_LINES_PROCATG) ||
378 !strcmp(cpl_frame_get_tag(frame), VISIR_SPEC_CAL_QEFF_PROCATG))
379 cpl_frameset_insert(obsset, frame);
381 cpl_frameset_insert(repackset, frame);
383 nrep = cpl_frameset_get_size(repackset);
384 if (cpl_frameset_find(repackset, VISIR_CALIB_LIN)) {
387 if (cpl_frameset_find(repackset, VISIR_CALIB_STATIC_MASK)) {
390 if (cpl_frameset_find(repackset, VISIR_CALIB_STATIC_MASK_SPC)) {
393 if (cpl_frameset_count_tags(repackset, VISIR_SPC_OBS_ECH_RAW) == nrep) {
394 input_tag = VISIR_SPC_OBS_ECH_PP;
396 else if (cpl_frameset_count_tags(repackset,
397 VISIR_SPC_PHOT_ECH_RAW) == nrep) {
398 input_tag = VISIR_SPC_PHOT_ECH_PP;
400 else if (cpl_frameset_count_tags(repackset, VISIR_SPC_OBS_RAW) == nrep) {
401 input_tag = VISIR_SPC_OBS_PP;
403 else if (cpl_frameset_count_tags(repackset, VISIR_SPC_PHOT_RAW) == nrep) {
404 input_tag = VISIR_SPC_PHOT_PP;
407 error_if(1, CPL_ERROR_ILLEGAL_INPUT,
"Invalid input tags");
409 cpl_msg_info(cpl_func,
"Working on %s", input_tag);
410 skip_if(visir_run_recipe(repack, repackset, parlist,
411 &util_repack_set_parameters));
413 cpl_frameset * undistset = visir_prepare_frameset(repackset, NULL, 0,
417 undistset = visir_remove_modified_calib(undistset);
418 cpl_frameset_delete(repackset);
420 skip_if(visir_run_recipe(undist, undistset, parlist,
421 &util_undistort_set_parameters));
423 cpl_frameset * destripeset = undistset;
425 const char * tagmap[] = {
"UNDISTORTED", VISIR_UTIL_CORRECTED};
427 visir_prepare_frameset(undistset, tagmap, ARRAY_LEN(tagmap),
429 skip_if(visir_run_recipe(destripe, destripeset, parlist,
430 &visir_copy_parameters));
433 const char * obstagmap[] = {do_destripe ?
"DESTRIPED" :
"UNDISTORTED",
435 cpl_frameset * tmp_obs =
436 visir_prepare_frameset(destripeset, obstagmap, ARRAY_LEN(obstagmap),
439 FOR_EACH_FRAMESET_C(frm, tmp_obs)
440 cpl_frameset_insert(obsset, cpl_frame_duplicate(frm));
441 cpl_frameset_delete(tmp_obs);
443 cpl_frame * sky = cpl_frameset_find(undistset, "SPEC_OBS_LMR_SKYFRAME");
444 skip_if(sky == NULL);
445 sky = cpl_frame_duplicate(sky);
446 cpl_frame_set_group(sky, CPL_FRAME_GROUP_CALIB);
447 cpl_frameset_insert(obsset, sky);
449 cpl_frameset_delete(undistset);
451 skip_if(visir_run_recipe(spcobs, obsset, parlist,
452 &visir_copy_parameters));
454 FOR_EACH_FRAMESET(frm, obsset)
455 if (cpl_frame_get_group(frm) == CPL_FRAME_GROUP_PRODUCT)
456 cpl_frameset_insert(framelist, cpl_frame_duplicate(frm));
461 cpl_recipe * recipes[] = {repack, undist, destripe, spcobs};
462 for (
size_t i = 0; i < ARRAY_LEN(recipes); i++)
464 cpl_plugin_delete(&(recipes[i]->interface));
466 cpl_pluginlist_delete(plugins);
468 cpl_frameset_delete(obsset);
469 cpl_frameset_delete(usedframes);
471 return cpl_error_get_code();
int visir_dfs_set_groups(cpl_frameset *set)
Set the group as RAW or CALIB in a frameset.