35 #include "muse_scipost_calibrate_flux_z.h"
49 static const char *muse_scipost_calibrate_flux_help =
50 "Replace the intensity in the MUSE pixel tables by the absolute flux. This is a task separated from muse_scipost.";
52 static const char *muse_scipost_calibrate_flux_help_esorex =
53 "\n\nInput frames for raw frame tag \"PIXTABLE_OBJECT\":\n"
54 "\n Frame tag Type Req #Fr Description"
55 "\n -------------------- ---- --- --- ------------"
56 "\n PIXTABLE_OBJECT raw Y Pixel table without flux calibration"
57 "\n EXTINCT_TABLE calib Y 1 Atmospheric extinction table"
58 "\n STD_RESPONSE calib Y 1 Response curve as derived from standard star(s)"
59 "\n STD_TELLURIC calib . 1 Telluric absorption correction as derived from standard star(s)"
60 "\n\nProduct frames for raw frame tag \"PIXTABLE_OBJECT\":\n"
61 "\n Frame tag Level Description"
62 "\n -------------------- -------- ------------"
63 "\n PIXTABLE_OBJECT final Flux calibrated pixel table";
74 static cpl_recipeconfig *
75 muse_scipost_calibrate_flux_new_recipeconfig(
void)
77 cpl_recipeconfig *recipeconfig = cpl_recipeconfig_new();
80 tag =
"PIXTABLE_OBJECT";
81 cpl_recipeconfig_set_tag(recipeconfig, tag, 1, -1);
82 cpl_recipeconfig_set_input(recipeconfig, tag,
"EXTINCT_TABLE", 1, 1);
83 cpl_recipeconfig_set_input(recipeconfig, tag,
"STD_RESPONSE", 1, 1);
84 cpl_recipeconfig_set_input(recipeconfig, tag,
"STD_TELLURIC", -1, 1);
85 cpl_recipeconfig_set_output(recipeconfig, tag,
"PIXTABLE_OBJECT");
101 static cpl_error_code
102 muse_scipost_calibrate_flux_prepare_header(
const char *aFrametag, cpl_propertylist *aHeader)
104 cpl_ensure_code(aFrametag, CPL_ERROR_NULL_INPUT);
105 cpl_ensure_code(aHeader, CPL_ERROR_NULL_INPUT);
106 if (!strcmp(aFrametag,
"PIXTABLE_OBJECT")) {
108 cpl_msg_warning(__func__,
"Frame tag %s is not defined", aFrametag);
109 return CPL_ERROR_ILLEGAL_INPUT;
111 return CPL_ERROR_NONE;
124 static cpl_frame_level
125 muse_scipost_calibrate_flux_get_frame_level(
const char *aFrametag)
128 return CPL_FRAME_LEVEL_NONE;
130 if (!strcmp(aFrametag,
"PIXTABLE_OBJECT")) {
131 return CPL_FRAME_LEVEL_FINAL;
133 return CPL_FRAME_LEVEL_NONE;
147 muse_scipost_calibrate_flux_get_frame_mode(
const char *aFrametag)
152 if (!strcmp(aFrametag,
"PIXTABLE_OBJECT")) {
170 muse_scipost_calibrate_flux_create(cpl_plugin *aPlugin)
174 if (cpl_plugin_get_type(aPlugin) == CPL_PLUGIN_TYPE_RECIPE) {
175 recipe = (cpl_recipe *)aPlugin;
183 muse_scipost_calibrate_flux_new_recipeconfig(),
184 muse_scipost_calibrate_flux_prepare_header,
185 muse_scipost_calibrate_flux_get_frame_level,
186 muse_scipost_calibrate_flux_get_frame_mode);
191 cpl_msg_set_time_on();
195 recipe->parameters = cpl_parameterlist_new();
200 p = cpl_parameter_new_value(
"muse.muse_scipost_calibrate_flux.lambdamin",
202 "Cut off the data below this wavelength after loading the pixel table(s).",
203 "muse.muse_scipost_calibrate_flux",
205 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"lambdamin");
206 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"lambdamin");
208 cpl_parameterlist_append(recipe->parameters, p);
211 p = cpl_parameter_new_value(
"muse.muse_scipost_calibrate_flux.lambdamax",
213 "Cut off the data above this wavelength after loading the pixel table(s).",
214 "muse.muse_scipost_calibrate_flux",
216 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"lambdamax");
217 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"lambdamax");
219 cpl_parameterlist_append(recipe->parameters, p);
239 cpl_ensure_code(aParams, CPL_ERROR_NULL_INPUT);
240 cpl_ensure_code(aParameters, CPL_ERROR_NULL_INPUT);
243 p = cpl_parameterlist_find(aParameters,
"muse.muse_scipost_calibrate_flux.lambdamin");
244 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
245 aParams->
lambdamin = cpl_parameter_get_double(p);
247 p = cpl_parameterlist_find(aParameters,
"muse.muse_scipost_calibrate_flux.lambdamax");
248 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
249 aParams->
lambdamax = cpl_parameter_get_double(p);
263 muse_scipost_calibrate_flux_exec(cpl_plugin *aPlugin)
265 if (cpl_plugin_get_type(aPlugin) != CPL_PLUGIN_TYPE_RECIPE) {
268 cpl_recipe *recipe = (cpl_recipe *)aPlugin;
269 cpl_msg_set_threadid_on();
271 cpl_frameset *usedframes = cpl_frameset_new(),
272 *outframes = cpl_frameset_new();
274 muse_scipost_calibrate_flux_params_fill(¶ms, recipe->parameters);
276 cpl_errorstate prestate = cpl_errorstate_get();
280 int rc = muse_scipost_calibrate_flux_compute(proc, ¶ms);
281 cpl_frameset_join(usedframes, proc->
usedframes);
282 cpl_frameset_join(outframes, proc->
outframes);
285 if (!cpl_errorstate_is_equal(prestate)) {
289 cpl_msg_set_level(CPL_MSG_INFO);
300 cpl_frameset_join(recipe->frames, usedframes);
301 cpl_frameset_join(recipe->frames, outframes);
302 cpl_frameset_delete(usedframes);
303 cpl_frameset_delete(outframes);
316 muse_scipost_calibrate_flux_destroy(cpl_plugin *aPlugin)
320 if (cpl_plugin_get_type(aPlugin) == CPL_PLUGIN_TYPE_RECIPE) {
321 recipe = (cpl_recipe *)aPlugin;
327 cpl_parameterlist_delete(recipe->parameters);
344 cpl_plugin_get_info(cpl_pluginlist *aList)
346 cpl_recipe *recipe = cpl_calloc(1,
sizeof *recipe);
347 cpl_plugin *plugin = &recipe->interface;
351 helptext = cpl_sprintf(
"%s%s", muse_scipost_calibrate_flux_help,
352 muse_scipost_calibrate_flux_help_esorex);
354 helptext = cpl_sprintf(
"%s", muse_scipost_calibrate_flux_help);
358 cpl_plugin_init(plugin, CPL_PLUGIN_API, MUSE_BINARY_VERSION,
359 CPL_PLUGIN_TYPE_RECIPE,
360 "muse_scipost_calibrate_flux",
361 "Calibrate flux for MUSE pixel tables.",
366 muse_scipost_calibrate_flux_create,
367 muse_scipost_calibrate_flux_exec,
368 muse_scipost_calibrate_flux_destroy);
369 cpl_pluginlist_append(aList, plugin);
void muse_processing_delete(muse_processing *aProcessing)
Free the muse_processing structure.
muse_cplframework_type muse_cplframework(void)
Return the CPL framework the recipe is run under.
double lambdamax
Cut off the data above this wavelength after loading the pixel table(s).
cpl_frameset * usedframes
muse_processing * muse_processing_new(const char *aName, cpl_recipe *aRecipe)
Create a new processing structure.
const char * muse_get_license(void)
Get the pipeline copyright and license.
void muse_cplerrorstate_dump_some(unsigned aCurrent, unsigned aFirst, unsigned aLast)
Dump some CPL errors.
void muse_processinginfo_delete(cpl_recipe *)
Clear all information from the processing info and from the recipe config.
cpl_error_code muse_cplframeset_erase_duplicate(cpl_frameset *aFrames)
Erase all duplicate frames from a frameset.
cpl_error_code muse_cplframeset_erase_all(cpl_frameset *aFrames)
Erase all frames in a frameset.
Structure to hold the parameters of the muse_scipost_calibrate_flux recipe.
void muse_processinginfo_register(cpl_recipe *, cpl_recipeconfig *, muse_processing_prepare_header_func *, muse_processing_get_frame_level_func *, muse_processing_get_frame_mode_func *)
Register extended functionalities for MUSE recipes.
double lambdamin
Cut off the data below this wavelength after loading the pixel table(s).