39#include "catalogue/casu_utils.h"
40#include "catalogue/casu_fits.h"
41#include "casu_stats.h"
42#include "catalogue/casu_wcsutils.h"
43#include "catalogue/casu_tfits.h"
45#define DATAMIN -1000.0
46#define DATAMAX 65535.0
72static void linecoverage(cpl_wcs *outwcs, cpl_matrix *xyin,
double *lra1,
73 double *lra2,
double *ldec1,
double *ldec2);
74static int stack_nn(
int nim, dstrct *fileptrs,
float lsig,
float hsig,
75 float sumweights, casu_fits *outfits, casu_fits *outconf,
76 casu_fits *outvar, cpl_wcs *outwcs);
77static int stack_lin(
int nim, dstrct *fileptrs,
float sumweights,
78 casu_fits *outfits, casu_fits *outconf, casu_fits *outvar,
80static void stackslow(
int nimages, dstrct *fileptrs,
float lsig,
float hsig,
81 float sumweights, casu_fits *outfits, casu_fits *outconf,
82 casu_fits *outvar, cpl_wcs *outwcs,
int dolin);
83static void seeing_wt(
int nim, dstrct *fileptrs);
84static void output_files(
int nim, dstrct *fileptrs, casu_fits **outfits,
85 casu_fits **outconf, casu_fits **outvar,
87static void diffxy(cpl_wcs *wref, cpl_wcs *wprog,
float *dx,
float *dy);
88static void outloc(cpl_wcs *win, cpl_matrix *in, cpl_wcs *wout,
89 cpl_array *trans, cpl_matrix **out);
90static void inloc(cpl_wcs *wout, cpl_matrix *xyout, cpl_wcs *win,
91 cpl_array *trans, cpl_matrix **xyin);
92static void backgrnd_ov(
int nim, dstrct *fileptrs,
int unmap);
93static void skyest(
float *data,
int *cdata,
long npts,
float thresh,
94 float *skymed,
float *skynoise);
95static void do_averages(
int ncontrib,
float *data,
float *vdata,
float *wconf,
96 float *conf,
unsigned char *
id,
float lclip,
97 float hclip,
float hsig,
float extra, dstrct *fileptrs,
98 float sumweights,
short int *lowcl,
short int *highcl,
99 float *outval,
float *outvalc,
float *outvalv);
100static cpl_table *mknewtab(casu_tfits *cat, dstrct *ddcur, dstrct *ddref);
101static cpl_array *transinit(
void);
102static void fileptrs_close(
int nim, dstrct *fileptrs);
103static void tidy(
int nim, dstrct *fileptrs, cpl_wcs *outwcs);
187extern int casu_imstack(casu_fits **inf, casu_fits **inconf, casu_fits **invar,
188 casu_tfits **cats,
int nimages,
int nconfs,
float lthr,
189 float hthr,
int method,
int seeing,
int fast,
int unmap,
190 const char *expkey, casu_fits **out, casu_fits **outc,
191 casu_fits **outv,
int *status) {
194 float expref,exposure,xoff,yoff,sumweights;
195 casu_fits *outfits=NULL,*outconf=NULL,*outvar=NULL;
197 cpl_table *newtab,*mtab;
198 cpl_propertylist *phu;
199 cpl_wcs *outwcs = NULL;
200 dstrct *fileptrs=NULL;
201 const char *fctid =
"casu_imstack";
208 if (*status != CASU_OK)
214 cpl_msg_error(fctid,
"No input files to combine");
215 tidy(nimages,fileptrs,outwcs);
217 }
else if (nimages == 1) {
228 fileptrs = cpl_malloc(nimages*
sizeof(dstrct));
235 expref = max(0.5,exposure);
237 for (i = 0; i < nimages; i++) {
246 }
else if (nconfs == 1) {
247 dd->conf = inconf[0];
250 dd->conf = inconf[i];
273 &(dd->ramax),&(dd->decmin),&(dd->decmax),
285 if (cpl_propertylist_has(phu,expkey)) {
286 exposure = (float)cpl_propertylist_get_double(phu,expkey);
287 exposure = max(0.5,exposure);
291 dd->expscale = exposure/expref;
295 dd->bpm = cpl_calloc((dd->nx)*(dd->ny),
sizeof(
unsigned char));
306 cpl_msg_error(fctid,
"Image %s and Confidence map %s don't match",
309 tidy(nimages,fileptrs,outwcs);
316 if (dd->var != NULL) {
319 cpl_msg_error(fctid,
"Image %s and Variance map %s don't match",
322 tidy(nimages,fileptrs,outwcs);
331 diffxy(fileptrs->vwcs,dd->vwcs,&(dd->xoff),&(dd->yoff));
339 if (i == 0 || cats[i] == NULL) {
340 dd->trans = transinit();
341 dd->invtrans = transinit();
343 newtab = mknewtab(cats[i],dd,fileptrs);
345 1024,&xoff,&yoff,&nm,&mtab,status);
346 if (*status != CASU_OK) {
347 dd->trans = transinit();
353 1024,&xoff,&yoff,&nm,&mtab,status);
367 backgrnd_ov(nimages,fileptrs,unmap);
372 seeing_wt(nimages,fileptrs);
377 for (i = 0; i < nimages; i++)
378 sumweights += (fileptrs+i)->weight;
382 output_files(nimages,fileptrs,&outfits,&outconf,&outvar,&outwcs);
393 stack_nn(nimages,fileptrs,lthr,hthr,sumweights,outfits,outconf,
402 stack_lin(nimages,fileptrs,sumweights,outfits,outconf,outvar,outwcs);
411 stackslow(nimages,fileptrs,lthr,hthr,sumweights,outfits,outconf,
412 outvar,outwcs,method);
424 tidy(nimages,fileptrs,outwcs);
467static void stackslow(
int nimages, dstrct *fileptrs,
float lsig,
float hsig,
468 float sumweights, casu_fits *outfits, casu_fits *outconf,
469 casu_fits *outvar, cpl_wcs *outwcs,
int dolin) {
470 float scale_avvar,*outdata,*outdatav,lclip,hclip,*data;
472 float *workbuf,*workbufv,*workbufw,*workbufc,*dbuf,*wbuf,*cbuf;
473 float outval,outvalc,outvalv,avlev,avvar,dx,dy,value,cval,*confwork;
474 float med,wt = 0.,w[4],renorm,*vbuf,vval,*workdatav,*workdatav2,*workdatav3;
475 double yout,xin,yin,oxf,oyf,lra1,lra2,ldec1,ldec2;
476 int *nbuf,*iloc,jout,bufloc_row,bufloc_before,iim,i,j,*outdatac;
477 int gotit,iout,ixin,iyin,ind,ind1,ox,oy,bufloc,ncontrib,*lbuf,nin;
478 int xmin,xmax,ymin,ymax,nz,nx,*bloc,*bbuf,m,nn,ii,jj,*cdata;
479 short int clipped_low,clipped_high;
481 cpl_image *im,*cim,*vim;
482 unsigned char *clipmap,*id,*ibuf,**bpms,*bbpm;
484 cpl_matrix *xyin,*xyin2,*xyout;
493 scale_avvar = sqrt(CPL_MATH_PI/2.0)/9.0;
506 lclip = fileptrs->sky - lsig*(fileptrs->noise);
507 hclip = fileptrs->sky + hsig*(fileptrs->noise);
512 workbuf = cpl_malloc(2*nxo*nz*
sizeof(
float));
514 workbufv = cpl_malloc(2*nxo*nz*
sizeof(
float));
517 workbufw = cpl_malloc(2*nxo*nz*
sizeof(
float));
518 workbufc = cpl_malloc(2*nxo*nz*
sizeof(
float));
519 confwork = cpl_calloc(nxo*nyo,
sizeof(
float));
520 id = cpl_malloc(2*nxo*nz*
sizeof(
unsigned char));
521 nbuf = cpl_malloc(2*nxo*
sizeof(
int));
522 iloc = cpl_malloc(2*nxo*nz*
sizeof(
int));
523 bloc = cpl_malloc(2*nxo*nz*
sizeof(
int));
524 clipmap = cpl_calloc(2*nxo*nz,
sizeof(
unsigned char));
525 bpms = cpl_calloc(nimages,
sizeof(
unsigned char *));
526 dbuf = cpl_malloc(2*nz*
sizeof(
float));
527 wbuf = cpl_malloc(2*nz*
sizeof(
float));
529 vbuf = cpl_malloc(2*nz*
sizeof(
float));
532 cbuf = cpl_malloc(2*nz*
sizeof(
float));
533 ibuf = cpl_malloc(2*nz*
sizeof(
unsigned char));
534 lbuf = cpl_malloc(2*nz*
sizeof(
int));
535 bbuf = cpl_malloc(2*nz*
sizeof(
int));
539 for (i = 0; i < nimages; i++)
540 bpms[i] = (fileptrs+i)->bpm;
544 for (jout = 0; jout < nyo; jout++) {
545 bufloc_row = (jout % 2 ? 0 : 1);
546 bufloc_before = (! bufloc_row);
547 yout = (double)(jout+1);
551 (void)memset(nbuf+bufloc_row*nxo,0,nxo*
sizeof(
int));
557 xyin = cpl_matrix_new((cpl_size)nin,2);
559 for (i = -1; i <= 1; i+= 2) {
560 for (iout = 0; iout < nxo; iout++) {
561 cpl_matrix_set(xyin,nin,0,(
double)(iout+1));
562 cpl_matrix_set(xyin,nin,1,yout+0.5*(
double)i);
566 linecoverage(outwcs,xyin,&lra1,&lra2,&ldec1,&ldec2);
571 for (iim = 0; iim < nimages; iim++) {
582 if (ldec2 < dd->decmin || ldec1 > dd->decmax ||
583 lra2 < dd->ramin || lra1 > dd->ramax)
588 inloc(outwcs,xyin,dd->vwcs,dd->trans,&xyout);
597 for (i = -1; i <= 1; i += 2) {
598 for (iout = 0; iout < nxo; iout++) {
599 xin = cpl_matrix_get(xyout,nin,0);
600 yin = cpl_matrix_get(xyout,nin,1);
602 ixin = casu_nint(xin);
603 iyin = casu_nint(yin);
604 if (ixin < 1 || iyin < 1 || ixin > dd->nx ||
607 xmin = min(xmin,ixin);
608 xmax = max(xmax,ixin);
609 ymin = min(ymin,iyin);
610 ymax = max(ymax,iyin);
614 cpl_matrix_delete(xyout);
623 (cpl_size)xmin,(cpl_size)ymin,
624 (cpl_size)xmax,(cpl_size)ymax);
625 nx = cpl_image_get_size_x(im);
626 data = cpl_image_get_data_float(im);
630 (cpl_size)xmin,(cpl_size)ymin,
631 (cpl_size)xmax,(cpl_size)ymax);
632 cdata = cpl_image_get_data_int(cim);
633 if (outvar != NULL) {
637 (cpl_size)xmin,(cpl_size)ymin,
638 (cpl_size)xmax,(cpl_size)ymax);
639 vdata = cpl_image_get_data_float(vim);
644 nin = (ymax - ymin + 1)*(xmax - xmin + 1);
645 xyin2 = cpl_matrix_new((cpl_size)nin,2);
647 for (j = ymin; j <= ymax; j++) {
648 for (i = xmin; i <= xmax; i++) {
649 cpl_matrix_set(xyin2,nin,0,(
double)i);
650 cpl_matrix_set(xyin2,nin,1,(
double)j);
654 outloc(dd->vwcs,xyin2,outwcs,dd->trans,&xyout);
655 cpl_matrix_delete(xyin2);
660 for (j = ymin; j <= ymax; j++) {
662 for (i = xmin; i <= xmax; i++) {
663 ind1 = ind + i - xmin;
664 oxf = cpl_matrix_get(xyout,nin,0);
665 oyf = cpl_matrix_get(xyout,nin,1);
667 ox = casu_nint(oxf) - 1;
668 oy = casu_nint(oyf) - 1;
669 if (ox < 0 || ox >= nxo || oy < 0 || oy >= nyo ||
670 cdata[ind1] == 0 || oy != jout)
672 bufloc = (bufloc_row*nxo + ox)*nz +
673 nbuf[ox+bufloc_row*nxo];
674 value = data[ind1]/(dd->expscale) + dd->skydiff;
675 workbuf[bufloc] = value;
677 workbufv[bufloc] = vdata[ind1]/powf(dd->expscale,2.0);
678 workbufw[bufloc] = wt;
679 workbufc[bufloc] = (float)cdata[ind1];
681 nbuf[ox+bufloc_row*nxo] += 1;
683 bloc[bufloc] = (j-1)*(dd->nx) + i - 1;
684 bpms[iim][bloc[bufloc]] = 0;
687 cpl_matrix_delete(xyout);
696 cpl_matrix_delete(xyin);
701 for (iout = 0; iout < nxo; iout++) {
702 clipmap[iout+bufloc_row*nxo] = 0;
703 bufloc = (bufloc_row*nxo + iout)*nz;
704 ncontrib = nbuf[iout+bufloc_row*nxo];
706 outdata[jout*nxo + iout] = fileptrs->sky;
707 outdatac[jout*nxo + iout] = 0;
713 for (i = 0; i < ncontrib; i++) {
714 dbuf[i] = workbuf[bufloc+i];
715 wbuf[i] = workbufw[bufloc+i];
717 vbuf[i] = workbufv[bufloc+i];
718 cbuf[i] = workbufc[bufloc+i];
719 ibuf[i] =
id[bufloc+i];
720 lbuf[i] = iloc[bufloc+i];
721 bbuf[i] = bloc[bufloc+i];
726 do_averages(ncontrib,dbuf,vbuf,wbuf,cbuf,ibuf,lclip,hclip,hsig,0.0,
727 fileptrs,sumweights,&clipped_low,&clipped_high,&outval,
732 outdata[jout*nxo + iout] = outval;
733 confwork[jout*nxo + iout] = outvalc;
735 outdatav[jout*nxo + iout] = outvalv;
736 clipmap[bufloc_row*nxo + iout] = (clipped_high >= 0);
737 if (clipped_low >= 0)
738 bpms[ibuf[clipped_low]][bbuf[clipped_low]] = 2;
739 if (clipped_high >= 0)
740 bpms[ibuf[clipped_high]][bbuf[clipped_high]] = 1;
748 for (iout = 1; iout < nxo-1; iout++) {
749 if (! clipmap[bufloc_before*nxo + iout])
751 ncontrib = nbuf[bufloc_before*nxo+iout];
754 ind = (jout-1)*nxo + iout;
755 bufloc = (bufloc_before*nxo + iout)*nz;
757 for (j = -1; j <= 1; j++)
758 for (i = -1; i <= 1; i++)
759 avlev += outdata[ind + j*nxo + i];
762 for (j = -1; j <= 1; j++)
763 for (i = -1; i <= 1; i++)
764 avvar += (
float)fabs(avlev - outdata[ind + j*nxo + i]);
765 avvar *= scale_avvar;
766 if (avlev <= hclip && avvar <= 2.0*(fileptrs->noise))
771 for (i = 0; i < ncontrib; i++) {
772 dbuf[i] = workbuf[bufloc+i];
774 vbuf[i] = workbufv[bufloc+i];
775 wbuf[i] = workbufw[bufloc+i];
776 cbuf[i] = workbufc[bufloc+i];
777 ibuf[i] =
id[bufloc+i];
778 lbuf[i] = iloc[bufloc+i];
779 bbuf[i] = bloc[bufloc+i];
780 bpms[ibuf[i]][bbuf[i]] = 0;
785 do_averages(ncontrib,dbuf,vbuf,wbuf,cbuf,ibuf,lclip,hclip,hsig,
786 avvar,fileptrs,sumweights,&clipped_low,
787 &clipped_high,&outval,&outvalc,&outvalv);
791 outdata[ind] = outval;
793 outdatav[ind] = outvalv;
794 confwork[ind] = outvalc;
795 if (clipped_low >= 0)
796 bpms[ibuf[clipped_low]][bbuf[clipped_low]] = 2;
797 if (clipped_high >= 0)
798 bpms[ibuf[clipped_high]][bbuf[clipped_high]] = 1;
808 if (outvar != NULL) {
809 workdatav = cpl_malloc(nxo*nyo*
sizeof(
float));
810 workdatav2 = cpl_malloc(nxo*nyo*
sizeof(
float));
811 workdatav3 = cpl_calloc(nxo*nyo,
sizeof(
float));
813 memset(outdata,0,nxo*nyo*
sizeof(
float));
814 memset(confwork,0,nxo*nyo*
sizeof(
float));
816 memset(outdatav,0,nxo*nyo*
sizeof(
float));
821 for (iim = 0; iim < nimages; iim++) {
822 if (outvar != NULL) {
823 memset(workdatav,0,nxo*nyo*
sizeof(
float));
824 memset(workdatav2,0,nxo*nyo*
sizeof(
float));
830 data = cpl_image_get_data_float(im);
834 cdata = cpl_image_get_data_int(cim);
835 if (outvar != NULL) {
839 vdata = cpl_image_get_data_float(vim);
844 nin = (dd->ny)*(dd->nx);
845 xyin = cpl_matrix_new((cpl_size)nin,2);
847 for (j = 1; j <= dd->ny; j++) {
848 for (i = 1; i <= dd->nx; i++) {
849 cpl_matrix_set(xyin,nin,0,(
double)i);
850 cpl_matrix_set(xyin,nin,1,(
double)j);
854 outloc(dd->vwcs,xyin,outwcs,dd->trans,&xyout);
855 cpl_matrix_delete(xyin);
860 for (j = 1; j <= dd->ny; j++) {
861 ind = (j - 1)*(dd->nx);
862 for (i = 1; i <= dd->nx; i++) {
865 if (bpms[iim][ind1] != 0 || cdata[ind1] == 0)
867 oxf = cpl_matrix_get(xyout,nin,0);
868 oyf = cpl_matrix_get(xyout,nin,1);
869 if (oxf < 0.0 || oyf < 0.0)
873 if (ox < 0 || ox >= nxo || oy < 0 || oy >= nyo)
875 dx = oxf - (float)(ox + 1);
876 dy = oyf - (float)(oy + 1);
877 w[0] = (1.0-dx)*(1.0-dy);
882 value = data[ind1]/(dd->expscale) + dd->skydiff;
884 vval = vdata[ind1]/powf(dd->expscale,2.0);
885 cval = (float)cdata[ind1];
886 for (jj = 0; jj <= 1; jj++) {
889 for (ii = 0; ii <= 1; ii++) {
890 nn = (oy+jj)*nxo + ox + ii;
891 if (nn >= npts || ox+ii >= nxo)
893 outdata[nn] += w[m]*value*wt*cval;
894 confwork[nn] += w[m]*wt*cval;
895 if (outvar != NULL) {
896 workdatav[nn] += vval*w[m]*cval;
897 workdatav2[nn] += w[m]*cval;
904 cpl_matrix_delete(xyout);
907 if (outvar != NULL) {
909 for (ii = 0; ii < npts; ii++) {
910 if (workdatav2[ii] != 0.0) {
911 outdatav[ii] += wt*wt*workdatav[ii]/workdatav2[ii];
912 workdatav3[ii] += wt;
920 for (jout = 0; jout < nyo; jout++) {
921 for (iout = 0; iout < nxo; iout++) {
922 ind = jout*nxo + iout;
923 if (confwork[ind] != 0.0) {
924 outdata[ind] /= confwork[ind];
925 if (outvar != NULL) {
926 if (workdatav3[ind] != 0.0)
927 outdatav[ind] /= powf(workdatav3[ind],2.0);
932 outdata[ind] = fileptrs->sky;
936 confwork[ind] /= sumweights;
939 if (outvar != NULL) {
940 freespace(workdatav);
941 freespace(workdatav2);
942 freespace(workdatav3);
949 bbpm = cpl_calloc(npts,
sizeof(*bbpm));
950 for (i = 0; i < npts; i++)
951 bbpm[i] = (confwork[i] == 0.0);
955 for (i = 0; i < npts; i++) {
956 confwork[i] *= renorm;
957 outdatac[i] = max(0,min(1000,(
int)(confwork[i]+0.5)));
1011static void linecoverage(cpl_wcs *outwcs, cpl_matrix *xyin,
double *lra1,
1012 double *lra2,
double *ldec1,
double *ldec2) {
1013 int i,first_quad,fourth_quad,nr;
1016 double cur_ra,cur_dec,*data,max_1q,min_4q;
1020 cpl_wcs_convert(outwcs,xyin,&radec,&status,CPL_WCS_PHYS2WORLD);
1021 cpl_array_delete(status);
1031 data = cpl_matrix_get_data(radec);
1032 nr = cpl_matrix_get_nrow(radec);
1035 for (i = 0; i < nr; i++) {
1037 cur_dec = data[2*i+1];
1038 if (cur_ra >= 0.0 && cur_ra <= 90.0) {
1040 max_1q = max(cur_ra,max_1q);
1041 }
else if (cur_ra >= 270.0 && cur_ra < 360.0) {
1043 min_4q = min((cur_ra-360.0),min_4q);
1045 *lra1 = min(*lra1,cur_ra);
1046 *lra2 = max(*lra2,cur_ra);
1047 *ldec1 = min(*ldec1,cur_dec);
1048 *ldec2 = max(*ldec2,cur_dec);
1050 cpl_matrix_delete(radec);
1057 if (first_quad && fourth_quad) {
1099static int stack_nn(
int nim, dstrct *fileptrs,
float lsig,
float hsig,
1100 float sumweights, casu_fits *outfits, casu_fits *outconf,
1101 casu_fits *outvar, cpl_wcs *outwcs) {
1102 float *workbuf,*workbufc,*workbufw,lclip,hclip,*data,wt,med,outvalc;
1103 float value,*dbuf,*wbuf,*cbuf,outval,avlev,avvar,*confwork,*outdata;
1104 float scale_avvar,renorm,*vbuf,*outdatav,*workbufv,*vdata=NULL,outvalv;
1106 long *iloc,i,npts,ix,iy,ind1,ind,ox,oy,nn,bufloc,ncontrib,*lbuf;
1107 long j,nx,ny,nz,nxo,nyo,nall;
1108 int *outdatac,*cdata,nin;
1109 short int clipped_low,clipped_high;
1111 unsigned char *id,*clipmap,*cc,*cclast,*ibuf,*bbpm;
1113 cpl_image *outim,*outimc,*outimv;
1114 cpl_matrix *xyin,*xyout;
1120 scale_avvar = sqrt(CPL_MATH_PI/2.0)/9.0;
1128 nxo = (int)cpl_image_get_size_x(outim);
1129 nyo = (int)cpl_image_get_size_y(outim);
1134 nall = (long)nz*(
long)nxo*(long)nyo;
1135 workbuf = cpl_calloc(nall,
sizeof(*workbuf));
1137 workbufv = cpl_calloc(nall,
sizeof(*workbufv));
1140 workbufc = cpl_calloc(nall,
sizeof(*workbufc));
1141 workbufw = cpl_calloc(nall,
sizeof(*workbufw));
1142 id = cpl_calloc(nall,
sizeof(*
id));
1143 iloc = cpl_calloc(nall,
sizeof(*iloc));
1144 nbuf = cpl_calloc(nxo*nyo,
sizeof(*nbuf));
1145 confwork = cpl_calloc(nxo*nyo,
sizeof(*confwork));
1149 clipmap = cpl_calloc(2*nxo,
sizeof(*clipmap));
1153 dbuf = cpl_calloc(2*nz,
sizeof(*dbuf));
1155 vbuf = cpl_calloc(2*nz,
sizeof(*vbuf));
1158 wbuf = cpl_calloc(2*nz,
sizeof(*wbuf));
1159 cbuf = cpl_calloc(2*nz,
sizeof(*cbuf));
1160 ibuf = cpl_calloc(2*nz,
sizeof(*ibuf));
1161 lbuf = cpl_calloc(2*nz,
sizeof(*lbuf));
1165 outdata = cpl_image_get_data_float(outim);
1166 outdatac = cpl_image_get_data_int(outimc);
1168 outdatav = cpl_image_get_data_float(outimv);
1172 lclip = fileptrs->sky - lsig*(fileptrs->noise);
1173 hclip = fileptrs->sky + hsig*(fileptrs->noise);
1178 for (i = 0; i < nim; i++) {
1192 xyin = cpl_matrix_new((cpl_size)nin,2);
1194 for (iy = 1; iy <= ny; iy++) {
1195 for (ix = 1; ix <= nx; ix++) {
1196 cpl_matrix_set(xyin,nin,0,(
double)ix);
1197 cpl_matrix_set(xyin,nin,1,(
double)iy);
1201 outloc(dd->vwcs,xyin,outwcs,dd->trans,&xyout);
1202 cpl_matrix_delete(xyin);
1208 for (iy = 0; iy < ny; iy++) {
1210 for (ix = 0; ix < nx; ix++) {
1212 oxf = cpl_matrix_get(xyout,nin,0);
1213 oyf = cpl_matrix_get(xyout,nin,1);
1215 ox = casu_nint(oxf) - 1;
1216 oy = casu_nint(oyf) - 1;
1217 if (ox < 0 || ox >= nxo || oy < 0 || oy >= nyo ||
1221 bufloc = oy*nxo*nz + ox*nz + nbuf[nn];
1222 value = data[ind]/(dd->expscale) + dd->skydiff;
1223 workbuf[bufloc] = value;
1224 if (outvar != NULL && vdata != NULL)
1225 workbufv[bufloc] = vdata[ind]/((dd->expscale)*(dd->expscale));
1226 workbufw[bufloc] = wt;
1227 workbufc[bufloc] = (float)cdata[ind];
1233 cpl_matrix_delete(xyout);
1238 for (iy = 0; iy < nyo; iy++) {
1240 cc = clipmap + (iy % 2)*nxo;
1241 cclast = clipmap + ((iy-1) % 2)*nxo;
1242 for (ix = 0; ix < nxo; ix++) {
1244 bufloc = iy*nxo*nz + ix*nz;
1245 ncontrib = nbuf[ind];
1246 if (ncontrib == 0) {
1247 outdata[ind] = fileptrs->sky;
1250 outdatav[ind] = 0.0;
1257 for (i = 0; i < ncontrib; i++) {
1258 dbuf[i] = workbuf[bufloc+i];
1259 wbuf[i] = workbufw[bufloc+i];
1260 cbuf[i] = workbufc[bufloc+i];
1262 vbuf[i] = workbufv[bufloc+i];
1263 ibuf[i] =
id[bufloc+i];
1264 lbuf[i] = iloc[bufloc+i];
1269 do_averages(ncontrib,dbuf,vbuf,wbuf,cbuf,ibuf,lclip,hclip,hsig,0.0,
1270 fileptrs,sumweights,&clipped_low,&clipped_high,&outval,
1275 outdata[ind] = outval;
1276 confwork[ind] = outvalc;
1278 outdatav[ind] = outvalv;
1279 cc[ix] = (clipped_high >= 0);
1280 if (clipped_low >= 0)
1281 ((fileptrs+ibuf[clipped_low])->bpm)[lbuf[clipped_low]] = 2;
1282 if (clipped_high >= 0)
1283 ((fileptrs+ibuf[clipped_high])->bpm)[lbuf[clipped_high]] = 1;
1292 for (ix = 1; ix < nxo-1; ix++) {
1295 ind = (iy-1)*nxo + ix;
1296 bufloc = (iy-1)*nxo*nz + ix*nz;
1297 ncontrib = nbuf[ind];
1301 for (i = -1; i <= 1; i++)
1302 for (j = -1; j <= 1; j++)
1303 avlev += outdata[ind + i*nxo + j];
1306 for (i = -1; i <= 1; i++)
1307 for (j = -1; j <= 1; j++)
1308 avvar += (
float)fabs(avlev - outdata[ind + i*nxo + j]);
1309 avvar *= scale_avvar;
1310 if (avlev <= hclip && avvar <= 2.0*(fileptrs->noise))
1315 for (i = 0; i < ncontrib; i++) {
1316 dbuf[i] = workbuf[bufloc+i];
1318 vbuf[i] = workbufv[bufloc+i];
1319 wbuf[i] = workbufw[bufloc+i];
1320 cbuf[i] = workbufc[bufloc+i];
1321 ibuf[i] =
id[bufloc+i];
1322 lbuf[i] = iloc[bufloc+i];
1323 (fileptrs+ibuf[i])->bpm[lbuf[i]] = 0;
1328 do_averages(ncontrib,dbuf,vbuf,wbuf,cbuf,ibuf,lclip,hclip,hsig,avvar,
1329 fileptrs,sumweights,&clipped_low,&clipped_high,&outval,
1334 outdata[ind] = outval;
1336 outdatav[ind] = outvalv;
1337 confwork[ind] = outvalc;
1338 if (clipped_low >= 0)
1339 ((fileptrs+ibuf[clipped_low])->bpm)[lbuf[clipped_low]] = 2;
1340 if (clipped_high >= 0)
1341 ((fileptrs+ibuf[clipped_high])->bpm)[lbuf[clipped_high]] = 1;
1348 bbpm = cpl_calloc(npts,
sizeof(*bbpm));
1349 for (i = 0; i < npts; i++)
1350 bbpm[i] = (confwork[i] == 0.0);
1351 med =
casu_med(confwork,bbpm,npts);
1354 for (i = 0; i < npts; i++) {
1355 confwork[i] *= renorm;
1356 outdatac[i] = max(0,min(1000,(
int)(confwork[i]+0.5)));
1362 freespace(workbufc);
1363 freespace(workbufv);
1364 freespace(workbufw);
1365 freespace(confwork);
1411static int stack_lin(
int nim, dstrct *fileptrs,
float sumweights,
1412 casu_fits *outfits, casu_fits *outconf, casu_fits *outvar,
1414 cpl_image *outim,*outimc,*outimv;
1416 long npts,i,ix,iy,ind1,ind,ox,oy,m,jj,ii,nn,nx,ny,nxo,nyo;
1417 float *workbufw,*data,wt,dx,dy,w[4],value,cval,*vdata,*workdatav3;
1418 float med,*outdata,renorm,vval,*outdatav,*workdatav,*workdatav2;
1419 int *cdata,*outdatac,nin;
1421 unsigned char *bbpm;
1422 cpl_matrix *xyin,*xyout;
1435 nxo = (long)cpl_image_get_size_x(outim);
1436 nyo = (long)cpl_image_get_size_y(outim);
1441 workbufw = cpl_calloc(nxo*nyo,
sizeof(*workbufw));
1445 outdata = cpl_image_get_data_float(outim);
1446 outdatac = cpl_image_get_data_int(outimc);
1447 if (outvar != NULL) {
1448 workdatav = cpl_malloc(nxo*nyo*
sizeof(
float));
1449 workdatav2 = cpl_malloc(nxo*nyo*
sizeof(
float));
1450 workdatav3 = cpl_malloc(nxo*nyo*
sizeof(
float));
1451 outdatav = cpl_image_get_data_float(outimv);
1457 for (i = 0; i < npts; i++) {
1460 if (outvar != NULL) {
1462 workdatav3[i] = 0.0;
1469 for (i = 0; i < nim; i++) {
1470 if (outvar != NULL) {
1471 memset(workdatav,0,nxo*nyo*
sizeof(
float));
1472 memset(workdatav2,0,nxo*nyo*
sizeof(
float));
1486 xyin = cpl_matrix_new((cpl_size)nin,2);
1488 for (iy = 1; iy <= ny; iy++) {
1489 for (ix = 1; ix <= nx; ix++) {
1490 cpl_matrix_set(xyin,nin,0,(
double)ix);
1491 cpl_matrix_set(xyin,nin,1,(
double)iy);
1495 outloc(dd->vwcs,xyin,outwcs,dd->trans,&xyout);
1496 cpl_matrix_delete(xyin);
1502 for (iy = 0; iy < ny; iy++) {
1504 for (ix = 0; ix < nx; ix++) {
1506 oxf = cpl_matrix_get(xyout,nin,0);
1507 oyf = cpl_matrix_get(xyout,nin,1);
1509 if (oxf < 0.0 || oyf < 0.0)
1513 if ((dd->bpm)[ind] != 0)
1515 if (ox < 0 || ox >= nxo || oy < 0 || oy >= nyo ||
1518 dx = oxf - (float)(ox + 1);
1519 dy = oyf - (float)(oy + 1);
1520 w[0] = (1.0-dx)*(1.0-dy);
1525 value = data[ind]/(dd->expscale) + dd->skydiff;
1527 vval = vdata[ind]/((dd->expscale)*(dd->expscale));
1528 cval = (float)cdata[ind];
1529 for (jj = 0; jj <= 1; jj++) {
1530 for (ii = 0; ii <= 1; ii++) {
1531 nn = (oy+jj)*nxo + ox + ii;
1532 if (nn >= npts || ox+ii >= nxo || oy+jj >= nyo)
1534 outdata[nn] += w[m]*value*wt*cval;
1535 workbufw[nn] += w[m]*wt*cval;
1536 if (outvar != NULL) {
1537 workdatav[nn] += vval*w[m]*cval;
1538 workdatav2[nn] += w[m]*cval;
1545 cpl_matrix_delete(xyout);
1546 if (outvar != NULL) {
1547 for (ii = 0; ii < npts; ii++) {
1548 if (workdatav2[ii] != 0.0) {
1549 outdatav[ii] += wt*wt*workdatav[ii]/workdatav2[ii];
1550 workdatav3[ii] += wt;
1558 for (i = 0; i < npts; i++) {
1559 if (workbufw[i] != 0.0) {
1560 outdata[i] /= workbufw[i];
1561 if (outvar != NULL) {
1562 if (workdatav3[i] != 0.0)
1563 outdatav[i] /= powf(workdatav3[i],2.0);
1567 workbufw[i] = workbufw[i]/sumweights;
1569 outdata[i] = fileptrs->sky;
1577 bbpm = cpl_calloc(npts,
sizeof(*bbpm));
1578 for (i = 0; i < npts; i++)
1579 bbpm[i] = (workbufw[i] == 0.0);
1580 med =
casu_med(workbufw,bbpm,npts);
1583 for (i = 0; i < npts; i++) {
1584 workbufw[i] *= renorm;
1585 outdatac[i] = max(0,min(1000,(
int)(workbufw[i]+0.5)));
1587 freespace(workbufw);
1588 if (outvar != NULL) {
1589 freespace(workdatav);
1590 freespace(workdatav2);
1591 freespace(workdatav3);
1620static void seeing_wt(
int nim, dstrct *fileptrs) {
1623 cpl_propertylist *plist;
1625 const char *fctid =
"seeing_wt";
1629 seeing = cpl_malloc(nim*
sizeof(*seeing));
1635 for (i = 0; i < nim; i++) {
1638 if (cpl_propertylist_has(plist,
"ESO DRS SEEING")) {
1639 seeing[i] = cpl_propertylist_get_float(plist,
"ESO DRS SEEING");
1640 if (seeing[i] <= 0.0) {
1654 for (i = 1; i < nim; i++) {
1656 dd->weight *= seeing[0]/seeing[i];
1659 cpl_msg_warning(fctid,
"No seeing weighting will be done");
1692static void output_files(
int nim, dstrct *fileptrs, casu_fits **outfits,
1693 casu_fits **outconf, casu_fits **outvar,
1695 cpl_image *newim,*newconf,*newvar;
1696 double lowerleft[2],upperleft[2],lowerright[2],upperright[2];
1697 double xmin,ymin,sh[2],ra,dec;
1699 int i,ixo,iyo,isnull;
1701 cpl_matrix *xyin,*xyout;
1702 cpl_propertylist *refp;
1710 upperleft[1] = (double)fileptrs->ny;
1711 lowerright[0] = (
double)fileptrs->nx;
1712 lowerright[1] = 1.0;
1713 upperright[0] = (double)fileptrs->nx;
1714 upperright[1] = (
double)fileptrs->ny;
1719 xyin = cpl_matrix_new(4,2);
1724 for (i = 1; i < nim; i++) {
1727 if (! strncmp(cpl_propertylist_get_string(refp,
"CTYPE1"),
"RA",2))
1728 cpl_propertylist_update_string(refp,
"CTYPE1",
"RA---TAN");
1730 cpl_propertylist_update_string(refp,
"CTYPE2",
"RA---TAN");
1731 if (! strncmp(cpl_propertylist_get_string(refp,
"CTYPE1"),
"DEC",3))
1732 cpl_propertylist_update_string(refp,
"CTYPE1",
"DEC--TAN");
1734 cpl_propertylist_update_string(refp,
"CTYPE2",
"DEC--TAN");
1735 refwcs = cpl_wcs_new_from_propertylist(refp);
1736 cpl_propertylist_delete(refp);
1739 cpl_matrix_set(xyin,0,0,(
double)1.0);
1740 cpl_matrix_set(xyin,0,1,(
double)1.0);
1741 cpl_matrix_set(xyin,1,0,(
double)1.0);
1742 cpl_matrix_set(xyin,1,1,(
double)(dd->ny));
1743 cpl_matrix_set(xyin,2,0,(
double)(dd->nx));
1744 cpl_matrix_set(xyin,2,1,(
double)1.0);
1745 cpl_matrix_set(xyin,3,0,(
double)(dd->nx));
1746 cpl_matrix_set(xyin,3,1,(
double)(dd->ny));
1747 outloc(dd->vwcs,xyin,refwcs,dd->trans,&xyout);
1748 lowerleft[0] = min(lowerleft[0],cpl_matrix_get(xyout,0,0));
1749 lowerleft[1] = min(lowerleft[1],cpl_matrix_get(xyout,0,1));
1750 upperleft[0] = min(upperleft[0],cpl_matrix_get(xyout,1,0));
1751 upperleft[1] = max(upperleft[1],cpl_matrix_get(xyout,1,1));
1752 lowerright[0] = max(lowerright[0],cpl_matrix_get(xyout,2,0));
1753 lowerright[1] = min(lowerright[1],cpl_matrix_get(xyout,2,1));
1754 upperright[0] = max(upperright[0],cpl_matrix_get(xyout,3,0));
1755 upperright[1] = max(upperright[1],cpl_matrix_get(xyout,3,1));
1756 cpl_matrix_delete(xyout);
1759 cpl_matrix_delete(xyin);
1763 ixo = casu_nint(max(lowerright[0]-lowerleft[0],upperright[0]-upperleft[0])) + 1;
1764 iyo = casu_nint(max(upperright[1]-lowerright[1],upperleft[1]-lowerleft[1])) + 1;
1765 xmin = min(lowerleft[0],upperleft[0]);
1766 ymin = min(lowerleft[1],lowerright[1]);
1770 newim = cpl_image_new((cpl_size)ixo,(cpl_size)iyo,CPL_TYPE_FLOAT);
1778 cpl_propertylist_update_string(refp,
"CTYPE1",
"RA---TAN");
1779 cpl_propertylist_update_string(refp,
"CTYPE2",
"DEC--TAN");
1780 cpl_propertylist_erase_regexp(refp,
"^PV[0-9]*_[0-9]*$",0);
1789 ra = cpl_array_get(cpl_wcs_get_crval(*outwcs),0,&isnull);
1790 dec = cpl_array_get(cpl_wcs_get_crval(*outwcs),1,&isnull);
1792 cpl_wcs_delete(*outwcs);
1799 newconf = cpl_image_new((cpl_size)ixo,(cpl_size)iyo,CPL_TYPE_INT);
1804 if (fileptrs->var != NULL) {
1805 newvar = cpl_image_new((cpl_size)ixo,(cpl_size)iyo,CPL_TYPE_FLOAT);
1837static void diffxy(cpl_wcs *wref, cpl_wcs *wprog,
float *dx,
float *dy) {
1838 cpl_matrix *xyin,*xyout;
1840 const cpl_array *arr;
1845 arr = cpl_wcs_get_image_dims(wref);
1846 xref = 0.5*cpl_array_get(arr,0,&isnull);
1847 yref = 0.5*cpl_array_get(arr,1,&isnull);
1848 xyin = cpl_matrix_new(1,2);
1849 cpl_matrix_set(xyin,0,0,xref);
1850 cpl_matrix_set(xyin,0,1,yref);
1854 outloc(wref,xyin,wprog,NULL,&xyout);
1858 *dx = (float)(xref - cpl_matrix_get(xyout,0,0));
1859 *dy = (float)(yref - cpl_matrix_get(xyout,0,1));
1860 cpl_matrix_delete(xyout);
1861 cpl_matrix_delete(xyin);
1891static void outloc(cpl_wcs *win, cpl_matrix *in, cpl_wcs *wout,
1892 cpl_array *trans, cpl_matrix **out) {
1893 double *outdata,*tdata,xt,yt,xout,yout;
1901 cpl_wcs_convert(win,in,&radec,&status,CPL_WCS_PHYS2WORLD);
1902 cpl_array_delete(status);
1906 cpl_wcs_convert(wout,radec,out,&status,CPL_WCS_WORLD2PHYS);
1907 cpl_array_delete(status);
1908 cpl_matrix_delete(radec);
1913 if (trans != NULL) {
1914 tdata = cpl_array_get_data_double(trans);
1915 n = cpl_matrix_get_nrow(*out);
1916 outdata = cpl_matrix_get_data(*out);
1917 for (i = 0; i < n; i++) {
1919 yt = outdata[2*i+1];
1920 xout = xt*tdata[0] + yt*tdata[1] + tdata[2];
1921 yout = xt*tdata[3] + yt*tdata[4] + tdata[5];
1922 outdata[2*i] = xout;
1923 outdata[2*i+1] = yout;
1955static void inloc(cpl_wcs *wout, cpl_matrix *out, cpl_wcs *win,
1956 cpl_array *trans, cpl_matrix **in) {
1957 double *outdata,*tdata,xt,yt,xout,yout;
1966 if (trans != NULL) {
1967 tdata = cpl_array_get_data_double(trans);
1968 n = cpl_matrix_get_nrow(out);
1969 outdata = cpl_matrix_get_data(out);
1970 for (i = 0; i < n; i++) {
1972 yt = outdata[2*i+1];
1973 xout = xt*tdata[0] + yt*tdata[1] + tdata[2];
1974 yout = xt*tdata[3] + yt*tdata[4] + tdata[5];
1975 outdata[2*i] = xout;
1976 outdata[2*i+1] = yout;
1982 cpl_wcs_convert(wout,out,&radec,&status,CPL_WCS_PHYS2WORLD);
1983 cpl_array_delete(status);
1987 cpl_wcs_convert(win,radec,in,&status,CPL_WCS_WORLD2PHYS);
1988 cpl_array_delete(status);
1989 cpl_matrix_delete(radec);
2017static void backgrnd_ov(
int nim, dstrct *fileptrs,
int unmap) {
2018 int i,dx,dy,jj,nx,ii,*cdata1,*cdata,*cdata2;
2019 long npts1,npts,start[2],end[2],ind1,ind,n;
2021 float *data,sky1,skynoise1,sky2,skynoise2,frac,*data1,*data2;
2026 npts1 = dd1->nx*dd1->ny;
2032 skyest(data1,cdata1,npts1,3.0,&sky1,&skynoise1);
2034 dd1->noise = skynoise1;
2035 dd1->sky /= dd1->expscale;
2041 for (i = 1; i < nim; i++) {
2048 dx = casu_nint(dd1->xoff - dd2->xoff);
2049 dy = casu_nint(dd1->yoff - dd2->yoff);
2062 if (abs(dx) > dd1->nx || abs(dy) > dd1->ny) {
2067 end[0] = max(0,dd1->nx-dx-1);
2074 end[1] = max(0,dd1->ny-dy-1);
2082 npts = (end[0]-start[0]+1)*(end[1]-start[1]+1);
2083 frac = (float)npts/(
float)npts1;
2090 data = cpl_malloc(npts*
sizeof(*data));
2091 cdata = cpl_malloc(npts*
sizeof(*cdata));
2093 for (jj = start[1]; jj <= end[1]; jj++) {
2095 for (ii = start[0]; ii <= end[0]; ii++) {
2097 data[n] = data1[ind];
2098 cdata[n++] = cdata1[ind];
2101 skyest(data,cdata,n,3.0,&sky1,&skynoise1);
2112 start[0] = max(0,dx);
2113 start[1] = max(0,dy);
2114 end[0] = min((dd2->nx-1),((dd2->nx)+dx-1));
2115 end[1] = min((dd2->ny-1),((dd2->ny)+dy-1));
2117 npts = (end[0]-start[0]+1)*(end[1]-start[1]+1);
2118 data = cpl_malloc(npts*
sizeof(*data));
2119 cdata = cpl_malloc(npts*
sizeof(*cdata));
2121 for (jj = start[1]; jj <= end[1]; jj++) {
2123 for (ii = start[0]; ii <= end[0]; ii++) {
2125 data[n] = data2[ind];
2126 cdata[n++] = cdata2[ind];
2129 skyest(data,cdata,n,3.0,&sky2,&skynoise2);
2133 npts = (dd2->nx)*(dd2->ny);
2134 skyest(data2,cdata2,npts,3.0,&sky2,&skynoise2);
2139 dd2->sky = sky2/dd2->expscale;
2140 dd2->skydiff = sky1 - sky2;
2141 dd2->noise = skynoise2/dd2->expscale;
2142 if (dd2->noise != 0.0 && dd2->sky != 0.0)
2143 dd2->weight = (float)(pow(dd1->noise,2.0)/pow(dd2->noise,2.0));
2148 if (! dd2->confcopy)
2208static void do_averages(
int ncontrib,
float *data,
float *vdata,
float *wbuf,
2209 float *conf,
unsigned char *
id,
float lclip,
float hclip,
2210 float hsig,
float extra, dstrct *fileptrs,
float sumweights,
2211 short int *lowcl,
short int *highcl,
float *outval,
2212 float *outvalc,
float *outvalv) {
2213 float minval,maxval,sum,wconfsum,reflev,clipval,clipscale,scl;
2228 for (i = 0; i < ncontrib; i++) {
2229 sum += data[i]*wbuf[i]*conf[i];
2230 wconfsum += wbuf[i]*conf[i];
2232 vsum += vdata[i]*wbuf[i]*wbuf[i]*conf[i]*conf[i];
2234 if (data[i] > maxval) {
2238 if (data[i] < minval) {
2246 if (wconfsum > 0.0) {
2247 *outval = sum/wconfsum;
2249 *outval = fileptrs->sky;
2255 if (maxval > hclip && wconfsum > 150.0 && csum > 150.0 &&
2256 imin != -1 && imax != -1) {
2257 scl = wbuf[imax]*conf[imax];
2258 reflev = (sum - data[imax]*scl)/(wconfsum - scl);
2259 clipscale = max(1.0,reflev)/max(1.0,(fileptrs+
id[imax])->sky);
2260 clipval = reflev + clipscale*hsig*(fileptrs+
id[imax])->noise;
2261 clipval += hsig*extra;
2265 if (maxval > clipval) {
2266 sum -= data[imax]*scl;
2269 vsum -= vdata[imax]*scl*scl;
2278 if (minval < lclip && wconfsum > 150.0 && csum > 150.0 &&
2279 imin != -1 && imax != -1) {
2280 scl = wbuf[imin]*conf[imin];
2281 reflev = (sum - data[imin]*scl)/(wconfsum - scl);
2282 clipscale = max(1.0,reflev)/max(1.0,(fileptrs+
id[imin])->sky);
2283 clipval = reflev + clipscale*hsig*(fileptrs+
id[imin])->noise;
2284 if (minval < clipval) {
2285 sum -= data[imin]*scl;
2288 vsum -= vdata[imin]*scl*scl;
2296 *outvalc = wconfsum/sumweights;
2298 *outvalv = vsum/powf(wconfsum,2.0);
2331static void skyest(
float *data,
int *cdata,
long npts,
float thresh,
2332 float *skymed,
float *skynoise) {
2338 bpm = cpl_calloc(npts,
sizeof(*bpm));
2339 for (i = 0; i < npts; i++)
2340 bpm[i] = (cdata[i] == 0);
2344 casu_qmedsig(data,bpm,npts,thresh,2,DATAMIN,DATAMAX,skymed,skynoise);
2376static cpl_table *mknewtab(casu_tfits *cat, dstrct *ddcur, dstrct *ddref) {
2380 cpl_matrix *xyin,*xyout;
2385 nr = (int)cpl_table_get_nrow(newtab);
2389 x = cpl_table_get_data_float(newtab,
"X_coordinate");
2390 y = cpl_table_get_data_float(newtab,
"Y_coordinate");
2391 xyin = cpl_matrix_new((cpl_size)nr,2);
2392 for (i = 0; i < nr; i++) {
2393 cpl_matrix_set(xyin,i,0,x[i]);
2394 cpl_matrix_set(xyin,i,1,y[i]);
2399 outloc(ddcur->vwcs,xyin,ddref->vwcs,NULL,&xyout);
2400 cpl_matrix_delete(xyin);
2404 for (i = 0; i < nr; i++) {
2405 x[i] = (float)cpl_matrix_get(xyout,i,0);
2406 y[i] = (float)cpl_matrix_get(xyout,i,1);
2408 cpl_matrix_delete(xyout);
2429static cpl_array *transinit(
void) {
2433 t = cpl_array_new(6,CPL_TYPE_DOUBLE);
2434 td = cpl_array_get_data_double(t);
2463static void fileptrs_close(
int nim, dstrct *fileptrs) {
2466 if (fileptrs == NULL)
2468 for (i = 0; i < nim; i++) {
2469 freewcs((fileptrs+i)->vwcs);
2470 freespace((fileptrs+i)->bpm);
2471 freearray((fileptrs+i)->trans);
2472 freearray((fileptrs+i)->invtrans);
2477static void tidy(
int nim, dstrct *fileptrs, cpl_wcs *outwcs) {
2478 fileptrs_close(nim,fileptrs);
2480 cpl_wcs_delete(outwcs);
casu_fits * casu_fits_wrap(cpl_image *im, casu_fits *model, cpl_propertylist *phu, cpl_propertylist *ehu)
cpl_image * casu_fits_get_image(casu_fits *p)
char * casu_fits_get_fullname(casu_fits *p)
casu_fits * casu_fits_duplicate(casu_fits *in)
cpl_propertylist * casu_fits_get_phu(casu_fits *p)
char * casu_fits_get_filename(casu_fits *p)
void casu_fits_unload_im(casu_fits *in)
cpl_propertylist * casu_fits_get_ehu(casu_fits *p)
int casu_fits_get_nexten(casu_fits *p)
int casu_platexy(cpl_table *matchedxy, int nconst, cpl_array **coefs, int *status)
Work out an xy transformation for two coodinate lists.
int casu_imstack(casu_fits **inf, casu_fits **inconf, casu_fits **invar, casu_tfits **cats, int nimages, int nconfs, float lthr, float hthr, int method, int seeing, int fast, int unmap, const char *expkey, casu_fits **out, casu_fits **outc, casu_fits **outv, int *status)
Stack images into a mean image using WCS info.
int casu_matchxy(cpl_table *progtab, cpl_table *template, float srad, float *xoffset, float *yoffset, int *nm, cpl_table **outtab, int *status)
Match two lists of x,y coordinates from two tables to find the cartesian offset between them.
float casu_med(float *data, unsigned char *bpm, long npts)
void casu_qmedsig(float *data, unsigned char *bpm, long npts, float thresh, int niter, float lowv, float highv, float *median, float *sigma)
cpl_table * casu_tfits_get_table(casu_tfits *p)
void casu_prov(cpl_propertylist *p, casu_fits **inlist, int n, int isextn)
Write provenance keywords.
void casu_propertylist_update_float(cpl_propertylist *plist, const char *name, float val)
void casu_radectoxy(cpl_wcs *wcs, double ra, double dec, double *x, double *y)
int casu_crpixshift(cpl_propertylist *p, double scalefac, double sh[])
int casu_coverage(cpl_propertylist *plist, int fudge, double *ra1, double *ra2, double *dec1, double *dec2, int *status)