35 #include "muse_scipost_correct_rv_z.h"
49 static const char *muse_scipost_correct_rv_help =
50 "Correct the wavelengths in the pixel table by given radial-velocity correction. This is a task separated from muse_scipost.";
52 static const char *muse_scipost_correct_rv_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 RV correction"
57 "\n\nProduct frames for raw frame tag \"PIXTABLE_OBJECT\":\n"
58 "\n Frame tag Level Description"
59 "\n -------------------- -------- ------------"
60 "\n PIXTABLE_REDUCED final RV corrected pixel table";
71 static cpl_recipeconfig *
72 muse_scipost_correct_rv_new_recipeconfig(
void)
74 cpl_recipeconfig *recipeconfig = cpl_recipeconfig_new();
77 tag =
"PIXTABLE_OBJECT";
78 cpl_recipeconfig_set_tag(recipeconfig, tag, 1, -1);
79 cpl_recipeconfig_set_output(recipeconfig, tag,
"PIXTABLE_REDUCED");
96 muse_scipost_correct_rv_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_REDUCED")) {
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_correct_rv_get_frame_level(
const char *aFrametag)
122 return CPL_FRAME_LEVEL_NONE;
124 if (!strcmp(aFrametag,
"PIXTABLE_REDUCED")) {
125 return CPL_FRAME_LEVEL_FINAL;
127 return CPL_FRAME_LEVEL_NONE;
141 muse_scipost_correct_rv_get_frame_mode(
const char *aFrametag)
146 if (!strcmp(aFrametag,
"PIXTABLE_REDUCED")) {
164 muse_scipost_correct_rv_create(cpl_plugin *aPlugin)
168 if (cpl_plugin_get_type(aPlugin) == CPL_PLUGIN_TYPE_RECIPE) {
169 recipe = (cpl_recipe *)aPlugin;
177 muse_scipost_correct_rv_new_recipeconfig(),
178 muse_scipost_correct_rv_prepare_header,
179 muse_scipost_correct_rv_get_frame_level,
180 muse_scipost_correct_rv_get_frame_mode);
185 cpl_msg_set_time_on();
189 recipe->parameters = cpl_parameterlist_new();
194 p = cpl_parameter_new_value(
"muse.muse_scipost_correct_rv.lambdamin",
196 "Cut off the data below this wavelength after loading the pixel table(s).",
197 "muse.muse_scipost_correct_rv",
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_correct_rv.lambdamax",
207 "Cut off the data above this wavelength after loading the pixel table(s).",
208 "muse.muse_scipost_correct_rv",
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);
216 p = cpl_parameter_new_enum(
"muse.muse_scipost_correct_rv.rvcorr",
218 "Correct the radial velocity of the telescope with reference to either the barycenter of the Solar System (bary), the center of the Sun (helio), or to the center of the Earth (geo).",
219 "muse.muse_scipost_correct_rv",
220 (
const char *)
"bary",
222 (
const char *)
"bary",
223 (
const char *)
"helio",
225 (
const char *)
"none");
226 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG,
"rvcorr");
227 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"rvcorr");
229 cpl_parameterlist_append(recipe->parameters, p);
249 cpl_ensure_code(aParams, CPL_ERROR_NULL_INPUT);
250 cpl_ensure_code(aParameters, CPL_ERROR_NULL_INPUT);
253 p = cpl_parameterlist_find(aParameters,
"muse.muse_scipost_correct_rv.lambdamin");
254 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
255 aParams->
lambdamin = cpl_parameter_get_double(p);
257 p = cpl_parameterlist_find(aParameters,
"muse.muse_scipost_correct_rv.lambdamax");
258 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
259 aParams->
lambdamax = cpl_parameter_get_double(p);
261 p = cpl_parameterlist_find(aParameters,
"muse.muse_scipost_correct_rv.rvcorr");
262 cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
263 aParams->
rvcorr_s = cpl_parameter_get_string(p);
265 (!strcasecmp(aParams->
rvcorr_s,
"bary")) ? MUSE_SCIPOST_CORRECT_RV_PARAM_RVCORR_BARY :
266 (!strcasecmp(aParams->
rvcorr_s,
"helio")) ? MUSE_SCIPOST_CORRECT_RV_PARAM_RVCORR_HELIO :
267 (!strcasecmp(aParams->
rvcorr_s,
"geo")) ? MUSE_SCIPOST_CORRECT_RV_PARAM_RVCORR_GEO :
268 (!strcasecmp(aParams->
rvcorr_s,
"none")) ? MUSE_SCIPOST_CORRECT_RV_PARAM_RVCORR_NONE :
269 MUSE_SCIPOST_CORRECT_RV_PARAM_RVCORR_INVALID_VALUE;
270 cpl_ensure_code(aParams->
rvcorr != MUSE_SCIPOST_CORRECT_RV_PARAM_RVCORR_INVALID_VALUE,
271 CPL_ERROR_ILLEGAL_INPUT);
285 muse_scipost_correct_rv_exec(cpl_plugin *aPlugin)
287 if (cpl_plugin_get_type(aPlugin) != CPL_PLUGIN_TYPE_RECIPE) {
290 cpl_recipe *recipe = (cpl_recipe *)aPlugin;
291 cpl_msg_set_threadid_on();
293 cpl_frameset *usedframes = cpl_frameset_new(),
294 *outframes = cpl_frameset_new();
296 muse_scipost_correct_rv_params_fill(¶ms, recipe->parameters);
298 cpl_errorstate prestate = cpl_errorstate_get();
302 int rc = muse_scipost_correct_rv_compute(proc, ¶ms);
303 cpl_frameset_join(usedframes, proc->
usedframes);
304 cpl_frameset_join(outframes, proc->
outframes);
307 if (!cpl_errorstate_is_equal(prestate)) {
311 cpl_msg_set_level(CPL_MSG_INFO);
322 cpl_frameset_join(recipe->frames, usedframes);
323 cpl_frameset_join(recipe->frames, outframes);
324 cpl_frameset_delete(usedframes);
325 cpl_frameset_delete(outframes);
338 muse_scipost_correct_rv_destroy(cpl_plugin *aPlugin)
342 if (cpl_plugin_get_type(aPlugin) == CPL_PLUGIN_TYPE_RECIPE) {
343 recipe = (cpl_recipe *)aPlugin;
349 cpl_parameterlist_delete(recipe->parameters);
366 cpl_plugin_get_info(cpl_pluginlist *aList)
368 cpl_recipe *recipe = cpl_calloc(1,
sizeof *recipe);
369 cpl_plugin *plugin = &recipe->interface;
373 helptext = cpl_sprintf(
"%s%s", muse_scipost_correct_rv_help,
374 muse_scipost_correct_rv_help_esorex);
376 helptext = cpl_sprintf(
"%s", muse_scipost_correct_rv_help);
380 cpl_plugin_init(plugin, CPL_PLUGIN_API, MUSE_BINARY_VERSION,
381 CPL_PLUGIN_TYPE_RECIPE,
382 "muse_scipost_correct_rv",
383 "Apply RV correction for MUSE pixel tables.",
388 muse_scipost_correct_rv_create,
389 muse_scipost_correct_rv_exec,
390 muse_scipost_correct_rv_destroy);
391 cpl_pluginlist_append(aList, plugin);
void muse_processing_delete(muse_processing *aProcessing)
Free the muse_processing structure.
const char * rvcorr_s
Correct the radial velocity of the telescope with reference to either the barycenter of the Solar Sys...
Structure to hold the parameters of the muse_scipost_correct_rv recipe.
muse_cplframework_type muse_cplframework(void)
Return the CPL framework the recipe is run under.
double lambdamin
Cut off the data below this wavelength after loading the pixel table(s).
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.
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.
int rvcorr
Correct the radial velocity of the telescope with reference to either the barycenter of the Solar Sys...