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 #ifdef HAVE_CONFIG_H
00028 #include <config.h>
00029 #endif
00030
00031
00039
00042
00043
00044
00045
00046
00047
00048
00049
00050 #include <xsh_error.h>
00051
00052 #include <xsh_utils.h>
00053 #include <xsh_msg.h>
00054 #include <xsh_data_instrument.h>
00055 #include <math.h>
00056
00057 #include <xsh_dfs.h>
00058
00059 #include <xsh_drl.h>
00060 #include <xsh_pfits.h>
00061 #include <xsh_detmon.h>
00062 #include <xsh_irplib_utils.h>
00063 #include <xsh_paf_save.h>
00064 #include <xsh_utils_image.h>
00065 #include <xsh_parameters.h>
00066 #include <xsh_drl_check.h>
00067 #include <xsh_model_arm_constants.h>
00068
00069
00070 #include <cpl.h>
00071 #include <assert.h>
00072
00073
00074
00075
00076 #define RECIPE_ID "xsh_mbias"
00077 #define RECIPE_AUTHOR "P.Goldoni, L.Guglielmi, R. Haigron, F. Royer, D. Bramich, A. Modigliani"
00078 #define RECIPE_CONTACT "amodigli@eso.org"
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 static int xsh_mbias_create(cpl_plugin *);
00089 static int xsh_mbias_exec(cpl_plugin *);
00090 static int xsh_mbias_destroy(cpl_plugin *);
00091
00092
00093 static void xsh_mbias(cpl_parameterlist *, cpl_frameset *);
00094
00095
00096
00097
00098 static char xsh_mbias_description_short[] = "Create the master bias frame";
00099
00100 static char xsh_mbias_description[] =
00101 "This recipe creates a master bias frame by computing the median of all \
00102 input bias frames.\n\
00103 Input Frames : \n\
00104 - A set of n RAW frames (Format=RAW, n >=3, Tag = BIAS_arm)\n\
00105 - [OPTIONAL] A map of non linear bad pixels (Format=QUP, Tag = BP_MAP_NL_arm)\n\
00106 - [OPTIONAL] A map of reference bad pixels (Format = QUP,RAW, Tag = BP_MAP_RP_arm)\n\
00107 Products : \n\
00108 - A master bias frame (Format=PRE, PRO.CATG = MASTER_BIAS_arm)\n";
00109
00110
00111
00112
00113
00122
00123
00124 int cpl_plugin_get_info(cpl_pluginlist * list)
00125 {
00126 cpl_recipe *recipe = NULL;
00127 cpl_plugin *plugin = NULL;
00128
00129 recipe = cpl_calloc(1, sizeof(*recipe));
00130 if (recipe == NULL) {
00131 return -1;
00132 }
00133
00134 plugin = &recipe->interface;
00135
00136 cpl_plugin_init(plugin, CPL_PLUGIN_API,
00137 XSH_BINARY_VERSION,
00138 CPL_PLUGIN_TYPE_RECIPE,
00139 RECIPE_ID,
00140 xsh_mbias_description_short,
00141 xsh_mbias_description,
00142 RECIPE_AUTHOR,
00143 RECIPE_CONTACT,
00144 xsh_get_license(),
00145 xsh_mbias_create,
00146 xsh_mbias_exec,
00147 xsh_mbias_destroy);
00148
00149 cpl_pluginlist_append(list, plugin);
00150
00151 return (cpl_error_get_code() != CPL_ERROR_NONE);
00152 }
00153
00154
00164
00165
00166 static int xsh_mbias_create(cpl_plugin * plugin)
00167 {
00168 cpl_recipe *recipe = NULL;
00169 xsh_fpn_param fpn_param = {10,10,1024,1024,10,100};
00170 xsh_ron_param ron_param = {"ALL",
00171 10,100,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,25};
00172 xsh_struct_param struct_param = {-1,-1};
00173 xsh_stack_param stack_param = {"median",5.,5.};
00174 int ival=DECODE_BP_FLAG_DEF;
00175
00176 xsh_init();
00177
00178
00179 assure(plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin");
00180
00181
00182 assure(cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00183 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00184
00185 recipe = (cpl_recipe *) plugin;
00186
00187
00188 recipe->parameters = cpl_parameterlist_new();
00189 assure(recipe->parameters != NULL,
00190 CPL_ERROR_ILLEGAL_OUTPUT, "Memory allocation failed!");
00191
00192
00193 check( xsh_parameters_generic( RECIPE_ID, recipe->parameters ) ) ;
00194 xsh_parameters_decode_bp(RECIPE_ID,recipe->parameters,ival);
00195 check(xsh_parameters_stack_create(RECIPE_ID,recipe->parameters,stack_param));
00196 check(xsh_parameters_fpn_create(RECIPE_ID,recipe->parameters,fpn_param));
00197 check(xsh_parameters_ron_create(RECIPE_ID,recipe->parameters,ron_param));
00198 check(xsh_parameters_struct_create(RECIPE_ID,recipe->parameters,struct_param));
00199 cleanup:
00200 if (cpl_error_get_code() != CPL_ERROR_NONE) {
00201 xsh_error_dump(CPL_MSG_ERROR);
00202 return 1;
00203 } else {
00204 return 0;
00205 }
00206 }
00207
00208
00214
00215
00216 static int xsh_mbias_exec(cpl_plugin * plugin)
00217 {
00218 cpl_recipe *recipe = NULL;
00219
00220
00221 assure(plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin");
00222
00223
00224 assure(cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00225 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00226
00227 recipe = (cpl_recipe *) plugin;
00228
00229
00230 xsh_mbias(recipe->parameters, recipe->frames);
00231
00232 cleanup:
00233 if (cpl_error_get_code() != CPL_ERROR_NONE) {
00234 xsh_error_dump(CPL_MSG_ERROR);
00235 cpl_error_reset();
00236 return 1;
00237 } else {
00238 return 0;
00239 }
00240 }
00241
00242
00248
00249 static int xsh_mbias_destroy(cpl_plugin * plugin)
00250 {
00251 cpl_recipe *recipe = NULL;
00252
00253 xsh_error_reset();
00254
00255 assure(plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin");
00256
00257
00258 assure(cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00259 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00260
00261 recipe = (cpl_recipe *) plugin;
00262
00263 xsh_free_parameterlist(&recipe->parameters);
00264
00265 cleanup:
00266 if (cpl_error_get_code() != CPL_ERROR_NONE) {
00267 return 1;
00268 } else {
00269 return 0;
00270 }
00271 }
00272
00273
00274
00275
00276
00284
00285 static void xsh_mbias(cpl_parameterlist * parameters, cpl_frameset * frameset)
00286 {
00287 const char* recipe_tags[1] = {XSH_BIAS};
00288 int recipe_tags_size = 1;
00289
00290 cpl_frameset *raws = NULL;
00291 cpl_frameset *calib = NULL;
00292 cpl_frame *bpmap = NULL;
00293 cpl_frame *master_bias = NULL;
00294 cpl_frame *product = NULL;
00295 xsh_instrument* instrument = NULL;
00296
00297 cpl_frame* bias_frm=NULL;
00298 cpl_propertylist* plist=NULL;
00299 char name[256];
00300 const char* ftag;
00301
00302 int pre_overscan_corr=0;
00303 xsh_stack_param* stack_par=NULL;
00304
00305
00306
00307
00308 check( xsh_begin( frameset, parameters, &instrument, &raws, &calib,
00309 recipe_tags, recipe_tags_size,
00310 RECIPE_ID, XSH_BINARY_VERSION,
00311 xsh_mbias_description_short ) ) ;
00312
00313
00314 xsh_recipe_params_check(parameters,instrument,RECIPE_ID);
00315
00316
00317
00318
00319
00320 check(bpmap=xsh_check_load_master_bpmap(calib,instrument,RECIPE_ID));
00321
00322
00323 check(bias_frm=cpl_frameset_get_first(raws));
00324 check(plist=cpl_propertylist_load(cpl_frame_get_filename(bias_frm),0));
00325 xsh_free_propertylist(&plist);
00326
00327 ftag=XSH_GET_TAG_FROM_ARM(XSH_MASTER_BIAS,instrument);
00328 sprintf(name,"%s.fits",ftag);
00329
00330
00331
00332
00333
00334 check( stack_par = xsh_stack_frames_get( RECIPE_ID, parameters));
00335
00336
00337
00338
00339
00340 check(xsh_prepare(raws, bpmap, NULL, XSH_BIAS, instrument,pre_overscan_corr,CPL_TRUE));
00341
00342
00343
00344 if(strcmp(stack_par->stack_method,"mean") == 0) {
00345 check(master_bias = xsh_create_master_bias2(raws,stack_par,instrument,ftag,1));
00346 } else {
00347 check(master_bias = xsh_create_master_bias2(raws,stack_par,instrument,ftag,0));
00348 }
00349
00350
00351
00352 check(product=xsh_compute_qc_on_master_bias(raws,master_bias,instrument,parameters));
00353
00354
00355
00356
00357
00358 xsh_msg("Save products");
00359 check( xsh_add_product_pre(product, frameset, parameters, RECIPE_ID,
00360 instrument));
00361
00362 xsh_msg("xsh_mbias success!!");
00363
00364 cleanup:
00365 xsh_end( RECIPE_ID, frameset, parameters );
00366
00367 xsh_free_propertylist(&plist);
00368 xsh_instrument_free(&instrument);
00369 xsh_free_frame(&product);
00370 xsh_free_frameset(&raws);
00371 xsh_free_frameset(&calib);
00372 xsh_free_frame(&master_bias);
00373 xsh_free_frame(&bpmap);
00374
00375 cpl_free(stack_par);
00376 return;
00377 }
00378