GRAVI Pipeline Reference Manual  0.6.3
gravi_all_dark.c
1 /* $Id: gravi_all_dark.c,v 1.29 2011/03/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: 2011/03/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_all_dark_create(cpl_plugin *);
53 static int gravi_all_dark_exec(cpl_plugin *);
54 static int gravi_all_dark_destroy(cpl_plugin *);
55 static int gravi_all_dark(cpl_frameset *, const cpl_parameterlist *);
56 
57 /*-----------------------------------------------------------------------------
58  Static variables
59  -----------------------------------------------------------------------------*/
60 
61 static char gravi_all_dark_description[] =
62 "This recipe is used to compute the median of a raw dark set of integration.\n"
63 "The median of each pixel is computed along the time axis for the FT and SC channel.\n"
64 "The master dark frame is created from these two median images.\n"
65 "Description DO category\n"
66 "Required input :\n"
67 "Raw dark file (one or more) " GRAVI_DARK "\n"
68 "Ouput :\n"
69 "Master dark (one per input file) " DARK "\n"
70 "Bad pixel map (one per input file) " BAD "\n"
71 "\n";
72 
73 /*-----------------------------------------------------------------------------
74  Function code
75  -----------------------------------------------------------------------------*/
76 
77 /*----------------------------------------------------------------------------*/
87 /*----------------------------------------------------------------------------*/
88 int cpl_plugin_get_info(cpl_pluginlist * list)
89 {
90  cpl_recipe * recipe = cpl_calloc(1, sizeof *recipe );
91  cpl_plugin * plugin = &recipe->interface;
92 
93  if (cpl_plugin_init(plugin,
94  CPL_PLUGIN_API,
95  GRAVI_BINARY_VERSION,
96  CPL_PLUGIN_TYPE_RECIPE,
97  "gravi_all_dark",
98  "This recipe is used to compute the median of a raw dark set of integration.",
99  gravi_all_dark_description,
100  "Firstname Lastname",
101  PACKAGE_BUGREPORT,
102  gravi_get_license(),
103  gravi_all_dark_create,
104  gravi_all_dark_exec,
105  gravi_all_dark_destroy)) {
106  cpl_msg_error(cpl_func, "Plugin initialization failed");
107  (void)cpl_error_set_where(cpl_func);
108  return 1;
109  }
110 
111  if (cpl_pluginlist_append(list, plugin)) {
112  cpl_msg_error(cpl_func, "Error adding plugin to list");
113  (void)cpl_error_set_where(cpl_func);
114  return 1;
115  }
116 
117  return 0;
118 }
119 
120 /*----------------------------------------------------------------------------*/
128 /*----------------------------------------------------------------------------*/
129 static int gravi_all_dark_create(cpl_plugin * plugin)
130 {
131  cpl_recipe * recipe;
132  cpl_parameter * p;
133 
134  /* Do not create the recipe if an error code is already set */
135  if (cpl_error_get_code() != CPL_ERROR_NONE) {
136  cpl_msg_error(cpl_func, "%s():%d: An error is already set: %s",
137  cpl_func, __LINE__, cpl_error_get_where());
138  return (int)cpl_error_get_code();
139  }
140 
141  if (plugin == NULL) {
142  cpl_msg_error(cpl_func, "Null plugin");
143  cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
144  }
145 
146  /* Verify plugin type */
147  if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
148  cpl_msg_error(cpl_func, "Plugin is not a recipe");
149  cpl_ensure_code(0, (int)CPL_ERROR_TYPE_MISMATCH);
150  }
151 
152  /* Get the recipe */
153  recipe = (cpl_recipe *)plugin;
154 
155  /* Create the parameters list in the cpl_recipe object */
156  recipe->parameters = cpl_parameterlist_new();
157  if (recipe->parameters == NULL) {
158  cpl_msg_error(cpl_func, "Parameter list allocation failed");
159  cpl_ensure_code(0, (int)CPL_ERROR_ILLEGAL_OUTPUT);
160  }
161 
162  /* Fill the parameters list */
163 
164  p = cpl_parameter_new_value("gravi."
165  "flat_param.Bad_dark_threshold", CPL_TYPE_INT, "the rms factor for "
166  "dark bad pixel threshold", "gravi.gravi_all_flat", 5);
167  cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, "Bad_dark_threshold");
168  cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
169  cpl_parameterlist_append(recipe->parameters, p);
170 
171  return 0;
172 }
173 
174 /*----------------------------------------------------------------------------*/
180 /*----------------------------------------------------------------------------*/
181 static int gravi_all_dark_exec(cpl_plugin * plugin)
182 {
183 
184  cpl_recipe * recipe;
185  int recipe_status;
186  cpl_errorstate initial_errorstate = cpl_errorstate_get();
187 
188  /* Return immediately if an error code is already set */
189  if (cpl_error_get_code() != CPL_ERROR_NONE) {
190  cpl_msg_error(cpl_func, "%s():%d: An error is already set: %s",
191  cpl_func, __LINE__, cpl_error_get_where());
192  return (int)cpl_error_get_code();
193  }
194 
195  if (plugin == NULL) {
196  cpl_msg_error(cpl_func, "Null plugin");
197  cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
198  }
199 
200  /* Verify plugin type */
201  if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
202  cpl_msg_error(cpl_func, "Plugin is not a recipe");
203  cpl_ensure_code(0, (int)CPL_ERROR_TYPE_MISMATCH);
204  }
205 
206  /* Get the recipe */
207  recipe = (cpl_recipe *)plugin;
208 
209  /* Verify parameter and frame lists */
210  if (recipe->parameters == NULL) {
211  cpl_msg_error(cpl_func, "Recipe invoked with NULL parameter list");
212  cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
213  }
214  if (recipe->frames == NULL) {
215  cpl_msg_error(cpl_func, "Recipe invoked with NULL frame set");
216  cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
217  }
218 
219  /* Invoke the recipe */
220  recipe_status = gravi_all_dark(recipe->frames, recipe->parameters);
221 
222  /* Ensure DFS-compliance of the products */
223  if (cpl_dfs_update_product_header(recipe->frames)) {
224  if (!recipe_status) recipe_status = (int)cpl_error_get_code();
225  }
226 
227  if (!cpl_errorstate_is_equal(initial_errorstate)) {
228  /* Dump the error history since recipe execution start.
229  At this point the recipe cannot recover from the error */
230  cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
231  }
232 
233  return recipe_status;
234 }
235 
236 /*----------------------------------------------------------------------------*/
242 /*----------------------------------------------------------------------------*/
243 static int gravi_all_dark_destroy(cpl_plugin * plugin)
244 {
245  cpl_recipe * recipe;
246 
247  if (plugin == NULL) {
248  cpl_msg_error(cpl_func, "Null plugin");
249  cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
250  }
251 
252  /* Verify plugin type */
253  if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
254  cpl_msg_error(cpl_func, "Plugin is not a recipe");
255  cpl_ensure_code(0, (int)CPL_ERROR_TYPE_MISMATCH);
256  }
257 
258  /* Get the recipe */
259  recipe = (cpl_recipe *)plugin;
260 
261  cpl_parameterlist_delete(recipe->parameters);
262 
263  return 0;
264 }
265 
266 
267 /*----------------------------------------------------------------------------*/
274 /*----------------------------------------------------------------------------*/
275 static int gravi_all_dark(cpl_frameset * frameset,
276  const cpl_parameterlist * parlist)
277 {
278  cpl_frameset * dark_frameset = NULL, * usedframes;
279  cpl_frame * frame;
280  cpl_propertylist * applist, * primary_hdr;
281  const char * input;
282  char * output;
283  gravi_data * raw_dark, * reduced_dark, * bad_map;
284  int * shutter;
285 // double dit;
286  int comp, nb_frame;
287 
288  /* Identify the RAW and CALIB frames in the input frameset */
289  cpl_ensure_code(gravi_dfs_set_groups(frameset) == CPL_ERROR_NONE,
290  cpl_error_get_code()) ;
291 
292  /* - Extract a set of frame dark */
293  dark_frameset = gravi_frameset_extract_dark(frameset);
294  if (cpl_frameset_is_empty(dark_frameset)) {
295  cpl_frameset_delete(dark_frameset);
296  /* To use this recipe the frameset must contain at least
297  * one dark frame. */
298  return (int)cpl_error_set_message(cpl_func, CPL_ERROR_INVALID_TYPE,
299  "No dark frame in the frameset") ;
300  }
301 
302  /* Apply the treatment for each dark frame contained in the frameset */
303  nb_frame = cpl_frameset_get_size(dark_frameset);
304 
305  for (comp = 0; comp < nb_frame; comp++){
306 
307  /* Find the file name and initialization of the output name */
308  frame = cpl_frameset_get_position(dark_frameset, comp);
309 
310  input = cpl_frame_get_filename(frame) ;
311  cpl_msg_info (NULL, "This file %s is a raw dark file", input);
312  output = cpl_sprintf("gravi_all_dark_0%d.fits", comp + 1);
313 
314  if (input == NULL) {
315  cpl_frameset_delete(dark_frameset);
316  cpl_free(output);
317  /* The file name does not exist */
318  return (int)cpl_error_set_message(cpl_func, CPL_ERROR_NULL_INPUT,
319  "Input file does not exist") ;
320  }
321 
322  /* Compute the median of a set of dark frames */
323  raw_dark = gravi_data_load(input);
324 
325  primary_hdr = gravi_data_get_propertylist(raw_dark,
326  GRAVI_PRIMARY_HDR_NAME_EXT);
327  shutter = gravi_shutters_check(primary_hdr);
328 
329  if ((shutter [0] != 0) || (shutter [1] != 0) ||
330  (shutter [2] != 0) || (shutter [3] != 0)){
331  cpl_msg_info (NULL, "The shutters of this file are not all close");
332  // gravi_data_delete(raw_dark);
333  // cpl_free(shutter);
334  // cpl_free(output);
335 
336 // continue;
337  }
338  cpl_free (shutter);
339  reduced_dark = gravi_compute_dark( raw_dark );
340 
341  if (cpl_error_get_code()) {
342  gravi_data_delete(reduced_dark);
343  gravi_data_delete(raw_dark);
344  cpl_frameset_delete(dark_frameset);
345  cpl_free(output);
346 
347  return (int)cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
348  "Error while computing the master dark");
349  }
350 
351  primary_hdr = gravi_data_get_propertylist(reduced_dark,
352  GRAVI_PRIMARY_HDR_NAME_EXT);
353 // dit = gravi_pfits_get_dit(primary_hdr);
354  //insname = gravi_pfits_get_insname(primary_hdr_dark);
355 
356  /* Create product frame, add DataFlow keywords, save the file, log the
357  * saved file in the input frameset*/
358  usedframes = cpl_frameset_new();
359  cpl_frameset_insert(usedframes, cpl_frame_duplicate(frame));
360  applist = gravi_propertylist_get_qc (primary_hdr);
361 
362 
363  cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, DARK);
364 // cpl_propertylist_append_double(applist, GRAVI_DET_DIT, dit);
365 
366  if (gravi_data_save(reduced_dark, frameset, output, parlist,
367  usedframes, frame, "gravi_all_dark", applist)
368  != CPL_ERROR_NONE){
369  gravi_data_delete(reduced_dark);
370  gravi_data_delete(raw_dark);
371  cpl_frameset_delete(dark_frameset);
372  cpl_frameset_delete(usedframes);
373  cpl_propertylist_delete(applist);
374  cpl_free(output);
375  return (int) cpl_error_set_message(cpl_func,
376  CPL_ERROR_ILLEGAL_OUTPUT, "Could not save the reduced_dark"
377  " on the output file");
378  }
379 
380  gravi_data_delete(reduced_dark);
381  gravi_data_delete(raw_dark);
382  cpl_frameset_delete(usedframes);
383  cpl_propertylist_delete(applist);
384  cpl_free(output);
385  }
386 
387  /* Deallocation of all variables */
388 
389  cpl_frameset_delete(dark_frameset);
390  return (int)cpl_error_get_code();
391 }
392 
393