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
00029
00030 #ifdef HAVE_CONFIG_H
00031 #include <config.h>
00032 #endif
00033
00034 #include <stdio.h>
00035 #include <cpl.h>
00036 #include <math.h>
00037 #include <string.h>
00038
00039 #include "vircam_utils.h"
00040 #include "vircam_mask.h"
00041 #include "vircam_dfs.h"
00042 #include "vircam_stats.h"
00043 #include "vircam_pfits.h"
00044 #include "vircam_paf.h"
00045
00046
00047
00048 static int vircam_detector_noise_create(cpl_plugin *) ;
00049 static int vircam_detector_noise_exec(cpl_plugin *) ;
00050 static int vircam_detector_noise_destroy(cpl_plugin *) ;
00051 static int vircam_detector_noise(cpl_parameterlist *, cpl_frameset *) ;
00052 static int vircam_detector_noise_save(cpl_frameset *framelist,
00053 cpl_parameterlist *parlist);
00054 static void vircam_detector_noise_init(void);
00055 static void vircam_detector_noise_tidy(void);
00056
00057
00058
00059 static struct {
00060
00061
00062
00063 float thresh;
00064 int extenum;
00065
00066
00067
00068 float gain;
00069 float readnoise;
00070 } vircam_detector_noise_config ;
00071
00072 static struct {
00073 int *labels;
00074 cpl_frameset *darklist;
00075 cpl_frameset *domelist;
00076 cpl_frameset *sorted;
00077 cpl_image *darkim1;
00078 cpl_image *darkim2;
00079 cpl_image *domeim1;
00080 cpl_image *domeim2;
00081 vir_mask *master_mask;
00082 cpl_propertylist *ph;
00083 cpl_propertylist *eh;
00084 cpl_propertylist *phupaf;
00085 } ps;
00086
00087 static cpl_frame *product_frame = NULL;
00088 static int isfirst;
00089 static int dummy;
00090
00091 #define BUZZ_OFF {vircam_detector_noise_tidy(); return(-1);}
00092
00093 static char vircam_detector_noise_description[] =
00094 "vircam_detector_noise -- VIRCAM readnoise and gain recipe.\n\n"
00095 "Measures the read noise and gain of a chip using two dome flat exposures\n"
00096 "and two dark exposures. The flats should have the same illumination.\n"
00097 "All four frames should have the same exposure time. If the SOF\n"
00098 "contains more than two files of a given type, the others are ignored.\n\n"
00099 "The program requires the following files in the SOF:\n\n"
00100 " Tag Description\n"
00101 " -----------------------------------------------------------------------\n"
00102 " %-21s A list of two raw dark images\n"
00103 " %-21s A list of two raw dome flat image\n"
00104 " %-21s Optional master bad pixel map or\n"
00105 " %-21s Optional master confidence map\n"
00106 "\n";
00107
00173
00174
00175
00183
00184
00185 int cpl_plugin_get_info(cpl_pluginlist *list) {
00186 cpl_recipe *recipe = cpl_calloc(1,sizeof(*recipe));
00187 cpl_plugin *plugin = &recipe->interface;
00188 char alldesc[SZ_ALLDESC];
00189 (void)snprintf(alldesc,SZ_ALLDESC,vircam_detector_noise_description,
00190 VIRCAM_NOISE_DARK_RAW,VIRCAM_NOISE_FLAT_RAW,VIRCAM_CAL_BPM,
00191 VIRCAM_CAL_CONF);
00192
00193 cpl_plugin_init(plugin,
00194 CPL_PLUGIN_API,
00195 VIRCAM_BINARY_VERSION,
00196 CPL_PLUGIN_TYPE_RECIPE,
00197 "vircam_detector_noise",
00198 "VIRCAM recipe to determine readout noise and gain",
00199 alldesc,
00200 "Jim Lewis",
00201 "jrl@ast.cam.ac.uk",
00202 vircam_get_license(),
00203 vircam_detector_noise_create,
00204 vircam_detector_noise_exec,
00205 vircam_detector_noise_destroy);
00206
00207 cpl_pluginlist_append(list,plugin);
00208
00209 return(0);
00210 }
00211
00212
00213
00222
00223
00224 static int vircam_detector_noise_create(cpl_plugin *plugin) {
00225 cpl_recipe *recipe;
00226 cpl_parameter *p;
00227
00228
00229
00230 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00231 recipe = (cpl_recipe *)plugin;
00232 else
00233 return(-1);
00234
00235
00236
00237 recipe->parameters = cpl_parameterlist_new();
00238
00239
00240
00241 p = cpl_parameter_new_value("vircam.vircam_detector_noise.thresh",
00242 CPL_TYPE_DOUBLE,
00243 "Rejection threshold in sigma above background", "vircam.vircam_detector_noise",5.0);
00244 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,"thresh");
00245 cpl_parameterlist_append(recipe->parameters,p);
00246
00247
00248
00249 p = cpl_parameter_new_range("vircam.vircam_detector_noise.extenum",
00250 CPL_TYPE_INT,
00251 "Extension number to be done, 0 == all",
00252 "vircam.vircam_detector_noise",
00253 1,0,16);
00254 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,"ext");
00255 cpl_parameterlist_append(recipe->parameters,p);
00256
00257
00258
00259 return(0);
00260 }
00261
00262
00268
00269
00270 static int vircam_detector_noise_destroy(cpl_plugin *plugin) {
00271 cpl_recipe *recipe ;
00272
00273
00274
00275 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00276 recipe = (cpl_recipe *)plugin;
00277 else
00278 return(-1);
00279
00280 cpl_parameterlist_delete(recipe->parameters);
00281 return(0);
00282 }
00283
00284
00290
00291
00292 static int vircam_detector_noise_exec(cpl_plugin *plugin) {
00293 cpl_recipe *recipe;
00294
00295
00296
00297 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00298 recipe = (cpl_recipe *)plugin;
00299 else
00300 return(-1);
00301
00302 return(vircam_detector_noise(recipe->parameters,recipe->frames));
00303 }
00304
00305
00312
00313
00314 static int vircam_detector_noise(cpl_parameterlist *parlist,
00315 cpl_frameset *framelist) {
00316 const char *fctid="vircam_detector_noise";
00317 cpl_parameter *p;
00318 int nlab,j,jst,jfn,retval,nx,ny,live;
00319 long nptsdark;
00320 float meandark1,meandome1,meandark2,meandome2,sigdark,lcut,hcut;
00321 float meandarkdiff,sigdarkdiff;
00322 float meandomediff,sigdomediff,gain,readnoise;
00323 cpl_frame *dark1,*dark2,*dome1,*dome2,*frame;
00324 cpl_propertylist *plist;
00325 unsigned char *bpm;
00326
00327
00328
00329 if (framelist == NULL || cpl_frameset_get_size(framelist) <= 0) {
00330 cpl_msg_error(fctid,"Input framelist NULL or has no input data\n");
00331 return(-1);
00332 }
00333
00334
00335
00336 vircam_detector_noise_init();
00337
00338
00339
00340 p = cpl_parameterlist_find(parlist,"vircam.vircam_detector_noise.thresh");
00341 vircam_detector_noise_config.thresh = (float)cpl_parameter_get_double(p);
00342 p = cpl_parameterlist_find(parlist,"vircam.vircam_detector_noise.extenum");
00343 vircam_detector_noise_config.extenum = cpl_parameter_get_int(p);
00344
00345
00346
00347 if (vircam_dfs_set_groups(framelist) != VIR_OK) {
00348 cpl_msg_error(fctid,"Cannot identify RAW and CALIB frames");
00349 vircam_detector_noise_tidy();
00350 return(-1);
00351 }
00352
00353
00354
00355 if ((ps.labels = cpl_frameset_labelise(framelist,vircam_compare_tags,
00356 &nlab)) == NULL) {
00357 cpl_msg_error(fctid,"Cannot labelise the input frameset");
00358 BUZZ_OFF
00359 }
00360 if ((ps.darklist = vircam_frameset_subgroup(framelist,ps.labels,nlab,
00361 VIRCAM_NOISE_DARK_RAW)) == NULL) {
00362 cpl_msg_error(fctid,"Cannot find dark frames in input frameset");
00363 BUZZ_OFF
00364 }
00365 if (cpl_frameset_get_size(ps.darklist) < 2) {
00366 cpl_msg_error(fctid,"Dark frameset doesn't have enough frames");
00367 BUZZ_OFF
00368 }
00369 if ((ps.domelist = vircam_frameset_subgroup(framelist,ps.labels,nlab,
00370 VIRCAM_NOISE_FLAT_RAW)) == NULL) {
00371 cpl_msg_error(fctid,"Cannot find dome flat frames in input frameset");
00372 BUZZ_OFF
00373 }
00374 if (cpl_frameset_get_size(ps.domelist) < 2) {
00375 cpl_msg_error(fctid,"Dome flat frameset doesn't have enough frames");
00376 BUZZ_OFF
00377 }
00378
00379
00380
00381
00382 ps.master_mask = vircam_mask_define(framelist,ps.labels,nlab);
00383
00384
00385
00386 dark1 = cpl_frameset_get_frame(ps.darklist,0);
00387 dark2 = cpl_frameset_get_frame(ps.darklist,1);
00388 dome1 = cpl_frameset_get_frame(ps.domelist,0);
00389 dome2 = cpl_frameset_get_frame(ps.domelist,1);
00390
00391
00392
00393 ps.sorted = cpl_frameset_new();
00394 cpl_frameset_insert(ps.sorted,cpl_frame_duplicate(dome1));
00395 cpl_frameset_insert(ps.sorted,cpl_frame_duplicate(dome2));
00396 cpl_frameset_insert(ps.sorted,cpl_frame_duplicate(dark1));
00397 cpl_frameset_insert(ps.sorted,cpl_frame_duplicate(dark2));
00398
00399
00400
00401 ps.ph = cpl_propertylist_load(cpl_frame_get_filename(dome1),0);
00402
00403
00404
00405
00406
00407 ps.sorted = cpl_frameset_new();
00408 for (j = 0; j < cpl_frameset_get_size(ps.domelist); j++) {
00409 frame = cpl_frameset_get_frame(ps.domelist,j);
00410 cpl_frameset_insert(ps.sorted,cpl_frame_duplicate(frame));
00411 }
00412 for (j = 0; j < cpl_frameset_get_size(ps.darklist); j++) {
00413 frame = cpl_frameset_get_frame(ps.darklist,j);
00414 cpl_frameset_insert(ps.sorted,cpl_frame_duplicate(frame));
00415 }
00416 for (j = 0; j < cpl_frameset_get_size(framelist); j++) {
00417 frame = cpl_frameset_get_frame(framelist,j);
00418 if (strcmp(cpl_frame_get_tag(frame),VIRCAM_NOISE_FLAT_RAW) &&
00419 strcmp(cpl_frame_get_tag(frame),VIRCAM_NOISE_DARK_RAW))
00420 cpl_frameset_insert(ps.sorted,cpl_frame_duplicate(frame));
00421 }
00422
00423
00424
00425 vircam_exten_range(vircam_detector_noise_config.extenum,
00426 (const cpl_frame *)dark1,&jst,&jfn);
00427 if (jst == -1 || jfn == -1) {
00428 cpl_msg_error(fctid,"Unable to continue");
00429 vircam_detector_noise_tidy();
00430 return(-1);
00431 }
00432 for (j = jst; j <= jfn; j++) {
00433 cpl_msg_info(fctid,"Beginning work on extension %d",j);
00434 isfirst = (j == jst);
00435 vircam_detector_noise_config.readnoise = 0.0;
00436 vircam_detector_noise_config.gain = 0.0;
00437 dummy = 1;
00438
00439
00440
00441 ps.darkim1 = cpl_image_load(cpl_frame_get_filename(dark1),
00442 CPL_TYPE_FLOAT,0,j);
00443 ps.darkim2 = cpl_image_load(cpl_frame_get_filename(dark2),
00444 CPL_TYPE_FLOAT,0,j);
00445 ps.domeim1 = cpl_image_load(cpl_frame_get_filename(dome1),
00446 CPL_TYPE_FLOAT,0,j);
00447 ps.domeim2 = cpl_image_load(cpl_frame_get_filename(dome2),
00448 CPL_TYPE_FLOAT,0,j);
00449 if (ps.darkim1 == NULL || ps.darkim2 == NULL || ps.domeim1 == NULL ||
00450 ps.domeim2 == NULL) {
00451 cpl_error_reset();
00452 cpl_msg_error(fctid,"NULL image input for extension %d",j);
00453 retval = vircam_detector_noise_save(framelist,parlist);
00454 freeimage(ps.darkim1);
00455 freeimage(ps.darkim2);
00456 freeimage(ps.domeim1);
00457 freeimage(ps.domeim2);
00458 continue;
00459 }
00460
00461
00462
00463 ps.eh = cpl_propertylist_load(cpl_frame_get_filename(dome1),j);
00464
00465
00466
00467 plist = cpl_propertylist_load(cpl_frame_get_filename(dark1),j);
00468 vircam_pfits_get_detlive(plist,&live);
00469 if (! live) {
00470 cpl_msg_warning(fctid,"First dark image detector not live");
00471 retval = vircam_detector_noise_save(framelist,parlist);
00472 cpl_propertylist_delete(plist);
00473 freeimage(ps.darkim1);
00474 freeimage(ps.darkim2);
00475 freeimage(ps.domeim1);
00476 freeimage(ps.domeim2);
00477 freepropertylist(ps.eh);
00478 continue;
00479 }
00480 cpl_propertylist_delete(plist);
00481 plist = cpl_propertylist_load(cpl_frame_get_filename(dark2),j);
00482 vircam_pfits_get_detlive(plist,&live);
00483 if (! live) {
00484 cpl_msg_warning(fctid,"Second dark image detector not live");
00485 retval = vircam_detector_noise_save(framelist,parlist);
00486 cpl_propertylist_delete(plist);
00487 freeimage(ps.darkim1);
00488 freeimage(ps.darkim2);
00489 freeimage(ps.domeim1);
00490 freeimage(ps.domeim2);
00491 freepropertylist(ps.eh);
00492 continue;
00493 }
00494 cpl_propertylist_delete(plist);
00495 plist = cpl_propertylist_load(cpl_frame_get_filename(dome1),j);
00496 vircam_pfits_get_detlive(plist,&live);
00497 if (! live) {
00498 cpl_msg_warning(fctid,"First dome image detector not live");
00499 retval = vircam_detector_noise_save(framelist,parlist);
00500 cpl_propertylist_delete(plist);
00501 freeimage(ps.darkim1);
00502 freeimage(ps.darkim2);
00503 freeimage(ps.domeim1);
00504 freeimage(ps.domeim2);
00505 freepropertylist(ps.eh);
00506 continue;
00507 }
00508 cpl_propertylist_delete(plist);
00509 plist = cpl_propertylist_load(cpl_frame_get_filename(dome2),j);
00510 vircam_pfits_get_detlive(plist,&live);
00511 if (! live) {
00512 cpl_msg_warning(fctid,"Second dome image detector not live");
00513 retval = vircam_detector_noise_save(framelist,parlist);
00514 cpl_propertylist_delete(plist);
00515 freeimage(ps.darkim1);
00516 freeimage(ps.darkim2);
00517 freeimage(ps.domeim1);
00518 freeimage(ps.domeim2);
00519 freepropertylist(ps.eh);
00520 continue;
00521 }
00522 cpl_propertylist_delete(plist);
00523
00524
00525
00526 nx = cpl_image_get_size_x(ps.darkim1);
00527 ny = cpl_image_get_size_y(ps.darkim1);
00528 nptsdark = (long)(nx*ny);
00529
00530
00531
00532 if (vircam_mask_load(ps.master_mask,j,nx,ny) == VIR_FATAL) {
00533 cpl_msg_info(fctid,"Unable to load mask image %s[%d]",
00534 vircam_mask_get_filename(ps.master_mask),j);
00535 cpl_msg_info(fctid,"Forcing all pixels to be good from now on");
00536 vircam_mask_force(ps.master_mask,nx,ny);
00537 }
00538 bpm = vircam_mask_get_data(ps.master_mask);
00539
00540
00541
00542 vircam_medmad((float *)cpl_image_get_data(ps.darkim1),bpm,
00543 nptsdark,&meandark1,&sigdark);
00544 sigdark *= 1.48;
00545 lcut = meandark1 - vircam_detector_noise_config.thresh*sigdark;
00546 hcut = meandark1 + vircam_detector_noise_config.thresh*sigdark;
00547 vircam_medmadcut((float *)cpl_image_get_data(ps.darkim1),bpm,
00548 nptsdark,lcut,hcut,&meandark1,&sigdark);
00549 vircam_medmad((float *)cpl_image_get_data(ps.domeim1),bpm,
00550 nptsdark,&meandome1,&sigdark);
00551 sigdark *= 1.48;
00552 lcut = meandome1 - vircam_detector_noise_config.thresh*sigdark;
00553 hcut = meandome1 + vircam_detector_noise_config.thresh*sigdark;
00554 vircam_medmadcut((float *)cpl_image_get_data(ps.domeim1),bpm,
00555 nptsdark,lcut,hcut,&meandome1,&sigdark);
00556
00557
00558
00559 vircam_medmad((float *)cpl_image_get_data(ps.darkim2),bpm,
00560 nptsdark,&meandark2,&sigdark);
00561 sigdark *= 1.48;
00562 lcut = meandark2 - vircam_detector_noise_config.thresh*sigdark;
00563 hcut = meandark2 + vircam_detector_noise_config.thresh*sigdark;
00564 vircam_medmadcut((float *)cpl_image_get_data(ps.darkim2),bpm,
00565 nptsdark,lcut,hcut,&meandark2,&sigdark);
00566 vircam_medmad((float *)cpl_image_get_data(ps.domeim2),bpm,
00567 nptsdark,&meandome2,&sigdark);
00568 sigdark *= 1.48;
00569 lcut = meandome2 - vircam_detector_noise_config.thresh*sigdark;
00570 hcut = meandome2 + vircam_detector_noise_config.thresh*sigdark;
00571 vircam_medmadcut((float *)cpl_image_get_data(ps.domeim2),bpm,
00572 nptsdark,lcut,hcut,&meandome2,&sigdark);
00573
00574
00575
00576 cpl_image_subtract(ps.darkim1,ps.darkim2);
00577 cpl_image_subtract(ps.domeim1,ps.domeim2);
00578
00579
00580
00581 vircam_medmad((float *)cpl_image_get_data(ps.darkim1),bpm,
00582 nptsdark,&meandarkdiff,&sigdarkdiff);
00583 sigdarkdiff *= 1.48;
00584 lcut = meandarkdiff - vircam_detector_noise_config.thresh*sigdarkdiff;
00585 hcut = meandarkdiff + vircam_detector_noise_config.thresh*sigdarkdiff;
00586 vircam_medmadcut((float *)cpl_image_get_data(ps.darkim1),bpm,
00587 nptsdark,lcut,hcut,&meandarkdiff,&sigdarkdiff);
00588 sigdarkdiff *= 1.48;
00589 vircam_medmad((float *)cpl_image_get_data(ps.domeim1),bpm,
00590 nptsdark,&meandomediff,&sigdomediff);
00591 sigdomediff *= 1.48;
00592 lcut = meandomediff - vircam_detector_noise_config.thresh*sigdomediff;
00593 hcut = meandomediff + vircam_detector_noise_config.thresh*sigdomediff;
00594 vircam_medmadcut((float *)cpl_image_get_data(ps.domeim1),bpm,
00595 nptsdark,lcut,hcut,&meandomediff,&sigdomediff);
00596 sigdomediff *= 1.48;
00597
00598
00599
00600 gain = ((meandome1 + meandome2) - (meandark1 + meandark2))/
00601 (sigdomediff*sigdomediff - sigdarkdiff*sigdarkdiff);
00602 vircam_detector_noise_config.gain = gain;
00603
00604
00605
00606 readnoise = gain*sigdarkdiff/sqrt(2.0);
00607 vircam_detector_noise_config.readnoise = readnoise;
00608 dummy = 0;
00609
00610
00611
00612 retval = vircam_detector_noise_save(framelist,parlist);
00613 if (retval != 0) {
00614 cpl_msg_error(fctid,"Error saving results");
00615 BUZZ_OFF
00616 }
00617
00618
00619
00620 freeimage(ps.darkim1);
00621 freeimage(ps.darkim2);
00622 freeimage(ps.domeim1);
00623 freeimage(ps.domeim2);
00624 vircam_mask_clear(ps.master_mask);
00625 freepropertylist(ps.eh);
00626 }
00627 vircam_detector_noise_tidy();
00628 return(0);
00629 }
00630
00631
00638
00639
00640 static int vircam_detector_noise_save(cpl_frameset *framelist,
00641 cpl_parameterlist *parlist) {
00642 const char *fctid = "vircam_detector_noise_save";
00643 const char *outpaf = "vircam_detector_noise";
00644 const char *outfile = "detector_noise.fits";
00645 const char *recipeid = "vircam_detector_noise";
00646 cpl_propertylist *plist,*p;
00647 cpl_table *o;
00648
00649
00650
00651 if (isfirst) {
00652
00653
00654
00655 product_frame = cpl_frame_new();
00656 cpl_frame_set_filename(product_frame,outfile);
00657 cpl_frame_set_tag(product_frame,VIRCAM_PRO_READGAINFILE);
00658 cpl_frame_set_type(product_frame,CPL_FRAME_TYPE_IMAGE);
00659 cpl_frame_set_group(product_frame,CPL_FRAME_GROUP_PRODUCT);
00660 cpl_frame_set_level(product_frame,CPL_FRAME_LEVEL_FINAL);
00661
00662
00663
00664 plist = cpl_propertylist_duplicate(ps.ph);
00665 ps.phupaf = vircam_paf_phu_items(plist);
00666 vircam_dfs_set_product_primary_header(plist,product_frame,ps.sorted,
00667 parlist,(char *)recipeid,
00668 "PRO-1.15");
00669
00670
00671
00672 if (cpl_image_save(NULL,outfile,CPL_BPP_8_UNSIGNED,plist,
00673 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
00674 cpl_msg_error(fctid,"Cannot save product PHU");
00675 cpl_frame_delete(product_frame);
00676 cpl_propertylist_delete(plist);
00677 return(-1);
00678 }
00679 cpl_propertylist_delete(plist);
00680 cpl_frameset_insert(framelist,product_frame);
00681 }
00682
00683
00684
00685 plist = cpl_propertylist_duplicate(ps.eh);
00686
00687
00688
00689 cpl_propertylist_update_float(plist,"ESO QC READNOISE",
00690 vircam_detector_noise_config.readnoise);
00691 cpl_propertylist_set_comment(plist,"ESO QC READNOISE",
00692 "Calculated detector readnoise");
00693 cpl_propertylist_update_float(plist,"ESO QC GAIN",
00694 vircam_detector_noise_config.gain);
00695 cpl_propertylist_set_comment(plist,"ESO QC GAIN",
00696 "Calculated detector gain");
00697
00698
00699
00700 vircam_dfs_set_product_exten_header(plist,product_frame,ps.sorted,
00701 parlist,(char *)recipeid,
00702 "PRO-1.15");
00703 if (dummy)
00704 vircam_dummy_property(plist);
00705
00706
00707
00708 o = cpl_table_new(1);
00709 cpl_table_new_column(o,"EXTNAME",CPL_TYPE_STRING);
00710 cpl_table_new_column(o,"READNOISE",CPL_TYPE_FLOAT);
00711 cpl_table_new_column(o,"GAIN",CPL_TYPE_FLOAT);
00712
00713
00714
00715 cpl_table_set_string(o,"EXTNAME",0,
00716 cpl_propertylist_get_string(plist,"EXTNAME"));
00717 cpl_table_set_float(o,"READNOISE",0,
00718 vircam_detector_noise_config.readnoise);
00719 cpl_table_set_float(o,"GAIN",0,vircam_detector_noise_config.gain);
00720
00721
00722
00723 if (cpl_table_save(o,NULL,plist,outfile,CPL_IO_EXTEND) != CPL_ERROR_NONE) {
00724 cpl_msg_error(fctid,"Cannot save product");
00725 cpl_propertylist_delete(plist);
00726 cpl_frame_delete(product_frame);
00727 freetable(o);
00728 return(-1);
00729 }
00730 freetable(o);
00731
00732
00733
00734 p = vircam_paf_req_items(plist);
00735 vircam_merge_propertylists(p,ps.phupaf);
00736 if (vircam_paf_print((char *)outpaf,"VIRCAM/vircam_detector_noise",
00737 "QC file",p) != VIR_OK)
00738 cpl_msg_warning(fctid,"Unable to write PAF\n");
00739 cpl_propertylist_delete(p);
00740
00741
00742
00743 freepropertylist(plist);
00744 return(0);
00745 }
00746
00747
00751
00752
00753 static void vircam_detector_noise_init(void) {
00754 ps.labels = NULL;
00755 ps.darklist = NULL;
00756 ps.domelist = NULL;
00757 ps.darkim1 = NULL;
00758 ps.darkim2 = NULL;
00759 ps.domeim1 = NULL;
00760 ps.domeim2 = NULL;
00761 ps.master_mask = NULL;
00762 ps.sorted = NULL;
00763 ps.ph = NULL;
00764 ps.eh = NULL;
00765 ps.phupaf = NULL;
00766 return;
00767 }
00768
00769
00773
00774
00775 static void vircam_detector_noise_tidy(void) {
00776 freespace(ps.labels);
00777 freeframeset(ps.darklist);
00778 freeframeset(ps.domelist);
00779 freeframeset(ps.sorted);
00780 freeimage(ps.darkim1);
00781 freeimage(ps.darkim2);
00782 freeimage(ps.domeim1);
00783 freeimage(ps.domeim2);
00784 freemask(ps.master_mask);
00785 freeframeset(ps.sorted);
00786 freepropertylist(ps.ph);
00787 freepropertylist(ps.eh);
00788 freepropertylist(ps.phupaf);
00789 return;
00790 }
00791
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954