GRAVI Pipeline Reference Manual  0.6.3
gravi_dual_baseline.c
1 /* $Id: gravi_dual_baseline.c,v 1.29 2015/01/10 09:16:12 nazouaoui Exp $
2  *
3  * This file is part of the GRAVI Pipeline
4  * Copyright (C) 2002,2003 European Southern Observatory
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  */
20 
21 /*
22  * $Author: nazouaoui $
23  * $Date: 2015/01/10 09:16:12 $
24  * $Revision: 1.29 $
25  * $Name: $
26  */
27 
28 #ifdef HAVE_CONFIG_H
29 #include <config.h>
30 #endif
31 
32 /*-----------------------------------------------------------------------------
33  Includes
34  -----------------------------------------------------------------------------*/
35 
36 #include <cpl.h>
37 #include <stdio.h>
38 #include <string.h>
39 
40 
41 #include "gravi_utils.h"
42 #include "gravi_pfits.h"
43 #include "gravi_dfs.h"
44 #include "gravi_calib.h"
45 
46 #include "gravi_data.h"
47 
48 /*-----------------------------------------------------------------------------
49  Private function prototypes
50  -----------------------------------------------------------------------------*/
51 
52 static int gravi_dual_baseline_create(cpl_plugin *);
53 static int gravi_dual_baseline_exec(cpl_plugin *);
54 static int gravi_dual_baseline_destroy(cpl_plugin *);
55 static int gravi_dual_baseline(cpl_frameset *, const cpl_parameterlist *);
56 
57 /*-----------------------------------------------------------------------------
58  Static variables
59  -----------------------------------------------------------------------------*/
60 
61 static char gravi_dual_baseline_description[] =
62 "This recipe computes the narrow angle baseline from the calibrated visibilities. "
63 "It is used in dual field mode\n"
64 "Description DO category\n"
65 "Required input :\n"
66 "Raw visibility file (one or more) " VIS_DUAL_CALIB "\n"
67 "Ouput :\n"
68 "Narow Angle Baseline (one per input file) " NAB_CAL "\n"
69 "\n";
70 
71 /*-----------------------------------------------------------------------------
72  Function code
73  -----------------------------------------------------------------------------*/
74 
75 /*----------------------------------------------------------------------------*/
85 /*----------------------------------------------------------------------------*/
86 int cpl_plugin_get_info(cpl_pluginlist * list)
87 {
88  cpl_recipe * recipe = cpl_calloc(1, sizeof *recipe );
89  cpl_plugin * plugin = &recipe->interface;
90 
91  if (cpl_plugin_init(plugin,
92  CPL_PLUGIN_API,
93  GRAVI_BINARY_VERSION,
94  CPL_PLUGIN_TYPE_RECIPE,
95  "gravi_dual_baseline",
96  "This recipe computes the narrow angle baseline from the calibrated visibilitie.",
97  gravi_dual_baseline_description,
98  "Firstname Lastname",
99  PACKAGE_BUGREPORT,
100  gravi_get_license(),
101  gravi_dual_baseline_create,
102  gravi_dual_baseline_exec,
103  gravi_dual_baseline_destroy)) {
104  cpl_msg_error(cpl_func, "Plugin initialization failed");
105  (void)cpl_error_set_where(cpl_func);
106  return 1;
107  }
108 
109  if (cpl_pluginlist_append(list, plugin)) {
110  cpl_msg_error(cpl_func, "Error adding plugin to list");
111  (void)cpl_error_set_where(cpl_func);
112  return 1;
113  }
114 
115  return 0;
116 }
117 
118 /*----------------------------------------------------------------------------*/
126 /*----------------------------------------------------------------------------*/
127 static int gravi_dual_baseline_create(cpl_plugin * plugin)
128 {
129  cpl_recipe * recipe;
130 
131  /* Do not create the recipe if an error code is already set */
132  if (cpl_error_get_code() != CPL_ERROR_NONE) {
133  cpl_msg_error(cpl_func, "%s():%d: An error is already set: %s",
134  cpl_func, __LINE__, cpl_error_get_where());
135  return (int)cpl_error_get_code();
136  }
137 
138  if (plugin == NULL) {
139  cpl_msg_error(cpl_func, "Null plugin");
140  cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
141  }
142 
143  /* Verify plugin type */
144  if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
145  cpl_msg_error(cpl_func, "Plugin is not a recipe");
146  cpl_ensure_code(0, (int)CPL_ERROR_TYPE_MISMATCH);
147  }
148 
149  /* Get the recipe */
150  recipe = (cpl_recipe *)plugin;
151 
152  /* Create the parameters list in the cpl_recipe object */
153  recipe->parameters = cpl_parameterlist_new();
154  if (recipe->parameters == NULL) {
155  cpl_msg_error(cpl_func, "Parameter list allocation failed");
156  cpl_ensure_code(0, (int)CPL_ERROR_ILLEGAL_OUTPUT);
157  }
158 
159  /* Fill the parameters list */
160 
161  return 0;
162 }
163 
164 /*----------------------------------------------------------------------------*/
170 /*----------------------------------------------------------------------------*/
171 static int gravi_dual_baseline_exec(cpl_plugin * plugin)
172 {
173 
174  cpl_recipe * recipe;
175  int recipe_status;
176  cpl_errorstate initial_errorstate = cpl_errorstate_get();
177 
178  /* Return immediately if an error code is already set */
179  if (cpl_error_get_code() != CPL_ERROR_NONE) {
180  cpl_msg_error(cpl_func, "%s():%d: An error is already set: %s",
181  cpl_func, __LINE__, cpl_error_get_where());
182  return (int)cpl_error_get_code();
183  }
184 
185  if (plugin == NULL) {
186  cpl_msg_error(cpl_func, "Null plugin");
187  cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
188  }
189 
190  /* Verify plugin type */
191  if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
192  cpl_msg_error(cpl_func, "Plugin is not a recipe");
193  cpl_ensure_code(0, (int)CPL_ERROR_TYPE_MISMATCH);
194  }
195 
196  /* Get the recipe */
197  recipe = (cpl_recipe *)plugin;
198 
199  /* Verify parameter and frame lists */
200  if (recipe->parameters == NULL) {
201  cpl_msg_error(cpl_func, "Recipe invoked with NULL parameter list");
202  cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
203  }
204  if (recipe->frames == NULL) {
205  cpl_msg_error(cpl_func, "Recipe invoked with NULL frame set");
206  cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
207  }
208 
209  /* Invoke the recipe */
210  recipe_status = gravi_dual_baseline(recipe->frames, recipe->parameters);
211 
212  /* Ensure DFS-compliance of the products */
213  if (cpl_dfs_update_product_header(recipe->frames)) {
214  if (!recipe_status) recipe_status = (int)cpl_error_get_code();
215  }
216 
217  if (!cpl_errorstate_is_equal(initial_errorstate)) {
218  /* Dump the error history since recipe execution start.
219  At this point the recipe cannot recover from the error */
220  cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
221  }
222 
223  return recipe_status;
224 }
225 
226 /*----------------------------------------------------------------------------*/
232 /*----------------------------------------------------------------------------*/
233 static int gravi_dual_baseline_destroy(cpl_plugin * plugin)
234 {
235  cpl_recipe * recipe;
236 
237  if (plugin == NULL) {
238  cpl_msg_error(cpl_func, "Null plugin");
239  cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
240  }
241 
242  /* Verify plugin type */
243  if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
244  cpl_msg_error(cpl_func, "Plugin is not a recipe");
245  cpl_ensure_code(0, (int)CPL_ERROR_TYPE_MISMATCH);
246  }
247 
248  /* Get the recipe */
249  recipe = (cpl_recipe *)plugin;
250 
251  cpl_parameterlist_delete(recipe->parameters);
252 
253  return 0;
254 }
255 
256 
257 /*----------------------------------------------------------------------------*/
264 /*----------------------------------------------------------------------------*/
265 static int gravi_dual_baseline(cpl_frameset * frameset,
266  const cpl_parameterlist * parlist)
267 {
268  cpl_frameset * baseline_frameset = NULL, * usedframes;
269  cpl_frame * frame;
270  cpl_propertylist * applist, * primary_hdr;
271  const char * input;
272  char * output;
273  gravi_data * raw_data, * baseline_data;
274 // double dit;
275  int comp, nb_frame;
276 
277  /* Identify the RAW and CALIB frames in the input frameset */
278  cpl_ensure_code(gravi_dfs_set_groups(frameset) == CPL_ERROR_NONE,
279  cpl_error_get_code()) ;
280 
281  /* - Extract a set of frame dark */
282  baseline_frameset = gravi_frameset_extract_vis_calib(frameset);
283  if (cpl_frameset_is_empty(baseline_frameset)) {
284  cpl_frameset_delete(baseline_frameset);
285  /* To use this recipe the frameset must contain at least
286  * one dark frame. */
287  return (int)cpl_error_set_message(cpl_func, CPL_ERROR_INVALID_TYPE,
288  "No dark frame in the frameset") ;
289  }
290 
291  /* Apply the treatment for each dark frame contained in the frameset */
292  nb_frame = cpl_frameset_get_size(baseline_frameset);
293 
294 
295  for (comp = 0; comp < nb_frame; comp++){
296  frame = cpl_frameset_get_position(baseline_frameset, comp);
297  /* Find the file name and initialization of the output name */
298  input = cpl_frame_get_filename(frame) ;
299  output = cpl_sprintf("gravi_dual_baseline_0%d.fits", comp + 1);
300 
301  if (input == NULL) {
302  cpl_frameset_delete(baseline_frameset);
303  cpl_free(output);
304  /* The file name does not exist */
305  return (int)cpl_error_set_message(cpl_func, CPL_ERROR_NULL_INPUT,
306  "Input file does not exist") ;
307  }
308 
309  /* Compute the median of a set of dark frames */
310  raw_data = gravi_data_load(input);
311 
312  baseline_data = gravi_compute_baseline ( raw_data );
313 
314  if (cpl_error_get_code()) {
315  gravi_data_delete(baseline_data);
316  gravi_data_delete(raw_data);
317  cpl_frameset_delete(baseline_frameset);
318  cpl_free(output);
319 
320  return (int)cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
321  "Error while computing the master dark");
322  }
323 
324  primary_hdr = gravi_data_get_propertylist(baseline_data,
325  GRAVI_PRIMARY_HDR_NAME_EXT);
326 // dit = gravi_pfits_get_dit(primary_hdr);
327  //insname = gravi_pfits_get_insname(primary_hdr_dark);
328 
329  /* Create product frame, add DataFlow keywords, save the file, log the
330  * saved file in the input frameset*/
331  usedframes = cpl_frameset_new();
332  cpl_frameset_insert(usedframes, cpl_frame_duplicate(frame));
333  applist = gravi_propertylist_get_qc (primary_hdr); //cpl_propertylist_new();
334 
335 
336  cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, NAB_CAL);
337 // cpl_propertylist_append_double(applist, GRAVI_DET_DIT, dit);
338 
339  if (gravi_data_save(baseline_data, frameset, output, parlist,
340  usedframes, frame, "gravi_dual_baseline", applist)
341  != CPL_ERROR_NONE){
342  gravi_data_delete(baseline_data);
343  gravi_data_delete(raw_data);
344  cpl_frameset_delete(baseline_frameset);
345  cpl_frameset_delete(usedframes);
346  cpl_propertylist_delete(applist);
347  cpl_free(output);
348  return (int) cpl_error_set_message(cpl_func,
349  CPL_ERROR_ILLEGAL_OUTPUT, "Could not save the reduced baseline"
350  " on the output file");
351  }
352 
353  gravi_data_delete(baseline_data);
354  gravi_data_delete(raw_data);
355  cpl_frameset_delete(usedframes);
356  cpl_propertylist_delete(applist);
357  cpl_free(output);
358  }
359 
360  /* Deallocation of all variables */
361 
362  cpl_frameset_delete(baseline_frameset);
363  return (int)cpl_error_get_code();
364 }
365 
366