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_dark_impl.h>
00033
00034 #include <fors_stack.h>
00035 #include <fors_dfs.h>
00036 #include <fors_utils.h>
00037
00038 #include <cpl.h>
00039
00046 const char *const fors_dark_name = "fors_dark";
00047 const char *const fors_dark_description_short = "Compute master dark frame";
00048 const char *const fors_dark_author = "Jonas M. Larsen";
00049 const char *const fors_dark_email = PACKAGE_BUGREPORT;
00050 const char *const fors_dark_description =
00051 "This recipe is used to combine input raw DARK frames into a master dark\n"
00052 "frame by subtracing the master bias and using the given stacking method.\n"
00053 "The overscan regions, if present, are removed from the result.\n"
00054 "\n"
00055 "Input files:\n"
00056 "\n"
00057 " DO category: Type: Explanation: Required:\n"
00058 " DARK Raw Dark frame Y\n"
00059 " MASTER_BIAS FITS image Master bias Y\n"
00060 "\n"
00061 "Output files:\n"
00062 "\n"
00063 " DO category: Data type: Explanation:\n"
00064 " MASTER_DARK FITS image Master dark frame\n"
00065 "\n";
00066
00071 void fors_dark_define_parameters(cpl_parameterlist *parameters)
00072 {
00073 const char *context = cpl_sprintf("fors.%s", fors_dark_name);
00074
00075 fors_stack_define_parameters(parameters, context, "median");
00076
00077 cpl_free((void *)context);
00078
00079 return;
00080 }
00081
00082 #undef cleanup
00083 #define cleanup \
00084 do { \
00085 cpl_frameset_delete(dark_frames); \
00086 cpl_frameset_delete(master_bias_frame); \
00087 fors_image_delete_const(&master_bias); \
00088 fors_stack_method_delete(&sm); \
00089 fors_image_delete(&master_dark); \
00090 fors_image_list_delete_const(&darks, fors_image_delete); \
00091 fors_setting_delete(&setting); \
00092 cpl_free((void *)context); \
00093 } while (0)
00094
00103 void fors_dark(cpl_frameset *frames, const cpl_parameterlist *parameters)
00104 {
00105
00106 cpl_frameset *dark_frames = NULL;
00107 const fors_image_list *darks = NULL;
00108
00109
00110 cpl_frameset *master_bias_frame = NULL;
00111 const fors_image *master_bias = NULL;
00112
00113
00114 fors_image *master_dark = NULL;
00115
00116
00117 stack_method *sm = NULL;
00118
00119
00120 fors_setting *setting = NULL;
00121 const char *context = cpl_sprintf("fors.%s", fors_dark_name);
00122
00123
00124 sm = fors_stack_method_new(parameters, context);
00125 assure( !cpl_error_get_code(), return, "Could not get stacking method");
00126
00127
00128 dark_frames = fors_frameset_extract(frames, DARK);
00129 assure( cpl_frameset_get_size(dark_frames) > 0, return,
00130 "No %s provided", DARK);
00131
00132
00133 master_bias_frame = fors_frameset_extract(frames, MASTER_BIAS);
00134 assure( cpl_frameset_get_size(master_bias_frame) == 1, return,
00135 "One %s required. %d found",
00136 MASTER_BIAS, cpl_frameset_get_size(master_bias_frame));
00137
00138
00139 setting = fors_setting_new(cpl_frameset_get_first(dark_frames));
00140 assure( !cpl_error_get_code(), return, "Could not get instrument setting" );
00141
00142 master_bias = fors_image_load(cpl_frameset_get_first(master_bias_frame),
00143 NULL, setting,
00144 NULL);
00145 assure( !cpl_error_get_code(), return,
00146 "Could not load master bias");
00147
00148
00149 darks = fors_image_load_list_const(dark_frames, master_bias, setting, NULL);
00150 assure( !cpl_error_get_code(), return, "Could not load dark images");
00151
00152
00153 master_dark = fors_stack_const(darks, sm);
00154 assure( !cpl_error_get_code(), return, "Dark stacking failed");
00155
00156
00157 fors_dfs_save_image(frames, master_dark, MASTER_DARK,
00158 NULL, parameters, fors_dark_name,
00159 cpl_frameset_get_first(dark_frames));
00160 assure( !cpl_error_get_code(), return, "Saving %s failed",
00161 MASTER_DARK);
00162
00163 cleanup;
00164 return;
00165 }
00166