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
00033
00034
00035
00036 #include "visir_recipe.h"
00037
00038 #include "visir_spc_distortion.h"
00039 #include "visir_destripe.h"
00040 #ifdef _OPENMP
00041 #include <omp.h>
00042 #endif
00043
00044
00045
00046
00047
00048 #define RECIPE_STRING "visir_old_util_destripe"
00049
00050 #define VISIR_UTIL_DESTRIPE_PROCATG "DESTRIPED"
00051
00052
00053
00054
00055 static
00056 cpl_error_code visir_util_destripe_one(cpl_frameset *,
00057 irplib_framelist *, int,
00058 const cpl_parameterlist *,
00059 const int,
00060 const cpl_boolean);
00061
00062 #ifdef VISIR_CHAIN
00063 #define cpl_plugin_get_info visir_old_util_destripe_get_info
00064 #endif
00065 cpl_recipe_define(visir_old_util_destripe, VISIR_BINARY_VERSION,
00066 "Julian Taylor", PACKAGE_BUGREPORT, "2012",
00067 "Old DRS detector: Attempt to remove stripes in spectral data",
00068 "The files listed in the Set Of Frames (sof-file) "
00069 "must be tagged:\n"
00070 "VISIR-chopnod-corrected-file.fits " VISIR_UTIL_CORRECTED
00071 "\nThe product(s) will have a FITS card\n"
00072 "'HIERARCH ESO PRO CATG' with a value of:\n"
00073 VISIR_UTIL_DESTRIPE_PROCATG);
00074
00075
00079
00080
00081
00082
00083
00084
00085
00086
00094
00095 static cpl_error_code
00096 visir_old_util_destripe_fill_parameterlist(cpl_parameterlist * self)
00097 {
00098
00099 return visir_parameter_set(self, RECIPE_STRING, VISIR_PARAM_STRIPITE |
00100 VISIR_PARAM_STRIPMOR)
00101 ? cpl_error_set_where(cpl_func) : CPL_ERROR_NONE;
00102 }
00103
00104
00105
00112
00113 static int visir_old_util_destripe(cpl_frameset * framelist,
00114 const cpl_parameterlist * parlist)
00115 {
00116 #ifdef _OPENMP
00117 cpl_errorstate cleanstate = cpl_errorstate_get();
00118 #endif
00119 cpl_error_code didfail = CPL_ERROR_NONE;
00120 irplib_framelist * allframes = NULL;
00121 irplib_framelist * rawframes = NULL;
00122 int n;
00123
00124 #ifdef _OPENMP
00125 omp_set_num_threads(visir_get_num_threads(CPL_FALSE));
00126 #endif
00127
00128 skip_if (0);
00129
00130 int ndestripe = visir_parameterlist_get_int(parlist, RECIPE_STRING,
00131 VISIR_PARAM_STRIPITE);
00132 bug_if (0);
00133
00134 cpl_boolean morpho_destripe = ndestripe <= 0 ? CPL_FALSE :
00135 visir_parameterlist_get_bool(parlist, RECIPE_STRING,
00136 VISIR_PARAM_STRIPMOR);
00137 bug_if (0);
00138
00139
00140 allframes = irplib_framelist_cast(framelist);
00141 skip_if(allframes == NULL);
00142 rawframes = irplib_framelist_extract_regexp(allframes, "^("
00143 VISIR_UTIL_CORRECTED"|"
00144 VISIR_UTIL_UNDISTORT_PROCATG
00145 ")$",
00146 CPL_FALSE);
00147 skip_if (rawframes == NULL);
00148 n = irplib_framelist_get_size(rawframes);
00149
00150 #ifdef _OPENMP
00151 #pragma omp parallel for
00152 #endif
00153 for (cpl_size i = 0; i < n; i++) {
00154 if (!didfail) {
00155
00156
00157
00158
00159
00160
00161
00162
00163 if (visir_util_destripe_one(framelist, rawframes, i, parlist,
00164 ndestripe, morpho_destripe)) {
00165 const cpl_error_code errori = cpl_error_set_where(cpl_func);
00166 #ifdef _OPENMP
00167
00168
00169 cpl_errorstate_dump(cleanstate, CPL_FALSE, NULL);
00170 cpl_errorstate_set(cleanstate);
00171 #pragma omp critical(visir_util_destripe)
00172 #endif
00173 didfail = errori;
00174 }
00175 }
00176 }
00177
00178 error_if(didfail, didfail, "Failed to destripe images in %d frame(s)", n);
00179
00180 end_skip;
00181
00182 irplib_framelist_delete(allframes);
00183 irplib_framelist_delete(rawframes);
00184
00185 return cpl_error_get_code();
00186 }
00187
00188
00189
00201
00202 static
00203 cpl_error_code visir_util_destripe_one(cpl_frameset * framelist,
00204 irplib_framelist * rawframes, int iframe,
00205 const cpl_parameterlist * parlist,
00206 const int ndestripe,
00207 const cpl_boolean morpho_destripe)
00208 {
00209
00210 cpl_frameset * products = cpl_frameset_new();
00211 cpl_frameset * usedframes = cpl_frameset_new();
00212 const cpl_frame * rawframe = irplib_framelist_get_const(rawframes, iframe);
00213 const char * filename = cpl_frame_get_filename(rawframe);
00214 cpl_image * img = NULL;
00215 char * proname = cpl_sprintf(RECIPE_STRING "_%d" CPL_DFS_FITS,
00216 1+iframe);
00217 cpl_propertylist * plist = NULL;
00218 visir_data_type dtype;
00219 cpl_size next;
00220
00221 cpl_frame_set_group(irplib_framelist_get(rawframes, iframe),
00222 CPL_FRAME_GROUP_RAW);
00223 bug_if(cpl_frameset_insert(usedframes, cpl_frame_duplicate
00224 (irplib_framelist_get_const(rawframes,
00225 iframe))));
00226
00227 irplib_framelist_load_propertylist(rawframes, iframe, 0, ".?", CPL_FALSE);
00228 plist = irplib_framelist_get_propertylist(rawframes, iframe);
00229
00230 skip_if(visir_get_data_type(rawframe, plist, &dtype, &next));
00231 skip_if(irplib_dfs_save_propertylist(products, parlist, usedframes,
00232 RECIPE_STRING,
00233 VISIR_UTIL_DESTRIPE_PROCATG, plist,
00234 NULL,
00235 visir_pipe_id, proname));
00236
00237 for (cpl_size iext = 0; iext < 1 + next; iext++) {
00238 cpl_errorstate prestate = cpl_errorstate_get();
00239
00240 img = cpl_image_load(filename, CPL_TYPE_FLOAT, 0, iext);
00241 if (img == NULL) {
00242 cpl_msg_info(cpl_func, "No image-data in extension %d", (int)iext);
00243 cpl_errorstate_set(prestate);
00244 continue;
00245 }
00246
00247
00248 if (visir_data_is_drs(dtype)) {
00249 if(visir_destripe_image(img, ndestripe,
00250 VISIR_DESTRIPE_DETECT,
00251 VISIR_DESTRIPE_DETECT_THRESHOLD,
00252 morpho_destripe)) {
00253 cpl_error_set_message(cpl_func,
00254 cpl_error_get_code(),
00255 "Failure for extension %d/%d",
00256 (int)iext, (int)next);
00257 break;
00258 }
00259 }
00260
00261 cpl_image_save(img, proname, CPL_BPP_IEEE_FLOAT,
00262 NULL, CPL_IO_EXTEND);
00263 }
00264
00265 FOR_EACH_FRAMESET_C(frame, products) {
00266 cpl_frame * copy = cpl_frame_duplicate(frame);
00267 cpl_error_code error;
00268
00269 #ifdef _OPENMP
00270 #pragma omp critical(visir_util_destripe_one)
00271 #endif
00272 error = cpl_frameset_insert(framelist, copy);
00273
00274 skip_if(error);
00275 }
00276
00277
00278 end_skip;
00279
00280 cpl_image_delete(img);
00281 cpl_frameset_delete(usedframes);
00282 cpl_frameset_delete(products);
00283 cpl_free(proname);
00284
00285 return cpl_error_get_code();
00286 }