59#include <irplib_utils.h>
73#define RECIPE_ID "xsh_mbias"
74#define HIST_FACT 2.354820045
82 cpl_parameterlist* parameters);
89 cpl_parameterlist* parameters);
93 cpl_parameterlist* parameters,
132 llx_on =801; lly_on =1058;urx_on =810; ury_on =1067;
133 llx_off=855; lly_off=1066;urx_off=864; ury_off=1075;
135 llx_on =1672; lly_on =2672;urx_on =1681;ury_on =2681;
136 llx_off=1926; lly_off=2941;urx_off=1935;ury_off=2950;
138 llx_on =991; lly_on =1083;urx_on =1015;ury_on =1108;
139 llx_off=1029;lly_off=1075;urx_off=1053;ury_off=1110;
141 llx_on =25; lly_on =10;urx_on =550;ury_on =520;
142 llx_off=25;lly_off=10;urx_off=550;ury_off=520;
146 llx_on=llx_on/pre->
binx;
147 lly_on=lly_on/pre->
biny;
148 urx_on=urx_on/pre->
binx;
149 ury_on=ury_on/pre->
biny;
151 llx_off=llx_off/pre->
binx;
152 lly_off=lly_off/pre->
biny;
153 urx_off=urx_off/pre->
binx;
154 ury_off=ury_off/pre->
biny;
157 cpl_image_get_median_window(pre->
data,llx_on,lly_on,urx_on,ury_on)-
158 cpl_image_get_median_window(pre->
data,llx_off,lly_off,urx_off,ury_off));
176 cpl_frame* crh_frm, cpl_frame* bpm_frm)
186 const char* crh_name=NULL;
187 const char* bpm_name=NULL;
188 cpl_image* crh_ima=NULL;
189 cpl_image* bpm_ima=NULL;
194 bool bpm_found=
false;
195 bool crh_found=
false;
196 double avg_value = 0.0;
197 double median_value = 0.0;
204 sx=cpl_image_get_size_x(preFrame->
data);
205 sy=cpl_image_get_size_y(preFrame->
data);
209 if(ref_llx == -1) ref_llx=1;
210 if(ref_lly == -1) ref_lly=1;
211 if(ref_urx == -1) ref_urx=sx;
212 if(ref_ury == -1) ref_ury=sy;
214 ref_llx = (ref_llx>0) ? ref_llx : 1;
215 ref_lly = (ref_lly>0) ? ref_lly : 1;
216 ref_urx = (ref_urx<sx) ? ref_urx : sx;
217 ref_ury = (ref_ury<sy) ? ref_ury : sy;
229 check(crh_name=cpl_frame_get_filename(crh_frm));
231 check(pcrh=cpl_image_get_data_int(crh_ima));
235 if(bpm_frm != NULL) {
236 check(bpm_name=cpl_frame_get_filename(bpm_frm));
238 check(pbpm=cpl_image_get_data_int(bpm_ima));
242 if (bpm_found || crh_found) {
244 check(pqua=cpl_image_get_data_int( preFrame->
qual));
248 if (bpm_found && crh_found) {
249 for (i = 0; i < sx_sy; i++) {
250 if (pcrh[i] != 0 || pbpm[i] != 0) {
254 }
else if (bpm_found) {
255 for (i = 0; i < sx_sy; i++) {
260 }
else if (crh_found) {
261 for (i = 0; i < sx_sy; i++) {
273 &avg_value, &median_value,&stdev,
274 ref_llx,ref_lly,ref_urx,ref_ury) ) ;
284 return cpl_error_get_code();
292 cpl_size zone_fpn[4];
313 sx=cpl_image_get_size_x(preFrame->
data);
314 sy=cpl_image_get_size_y(preFrame->
data);
318 if(fpn_llx == -1) fpn_llx=1;
319 if(fpn_lly == -1) fpn_lly=1;
320 if(fpn_urx == -1) fpn_urx=sx;
321 if(fpn_ury == -1) fpn_ury=sy;
323 fpn_llx = (fpn_llx>0) ? fpn_llx : 1;
324 fpn_lly = (fpn_lly>0) ? fpn_lly : 1;
325 fpn_urx = (fpn_urx<sx) ? fpn_urx : sx;
326 fpn_ury = (fpn_ury<sy) ? fpn_ury : sy;
328 assure(fpn_urx>fpn_llx,CPL_ERROR_ILLEGAL_INPUT,
329 "Must be fpn_urx (%d) > fpn_llx (%d)",
332 assure(fpn_ury>fpn_lly,CPL_ERROR_ILLEGAL_INPUT,
333 "Must be fpn_ury (%d) > fpn_lly (%d)",
344 check_msg(cpl_flux_get_noise_window(preFrame->
data, zone_fpn, fpn_hsize,
345 fpn_nsamp, &qc_fpn_val, &qc_fpn_err),
346 "Error computing noise in a window");
349 median=cpl_image_get_median_window(preFrame->
data,fpn_llx,fpn_lly,fpn_urx,fpn_ury);
350 qc_fpn_val /= median;
351 qc_fpn_err /= median;
367 median=cpl_image_get_median_window(preFrame->
data,fpn_llx,fpn_lly,fpn_urx,fpn_ury);
375 qc_fpn_val /= median;
376 qc_fpn_err /= median;
385 return cpl_error_get_code();
409 sx=cpl_image_get_size_x(preFrame->
data);
410 sy=cpl_image_get_size_y(preFrame->
data);
413 if(ron_llx == -1) ron_llx=1;
414 if(ron_lly == -1) ron_lly=1;
415 if(ron_urx == -1) ron_urx=sx;
416 if(ron_ury == -1) ron_ury=sy;
418 ron_llx = (ron_llx>0) ? ron_llx : 1;
419 ron_lly = (ron_lly>0) ? ron_lly : 1;
420 ron_urx = (ron_urx<sx) ? ron_urx : sx;
421 ron_ury = (ron_ury<sy) ? ron_ury : sy;
424 return cpl_error_get_code();
440 cpl_parameterlist* parameters,
441 cpl_frame* crh_frm, cpl_frame* bpm_frm)
447 assure (
nx != 0, cpl_error_get_code (),
"Cant get X size");
449 assure (
ny != 0, cpl_error_get_code (),
"Cant get Y size");
490 cpl_size fpn_hsize=0;
491 cpl_size fpn_nsamp=0;
519 if(fpn_llx == -1) fpn_llx=1;
520 if(fpn_lly == -1) fpn_lly=1;
521 if(fpn_urx == -1) fpn_urx=sx;
522 if(fpn_ury == -1) fpn_ury=sy;
524 fpn_llx = (fpn_llx>0) ? fpn_llx : 1;
525 fpn_lly = (fpn_lly>0) ? fpn_lly : 1;
526 fpn_urx = (fpn_urx<sx) ? fpn_urx : sx;
527 fpn_ury = (fpn_ury<sy) ? fpn_ury : sy;
529 assure(fpn_urx>fpn_llx,CPL_ERROR_ILLEGAL_INPUT,
530 "Must be fpn_urx (%d) > fpn_llx (%d)",
533 assure(fpn_ury>fpn_lly,CPL_ERROR_ILLEGAL_INPUT,
534 "Must be fpn_ury (%d) > fpn_lly (%d)",
544 check_msg(cpl_flux_get_noise_window(pre->
data, zone, fpn_hsize,fpn_nsamp,
545 &qc_ron_val, &qc_ron_err),
546 "Error computing noise in a window");
552 double inv_sqrt2=1./sqrt(2);
571 return cpl_error_get_code();
591 nraws=cpl_frameset_get_size(raws);
595 frm=cpl_frameset_get_frame(raws,0);
598 frm=cpl_frameset_get_frame(raws,1);
609 return cpl_error_get_code();
624 cpl_parameterlist* params,
625 cpl_propertylist* qc_log,
629 double mean_exptime=0;
630 cpl_imagelist* raw_data=NULL;
631 cpl_imagelist* raw_errs=NULL;
632 cpl_imagelist* iml_errs=NULL;
633 cpl_imagelist* iml_data=NULL;
634 cpl_image* qual_comb=NULL;
636 cpl_propertylist** raw_headers=NULL;
637 cpl_frame* mdark=NULL;
638 cpl_image* mbias=NULL;
642 char mdark_name[256];
644 const double kappa=5.;
653 sz=cpl_frameset_get_size(raws);
654 raw_data=cpl_imagelist_new();
655 raw_errs=cpl_imagelist_new();
656 raw_headers=cpl_calloc(sz,
sizeof(cpl_propertylist*));
659 check(frm=cpl_frameset_get_frame(raws,i));
664 cpl_imagelist_set(raw_data,cpl_image_duplicate(pre->
data),i);
665 cpl_imagelist_set(raw_errs,cpl_image_duplicate(pre->
errs),i);
666 raw_headers[i]=cpl_propertylist_duplicate(pre->
data_header);
668 qual_comb=cpl_image_duplicate(pre->
qual);
689 pre->
qual=cpl_image_duplicate(qual_comb);
693 xsh_msg(
"Calculating stack median");
699 xsh_msg(
"Calculating stack mean");
711 check_msg (cpl_image_divide_scalar (pre->
data, mean_exptime),
712 "Cant divide median image by exptime %lf", mean_exptime);
713 check_msg (cpl_image_divide_scalar (pre->
errs, mean_exptime),
714 "Cant divide median image by exptime %lf", mean_exptime);
729 if(qc_log != NULL ) {
737 if(qc_log != NULL ) {
743 sprintf(mdark_name,
"%s.fits",mdark_tag);
746 check(cpl_frame_set_tag(mdark,mdark_tag));
759cpl_free(raw_headers);
776 cpl_parameterlist* parameters,
777 cpl_frame* crh_frm,cpl_frame* bpm_frm)
786 cpl_frame* resFrame = NULL;
788 char* finalName = NULL;
801 "Cant divide median image by exptime %lf",
exptime);
803 "Cant divide median image by exptime %lf",
exptime);
836 assure (resFrame != NULL, cpl_error_get_code (),
"Cant save PRE");
839 check(cpl_frame_set_level (resFrame, CPL_FRAME_LEVEL_FINAL));
840 check(cpl_frame_set_tag (resFrame, tag));
843 if (cpl_error_get_code() != CPL_ERROR_NONE){
863 cpl_mask *mask_lo = NULL;
864 cpl_mask *mask_hi = NULL;
866 mask_lo = cpl_mask_threshold_image_create(image, -DBL_MAX, min);
867 mask_hi = cpl_mask_threshold_image_create(image,
max, DBL_MAX);
871 cpl_mask_or(mask_lo, mask_hi);
873 cpl_image_reject_from_mask(image, mask_lo);
885 cpl_image_get_size_x(image) * cpl_image_get_size_y(image) -
886 cpl_image_count_rejected(image);
893 cpl_image* avg_row=NULL;
900 check(avg_row = cpl_image_collapse_create(tima,0));
901 check(cpl_image_divide_scalar(avg_row,cpl_image_get_size_y(tima)));
904 min = cpl_image_get_mean(avg_row) - 2;
905 max = cpl_image_get_mean(avg_row) + 2;
913 check(struct_row = cpl_image_get_stdev(avg_row));
918 xsh_msg_warning(
"Only %d good pixels in image. Setting QC parameter to -1",
938 cpl_image* avg_col=NULL;
943 check(avg_col = cpl_image_collapse_create(tima,1));
944 check(cpl_image_divide_scalar(avg_col,cpl_image_get_size_x(tima)));
947 min = cpl_image_get_mean(avg_col) - 2;
948 max = cpl_image_get_mean(avg_col) + 2;
956 check(struct_col = cpl_image_get_stdev(avg_col));
961 xsh_msg_warning(
"Only %d good pixels in image. Setting QC parameter to -1",
1000 cpl_image* xima=NULL;
1001 cpl_image* yima=NULL;
1002 double struct_row=0;
1003 double struct_col=0;
1006 double median = 0.0;
1009 double structx = 0.0;
1010 double structy = 0.0;
1031 check(cpl_image_threshold(xima,
1032 -DBL_MAX,median+3*stdev,
1033 -DBL_MAX,median+3*stdev));
1045 check(cpl_image_threshold(yima,
1046 -DBL_MAX,median+3*stdev,
1047 -DBL_MAX,median+3*stdev));
1105 ref_x,ref_y,reg_id));
1124 cpl_parameter* p=NULL;
1137 sx=cpl_image_get_size_x(master->
data);
1138 sy=cpl_image_get_size_y(master->
data);
1139 check(p = cpl_parameterlist_find(parameters,
"xsh.xsh_mbias.struct_refx"));
1140 check(ref_x = cpl_parameter_get_int(p));
1142 check(p = cpl_parameterlist_find(parameters,
"xsh.xsh_mbias.struct_refy"));
1143 check(ref_y = cpl_parameter_get_int(p));
1147 ref_llx=1;ref_urx=sx;
1148 ref_lly=1;ref_ury=sy;
1158 ref_x = (ref_x>0) ? ref_x : 1;
1159 ref_y = (ref_y>0) ? ref_y : 1;
1160 ref_x = (ref_x<sx) ? ref_x : sx;
1161 ref_y = (ref_y<sy) ? ref_y : sy;
1193 const int method_code)
1195 cpl_frame* medFrame = NULL;
1196 cpl_imagelist *dataList = NULL;
1197 cpl_imagelist *errsList = NULL;
1198 cpl_image* qual_comb=NULL;
1202 cpl_frame *current = NULL;
1203 char result_name[256];
1204 const int mode_and=0;
1208 check(
size = cpl_frameset_get_size( rawFrames));
1212 check( dataList = cpl_imagelist_new());
1213 check( errsList = cpl_imagelist_new());
1215 for (i=0;i <
size;i++){
1216 check(current = cpl_frameset_get_frame(rawFrames,i));
1223 check_msg( cpl_imagelist_set(dataList,cpl_image_duplicate(pre->
data),
1224 i),
"Cant add Data Image %d to imagelist", i) ;
1225 check_msg( cpl_imagelist_set(errsList,cpl_image_duplicate(pre->
errs),
1226 i),
"Cant add Data Image %d to imagelist", i) ;
1230 qual_comb=cpl_image_duplicate(pre->
qual);
1246 pre->
qual=cpl_image_duplicate(qual_comb);
1251 assure (cpl_imagelist_is_uniform (dataList) == 0, CPL_ERROR_ILLEGAL_INPUT,
1252 "Data images are not uniform");
1253 assure (cpl_imagelist_is_uniform (errsList) == 0, CPL_ERROR_ILLEGAL_INPUT,
1254 "Errs images are not uniform");
1257 if(method_code==0) {
1262 }
else if(method_code==1) {
1277 sprintf(result_name,
"%s.fits",result_tag);
1280 check(cpl_frame_set_tag(medFrame, result_tag));
1285 if (cpl_error_get_code () != CPL_ERROR_NONE) {
1322 cpl_parameterlist* params)
1325 cpl_frame *masterFrame = NULL;
1327 char mastername[256];
1340 if ( params != NULL ) {
1342 if(cpl_frameset_get_size(raws) > 1 ) {
1348 sprintf(mastername,
"MASTER_BIAS_%s.fits",
1351 nraws = cpl_frameset_get_size(raws);
1355 xsh_msg (
"Create master bias");
1358 cpl_frame_set_tag (masterFrame, tag);
1359 cpl_frame_set_group(masterFrame,CPL_FRAME_GROUP_CALIB);
1370 cpl_frame *masterFrame = NULL;
1371 const char *tag = NULL;
1387 cpl_image* ima=NULL;
1418 ima=cpl_image_new(
nx,
ny,CPL_TYPE_FLOAT);
1438 check(mean=cpl_image_get_median_window(master->
data,x1,y1,x2,y2));
1439 xsh_msg(
"scaling factor mean flat=%g",mean);
1449 cpl_image_divide_scalar( master->
data, mean);
1450 cpl_image_divide_scalar( master->
errs, mean);
1454 xsh_msg (
"Create master flat %s tag %s", name, tag);
1460 check( cpl_frame_set_tag( masterFrame, tag));
1461 check( cpl_frame_set_group( masterFrame, CPL_FRAME_GROUP_CALIB));
1475 cpl_frame *masterFrame = NULL;
1476 const char *tag = NULL;
1492 xsh_msg (
"Create master flat %s tag %s", name, tag);
1495 check( cpl_frame_set_tag( masterFrame, tag));
1496 check( cpl_frame_set_group( masterFrame, CPL_FRAME_GROUP_CALIB));
1514 cpl_frame* resFrame = NULL;
1516 char* finalName = NULL;
1518 int* qual_data = NULL;
1520 int nb_flag_pixels = 0;
1521 int error_pixels[32];
1547 CPL_FRAME_TYPE_IMAGE,
1548 CPL_FRAME_GROUP_PRODUCT,
1549 CPL_FRAME_LEVEL_FINAL));
1552 check( qual_data = cpl_image_get_data_int( mdark_pre->
qual));
1553 check(
nx = cpl_image_get_size_x( mdark_pre->
qual));
1554 check(
ny = cpl_image_get_size_y( mdark_pre->
qual));
1557 for(j=0; j<32; j++){
1558 error_pixels[j] = 0;
1561 for(i=0; i<
nx*
ny; i++){
1562 if( qual_data[i] > 0){
1566 if ( qual_data[i] & cmp){
1577 for(i=1; i< 33; i++){
1585 "Could not save bpmap to %s extension", finalName);
1589 if (cpl_error_get_code() != CPL_ERROR_NONE){
1597static cpl_error_code
1600 cpl_parameterlist* parameters)
1604 int random_sizex=-1;
1605 int random_nsamples=-1;
1622 cpl_parameter* p=NULL;
1624 const cpl_frame * fr = NULL;
1626 cpl_propertylist * plist = NULL;
1635 check(p = cpl_parameterlist_find(parameters,
"xsh.xsh_mbias.random_sizex"));
1636 check(random_sizex = cpl_parameter_get_int(p));
1638 check(p = cpl_parameterlist_find(parameters,
"xsh.xsh_mbias.random_nsamples"));
1639 check(random_nsamples = cpl_parameter_get_int(p));
1641 check(p = cpl_parameterlist_find(parameters,
"xsh.xsh_mbias.ref1_llx"));
1642 check(ref_llx = cpl_parameter_get_int(p));
1644 check(p = cpl_parameterlist_find(parameters,
"xsh.xsh_mbias.ref1_lly"));
1645 check(ref_lly = cpl_parameter_get_int(p));
1647 check(p = cpl_parameterlist_find(parameters,
"xsh.xsh_mbias.ref1_urx"));
1648 check(ref_urx = cpl_parameter_get_int(p));
1650 check(p = cpl_parameterlist_find(parameters,
"xsh.xsh_mbias.ref1_urx"));
1651 check(ref_ury = cpl_parameter_get_int(p));
1653 check(fr=cpl_frameset_get_frame_const(raws,0));
1655 check(plist=cpl_propertylist_load(cpl_frame_get_filename(fr),0));
1656 check(naxis1 = cpl_propertylist_get_int(plist,
"NAXIS1"));
1657 check(naxis2 = cpl_propertylist_get_int(plist,
"NAXIS2"));
1660 cpl_propertylist_delete(plist);
1663 if(ref_llx == -1) ref_llx = naxis1 / 8;
1664 if(ref_lly == -1) ref_lly = naxis2 / 8;
1665 if(ref_urx == -1) ref_urx = naxis1 * 7 / 8;
1666 if(ref_ury == -1) ref_ury = naxis2 * 7 / 8;
1676 XSH_ASSURE_NOT_ILLEGAL_MSG(ref_ury<=naxis2,"Must be ref_ury > frame Y
size");
1678 XSH_ASSURE_NOT_ILLEGAL_MSG(ref_urx>ref_llx,"Must be ref_urx > ref_llx
");
1679 XSH_ASSURE_NOT_ILLEGAL_MSG(ref_ury>ref_lly,"Must be ref_ury > ref_lly
");
1681 XSH_ASSURE_NOT_ILLEGAL_MSG(random_nsamples>0,"Must be random_nsamples > 0
");
1682 XSH_ASSURE_NOT_ILLEGAL_MSG(random_nsamples<100000000,"Must be random_nsamples < 100000000
");
1683 XSH_ASSURE_NOT_ILLEGAL_MSG(random_sizex>0,"Must be random_sizex > 0
");
1684 XSH_ASSURE_NOT_ILLEGAL_MSG(random_sizex<naxis1,"Must be random_sizex < frame X
size");
1685 XSH_ASSURE_NOT_ILLEGAL_MSG(random_sizex<naxis2,"Must be random_sizex < frame Y
size");
1687 check(xsh_compute_ron(raws,ref_llx,ref_lly,ref_urx,ref_ury,random_nsamples,random_sizex,1,&ron,&ron_err));
1688 xsh_pfits_set_qc_ron1(master->data_header,ron);
1689 xsh_pfits_set_qc_ron1_err(master->data_header,ron_err);
1691 check(p = cpl_parameterlist_find(parameters,"xsh.xsh_mbias.ref2_llx
"));
1692 check(ref2_llx = cpl_parameter_get_int(p));
1694 check(p = cpl_parameterlist_find(parameters,"xsh.xsh_mbias.ref2_lly
"));
1695 check(ref2_lly = cpl_parameter_get_int(p));
1697 check(p = cpl_parameterlist_find(parameters,"xsh.xsh_mbias.ref2_urx
"));
1698 check(ref2_urx = cpl_parameter_get_int(p));
1700 check(p = cpl_parameterlist_find(parameters,"xsh.xsh_mbias.ref2_urx
"));
1701 check(ref2_ury = cpl_parameter_get_int(p));
1704 //checking for defaults
1705 if(ref2_llx == -1) ref2_llx = naxis1 / 8;
1706 if(ref2_lly == -1) ref2_lly = naxis2 / 8;
1707 if(ref2_urx == -1) ref2_urx = naxis1 * 7 / 8;
1708 if(ref2_ury == -1) ref2_ury = naxis2 * 7 / 8;
1711 XSH_ASSURE_NOT_ILLEGAL_MSG(ref2_llx>0,"Must be ref2_llx > 0
");
1712 XSH_ASSURE_NOT_ILLEGAL_MSG(ref2_lly>0,"Must be ref2_lly > 0
");
1713 XSH_ASSURE_NOT_ILLEGAL_MSG(ref2_urx>0,"Must be ref2_urx > 0
");
1714 XSH_ASSURE_NOT_ILLEGAL_MSG(ref2_ury>0,"Must be ref2_ury > 0
");
1716 XSH_ASSURE_NOT_ILLEGAL_MSG(ref2_llx<naxis1,"Must be ref2_llx < frame X
size");
1717 XSH_ASSURE_NOT_ILLEGAL_MSG(ref2_lly<naxis2,"Must be ref2_lly < frame Y
size");
1720 XSH_ASSURE_NOT_ILLEGAL_MSG(ref2_urx<=naxis1,"Must be ref2_urx <= frame X
size");
1721 XSH_ASSURE_NOT_ILLEGAL_MSG(ref2_ury<=naxis2,"Must be ref2_ury <= frame Y
size");
1723 XSH_ASSURE_NOT_ILLEGAL_MSG(ref2_urx>ref2_llx,"Must be ref2_urx > ref2_llx
");
1724 XSH_ASSURE_NOT_ILLEGAL_MSG(ref2_ury>ref2_lly,"Must be ref2_ury > ref2_lly
");
1727 (ref2_llx != ref_llx) ||
1728 (ref2_lly != ref_lly) ||
1729 (ref2_urx != ref_urx) ||
1730 (ref2_ury != ref_ury)
1733 check(xsh_compute_ron(raws,ref2_llx,ref2_lly,ref2_urx,ref2_ury,random_nsamples,random_sizex,2,&ron,&ron_err));
1735 xsh_pfits_set_qc_ron2(master->data_header,ron);
1736 xsh_pfits_set_qc_ron2_err(master->data_header,ron_err);
1743 return cpl_error_get_code();
1748static cpl_error_code
1749xsh_compute_fpn_mbias(cpl_frameset* raws,
1751 xsh_instrument* instrument,
1752 cpl_parameterlist* parameters)
1758 cpl_frame* frm1=NULL;
1759 cpl_frame* frm2=NULL;
1760 cpl_image* ima1=NULL;
1761 cpl_image* ima2=NULL;
1762 cpl_image* ima=NULL;
1765 if ( xsh_instrument_get_arm(instrument) != XSH_ARM_NIR){
1766 nraws=cpl_frameset_get_size(raws);
1768 frm1=cpl_frameset_get_frame(raws,0);
1769 frm2=cpl_frameset_get_frame(raws,1);
1770 ima1=cpl_image_load(cpl_frame_get_filename(frm1),CPL_TYPE_FLOAT,0,0);
1771 ima2=cpl_image_load(cpl_frame_get_filename(frm2),CPL_TYPE_FLOAT,0,0);
1773 ima = cpl_image_duplicate(ima1);
1774 check(ron = xsh_image_get_stdev_clean(ima, NULL) / sqrt(2.0));
1776 check(fpn = xsh_fixed_pattern_noise_bias(ima1,ima2,ron));
1778 xsh_pfits_set_qc_ron_master(master->data_header,ron);
1779 xsh_pfits_set_qc_fpn_master(master->data_header,fpn);
1781 xsh_free_image(&ima);
1782 xsh_free_image(&ima1);
1783 xsh_free_image(&ima2);
1786 check(xsh_mbias_get_fpn(master->data,parameters,&fpn));
1787 /* xsh_msg("Fixed Pattern Noise=%f
",fpn); */
1792 xsh_free_image(&ima);
1793 xsh_free_image(&ima1);
1794 xsh_free_image(&ima2);
1795 return cpl_error_get_code();
1801static cpl_error_code
1802xsh_mbias_get_fpn(const cpl_image* ima,
1803 cpl_parameterlist* parameters,
1813 cpl_parameter* p=NULL;
1819 check(p = cpl_parameterlist_find(parameters,"xsh.xsh_mbias.fpn_llx
"));
1820 check(fpn_llx = cpl_parameter_get_int(p));
1822 check(p = cpl_parameterlist_find(parameters,"xsh.xsh_mbias.fpn_lly
"));
1823 check(fpn_lly = cpl_parameter_get_int(p));
1825 check(p = cpl_parameterlist_find(parameters,"xsh.xsh_mbias.fpn_urx
"));
1826 check(fpn_urx = cpl_parameter_get_int(p));
1828 check(p = cpl_parameterlist_find(parameters,"xsh.xsh_mbias.fpn_ury
"));
1829 check(fpn_ury = cpl_parameter_get_int(p));
1831 check(p = cpl_parameterlist_find(parameters,"xsh.xsh_mbias.fpn_hsize
"));
1832 check(fpn_hsize = cpl_parameter_get_int(p));
1834 check(p = cpl_parameterlist_find(parameters,"xsh.xsh_mbias.fpn_nsamples
"));
1835 check(fpn_nsamp = cpl_parameter_get_int(p));
1837 sx=cpl_image_get_size_x(ima);
1838 sy=cpl_image_get_size_y(ima);
1840 fpn_llx=(fpn_llx>0) ? fpn_llx: 0;
1841 fpn_lly=(fpn_lly>0) ? fpn_lly: 0;
1843 fpn_urx=(fpn_urx<sx) ? fpn_urx: sx;
1844 fpn_ury=(fpn_ury<sy) ? fpn_ury: sy;
1853 check_msg(cpl_flux_get_noise_window(ima,zone,fpn_hsize,fpn_nsamp,fpn,NULL),
1854 "Error computing noise in a window
");
1857 return cpl_error_get_code();
1887xsh_flat_create_normalized_master(cpl_imagelist * flats,
1888 const cpl_table *ordertable,
1889 xsh_order_list* order_locations,
1890 xsh_stack_param* stack_param)
1893 cpl_image *image=NULL;
1894 cpl_image* master_flat=NULL;
1895 cpl_imagelist* flats_norm=NULL;
1917 cpl_vector* vec_flux_ord=NULL;
1918 cpl_vector* vec_flux_sam=NULL;
1919 double* pvec_flux_ord=NULL;
1920 double* pvec_flux_sam=NULL;
1921 double tolerance=1.e-5;
1925 XSH_ASSURE_NOT_NULL_MSG(order_locations, "Null input
order locations polinomial!
");
1926 XSH_ASSURE_NOT_NULL_MSG(flats, "Null input flats imagelist!
");
1928 ni = cpl_imagelist_get_size(flats);
1930 image = cpl_image_duplicate(cpl_imagelist_get(flats, 0));
1931 sx = cpl_image_get_size_x(image);
1932 sy = cpl_image_get_size_y(image);
1934 xsh_free_image(&image);
1935 ord_min=cpl_table_get_column_min(ordertable,"ORDER");
1936 ord_max=cpl_table_get_column_max(ordertable,"ORDER");
1937 nord=ord_max-ord_min+1;
1938 vec_flux_ord=cpl_vector_new(nord);
1939 vec_flux_sam=cpl_vector_new(nsam);
1940 pvec_flux_ord=cpl_vector_get_data(vec_flux_ord);
1941 pvec_flux_sam=cpl_vector_get_data(vec_flux_sam);
1942 hbox_sy=(int)((sy-2*y_space)/(2*nsam)+0.5);
1943 flats_norm=cpl_imagelist_new();
1946 for(k=0;k<ni;k++) { /* loop over input images */
1947 xsh_free_image(&image);
1948 image = cpl_image_duplicate(cpl_imagelist_get(flats, k));
1949 for(ord=0;ord<nord;ord++) {
1950 //absord=ord+ord_min;
1951 endy=order_locations->list[ord].endy;
1952 starty=order_locations->list[ord].starty;
1953 pos_y=starty-hbox_sy;
1954 hbox_sy=(int)((endy-starty+1-2*y_space)/(2*nsam)+0.5);
1955 for(is=0;is<nsam;is++) {
1956 /* sample flux on nsam rectangular boxes distributed uniformly over the order center traces
1957 * we use a median to be robust to bad pixels */
1958 pos_y+=(2*hbox_sy+y_space);
1962 check( x=cpl_polynomial_eval_1d(order_locations->list[ord].cenpoly,
1967 llx=xsh_max_int(pos_x-hbox_sx,1);
1968 lly=xsh_max_int(pos_y-hbox_sy,1);
1969 llx=xsh_min_int(llx,sx);
1970 lly=xsh_min_int(lly,sy);
1972 urx=xsh_min_int(pos_x+hbox_sx,sx);
1973 ury=xsh_min_int(pos_y+hbox_sy,sy);
1974 urx=xsh_max_int(urx,1);
1975 ury=xsh_max_int(ury,1);
1977 llx=xsh_min_int(llx,urx);
1978 lly=xsh_min_int(lly,ury);
1979 //xsh_msg("ord=%d
llx=%d
lly=%d
urx=%d
ury=%d
",ord,llx,lly,urx,ury);
1980 check(pvec_flux_sam[is]=cpl_image_get_median_window(image,llx,lly,urx,ury));
1983 /* compute mean sampled values for each order */
1984 pvec_flux_ord[ord]=cpl_vector_get_mean(vec_flux_sam);
1986 /* compute mean of mean values measured on all orders. Normalizes each flat image to it */
1987 flux_mean=cpl_vector_get_mean(vec_flux_ord);
1988 xsh_msg("Flat %d normalize factor inter1: %g
",k,flux_mean);
1989 cpl_image_divide_scalar(image,flux_mean);
1990 cpl_imagelist_set(flats_norm,cpl_image_duplicate(image),k);
1993 /* the first master flat is the median of all means */
1994 if (strcmp(stack_param->stack_method, "median
") == 0) {
1995 master_flat=xsh_imagelist_collapse_median_create(flats_norm);
1997 master_flat=cpl_imagelist_collapse_sigclip_create(flats_norm,stack_param->klow,stack_param->khigh,tolerance,CPL_COLLAPSE_MEAN,NULL);
2003 xsh_free_vector(&vec_flux_ord);
2004 xsh_free_vector(&vec_flux_sam);
2005 xsh_free_image(&image);
2006 xsh_free_imagelist(&flats_norm);
2036xsh_flat_create_normalized_master2(cpl_imagelist * flats,
2037 const cpl_table *ordertable, xsh_order_list* order_locations,
2038 const cpl_image* mflat,xsh_stack_param* stack_param,cpl_vector** vec_flux_stack) {
2040 cpl_imagelist* flats_norm = NULL;
2041 cpl_imagelist* flats_norm2 = NULL;
2042 cpl_image* master_flat = NULL;
2044 cpl_image* flat = NULL;
2045 cpl_image* flat_mflat = NULL;
2048 cpl_vector* vec_flux = NULL;
2049 double* pvec_flux = NULL;
2051 double* pvec_flux_stack = NULL;
2074 double flux_median = 0;
2075 double mean_explevel=0;
2076 /* double exptime=0; */
2082 double tolerance=1.e-5;
2087 ni = cpl_imagelist_get_size(flats);
2089 /* evaluate median on many windows distributed all over orders of flats */
2090 sx = cpl_image_get_size_x(mflat);
2091 sy = cpl_image_get_size_y(mflat);
2093 ord_min = cpl_table_get_column_min(ordertable, "ORDER");
2094 ord_max = cpl_table_get_column_max(ordertable, "ORDER");
2095 nord = ord_max - ord_min + 1;
2097 hbox_sy = (int) ((sy - 2 * y_space) / (2 * nsam) + 0.5);
2098 flats_norm = cpl_imagelist_new();
2099 *vec_flux_stack = cpl_vector_new(ni);
2100 pvec_flux_stack=cpl_vector_get_data(*vec_flux_stack);
2102 for (i = 0; i < ni; i++) {
2103 xsh_free_vector(&vec_flux);
2104 vec_flux = cpl_vector_new(nord * nsam);
2105 pvec_flux = cpl_vector_get_data(vec_flux);
2111 check(flat = cpl_image_duplicate(cpl_imagelist_get(flats, i)));
2112 /* normalize flats by master flat previously computed */
2113 flat_mflat = cpl_image_duplicate(flat);
2114 cpl_image_divide(flat_mflat, mflat);
2115 mask = cpl_image_get_bpm(flat_mflat);
2117 for (ord = 0; ord < nord; ord++) {
2118 //absord = ord + ord_min;
2120 endy=order_locations->list[ord].endy;
2121 starty=order_locations->list[ord].starty;
2122 pos_y=starty-hbox_sy;
2123 hbox_sy=(int)((endy-starty+1-2*y_space)/(2*nsam)+0.5);
2125 for (is = 0; is < nsam; is++) {
2126 /* sample flux on nsam rectangular boxes distributed uniformly over the order center traces
2127 * we use a median to be robust to bad pixels */
2129 pos_y += (2 * hbox_sy + y_space);
2130 y = (int) (pos_y + 0.5);
2133 x=cpl_polynomial_eval_1d(order_locations->list[ord].cenpoly, (double)y,NULL));
2135 pos_x = (int) (x + 0.5);
2137 check(llx=xsh_max_int(pos_x-hbox_sx,1));
2138 check(lly=xsh_max_int(pos_y-hbox_sy,1));
2139 check(llx=xsh_min_int(llx,sx));
2140 check(lly=xsh_min_int(lly,sy));
2142 check(urx=xsh_min_int(pos_x+hbox_sx,sx));
2143 check(ury=xsh_min_int(pos_y+hbox_sy,sy));
2144 check(urx=xsh_max_int(urx,1));
2145 check(ury=xsh_max_int(ury,1));
2147 check(llx=xsh_min_int(llx,urx));
2148 check(lly=xsh_min_int(lly,ury));
2150 check(pvec_flux[k]=0);
2151 nflagged=cpl_mask_count_window(mask,llx,lly,urx,ury);
2152 if(nflagged < (urx-llx+1)*(ury-lly+1) ) {
2153 check(pvec_flux[k]=cpl_image_get_median_window(flat_mflat,llx,lly,urx,ury));
2159 /* compute median of median values measured on all orders. Normalizes each flat image to it */
2160 flux_median = cpl_vector_get_median(vec_flux);
2161 pvec_flux_stack[i]= flux_median;
2162 xsh_msg("Flat %d level iter2: %g
", i, flux_median);
2163 //xsh_msg("Flat %d level ingested: %g
", i, cpl_vector_get(*vec_flux_stack,i));
2164 //cpl_image_divide_scalar(flat, flux_median);
2165 cpl_imagelist_set(flats_norm, cpl_image_duplicate(flat), i);
2166 //xsh_msg("mean flat1=%g
",cpl_image_get_median(flat));
2167 mean_explevel+=flux_median;
2170 xsh_free_image(&flat_mflat);
2171 xsh_free_image(&flat);
2175 mean_explevel /= ni;
2176 //xsh_msg("mean_exp level: %g
",mean_explevel);
2178 cpl_vector_divide_scalar(*vec_flux_stack, mean_explevel);
2179 pvec_flux_stack = cpl_vector_get_data(*vec_flux_stack);
2180 flats_norm2 = cpl_imagelist_new();
2181 for (i = 0; i < ni; i++) {
2182 flat = cpl_imagelist_get(flats_norm, i);
2183 cpl_image_multiply_scalar(flat, 1./pvec_flux_stack[i]);
2184 //xsh_msg("inv factor=%g
",pvec_flux_stack[i]);
2185 //xsh_msg("factor=%g
",1./pvec_flux_stack[i]);
2186 //xsh_msg("mean flat2=%g
",cpl_image_get_median(flat));
2187 cpl_imagelist_set(flats_norm2, cpl_image_duplicate(flat), i);
2190 if (strcmp(stack_param->stack_method, "median
") == 0) {
2191 master_flat=xsh_imagelist_collapse_median_create(flats_norm2);
2193 master_flat=cpl_imagelist_collapse_sigclip_create(flats_norm2,stack_param->klow,stack_param->khigh,tolerance,CPL_COLLAPSE_MEAN,NULL);
2198 xsh_free_imagelist(&flats_norm);
2199 xsh_free_imagelist(&flats_norm2);
2200 xsh_free_vector(&vec_flux);
2201 xsh_free_image(&flat_mflat);
2202 //xsh_free_image(&flat);
2208/*----------------------------------------------------------------------------*/
2246/*----------------------------------------------------------------------------*/
2248xsh_create_master_flat2(cpl_frameset *set,
2249 cpl_frame * order_tab_cen,
2250 xsh_stack_param* stack_par,
2251 xsh_instrument* inst)
2254 cpl_imagelist *dataList = NULL;
2255 cpl_imagelist *errsList = NULL;
2256 cpl_imagelist *errsList2 = NULL;
2257 //cpl_imagelist *raw_images_local = NULL;
2259 cpl_image* qual_comb = NULL;
2260 cpl_image* ima=NULL;
2262 cpl_image *master_flat = NULL;
2263 cpl_image *master_flat_tmp = NULL;
2264 cpl_image *current_flat = NULL;
2266 cpl_table* ordertable = NULL;
2268 cpl_vector* vec_flux=NULL;
2270 cpl_frame *current = NULL;
2272 cpl_frame* mflat = NULL;
2274 xsh_pre* pre = NULL;
2275 xsh_order_list *order_centres_list = NULL;
2277 double* pvec_flux=NULL;
2278 const char* fname = NULL;
2283 const int mode_and = 0;
2284 char mflat_name[256];
2285 char mflat_tag[256];
2288 /* is input valid? */
2289 XSH_ASSURE_NOT_NULL( inst);
2290 XSH_ASSURE_NOT_NULL( set);
2291 check( size = cpl_frameset_get_size( set));
2292 XSH_ASSURE_NOT_ILLEGAL( size > 0);
2294 fname = cpl_frame_get_filename(order_tab_cen);
2295 ordertable = cpl_table_load(fname, 1, 0);
2296 order_centres_list = xsh_order_list_load(order_tab_cen, inst);
2298 check( dataList = cpl_imagelist_new());
2299 check( errsList = cpl_imagelist_new());
2303 /* Populate image lists with images in frame set */
2304 for (i = 0; i < size; i++) {
2305 check(current = cpl_frameset_get_frame(set,i));
2306 //cpl_msg_info(__func__,"Looking at file %
s with tag %
s\
n",cpl_frame_get_filename(current),cpl_frame_get_tag(current));
2308 check(pre = xsh_pre_load(current,inst));
2310 /* Get number of saturated pixels and update qc_numsat_max if needed */
2312 double* idata = NULL;
2313 current_flat = cpl_image_duplicate(pre->data);
2314 idata = cpl_image_get_data(current_flat);
2316 cpl_msg_info(__func__,"image: pre->nx %d pre->ny %d
nx %d
ny %d idata %d\
n",pre->nx,pre->ny,cpl_image_get_size_x(pre->data),cpl_image_get_size_y(pre->data),(idata == NULL));
2317 for(int j=0;j<pre->nx*pre->ny;j++){
2318 if(idata[j] > thresh){
2322 if(nsat > qc_numsat_max){
2323 qc_numsat_max = nsat;
2325 xsh_free_image(¤t_flat);
2327 /* inject bad pixels to change statistics */
2328 xsh_image_flag_bp(pre->data, pre->qual, inst);
2329 xsh_image_flag_bp(pre->errs, pre->qual, inst);
2330 check_msg( cpl_imagelist_set(dataList,cpl_image_duplicate(pre->data),
2331 i),"Cant add Data Image %d to imagelist
", i);
2332 check_msg( cpl_imagelist_set(errsList,cpl_image_duplicate(pre->errs),
2333 i),"Cant add Data Image %d to imagelist
", i);
2335 /* combining bad pixels */
2337 qual_comb = cpl_image_duplicate(pre->qual);
2339 xsh_badpixelmap_image_coadd(&qual_comb, pre->qual, mode_and);
2342 if (i < (size - 1)) {
2347 /*free memory on product extensions that will be re-allocated later on (errs is only modified) */
2348 xsh_free_image(&pre->data);
2349 xsh_free_image(&pre->qual);
2351 /* store combined bp map in qual extension of result */
2352 pre->qual = cpl_image_duplicate(qual_comb);
2353 xsh_free_image(&qual_comb);
2355 /* Create initial master flat */
2356 xsh_msg("Calculating stack normalized master
");
2358 master_flat_tmp = xsh_flat_create_normalized_master(dataList, ordertable, order_centres_list,stack_par),
2359 "Error computing master flat with normalization
");
2360 //check(cpl_image_save(master_flat_tmp,"master_flat_tmp.fits
",CPL_BPP_IEEE_FLOAT,NULL,CPL_IO_DEFAULT));
2363 /* Create final master flat */
2365 //xsh_free_image(&(pre->data));
2367 pre->data = xsh_flat_create_normalized_master2(dataList, ordertable, order_centres_list, master_flat_tmp,
2368 stack_par,&vec_flux),"Error computing master flat with normalization
");
2369 //check(cpl_image_save(pre->data,"master_flat_final.fits
",CPL_BPP_IEEE_FLOAT,NULL,CPL_IO_DEFAULT));
2371 xsh_free_image(&master_flat_tmp);
2372 check(pvec_flux=cpl_vector_get_data(vec_flux));
2373 check( errsList2 = cpl_imagelist_new());
2375 for (i = 0; i < size; i++) {
2376 check(ima=cpl_imagelist_get(errsList,i));
2377 check(cpl_image_multiply_scalar(ima,pvec_flux[i]));
2378 check(cpl_imagelist_set(errsList2,cpl_image_duplicate(ima),i));
2381 /* Create initial master flat err */
2382 if (strcmp(stack_par->stack_method, "median
") == 0) {
2383 check( xsh_collapse_errs(pre->errs,errsList2,0));
2385 check( xsh_collapse_errs(pre->errs,errsList2,1));
2388 /*clean memory and reset local pointers to null */
2389 //raw_images_local = NULL;
2390 if (xsh_instrument_get_arm(inst) == XSH_ARM_UVB) {
2391 sprintf(mflat_tag, "%s_%s_%
s", XSH_MASTER_FLAT,
2392 xsh_instrument_lamp_tostring(inst), xsh_instrument_arm_tostring(inst));
2394 sprintf(mflat_tag, "%s_%
s", XSH_MASTER_FLAT,xsh_instrument_arm_tostring(inst));
2396 sprintf(mflat_name,"%
s.fits
",mflat_tag);
2397 xsh_count_satpix(pre, inst,size);
2398 check(mflat = xsh_pre_save( pre,mflat_name,mflat_tag,1));
2399 check(cpl_frame_set_tag(mflat,mflat_tag));
2402 xsh_free_imagelist(&dataList);
2403 xsh_free_imagelist(&errsList);
2404 xsh_free_imagelist(&errsList2);
2405 xsh_free_table(&ordertable);
2406 xsh_free_image(¤t_flat);
2407 xsh_order_list_free(&order_centres_list);
2409 xsh_free_vector(&vec_flux);
2411 if (cpl_error_get_code() != CPL_ERROR_NONE) {
2412 xsh_free_image(&master_flat);
static void set_masterbias_qc_structure(xsh_pre *master, cpl_parameterlist *parameters)
static void set_masterdark_qc(xsh_pre *preFrame, xsh_instrument *instrument, cpl_parameterlist *parameters, cpl_frame *crh_frm, cpl_frame *bpm_frm)
static cpl_error_code xsh_mdark_compute_fpn(cpl_frameset *raws, cpl_parameterlist *params, cpl_propertylist *qclog, xsh_instrument *instrument)
static void set_masterbias_qc_xsh_structure_region(xsh_pre *master, const int llx, const int lly, const int urx, const int ury, const int ref_x, const int ref_y, const int reg_id)
cpl_frame * xsh_compute_qc_on_master_bias(cpl_frameset *raws, cpl_frame *frame, xsh_instrument *instr, cpl_parameterlist *params)
Computes QC on a master bias frame.
static int count_good(const cpl_image *image)
cpl_frame * xsh_create_master_flat_with_mask(cpl_frame *frame, cpl_frame *edges, xsh_instrument *instr)
cpl_error_code xsh_mdark_measure_ron(xsh_pre *preFrame, cpl_parameterlist *parameters)
static cpl_error_code xsh_mdark_get_ron(xsh_pre *pre, cpl_parameterlist *params, cpl_propertylist *qc_log, xsh_instrument *instr)
static double get_masterbias_qc_structure_col_region(cpl_image *tima)
static cpl_error_code xsh_compute_fpn_mbias(cpl_frameset *raws, xsh_pre *master, xsh_instrument *instrument, cpl_parameterlist *parameters)
static cpl_error_code xsh_mdark_measure_fpn(xsh_pre *preFrame, cpl_parameterlist *parameters, xsh_instrument *instrument)
static cpl_error_code xsh_mbias_get_fpn(const cpl_image *ima, cpl_parameterlist *parameters, double *fpn)
static void reject_lo_hi(cpl_image *image, double min, double max)
Reject outlier pixels.
static void set_masterbias_qc_structure_region(xsh_pre *master, const int llx, const int lly, const int urx, const int ury, const int ref_x, const int ref_y, const int reg_id)
static double xsh_mdark_get_contam(xsh_pre *pre, cpl_parameterlist *params, xsh_instrument *instr)
static cpl_error_code xsh_compute_ron_mbias(cpl_frameset *raws, xsh_pre *master, cpl_parameterlist *parameters)
cpl_frame * xsh_create_master_flat(cpl_frame *frame, xsh_instrument *instr)
static double get_masterbias_qc_structure_row_region(cpl_image *tima)
cpl_error_code xsh_mdark_get_median_stdev(xsh_pre *preFrame, cpl_parameterlist *parameters, cpl_frame *crh_frm, cpl_frame *bpm_frm)
cpl_frame * xsh_create_master_bias2(cpl_frameset *rawFrames, xsh_stack_param *stack_par, xsh_instrument *instr, const char *result_tag, const int method_code)
Creates master bias.
cpl_frame * xsh_create_master_dark(cpl_frame *medFrame, xsh_instrument *instr, cpl_parameterlist *parameters, cpl_frame *crh_frm, cpl_frame *bpm_frm)
cpl_frame * xsh_create_master_dark_bpmap(cpl_frame *mdarkFrame, xsh_instrument *instr)
cpl_frame * xsh_create_master_dark2(cpl_frameset *raws, xsh_stack_param *stack_param, cpl_parameterlist *params, cpl_propertylist *qc_log, xsh_instrument *instr)
cpl_imagelist * xsh_irplib_mkmaster_dark_fill_imagelist(const cpl_imagelist *raw_images, cpl_propertylist **raw_headers, const cpl_image *master_bias, double *mean_exptime)
cpl_image * xsh_irplib_mkmaster_median(cpl_imagelist *images, const double kappa, const int nclip, const double tolerance)
Computes master frame by clean stack median of the input imagelist.
cpl_image * xsh_irplib_mkmaster_mean(cpl_imagelist *images, const double kappa, const int nclip, const double tolerance, const double klow, const double khigh)
Computes master frame by clean stack mean of the input imagelist.
static xsh_instrument * instrument
void xsh_image_flag_bp(cpl_image *image, cpl_image *bpmap, xsh_instrument *inst)
cpl_error_code xsh_badpixelmap_image_coadd(cpl_image **self, const cpl_image *right, const int mode)
cpl_error_code xsh_count_satpix(xsh_pre *pre, xsh_instrument *instr, const int datancom)
xsh_order_list * xsh_order_list_load(cpl_frame *frame, xsh_instrument *instr)
load an order list from a frame
void xsh_order_list_free(xsh_order_list **list)
free memory associated to an order_list
double xsh_order_list_eval(xsh_order_list *list, cpl_polynomial *poly, double y)
Evaluate an order list poly.
xsh_pre * xsh_pre_duplicate(const xsh_pre *pre)
Copy a PRE structure.
xsh_pre * xsh_pre_load(cpl_frame *frame, xsh_instrument *instr)
Load a xsh_pre structure from a frame.
int xsh_pre_get_ny(const xsh_pre *pre)
Get ny of pre structure.
void xsh_pre_normalize(xsh_pre *self)
Normalize data flux.
void xsh_pre_free(xsh_pre **pre)
Free a xsh_pre structure.
int xsh_pre_get_nx(const xsh_pre *pre)
Get nx of pre structure.
void xsh_pre_subtract(xsh_pre *self, const xsh_pre *right)
Subtract one PRE image from another The data units are subtracted data = data1 - data2 The error imag...
cpl_frame * xsh_pre_save(const xsh_pre *pre, const char *filename, const char *tag, int temp)
Save PRE on disk.
void xsh_pre_median_mean_stdev_window(xsh_pre *preFrame, double *mean, double *median, double *stdev, const int llx, const int lly, const int urx, const int ury)
#define XSH_ASSURE_NOT_NULL_MSG(pointer, msg)
#define XSH_ASSURE_NOT_ILLEGAL(cond)
#define assure(CONDITION, ERROR_CODE,...)
#define check_msg(COMMAND,...)
#define XSH_ASSURE_NOT_ILLEGAL_MSG(cond, msg)
#define XSH_ASSURE_NOT_NULL(pointer)
const char * xsh_instrument_arm_tostring(xsh_instrument *i)
Get the string associated with an arm.
XSH_LAMP xsh_instrument_get_lamp(xsh_instrument *i)
Get a lamp on instrument structure.
XSH_ARM xsh_instrument_get_arm(xsh_instrument *i)
Get an arm on instrument structure.
#define xsh_msg_warning(...)
Print an warning message.
#define xsh_msg(...)
Print a message on info level.
#define xsh_msg_dbg_high(...)
void xsh_pfits_set_pcatg(cpl_propertylist *plist, const char *value)
Write the PCATG value.
void xsh_pfits_set_datancom(cpl_propertylist *plist, int value)
void xsh_pfits_set_exptime(cpl_propertylist *plist, double value)
Write the EXPTIME value.
void xsh_pfits_set_qc_mbiasrms(cpl_propertylist *plist, double value)
Write the QC.MBIASRMS value.
void xsh_pfits_set_qc_mdarkmed(cpl_propertylist *plist, double value)
Write the QC.MDARKMED value.
void xsh_pfits_set_qc_mbiasmed(cpl_propertylist *plist, double value)
Write the QC.MBIASMED value.
void xsh_pfits_set_qc_norm_fpn(cpl_propertylist *plist, double value)
Write the QC.NORMFPN value.
void xsh_pfits_set_qc_multi(cpl_propertylist *plist, void *value, const char *kw, xsh_instrument *instrument, int idx)
void xsh_pfits_set_qc_ron_err(cpl_propertylist *plist, double value)
void xsh_pfits_set_qc_mbiasavg(cpl_propertylist *plist, double value)
Write the QC.MBIASAVG value.
void xsh_pfits_set_qc_contamination(cpl_propertylist *plist, double value)
Write the contamination value.
void xsh_pfits_set_qc_reg1_structy(cpl_propertylist *plist, double value)
Write the QC.STRUCTY value.
void xsh_pfits_set_qc_bp_map_ntotal(cpl_propertylist *plist, int value)
Write the contamination value.
void xsh_pfits_set_qc_fpn_err(cpl_propertylist *plist, double value)
Write the QC.FPN value.
void xsh_pfits_set_qc_mdarkavg(cpl_propertylist *plist, double value)
Write the QC.MDARKAVG value.
void xsh_pfits_set_qc_ron(cpl_propertylist *plist, double value)
void xsh_pfits_set_qc_fpn(cpl_propertylist *plist, double value)
Write the QC.FPN value.
void xsh_pfits_set_qc_mdarkrms(cpl_propertylist *plist, double value)
Write the QC.MDARKRMS value.
void xsh_pfits_set_qc_norm_fpn_err(cpl_propertylist *plist, double value)
Write the QC.NORMFPN.ERR value.
void xsh_pfits_set_qc_reg2_structx(cpl_propertylist *plist, double value)
Write the QC.STRUCTX value.
void xsh_pfits_set_qc_reg1_structx(cpl_propertylist *plist, double value)
Write the QC.STRUCTX value.
void xsh_pfits_set_qc_slit_width(cpl_propertylist *source_list, cpl_propertylist *set_list, xsh_instrument *instrument)
void xsh_pfits_set_qc_reg2_structy(cpl_propertylist *plist, double value)
Write the QC.STRUCTY value.
void xsh_free_image(cpl_image **i)
Deallocate an image and set the pointer to NULL.
void xsh_free_frame(cpl_frame **f)
Deallocate a frame and set the pointer to NULL.
void xsh_free_mask(cpl_mask **m)
Deallocate an image mask and set the pointer to NULL.
void xsh_free_propertylist(cpl_propertylist **p)
Deallocate a property list and set the pointer to NULL.
void xsh_free_imagelist(cpl_imagelist **i)
Deallocate an image list and set the pointer to NULL.
cpl_polynomial * edguppoly
cpl_polynomial * edglopoly
cpl_propertylist * qual_header
cpl_propertylist * errs_header
cpl_propertylist * data_header
const char * stack_method
#define XSH_GOOD_PIXEL_LEVEL
#define XSH_NAME_LAMP_MODE_ARM(name, id, ext, instr)
#define XSH_PRE_QUAL_TYPE
cpl_frame * xsh_frame_product(const char *fname, const char *tag, cpl_frame_type type, cpl_frame_group group, cpl_frame_level level)
Creates a frame with given characteristics.
#define XSH_GET_TAG_FROM_ARM(TAG, instr)
#define XSH_MASTER_BP_MAP_DARK
#define XSH_GET_TAG_FROM_LAMP(TAG, instr)
cpl_parameter * xsh_parameters_find(cpl_parameterlist *list, const char *recipe_id, const char *name)
find a parameter
int xsh_parameters_get_int(const cpl_parameterlist *list, const char *recipe_id, const char *name)
#define XSH_QC_BP_MAP_NFLAGi
#define XSH_FREE(POINTER)
cpl_error_code xsh_collapse_errs(cpl_image *errs, cpl_imagelist *list, const int mode)