35 #include "muse_scipost_correct_dar_z.h" 49 static const char *muse_scipost_correct_dar_help =
50 "Correct the coordinates in the pixel table by differential atmospheric refraction. This is a task separated from muse_scipost.";
52 static const char *muse_scipost_correct_dar_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 DAR correction" 57 "\n\nProduct frames for raw frame tag \"PIXTABLE_OBJECT\":\n" 58 "\n Frame tag Level Description" 59 "\n -------------------- -------- ------------" 60 "\n PIXTABLE_OBJECT final DAR corrected pixel table";
71 static cpl_recipeconfig *
72 muse_scipost_correct_dar_new_recipeconfig(
void)
74 cpl_recipeconfig *recipeconfig = cpl_recipeconfig_new();
76 cpl_recipeconfig_set_tag(recipeconfig,
"PIXTABLE_OBJECT", 1, -1);
77 cpl_recipeconfig_set_output(recipeconfig,
"PIXTABLE_OBJECT",
"PIXTABLE_OBJECT");
94 muse_scipost_correct_dar_prepare_header(
const char *aFrametag, cpl_propertylist *aHeader)
96 cpl_ensure_code(aFrametag, CPL_ERROR_NULL_INPUT);
97 cpl_ensure_code(aHeader, CPL_ERROR_NULL_INPUT);
98 if (!strcmp(aFrametag,
"PIXTABLE_OBJECT")) {
100 cpl_msg_warning(__func__,
"Frame tag %s is not defined", aFrametag);
101 return CPL_ERROR_ILLEGAL_INPUT;
103 return CPL_ERROR_NONE;
116 static cpl_frame_level
117 muse_scipost_correct_dar_get_frame_level(
const char *aFrametag)
120 return CPL_FRAME_LEVEL_NONE;
122 if (!strcmp(aFrametag,
"PIXTABLE_OBJECT")) {
123 return CPL_FRAME_LEVEL_FINAL;
125 return CPL_FRAME_LEVEL_NONE;
139 muse_scipost_correct_dar_get_frame_mode(
const char *aFrametag)
144 if (!strcmp(aFrametag,
"PIXTABLE_OBJECT")) {
162 muse_scipost_correct_dar_create(cpl_plugin *aPlugin)
166 if (cpl_plugin_get_type(aPlugin) == CPL_PLUGIN_TYPE_RECIPE) {
167 recipe = (cpl_recipe *)aPlugin;
175 muse_scipost_correct_dar_new_recipeconfig(),
176 muse_scipost_correct_dar_prepare_header,
177 muse_scipost_correct_dar_get_frame_level,
178 muse_scipost_correct_dar_get_frame_mode);
183 cpl_msg_set_time_on();
187 recipe->parameters = cpl_parameterlist_new();
192 p = cpl_parameter_new_value(
"muse.muse_scipost_correct_dar.lambdamin",
194 "Cut off the data below this wavelength after loading the pixel table(s).",
195 "muse.muse_scipost_correct_dar",
197 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"lambdamin");
198 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"lambdamin");
200 cpl_parameterlist_append(recipe->parameters, p);
203 p = cpl_parameter_new_value(
"muse.muse_scipost_correct_dar.lambdamax",
205 "Cut off the data above this wavelength after loading the pixel table(s).",
206 "muse.muse_scipost_correct_dar",
208 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"lambdamax");
209 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"lambdamax");
211 cpl_parameterlist_append(recipe->parameters, p);
214 p = cpl_parameter_new_value(
"muse.muse_scipost_correct_dar.lambdaref",
216 "Reference wavelength used for correction of differential atmospheric refraction. The R-band (peak wavelength ~7000 Angstrom) that is usually used for guiding, is close to the central wavelength of MUSE, so a value of 7000.0 Angstrom should be used if nothing else is known. A value less than zero switches DAR correction off.",
217 "muse.muse_scipost_correct_dar",
219 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"lambdaref");
220 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"lambdaref");
222 cpl_parameterlist_append(recipe->parameters, p);
225 p = cpl_parameter_new_enum(
"muse.muse_scipost_correct_dar.darcheck",
227 "Carry out a check of the theoretical DAR correction using source centroiding. If \"correct\" it will also apply an empirical correction.",
228 "muse.muse_scipost_correct_dar",
229 (
const char *)
"none",
231 (
const char *)
"none",
232 (
const char *)
"check",
233 (
const char *)
"correct");
234 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"darcheck");
235 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"darcheck");
237 cpl_parameterlist_append(recipe->parameters, p);
257 cpl_ensure_code(aParams, CPL_ERROR_NULL_INPUT);
258 cpl_ensure_code(aParameters, CPL_ERROR_NULL_INPUT);
261 p = cpl_parameterlist_find(aParameters,
"muse.muse_scipost_correct_dar.lambdamin");
262 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
263 aParams->
lambdamin = cpl_parameter_get_double(p);
265 p = cpl_parameterlist_find(aParameters,
"muse.muse_scipost_correct_dar.lambdamax");
266 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
267 aParams->
lambdamax = cpl_parameter_get_double(p);
269 p = cpl_parameterlist_find(aParameters,
"muse.muse_scipost_correct_dar.lambdaref");
270 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
271 aParams->
lambdaref = cpl_parameter_get_double(p);
273 p = cpl_parameterlist_find(aParameters,
"muse.muse_scipost_correct_dar.darcheck");
274 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
275 aParams->
darcheck_s = cpl_parameter_get_string(p);
277 (!strcasecmp(aParams->
darcheck_s,
"none")) ? MUSE_SCIPOST_CORRECT_DAR_PARAM_DARCHECK_NONE :
278 (!strcasecmp(aParams->
darcheck_s,
"check")) ? MUSE_SCIPOST_CORRECT_DAR_PARAM_DARCHECK_CHECK :
279 (!strcasecmp(aParams->
darcheck_s,
"correct")) ? MUSE_SCIPOST_CORRECT_DAR_PARAM_DARCHECK_CORRECT :
280 MUSE_SCIPOST_CORRECT_DAR_PARAM_DARCHECK_INVALID_VALUE;
281 cpl_ensure_code(aParams->
darcheck != MUSE_SCIPOST_CORRECT_DAR_PARAM_DARCHECK_INVALID_VALUE,
282 CPL_ERROR_ILLEGAL_INPUT);
296 muse_scipost_correct_dar_exec(cpl_plugin *aPlugin)
298 if (cpl_plugin_get_type(aPlugin) != CPL_PLUGIN_TYPE_RECIPE) {
302 cpl_recipe *recipe = (cpl_recipe *)aPlugin;
303 cpl_msg_set_threadid_on();
305 cpl_frameset *usedframes = cpl_frameset_new(),
306 *outframes = cpl_frameset_new();
308 muse_scipost_correct_dar_params_fill(¶ms, recipe->parameters);
310 cpl_errorstate prestate = cpl_errorstate_get();
314 int rc = muse_scipost_correct_dar_compute(proc, ¶ms);
315 cpl_frameset_join(usedframes, proc->
usedframes);
316 cpl_frameset_join(outframes, proc->
outframes);
319 if (!cpl_errorstate_is_equal(prestate)) {
323 cpl_msg_set_level(CPL_MSG_INFO);
334 cpl_frameset_join(recipe->frames, usedframes);
335 cpl_frameset_join(recipe->frames, outframes);
336 cpl_frameset_delete(usedframes);
337 cpl_frameset_delete(outframes);
350 muse_scipost_correct_dar_destroy(cpl_plugin *aPlugin)
354 if (cpl_plugin_get_type(aPlugin) == CPL_PLUGIN_TYPE_RECIPE) {
355 recipe = (cpl_recipe *)aPlugin;
361 cpl_parameterlist_delete(recipe->parameters);
378 cpl_plugin_get_info(cpl_pluginlist *aList)
380 cpl_recipe *recipe = cpl_calloc(1,
sizeof *recipe);
381 cpl_plugin *plugin = &recipe->interface;
385 helptext = cpl_sprintf(
"%s%s", muse_scipost_correct_dar_help,
386 muse_scipost_correct_dar_help_esorex);
388 helptext = cpl_sprintf(
"%s", muse_scipost_correct_dar_help);
392 cpl_plugin_init(plugin, CPL_PLUGIN_API, MUSE_BINARY_VERSION,
393 CPL_PLUGIN_TYPE_RECIPE,
394 "muse_scipost_correct_dar",
395 "Apply DAR correction for MUSE pixel tables.",
400 muse_scipost_correct_dar_create,
401 muse_scipost_correct_dar_exec,
402 muse_scipost_correct_dar_destroy);
403 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.
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.
double lambdaref
Reference wavelength used for correction of differential atmospheric refraction. The R-band (peak wav...
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.
Structure to hold the parameters of the muse_scipost_correct_dar recipe.
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.
int darcheck
Carry out a check of the theoretical DAR correction using source centroiding. If "correct" it will al...
double lambdamin
Cut off the data below this wavelength after loading the pixel table(s).
const char * darcheck_s
Carry out a check of the theoretical DAR correction using source centroiding. If "correct" it will al...
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 lambdamax
Cut off the data above this wavelength after loading the pixel table(s).
void muse_processing_recipeinfo(cpl_plugin *)
Output main pipeline configuration, inputs, and parameters.