MUSE Pipeline Reference Manual  1.0.2
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-2014 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  const char *tag;
76 
77  tag = "PIXTABLE_OBJECT";
78  cpl_recipeconfig_set_tag(recipeconfig, tag, 1, -1);
79  cpl_recipeconfig_set_output(recipeconfig, tag, "PIXTABLE_REDUCED");
80 
81  return recipeconfig;
82 } /* muse_scipost_correct_rv_new_recipeconfig() */
83 
84 /*----------------------------------------------------------------------------*/
94 /*----------------------------------------------------------------------------*/
95 static cpl_error_code
96 muse_scipost_correct_rv_prepare_header(const char *aFrametag, cpl_propertylist *aHeader)
97 {
98  cpl_ensure_code(aFrametag, CPL_ERROR_NULL_INPUT);
99  cpl_ensure_code(aHeader, CPL_ERROR_NULL_INPUT);
100  if (!strcmp(aFrametag, "PIXTABLE_REDUCED")) {
101  } else {
102  cpl_msg_warning(__func__, "Frame tag %s is not defined", aFrametag);
103  return CPL_ERROR_ILLEGAL_INPUT;
104  }
105  return CPL_ERROR_NONE;
106 } /* muse_scipost_correct_rv_prepare_header() */
107 
108 /*----------------------------------------------------------------------------*/
117 /*----------------------------------------------------------------------------*/
118 static cpl_frame_level
119 muse_scipost_correct_rv_get_frame_level(const char *aFrametag)
120 {
121  if (!aFrametag) {
122  return CPL_FRAME_LEVEL_NONE;
123  }
124  if (!strcmp(aFrametag, "PIXTABLE_REDUCED")) {
125  return CPL_FRAME_LEVEL_FINAL;
126  }
127  return CPL_FRAME_LEVEL_NONE;
128 } /* muse_scipost_correct_rv_get_frame_level() */
129 
130 /*----------------------------------------------------------------------------*/
139 /*----------------------------------------------------------------------------*/
140 static muse_frame_mode
141 muse_scipost_correct_rv_get_frame_mode(const char *aFrametag)
142 {
143  if (!aFrametag) {
144  return MUSE_FRAME_MODE_ALL;
145  }
146  if (!strcmp(aFrametag, "PIXTABLE_REDUCED")) {
147  return MUSE_FRAME_MODE_ALL;
148  }
149  return MUSE_FRAME_MODE_ALL;
150 } /* muse_scipost_correct_rv_get_frame_mode() */
151 
152 /*----------------------------------------------------------------------------*/
162 /*----------------------------------------------------------------------------*/
163 static int
164 muse_scipost_correct_rv_create(cpl_plugin *aPlugin)
165 {
166  /* Check that the plugin is part of a valid recipe */
167  cpl_recipe *recipe;
168  if (cpl_plugin_get_type(aPlugin) == CPL_PLUGIN_TYPE_RECIPE) {
169  recipe = (cpl_recipe *)aPlugin;
170  } else {
171  return -1;
172  }
173 
174  /* register the extended processing information (new FITS header creation, *
175  * getting of the frame level for a certain tag) */
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);
181 
182  /* XXX initialize timing in messages *
183  * since at least esorex is too stupid to turn it on, we have to do it */
185  cpl_msg_set_time_on();
186  }
187 
188  /* Create the parameter list in the cpl_recipe object */
189  recipe->parameters = cpl_parameterlist_new();
190  /* Fill the parameters list */
191  cpl_parameter *p;
192 
193  /* --lambdamin: Cut off the data below this wavelength after loading the pixel table(s). */
194  p = cpl_parameter_new_value("muse.muse_scipost_correct_rv.lambdamin",
195  CPL_TYPE_DOUBLE,
196  "Cut off the data below this wavelength after loading the pixel table(s).",
197  "muse.muse_scipost_correct_rv",
198  (double)4000.);
199  cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG, "lambdamin");
200  cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "lambdamin");
201 
202  cpl_parameterlist_append(recipe->parameters, p);
203 
204  /* --lambdamax: Cut off the data above this wavelength after loading the pixel table(s). */
205  p = cpl_parameter_new_value("muse.muse_scipost_correct_rv.lambdamax",
206  CPL_TYPE_DOUBLE,
207  "Cut off the data above this wavelength after loading the pixel table(s).",
208  "muse.muse_scipost_correct_rv",
209  (double)10000.);
210  cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CFG, "lambdamax");
211  cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "lambdamax");
212 
213  cpl_parameterlist_append(recipe->parameters, p);
214 
215  /* --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). */
216  p = cpl_parameter_new_enum("muse.muse_scipost_correct_rv.rvcorr",
217  CPL_TYPE_STRING,
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",
221  4,
222  (const char *)"bary",
223  (const char *)"helio",
224  (const char *)"geo",
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");
228 
229  cpl_parameterlist_append(recipe->parameters, p);
230 
231  return 0;
232 } /* muse_scipost_correct_rv_create() */
233 
234 /*----------------------------------------------------------------------------*/
245 /*----------------------------------------------------------------------------*/
246 static int
247 muse_scipost_correct_rv_params_fill(muse_scipost_correct_rv_params_t *aParams, cpl_parameterlist *aParameters)
248 {
249  cpl_ensure_code(aParams, CPL_ERROR_NULL_INPUT);
250  cpl_ensure_code(aParameters, CPL_ERROR_NULL_INPUT);
251  cpl_parameter *p;
252 
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);
256 
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);
260 
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);
264  aParams->rvcorr =
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);
272 
273  return 0;
274 } /* muse_scipost_correct_rv_params_fill() */
275 
276 /*----------------------------------------------------------------------------*/
283 /*----------------------------------------------------------------------------*/
284 static int
285 muse_scipost_correct_rv_exec(cpl_plugin *aPlugin)
286 {
287  if (cpl_plugin_get_type(aPlugin) != CPL_PLUGIN_TYPE_RECIPE) {
288  return -1;
289  }
290  cpl_recipe *recipe = (cpl_recipe *)aPlugin;
291  cpl_msg_set_threadid_on();
292 
293  cpl_frameset *usedframes = cpl_frameset_new(),
294  *outframes = cpl_frameset_new();
296  muse_scipost_correct_rv_params_fill(&params, recipe->parameters);
297 
298  cpl_errorstate prestate = cpl_errorstate_get();
299 
300  muse_processing *proc = muse_processing_new("muse_scipost_correct_rv",
301  recipe);
302  int rc = muse_scipost_correct_rv_compute(proc, &params);
303  cpl_frameset_join(usedframes, proc->usedframes);
304  cpl_frameset_join(outframes, proc->outframes);
306 
307  if (!cpl_errorstate_is_equal(prestate)) {
308  /* dump all errors from this recipe in chronological order */
309  cpl_errorstate_dump(prestate, CPL_FALSE, muse_cplerrorstate_dump_some);
310  /* reset message level to not get the same errors displayed again by esorex */
311  cpl_msg_set_level(CPL_MSG_INFO);
312  }
313  /* clean up duplicates in framesets of used and output frames */
316 
317  /* to get esorex to see our classification (frame groups etc.), *
318  * replace the original frameset with the list of used frames *
319  * before appending product output frames */
320  /* keep the same pointer, so just erase all frames, not delete the frameset */
321  muse_cplframeset_erase_all(recipe->frames);
322  cpl_frameset_join(recipe->frames, usedframes);
323  cpl_frameset_join(recipe->frames, outframes);
324  cpl_frameset_delete(usedframes);
325  cpl_frameset_delete(outframes);
326  return rc;
327 } /* muse_scipost_correct_rv_exec() */
328 
329 /*----------------------------------------------------------------------------*/
336 /*----------------------------------------------------------------------------*/
337 static int
338 muse_scipost_correct_rv_destroy(cpl_plugin *aPlugin)
339 {
340  /* Get the recipe from the plugin */
341  cpl_recipe *recipe;
342  if (cpl_plugin_get_type(aPlugin) == CPL_PLUGIN_TYPE_RECIPE) {
343  recipe = (cpl_recipe *)aPlugin;
344  } else {
345  return -1;
346  }
347 
348  /* Clean up */
349  cpl_parameterlist_delete(recipe->parameters);
351  return 0;
352 } /* muse_scipost_correct_rv_destroy() */
353 
354 /*----------------------------------------------------------------------------*/
364 /*----------------------------------------------------------------------------*/
365 int
366 cpl_plugin_get_info(cpl_pluginlist *aList)
367 {
368  cpl_recipe *recipe = cpl_calloc(1, sizeof *recipe);
369  cpl_plugin *plugin = &recipe->interface;
370 
371  char *helptext;
373  helptext = cpl_sprintf("%s%s", muse_scipost_correct_rv_help,
374  muse_scipost_correct_rv_help_esorex);
375  } else {
376  helptext = cpl_sprintf("%s", muse_scipost_correct_rv_help);
377  }
378 
379  /* Initialize the CPL plugin stuff for this module */
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.",
384  helptext,
385  "Peter Weilbacher",
386  "usd-help@eso.org",
388  muse_scipost_correct_rv_create,
389  muse_scipost_correct_rv_exec,
390  muse_scipost_correct_rv_destroy);
391  cpl_pluginlist_append(aList, plugin);
392  cpl_free(helptext);
393 
394  return 0;
395 } /* cpl_plugin_get_info() */
396 
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:84
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...