FORS Pipeline Reference Manual  4.12.5
fors_stack-test.c
1 /* $Id: fors_stack-test.c,v 1.10 2013-09-11 10:04:50 cgarcia Exp $
2  *
3  * This file is part of the FORS Library
4  * Copyright (C) 2002-2006 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /*
22  * $Author: cgarcia $
23  * $Date: 2013-09-11 10:04:50 $
24  * $Revision: 1.10 $
25  * $Name: not supported by cvs2svn $
26  */
27 
28 #ifdef HAVE_CONFIG_H
29 #include <config.h>
30 #endif
31 
32 #include <fors_image.h>
33 #include <fors_stack.h>
34 #include <fors_dfs.h>
35 #include <fors_utils.h>
36 
37 #include <test_simulate.h>
38 #include <test.h>
39 
46 #undef cleanup
47 #define cleanup \
48 do { \
49  cpl_frameset_delete(raw); \
50  fors_stack_method_delete(&sm); \
51  fors_setting_delete(&setting); \
52  cpl_parameterlist_delete(parameters); \
53  fors_image_list_delete_const(&ilist, fors_image_delete); \
54 } while(0)
55 
59 static void
61 {
62  const unsigned N = 3;
63  const fors_image_list *ilist = NULL;
64  cpl_frameset *raw = cpl_frameset_new();
65  fors_setting *setting = NULL;
66  stack_method *sm = NULL;
67  fors_image *master = NULL;
68  const char *master_filename = NULL;
69  cpl_parameterlist *parameters = NULL;
70  const char *filename[] = {"stack_bias_1.fits",
71  "stack_bias_2.fits",
72  "stack_bias_3.fits"};
73 
74  const char *method[] = {"average",
75  "median",
76  "minmax",
77  "ksigma"};
78  unsigned i;
79 
80  /* Simulate raw bias */
81  for (i = 0; i < N; i++) {
82  cpl_frame *bias;
83 
84  bias = create_bias(filename[i], BIAS, CPL_FRAME_GROUP_RAW);
85 
86  assure( !cpl_error_get_code(), return,
87  "Create bias %s failed", filename[i] );
88 
89  cpl_frameset_insert(raw, bias);
90  }
91 
92  setting = fors_setting_new(cpl_frameset_get_position(raw, 0));
93 
94  ilist = fors_image_load_list(raw);
95  assure( ilist != NULL, return, "Loading list failed" );
96 
97  test_eq( fors_image_list_size(ilist), 3 );
98 
99  /* For each stack method */
100  for (i = 0; i < 2; i++) {
101 //fixme: enable these tests for (i = 0; i < sizeof(method)/sizeof(char *); i++) {
102  const char *const context = "test";
103 
104  parameters = cpl_parameterlist_new();
105 
106  fors_stack_define_parameters(parameters, context, "median");
107  assure( !cpl_error_get_code(), return,
108  "Define parameters" );
109 
110  cpl_parameter_set_string(cpl_parameterlist_find(
111  parameters, "test.stack_method"),
112  method[i]);
113 
114 
115  sm = fors_stack_method_new(parameters, context);
116 
117  /* Call function */
118  master = fors_stack_const(ilist, sm);
119  assure( !cpl_error_get_code(), return,
120  "Could not stack images using method %s", method[i]);
121 
122  /* Compare results */
123 
124  /* Same level */
125  test_abs( fors_image_get_mean(master, NULL),
126  fors_image_get_mean(fors_image_list_first_const(ilist), NULL), 1.0);
127 
128  /* Test that avg(sigma_i) is consistent with empirical stdev */
129  test_rel( fors_image_get_stdev(master, NULL),
130  fors_image_get_error_mean(master, NULL),
131  i == 0 ? 0.01 :
132  i == 1 ? 0.1 : 0.01);
133 
134 
135  /* Save */
136  master_filename = cpl_sprintf("stack_master_bias_%s.fits", method[i]);
137 
138  fors_image_save(master, NULL, master_filename);
139  assure( !cpl_error_get_code(), return,
140  "Error saving stacked image to %s", master_filename);
141 
142 
144  cpl_parameterlist_delete(parameters); parameters = NULL;
145  fors_image_delete(&master);
146  cpl_free((void *)master_filename); master_filename = NULL;
147  }
148 
149  cleanup;
150  return;
151 }
152 
156 int main(void)
157 {
158  TEST_INIT;
159 
160  /* cpl_msg_set_level(CPL_MSG_DEBUG); */
161  test_stack();
162 
163  TEST_END;
164 }
165 
cpl_frame * create_bias(const char *filename, const char *tag, cpl_frame_group group)
Simulate bias image.
fors_setting * fors_setting_new(const cpl_frame *raw)
Create setting from FITS header.
Definition: fors_setting.c:64
int main(void)
Test of image stacking module.
static void test_stack(void)
Test image i/o + stacking.
double fors_image_get_stdev(const fors_image *image, double *dstdev)
Get empirical stdev of data.
Definition: fors_image.c:1377
void fors_image_delete(fors_image **image)
Deallocate image and set pointer to NULL.
Definition: fors_image.c:162
#define assure(EXPR)
Definition: list.c:101
double fors_image_get_mean(const fors_image *image, double *dmean)
Get mean data value.
Definition: fors_image.c:970
void fors_stack_define_parameters(cpl_parameterlist *parameters, const char *context, const char *default_method)
Define recipe parameters.
Definition: fors_stack.c:55
fors_image_list * fors_image_load_list(const cpl_frameset *frames)
Load imagelist.
Definition: fors_image.c:234
void fors_stack_method_delete(stack_method **sm)
Destructor.
Definition: fors_stack.c:273
stack_method * fors_stack_method_new(const cpl_parameterlist *parameters, const char *context)
Get stack method from parameter list.
Definition: fors_stack.c:157
void fors_image_save(const fors_image *image, const cpl_propertylist *header, const char *filename)
Save image.
Definition: fors_image.c:383
double fors_image_get_error_mean(const fors_image *image, double *dmean)
Get mean of error bars.
Definition: fors_image.c:1441
fors_image * fors_stack_const(const fors_image_list *images, const stack_method *sm)
Stack images.
Definition: fors_stack.c:306