35 #include "muse_scipost_apply_astrometry_z.h" 49 static const char *muse_scipost_apply_astrometry_help =
50 "Apply an astrometric calibration to the pixel table spatial coordinates. This is a task separated from muse_scipost.";
52 static const char *muse_scipost_apply_astrometry_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 astrometric calibration" 57 "\n ASTROMETRY_WCS calib . 1 Astrometric solution derived from astrometric science frame" 58 "\n\nProduct frames for raw frame tag \"PIXTABLE_OBJECT\":\n" 59 "\n Frame tag Level Description" 60 "\n -------------------- -------- ------------" 61 "\n PIXTABLE_OBJECT final Pixel table with astrometric calibration";
72 static cpl_recipeconfig *
73 muse_scipost_apply_astrometry_new_recipeconfig(
void)
75 cpl_recipeconfig *recipeconfig = cpl_recipeconfig_new();
77 cpl_recipeconfig_set_tag(recipeconfig,
"PIXTABLE_OBJECT", 1, -1);
78 cpl_recipeconfig_set_input(recipeconfig,
"PIXTABLE_OBJECT",
"ASTROMETRY_WCS", -1, 1);
79 cpl_recipeconfig_set_output(recipeconfig,
"PIXTABLE_OBJECT",
"PIXTABLE_OBJECT");
96 muse_scipost_apply_astrometry_prepare_header(
const char *aFrametag, cpl_propertylist *aHeader)
98 cpl_ensure_code(aFrametag, CPL_ERROR_NULL_INPUT);
99 cpl_ensure_code(aHeader, CPL_ERROR_NULL_INPUT);
100 if (!strcmp(aFrametag,
"PIXTABLE_OBJECT")) {
102 cpl_msg_warning(__func__,
"Frame tag %s is not defined", aFrametag);
103 return CPL_ERROR_ILLEGAL_INPUT;
105 return CPL_ERROR_NONE;
118 static cpl_frame_level
119 muse_scipost_apply_astrometry_get_frame_level(
const char *aFrametag)
122 return CPL_FRAME_LEVEL_NONE;
124 if (!strcmp(aFrametag,
"PIXTABLE_OBJECT")) {
125 return CPL_FRAME_LEVEL_FINAL;
127 return CPL_FRAME_LEVEL_NONE;
141 muse_scipost_apply_astrometry_get_frame_mode(
const char *aFrametag)
146 if (!strcmp(aFrametag,
"PIXTABLE_OBJECT")) {
164 muse_scipost_apply_astrometry_create(cpl_plugin *aPlugin)
168 if (cpl_plugin_get_type(aPlugin) == CPL_PLUGIN_TYPE_RECIPE) {
169 recipe = (cpl_recipe *)aPlugin;
177 muse_scipost_apply_astrometry_new_recipeconfig(),
178 muse_scipost_apply_astrometry_prepare_header,
179 muse_scipost_apply_astrometry_get_frame_level,
180 muse_scipost_apply_astrometry_get_frame_mode);
185 cpl_msg_set_time_on();
189 recipe->parameters = cpl_parameterlist_new();
194 p = cpl_parameter_new_value(
"muse.muse_scipost_apply_astrometry.lambdamin",
196 "Cut off the data below this wavelength after loading the pixel table(s).",
197 "muse.muse_scipost_apply_astrometry",
199 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"lambdamin");
200 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"lambdamin");
202 cpl_parameterlist_append(recipe->parameters, p);
205 p = cpl_parameter_new_value(
"muse.muse_scipost_apply_astrometry.lambdamax",
207 "Cut off the data above this wavelength after loading the pixel table(s).",
208 "muse.muse_scipost_apply_astrometry",
210 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"lambdamax");
211 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"lambdamax");
213 cpl_parameterlist_append(recipe->parameters, p);
233 cpl_ensure_code(aParams, CPL_ERROR_NULL_INPUT);
234 cpl_ensure_code(aParameters, CPL_ERROR_NULL_INPUT);
237 p = cpl_parameterlist_find(aParameters,
"muse.muse_scipost_apply_astrometry.lambdamin");
238 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
239 aParams->
lambdamin = cpl_parameter_get_double(p);
241 p = cpl_parameterlist_find(aParameters,
"muse.muse_scipost_apply_astrometry.lambdamax");
242 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
243 aParams->
lambdamax = cpl_parameter_get_double(p);
257 muse_scipost_apply_astrometry_exec(cpl_plugin *aPlugin)
259 if (cpl_plugin_get_type(aPlugin) != CPL_PLUGIN_TYPE_RECIPE) {
263 cpl_recipe *recipe = (cpl_recipe *)aPlugin;
264 cpl_msg_set_threadid_on();
266 cpl_frameset *usedframes = cpl_frameset_new(),
267 *outframes = cpl_frameset_new();
269 muse_scipost_apply_astrometry_params_fill(¶ms, recipe->parameters);
271 cpl_errorstate prestate = cpl_errorstate_get();
275 int rc = muse_scipost_apply_astrometry_compute(proc, ¶ms);
276 cpl_frameset_join(usedframes, proc->
usedframes);
277 cpl_frameset_join(outframes, proc->
outframes);
280 if (!cpl_errorstate_is_equal(prestate)) {
284 cpl_msg_set_level(CPL_MSG_INFO);
295 cpl_frameset_join(recipe->frames, usedframes);
296 cpl_frameset_join(recipe->frames, outframes);
297 cpl_frameset_delete(usedframes);
298 cpl_frameset_delete(outframes);
311 muse_scipost_apply_astrometry_destroy(cpl_plugin *aPlugin)
315 if (cpl_plugin_get_type(aPlugin) == CPL_PLUGIN_TYPE_RECIPE) {
316 recipe = (cpl_recipe *)aPlugin;
322 cpl_parameterlist_delete(recipe->parameters);
339 cpl_plugin_get_info(cpl_pluginlist *aList)
341 cpl_recipe *recipe = cpl_calloc(1,
sizeof *recipe);
342 cpl_plugin *plugin = &recipe->interface;
346 helptext = cpl_sprintf(
"%s%s", muse_scipost_apply_astrometry_help,
347 muse_scipost_apply_astrometry_help_esorex);
349 helptext = cpl_sprintf(
"%s", muse_scipost_apply_astrometry_help);
353 cpl_plugin_init(plugin, CPL_PLUGIN_API, MUSE_BINARY_VERSION,
354 CPL_PLUGIN_TYPE_RECIPE,
355 "muse_scipost_apply_astrometry",
356 "Calibrate astrometry for MUSE pixel tables.",
361 muse_scipost_apply_astrometry_create,
362 muse_scipost_apply_astrometry_exec,
363 muse_scipost_apply_astrometry_destroy);
364 cpl_pluginlist_append(aList, plugin);
void muse_processing_delete(muse_processing *aProcessing)
Free the muse_processing structure.
Structure to hold the parameters of the muse_scipost_apply_astrometry recipe.
double lambdamin
Cut off the data below this wavelength after loading the pixel table(s).
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.
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.
double lambdamax
Cut off the data above this wavelength after loading the pixel table(s).
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.
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.
void muse_processing_recipeinfo(cpl_plugin *)
Output main pipeline configuration, inputs, and parameters.