00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifdef HAVE_CONFIG_H
00029 #include <config.h>
00030 #endif
00031
00032 #include <fors_image.h>
00033 #include <fors_stack.h>
00034 #include <fors_dfs.h>
00035 #include <fors_utils.h>
00036
00037 #include <test_simulate.h>
00038 #include <test.h>
00039
00046 #undef cleanup
00047 #define cleanup \
00048 do { \
00049 cpl_frameset_delete(raw); \
00050 fors_stack_method_delete(&sm); \
00051 fors_setting_delete(&setting); \
00052 cpl_parameterlist_delete(parameters); \
00053 fors_image_list_delete_const(&ilist, fors_image_delete); \
00054 } while(0)
00055
00059 static void
00060 test_stack(void)
00061 {
00062 const unsigned N = 3;
00063 const fors_image_list *ilist = NULL;
00064 cpl_frameset *raw = cpl_frameset_new();
00065 fors_setting *setting = NULL;
00066 stack_method *sm = NULL;
00067 fors_image *master = NULL;
00068 const char *master_filename = NULL;
00069 cpl_parameterlist *parameters = NULL;
00070 const char *filename[] = {"stack_bias_1.fits",
00071 "stack_bias_2.fits",
00072 "stack_bias_3.fits"};
00073
00074 const char *method[] = {"average",
00075 "median",
00076 "minmax",
00077 "ksigma"};
00078 unsigned i;
00079
00080
00081 for (i = 0; i < N; i++) {
00082 cpl_frame *bias;
00083
00084 bias = create_bias(filename[i], BIAS, CPL_FRAME_GROUP_RAW);
00085
00086 assure( !cpl_error_get_code(), return,
00087 "Create bias %s failed", filename[i] );
00088
00089 cpl_frameset_insert(raw, bias);
00090 }
00091
00092 setting = fors_setting_new(cpl_frameset_get_first(raw));
00093
00094 ilist = fors_image_load_list(raw, NULL, setting, NULL);
00095 assure( ilist != NULL, return, "Loading list failed" );
00096
00097 test_eq( fors_image_list_size(ilist), 3 );
00098
00099
00100 for (i = 0; i < 2; i++) {
00101
00102 const char *const context = "test";
00103
00104 parameters = cpl_parameterlist_new();
00105
00106 fors_stack_define_parameters(parameters, context, "median");
00107 assure( !cpl_error_get_code(), return,
00108 "Define parameters" );
00109
00110 cpl_parameter_set_string(cpl_parameterlist_find(
00111 parameters, "test.stack_method"),
00112 method[i]);
00113
00114
00115 sm = fors_stack_method_new(parameters, context);
00116
00117
00118 master = fors_stack_const(ilist, sm);
00119 assure( !cpl_error_get_code(), return,
00120 "Could not stack images using method %s", method[i]);
00121
00122
00123
00124
00125 test_abs( fors_image_get_mean(master, NULL),
00126 fors_image_get_mean(fors_image_list_first_const(ilist), NULL), 1.0);
00127
00128
00129 test_rel( fors_image_get_stdev(master, NULL),
00130 fors_image_get_error_mean(master, NULL),
00131 i == 0 ? 0.01 :
00132 i == 1 ? 0.1 : 0.01);
00133
00134
00135
00136 master_filename = cpl_sprintf("stack_master_bias_%s.fits", method[i]);
00137
00138 fors_image_save(master, NULL, master_filename);
00139 assure( !cpl_error_get_code(), return,
00140 "Error saving stacked image to %s", master_filename);
00141
00142
00143 fors_stack_method_delete(&sm);
00144 cpl_parameterlist_delete(parameters); parameters = NULL;
00145 fors_image_delete(&master);
00146 cpl_free((void *)master_filename); master_filename = NULL;
00147 }
00148
00149 cleanup;
00150 return;
00151 }
00152
00156 int main(void)
00157 {
00158 TEST_INIT;
00159
00160
00161 test_stack();
00162
00163 TEST_END;
00164 }
00165