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, 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 badpixel map (Format=QUP, Tag = MASTER_BP_MAP_NLIN_arm)\n\
00106 Products : \n\
00107 - A master bias frame (Format=PRE, PRO.CATG = MASTER_BIAS_arm)\n";
00108
00109
00110
00111
00112
00121
00122
00123 int cpl_plugin_get_info(cpl_pluginlist * list)
00124 {
00125 cpl_recipe *recipe = NULL;
00126 cpl_plugin *plugin = NULL;
00127
00128 recipe = cpl_calloc(1, sizeof(*recipe));
00129 if (recipe == NULL) {
00130 return -1;
00131 }
00132
00133 plugin = &recipe->interface;
00134
00135 cpl_plugin_init(plugin, CPL_PLUGIN_API,
00136 XSH_BINARY_VERSION,
00137 CPL_PLUGIN_TYPE_RECIPE,
00138 RECIPE_ID,
00139 xsh_mbias_description_short,
00140 xsh_mbias_description,
00141 RECIPE_AUTHOR,
00142 RECIPE_CONTACT,
00143 xsh_get_license(),
00144 xsh_mbias_create,
00145 xsh_mbias_exec,
00146 xsh_mbias_destroy);
00147
00148 cpl_pluginlist_append(list, plugin);
00149
00150 return (cpl_error_get_code() != CPL_ERROR_NONE);
00151 }
00152
00153
00163
00164
00165 static int xsh_mbias_create(cpl_plugin * plugin)
00166 {
00167 cpl_recipe *recipe = NULL;
00168 xsh_fpn_param fpn_param = {10,10,1024,1024,10,100};
00169 xsh_ron_param ron_param = {"ALL",
00170 10,100,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,25};
00171 xsh_struct_param struct_param = {-1,-1};
00172 xsh_stack_param stack_param = {"median",5.,5.,5};
00173
00174
00175 xsh_init();
00176
00177
00178 assure(plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin");
00179
00180
00181 assure(cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00182 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00183
00184 recipe = (cpl_recipe *) plugin;
00185
00186
00187 recipe->parameters = cpl_parameterlist_new();
00188 assure(recipe->parameters != NULL,
00189 CPL_ERROR_ILLEGAL_OUTPUT, "Memory allocation failed!");
00190
00191
00192 check( xsh_parameters_generic( RECIPE_ID, recipe->parameters ) ) ;
00193 check(xsh_parameters_stack_create(RECIPE_ID,recipe->parameters,stack_param));
00194 check(xsh_parameters_fpn_create(RECIPE_ID,recipe->parameters,fpn_param));
00195 check(xsh_parameters_ron_create(RECIPE_ID,recipe->parameters,ron_param));
00196 check(xsh_parameters_struct_create(RECIPE_ID,recipe->parameters,struct_param));
00197 cleanup:
00198 if (cpl_error_get_code() != CPL_ERROR_NONE) {
00199 xsh_error_dump(CPL_MSG_ERROR);
00200 return 1;
00201 } else {
00202 return 0;
00203 }
00204 }
00205
00206
00212
00213
00214 static int xsh_mbias_exec(cpl_plugin * plugin)
00215 {
00216 cpl_recipe *recipe = NULL;
00217
00218
00219 assure(plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin");
00220
00221
00222 assure(cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00223 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00224
00225 recipe = (cpl_recipe *) plugin;
00226
00227
00228 xsh_mbias(recipe->parameters, recipe->frames);
00229
00230 cleanup:
00231 if (cpl_error_get_code() != CPL_ERROR_NONE) {
00232 xsh_error_dump(CPL_MSG_ERROR);
00233 cpl_error_reset();
00234 return 1;
00235 } else {
00236 return 0;
00237 }
00238 }
00239
00240
00246
00247 static int xsh_mbias_destroy(cpl_plugin * plugin)
00248 {
00249 cpl_recipe *recipe = NULL;
00250
00251 xsh_error_reset();
00252
00253 assure(plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin");
00254
00255
00256 assure(cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00257 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00258
00259 recipe = (cpl_recipe *) plugin;
00260
00261 xsh_free_parameterlist(&recipe->parameters);
00262
00263 cleanup:
00264 if (cpl_error_get_code() != CPL_ERROR_NONE) {
00265 return 1;
00266 } else {
00267 return 0;
00268 }
00269 }
00270
00271
00272
00273
00274
00282
00283 static void xsh_mbias(cpl_parameterlist * parameters, cpl_frameset * frameset)
00284 {
00285 const char* recipe_tags[1] = {XSH_BIAS};
00286 int recipe_tags_size = 1;
00287
00288 cpl_frameset *raws = NULL;
00289 cpl_frameset *calib = NULL;
00290 cpl_frame *bpmap = NULL;
00291 cpl_frame *master_bias = NULL;
00292 cpl_frame *product = NULL;
00293 xsh_instrument* instrument = NULL;
00294
00295
00296 int binx=0;
00297 int biny=0;
00298 cpl_frame* bias_frm=NULL;
00299 cpl_propertylist* plist=NULL;
00300 char name[256];
00301 const char* ftag;
00302
00303 int pre_overscan_corr=0;
00304 xsh_stack_param* stack_par=NULL;
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315 check( xsh_begin( frameset, parameters, &instrument, &raws, &calib,
00316 recipe_tags, recipe_tags_size,
00317 RECIPE_ID, XSH_BINARY_VERSION,
00318 xsh_mbias_description_short ) ) ;
00319
00320
00321 xsh_recipe_params_check(parameters,instrument,RECIPE_ID);
00322
00323
00324
00325
00326
00327 check(bpmap=xsh_check_load_master_bpmap(calib,instrument,RECIPE_ID));
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342 check(bias_frm=cpl_frameset_get_first(raws));
00343 check(plist=cpl_propertylist_load(cpl_frame_get_filename(bias_frm),0));
00344 check(binx=xsh_pfits_get_binx(plist));
00345 check(biny=xsh_pfits_get_biny(plist));
00346 xsh_free_propertylist(&plist);
00347
00348 ftag=XSH_GET_TAG_FROM_ARM(XSH_MASTER_BIAS,instrument);
00349 sprintf(name,"%s.fits",ftag);
00350
00351
00352
00353
00354
00355 check( stack_par = xsh_stack_frames_get( RECIPE_ID, parameters));
00356
00357
00358
00359
00360
00361 check(xsh_prepare(raws, bpmap, NULL, XSH_BIAS, instrument,pre_overscan_corr));
00362
00363
00364
00365 if(strcmp(stack_par->stack_method,"mean") == 0) {
00366 check(master_bias = xsh_create_master_bias2(raws,stack_par,instrument,ftag,1));
00367 } else {
00368 check(master_bias = xsh_create_master_bias2(raws,stack_par,instrument,ftag,0));
00369 }
00370 if(bpmap!=NULL) {
00371 xsh_frame_qual_update(master_bias,bpmap,instrument);
00372 }
00373
00374
00375 check(product=xsh_compute_qc_on_master_bias(raws,master_bias,instrument,parameters));
00376
00377
00378
00379
00380
00381 xsh_msg("Save products");
00382
00383 check( xsh_add_product_pre(product, frameset, parameters, RECIPE_ID,
00384 instrument));
00385
00386
00387 xsh_msg("xsh_mbias success!!");
00388
00389 cleanup:
00390 xsh_end( RECIPE_ID, frameset, parameters );
00391
00392 xsh_free_propertylist(&plist);
00393 xsh_instrument_free(&instrument);
00394 xsh_free_frame(&product);
00395 xsh_free_frameset(&raws);
00396 xsh_free_frameset(&calib);
00397 xsh_free_frame(&master_bias);
00398 cpl_free(stack_par);
00399 return;
00400 }
00401