MUSE Pipeline Reference Manual  2.1.1
muse_scipost_correct_rv_z.c
1 /* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set sw=2 sts=2 et cin: */
3 /*
4  * This file is part of the MUSE Instrument Pipeline
5  * Copyright (C) 2005-2015 European Southern Observatory
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  */
21 
22 /* This file was automatically generated */
23 
24 #ifdef HAVE_CONFIG_H
25 #include <config.h>
26 #endif
27 
28 /*----------------------------------------------------------------------------*
29  * Includes *
30  *----------------------------------------------------------------------------*/
31 #include <string.h> /* strcmp(), strstr() */
32 #include <strings.h> /* strcasecmp() */
33 #include <cpl.h>
34 
35 #include "muse_scipost_correct_rv_z.h" /* in turn includes muse.h */
36 
37 /*----------------------------------------------------------------------------*/
43 /*----------------------------------------------------------------------------*/
46 /*----------------------------------------------------------------------------*
47  * Static variables *
48  *----------------------------------------------------------------------------*/
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.";
51 
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";
61 
62 /*----------------------------------------------------------------------------*/
70 /*----------------------------------------------------------------------------*/
71 static cpl_recipeconfig *
72 muse_scipost_correct_rv_new_recipeconfig(void)
73 {
74  cpl_recipeconfig *recipeconfig = cpl_recipeconfig_new();
75 
76  cpl_recipeconfig_set_tag(recipeconfig, "PIXTABLE_OBJECT", 1, -1);
77  cpl_recipeconfig_set_output(recipeconfig, "PIXTABLE_OBJECT", "PIXTABLE_REDUCED");
78 
79  return recipeconfig;
80 } /* muse_scipost_correct_rv_new_recipeconfig() */
81 
82 /*----------------------------------------------------------------------------*/
92 /*----------------------------------------------------------------------------*/
93 static cpl_error_code
94 muse_scipost_correct_rv_prepare_header(const char *aFrametag, cpl_propertylist *aHeader)
95 {
96  cpl_ensure_code(aFrametag, CPL_ERROR_NULL_INPUT);
97  cpl_ensure_code(aHeader, CPL_ERROR_NULL_INPUT);
98  if (!strcmp(aFrametag, "PIXTABLE_REDUCED")) {
99  } else {
100  cpl_msg_warning(__func__, "Frame tag %s is not defined", aFrametag);
101  return CPL_ERROR_ILLEGAL_INPUT;
102  }
103  return CPL_ERROR_NONE;
104 } /* muse_scipost_correct_rv_prepare_header() */
105 
106 /*----------------------------------------------------------------------------*/
115 /*----------------------------------------------------------------------------*/
116 static cpl_frame_level
117 muse_scipost_correct_rv_get_frame_level(const char *aFrametag)
118 {
119  if (!aFrametag) {
120  return CPL_FRAME_LEVEL_NONE;
121  }
122  if (!strcmp(aFrametag, "PIXTABLE_REDUCED")) {
123  return CPL_FRAME_LEVEL_FINAL;
124  }
125  return CPL_FRAME_LEVEL_NONE;
126 } /* muse_scipost_correct_rv_get_frame_level() */
127 
128 /*----------------------------------------------------------------------------*/
137 /*----------------------------------------------------------------------------*/
138 static muse_frame_mode
139 muse_scipost_correct_rv_get_frame_mode(const char *aFrametag)
140 {
141  if (!aFrametag) {
142  return MUSE_FRAME_MODE_ALL;
143  }
144  if (!strcmp(aFrametag, "PIXTABLE_REDUCED")) {
145  return MUSE_FRAME_MODE_ALL;
146  }
147  return MUSE_FRAME_MODE_ALL;
148 } /* muse_scipost_correct_rv_get_frame_mode() */
149 
150 /*----------------------------------------------------------------------------*/
160 /*----------------------------------------------------------------------------*/
161 static int
162 muse_scipost_correct_rv_create(cpl_plugin *aPlugin)
163 {
164  /* Check that the plugin is part of a valid recipe */
165  cpl_recipe *recipe;
166  if (cpl_plugin_get_type(aPlugin) == CPL_PLUGIN_TYPE_RECIPE) {
167  recipe = (cpl_recipe *)aPlugin;
168  } else {
169  return -1;
170  }
171 
172  /* register the extended processing information (new FITS header creation, *
173  * getting of the frame level for a certain tag) */
175  muse_scipost_correct_rv_new_recipeconfig(),
176  muse_scipost_correct_rv_prepare_header,
177  muse_scipost_correct_rv_get_frame_level,
178  muse_scipost_correct_rv_get_frame_mode);
179 
180  /* XXX initialize timing in messages *
181  * since at least esorex is too stupid to turn it on, we have to do it */
183  cpl_msg_set_time_on();
184  }
185 
186  /* Create the parameter list in the cpl_recipe object */
187  recipe->parameters = cpl_parameterlist_new();
188  /* Fill the parameters list */
189  cpl_parameter *p;
190 
191  /* --lambdamin: Cut off the data below this wavelength after loading the pixel table(s). */
192  p = cpl_parameter_new_value("muse.muse_scipost_correct_rv.lambdamin",
193  CPL_TYPE_DOUBLE,
194  "Cut off the data below this wavelength after loading the pixel table(s).",
195  "muse.muse_scipost_correct_rv",
196  (double)4000.);
197  cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG, "lambdamin");
198  cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "lambdamin");
199 
200  cpl_parameterlist_append(recipe->parameters, p);
201 
202  /* --lambdamax: Cut off the data above this wavelength after loading the pixel table(s). */
203  p = cpl_parameter_new_value("muse.muse_scipost_correct_rv.lambdamax",
204  CPL_TYPE_DOUBLE,
205  "Cut off the data above this wavelength after loading the pixel table(s).",
206  "muse.muse_scipost_correct_rv",
207  (double)10000.);
208  cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG, "lambdamax");
209  cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "lambdamax");
210 
211  cpl_parameterlist_append(recipe->parameters, p);
212 
213  /* --rvcorr: 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). */
214  p = cpl_parameter_new_enum("muse.muse_scipost_correct_rv.rvcorr",
215  CPL_TYPE_STRING,
216  "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).",
217  "muse.muse_scipost_correct_rv",
218  (const char *)"bary",
219  4,
220  (const char *)"bary",
221  (const char *)"helio",
222  (const char *)"geo",
223  (const char *)"none");
224  cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG, "rvcorr");
225  cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "rvcorr");
226 
227  cpl_parameterlist_append(recipe->parameters, p);
228 
229  return 0;
230 } /* muse_scipost_correct_rv_create() */
231 
232 /*----------------------------------------------------------------------------*/
243 /*----------------------------------------------------------------------------*/
244 static int
245 muse_scipost_correct_rv_params_fill(muse_scipost_correct_rv_params_t *aParams, cpl_parameterlist *aParameters)
246 {
247  cpl_ensure_code(aParams, CPL_ERROR_NULL_INPUT);
248  cpl_ensure_code(aParameters, CPL_ERROR_NULL_INPUT);
249  cpl_parameter *p;
250 
251  p = cpl_parameterlist_find(aParameters, "muse.muse_scipost_correct_rv.lambdamin");
252  cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
253  aParams->lambdamin = cpl_parameter_get_double(p);
254 
255  p = cpl_parameterlist_find(aParameters, "muse.muse_scipost_correct_rv.lambdamax");
256  cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
257  aParams->lambdamax = cpl_parameter_get_double(p);
258 
259  p = cpl_parameterlist_find(aParameters, "muse.muse_scipost_correct_rv.rvcorr");
260  cpl_ensure_code(p, CPL_ERROR_DATA_NOT_FOUND);
261  aParams->rvcorr_s = cpl_parameter_get_string(p);
262  aParams->rvcorr =
263  (!strcasecmp(aParams->rvcorr_s, "bary")) ? MUSE_SCIPOST_CORRECT_RV_PARAM_RVCORR_BARY :
264  (!strcasecmp(aParams->rvcorr_s, "helio")) ? MUSE_SCIPOST_CORRECT_RV_PARAM_RVCORR_HELIO :
265  (!strcasecmp(aParams->rvcorr_s, "geo")) ? MUSE_SCIPOST_CORRECT_RV_PARAM_RVCORR_GEO :
266  (!strcasecmp(aParams->rvcorr_s, "none")) ? MUSE_SCIPOST_CORRECT_RV_PARAM_RVCORR_NONE :
267  MUSE_SCIPOST_CORRECT_RV_PARAM_RVCORR_INVALID_VALUE;
268  cpl_ensure_code(aParams->rvcorr != MUSE_SCIPOST_CORRECT_RV_PARAM_RVCORR_INVALID_VALUE,
269  CPL_ERROR_ILLEGAL_INPUT);
270 
271  return 0;
272 } /* muse_scipost_correct_rv_params_fill() */
273 
274 /*----------------------------------------------------------------------------*/
281 /*----------------------------------------------------------------------------*/
282 static int
283 muse_scipost_correct_rv_exec(cpl_plugin *aPlugin)
284 {
285  if (cpl_plugin_get_type(aPlugin) != CPL_PLUGIN_TYPE_RECIPE) {
286  return -1;
287  }
289  cpl_recipe *recipe = (cpl_recipe *)aPlugin;
290  cpl_msg_set_threadid_on();
291 
292  cpl_frameset *usedframes = cpl_frameset_new(),
293  *outframes = cpl_frameset_new();
295  muse_scipost_correct_rv_params_fill(&params, recipe->parameters);
296 
297  cpl_errorstate prestate = cpl_errorstate_get();
298 
299  muse_processing *proc = muse_processing_new("muse_scipost_correct_rv",
300  recipe);
301  int rc = muse_scipost_correct_rv_compute(proc, &params);
302  cpl_frameset_join(usedframes, proc->usedframes);
303  cpl_frameset_join(outframes, proc->outframes);
305 
306  if (!cpl_errorstate_is_equal(prestate)) {
307  /* dump all errors from this recipe in chronological order */
308  cpl_errorstate_dump(prestate, CPL_FALSE, muse_cplerrorstate_dump_some);
309  /* reset message level to not get the same errors displayed again by esorex */
310  cpl_msg_set_level(CPL_MSG_INFO);
311  }
312  /* clean up duplicates in framesets of used and output frames */
315 
316  /* to get esorex to see our classification (frame groups etc.), *
317  * replace the original frameset with the list of used frames *
318  * before appending product output frames */
319  /* keep the same pointer, so just erase all frames, not delete the frameset */
320  muse_cplframeset_erase_all(recipe->frames);
321  cpl_frameset_join(recipe->frames, usedframes);
322  cpl_frameset_join(recipe->frames, outframes);
323  cpl_frameset_delete(usedframes);
324  cpl_frameset_delete(outframes);
325  return rc;
326 } /* muse_scipost_correct_rv_exec() */
327 
328 /*----------------------------------------------------------------------------*/
335 /*----------------------------------------------------------------------------*/
336 static int
337 muse_scipost_correct_rv_destroy(cpl_plugin *aPlugin)
338 {
339  /* Get the recipe from the plugin */
340  cpl_recipe *recipe;
341  if (cpl_plugin_get_type(aPlugin) == CPL_PLUGIN_TYPE_RECIPE) {
342  recipe = (cpl_recipe *)aPlugin;
343  } else {
344  return -1;
345  }
346 
347  /* Clean up */
348  cpl_parameterlist_delete(recipe->parameters);
350  return 0;
351 } /* muse_scipost_correct_rv_destroy() */
352 
353 /*----------------------------------------------------------------------------*/
363 /*----------------------------------------------------------------------------*/
364 int
365 cpl_plugin_get_info(cpl_pluginlist *aList)
366 {
367  cpl_recipe *recipe = cpl_calloc(1, sizeof *recipe);
368  cpl_plugin *plugin = &recipe->interface;
369 
370  char *helptext;
372  helptext = cpl_sprintf("%s%s", muse_scipost_correct_rv_help,
373  muse_scipost_correct_rv_help_esorex);
374  } else {
375  helptext = cpl_sprintf("%s", muse_scipost_correct_rv_help);
376  }
377 
378  /* Initialize the CPL plugin stuff for this module */
379  cpl_plugin_init(plugin, CPL_PLUGIN_API, MUSE_BINARY_VERSION,
380  CPL_PLUGIN_TYPE_RECIPE,
381  "muse_scipost_correct_rv",
382  "Apply RV correction for MUSE pixel tables.",
383  helptext,
384  "Peter Weilbacher",
385  "usd-help@eso.org",
387  muse_scipost_correct_rv_create,
388  muse_scipost_correct_rv_exec,
389  muse_scipost_correct_rv_destroy);
390  cpl_pluginlist_append(aList, plugin);
391  cpl_free(helptext);
392 
393  return 0;
394 } /* cpl_plugin_get_info() */
395 
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.
Definition: muse_utils.c:83
muse_frame_mode
cpl_frameset * outframes
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...
void muse_processing_recipeinfo(cpl_plugin *)
Output main pipeline configuration, inputs, and parameters.