37 #include <casu_utils.h>
38 #include <casu_stats.h>
39 #include <casu_wcsutils.h>
41 #include "vircam_mods.h"
87 static dstrct *fileptrs = NULL;
89 static void prov(
int interp, casu_fits *file, cpl_frameset *fset);
90 static void writewcs(casu_fits *fitsfile, mywcs *o);
91 static void average(dstrct *dd,
int nextn,
float *data,
int *cdata,
92 outstrct *outstr,
int interp,
int conflim);
93 static void output_images(
int nimages, outstrct *outstr);
94 static mywcs *dupwcs(mywcs *in);
95 static float distort_corr(
double x,
double y, mywcs *w);
96 static void outloc(mywcs *win,
double xin,
double yin, mywcs *wout,
97 double *xout,
double *yout);
98 static void xytord(mywcs *win,
double xin,
double yin,
double *ra,
101 static void dstrct_init(
int nfiles);
102 static void dstrct_extn_init(dstrct *dd,
int nhdu);
103 static int dstrct_extn_fill_from_plist(dstrct *dd,
int extnum,
105 cpl_propertylist *plist,
char *msg);
106 static void dstrct_close(
int nfiles);
107 static void normal(outstrct *o);
168 int interp,
int skyflag,
float skywish_in,
169 const char *expkey,
int conflim, casu_fits **out,
170 casu_fits **outc,
int *status) {
171 cpl_size i,nimages,nconfs;
172 int nerrs,nhdu,j,nstart,nalloc,npts,*cdata,jj,ind1,ind,ii,sczpt;
176 cpl_propertylist *plist1,*plist2;
178 float *alldata,back,noise,skywish,zpt1,exp1,sky1,scalefac,ds,*data,distort;
182 const char *fctid=
"vircam_mosaic";
188 if (*status != CASU_OK)
193 nimages = cpl_frameset_get_size(infiles);
194 nconfs = cpl_frameset_get_size(inconf);
196 cpl_msg_error(fctid,
"No images to combine");
199 if (nconfs != 1 && nconfs != nimages) {
200 cpl_msg_error(fctid,
"Number of conf maps must be 1 or nimages");
206 dstrct_init(nimages);
213 for (i = 0; i < nimages; i++) {
215 fr = cpl_frameset_get_position(infiles,i);
218 frc = cpl_frameset_get_position(inconf,0);
220 frc = cpl_frameset_get_position(inconf,i);
225 if (cpl_frame_get_nextensions(fr) != cpl_frame_get_nextensions(frc)) {
226 cpl_msg_error(fctid,
"Number of extensions in %s and %s must match",
227 cpl_frame_get_filename(fr),
228 cpl_frame_get_filename(frc));
236 nhdu = (int)cpl_frame_get_nextensions(fr);
237 dstrct_extn_init(dd,nhdu);
238 for (j = 1; j <= nhdu; j++) {
239 plist1 = cpl_propertylist_load(cpl_frame_get_filename(fr),j);
240 if (cpl_error_get_code() != 0) {
242 cpl_msg_error(fctid,
"Unable to get header from %s[%d]",
243 cpl_frame_get_filename(fr),j);
246 plist2 = cpl_propertylist_load(cpl_frame_get_filename(frc),j);
247 if (cpl_error_get_code() != 0) {
249 cpl_msg_error(fctid,
"Unable to get header from %s[%d]",
250 cpl_frame_get_filename(frc),j);
251 cpl_propertylist_delete(plist1);
254 if (cpl_propertylist_get_int(plist1,
"NAXIS1") !=
255 cpl_propertylist_get_int(plist2,
"NAXIS1") ||
256 cpl_propertylist_get_int(plist1,
"NAXIS2") !=
257 cpl_propertylist_get_int(plist2,
"NAXIS2")) {
259 cpl_msg_error(fctid,
"%s[%d] and %s[%d] image dimensions don't match",
260 cpl_frame_get_filename(fr),j,
261 cpl_frame_get_filename(frc),j);
262 cpl_propertylist_delete(plist1);
263 cpl_propertylist_delete(plist2);
269 if (dstrct_extn_fill_from_plist(dd,j,expkey,plist1,msg) != CASU_OK) {
271 cpl_msg_error(fctid,
"Error reading header in %s[%d] -- %s",
272 cpl_frame_get_filename(fr),j,msg);
273 cpl_propertylist_delete(plist1);
274 cpl_propertylist_delete(plist2);
277 cpl_propertylist_delete(plist1);
278 cpl_propertylist_delete(plist2);
282 cpl_msg_error(fctid,
"%d fatal errors",nerrs);
288 for (i = 0; i < nimages; i++) {
293 for (j = 1; j <= dd->nhdus; j++) {
298 npts = (dd->nx_extn[j-1])*(dd->ny_extn[j-1]);
300 alldata = cpl_realloc(alldata,nalloc*
sizeof(
float));
304 im = cpl_image_load(cpl_frame_get_filename(dd->infile),
306 memmove(alldata+nstart,cpl_image_get_data_float(im),
311 casu_qmedsig(cpl_image_get_data_float(im),NULL,(
long)npts,
312 3.0,3,-1000.0,65535.0,&back,&noise);
313 dd->sky_extn[j-1] = back;
314 cpl_image_delete(im);
319 casu_qmedsig(alldata,NULL,(
long)nalloc,3.0,3,-1000.0,65535.0,
321 dd->global_sky = back;
322 dd->global_noise = noise;
331 for (i = 0; i < nimages; i++)
332 skywish += (fileptrs+i)->global_sky;
333 skywish /= (float)nimages;
334 }
else if (skyflag == 1) {
335 skywish = skywish_in;
340 for (i = 0; i < nimages; i++)
341 (fileptrs+i)->global_sky = skywish;
348 for (i = 0; i < nimages; i++) {
350 for (j = 1; j <= dd->nhdus; j++) {
351 if (dd->magzpt_extn[j-1] == 0.0) {
360 cpl_msg_warning(fctid,
"Missing magnitude zeropoint -- no photometric scaling done");
364 zpt1 = fileptrs->magzpt_extn[0];
365 exp1 = fileptrs->exptime;
366 sky1 = fileptrs->global_sky;
367 for (i = 0; i < nimages; i++) {
369 for (j = 1; j <= dd->nhdus; j++) {
370 scalefac = (exp1/dd->exptime);
372 scalefac *= pow(10.0,0.4*(zpt1-dd->magzpt_extn[j-1]));
373 ds = sky1 - scalefac*(dd->global_sky);
374 dd->scalefac[j-1] = scalefac;
375 dd->skydiff[j-1] = ds;
381 output_images((
int)nimages,&outstr);
385 for (i = 0; i < nimages; i++) {
387 for (j = 1; j <= dd->nhdus; j++) {
388 im = cpl_image_load(cpl_frame_get_filename(dd->infile),
389 CPL_TYPE_FLOAT,0,(cpl_size)j);
390 data = cpl_image_get_data_float(im);
391 cim = cpl_image_load(cpl_frame_get_filename(dd->conf),
392 CPL_TYPE_INT,0,(cpl_size)j);
393 cdata = cpl_image_get_data_int(cim);
400 for (jj = 0; jj < dd->ny_extn[j-1]; jj++) {
401 ind1 = jj*(dd->nx_extn[j-1]);
402 y = (double)(jj + 1);
403 for (ii = 0; ii < dd->nx_extn[j-1]; ii++) {
405 x = (double)(ii + 1);
406 distort = distort_corr(x,y,dd->wcs_extn[j-1]);
407 data[ind] = (data[ind] - dd->sky_extn[j-1])*distort +
415 average(dd,j,data,cdata,&outstr,interp,conflim);
416 cpl_image_delete(im);
417 cpl_image_delete(cim);
436 writewcs(*out,outstr.outwcs);
437 writewcs(*outc,outstr.outwcs);
441 prov(interp,*out,infiles);
442 prov(interp,*outc,infiles);
450 "Interpolation method");
455 freespace(outstr.outwcs);
456 cpl_image_delete(outstr.work);
457 dstrct_close(nimages);
484 static void prov(
int interp, casu_fits *file, cpl_frameset *fset) {
486 cpl_propertylist *ehu;
487 char value[81],key[9],comment[81];
488 const char *algorithm[] = {
"Nearest-neighbour",
"Bi-linear interpolation"};
493 cpl_propertylist_erase_regexp(ehu,
"PROV[0-9]+",0);
498 (void)snprintf(key,9,
"PROV%04d",ncard);
499 (void)snprintf(value,81,
"File formed from %s of",algorithm[interp]);
500 (void)snprintf(comment,81,
"File combination algorithm");
501 cpl_propertylist_update_string(ehu,key,value);
502 cpl_propertylist_set_comment(ehu,key,comment);
506 nfset = cpl_frameset_get_size(fset);
507 for (i = 0; i < nfset; i++) {
509 (void)snprintf(key,9,
"PROV%04d",ncard);
510 (void)snprintf(value,81,
"%s",
511 basename((
char *)cpl_frame_get_filename(cpl_frameset_get_position(fset,i))));
512 (void)snprintf(comment,81,
"Card # %d",ncard);
513 cpl_propertylist_update_string(ehu,key,value);
514 cpl_propertylist_set_comment(ehu,key,comment);
538 static void writewcs(casu_fits *fitsfile, mywcs *o) {
539 char key[16],sval[16],proj[4];
543 cpl_propertylist *ehu;
548 cpl_propertylist_update_int(ehu,
"NAXIS1",
550 cpl_propertylist_update_int(ehu,
"NAXIS2",
556 (void)strcpy(proj,
"TAN");
558 (
void)strcpy(proj,
"ZPN");
559 for (i = 1; i <= 2; i++) {
560 (void)sprintf(key,
"CTYPE%d",i);
562 (void)sprintf(sval,
"RA---%s",proj);
564 (
void)sprintf(sval,
"DEC--%s",proj);
565 (void)cpl_propertylist_update_string(ehu,key,sval);
570 for (i = 1; i <= 2; i++) {
571 (void)sprintf(key,
"CRVAL%d",i);
572 dval = (o->crval[i-1])*DEGRAD;
573 cpl_propertylist_update_double(ehu,key,dval);
575 for (i = 1; i <= 2; i++) {
576 (void)sprintf(key,
"CRPIX%d",i);
577 dval = (o->crpix[i-1]);
578 cpl_propertylist_update_double(ehu,key,dval);
584 for (j = 1; j <= 2; j++) {
585 for (i = 1; i <= 2; i++) {
586 (void)sprintf(key,
"CD%d_%d",j,i);
587 dval = (o->cd[n])*DEGRAD;
588 cpl_propertylist_update_double(ehu,key,dval);
596 val = (float)(o->pv21);
597 cpl_propertylist_update_float(ehu,
"PV2_1",val);
598 val = (float)(o->pv23);
599 cpl_propertylist_update_float(ehu,
"PV2_3",val);
600 val = (float)(o->pv25);
601 cpl_propertylist_update_float(ehu,
"PV2_5",val);
603 if (cpl_propertylist_has(ehu,
"PV2_1"))
604 cpl_propertylist_erase(ehu,
"PV2_1");
605 if (cpl_propertylist_has(ehu,
"PV2_3"))
606 cpl_propertylist_erase(ehu,
"PV2_3");
607 if (cpl_propertylist_has(ehu,
"PV2_5"))
608 cpl_propertylist_erase(ehu,
"PV2_5");
644 static void average(dstrct *dd,
int nextn,
float *data,
int *cdata,
645 outstrct *outstr,
int interp,
int conflim) {
646 int i,j,ind1,ind,outind,j_1,j_2,i_1,i_2,jj,ii,ind1o,indo,ixo,iyo;
647 float *odata,*work,wi,wj,scf,fcd,ds;
648 double x_in,y_in,x_out,y_out;
652 odata = cpl_image_get_data_float(outstr->outim);
653 scf = dd->scalefac[nextn-1];
654 ds = dd->skydiff[nextn-1];
658 work = cpl_image_get_data_float(outstr->work);
664 for (j = 0; j < dd->ny_extn[nextn-1]; j++) {
665 ind1 = j*dd->nx_extn[nextn-1];
666 y_in = (double)(j+1);
667 for (i = 0; i < dd->nx_extn[nextn-1]; i++) {
669 if (cdata[ind] <= conflim)
671 x_in = (double)(i+1);
672 outloc(dd->wcs_extn[nextn-1],x_in,y_in,outstr->outwcs,
674 ixo = casu_nint(x_out);
675 iyo = casu_nint(y_out);
676 if (ixo < 1 || ixo > outstr->nxo || iyo < 1 ||
679 outind = (iyo-1)*outstr->nxo + ixo - 1;
680 fcd = (
float)cdata[ind];
681 odata[outind] += fcd*(data[ind]*scf + ds);
686 for (j = 0; j < dd->ny_extn[nextn-1]; j++) {
687 ind1 = j*dd->nx_extn[nextn-1];
688 y_in = (double)(j+1);
689 for (i = 0; i < dd->nx_extn[nextn-1]; i++) {
691 if (cdata[ind] <= conflim)
693 x_in = (double)(i+1);
694 outloc(dd->wcs_extn[nextn-1],x_in,y_in,outstr->outwcs,
696 if (x_out < 1.0 || y_out < 1.0 || x_out >= outstr->nxo || y_out >= outstr->nyo) {
708 fcd = (float)cdata[ind];
709 for (jj = j_1; jj <= j_2; jj++) {
710 wj = 1.0 - fabs(y_out - (
double)jj);
711 ind1o = (jj - 1)*outstr->nxo;
712 for (ii = i_1; ii <= i_2; ii++) {
713 indo = ind1o + ii - 1;
714 wi = 1.0 - fabs(x_out - (
double)ii);
715 odata[indo] += wi*wj*fcd*(scf*data[ind] + ds);
716 work[indo] += wi*wj*fcd;
744 static void output_images(
int nimages, outstrct *outstr) {
745 double lowerleft[2],upperleft[2],lowerright[2],upperright[2];
746 double xout,yout,xmin,ymin,ra,dec;
748 int i,*idata,j,nx,ny,ixo,iyo;
750 mywcs *refwcs,*curwcs,*outwcs;
754 lowerleft[0] = 1.0e8;
755 lowerleft[1] = 1.0e8;
756 upperleft[0] = 1.0e8;
757 upperleft[1] = -1.0e8;
758 lowerright[0] = -1.0e8;
759 lowerright[1] = 1.0e8;
760 upperright[0] = -1.0e8;
761 upperright[1] = -1.0e8;
766 for (i = 0; i < nimages; i++) {
771 for (j = 1; j <= dd->nhdus; j++) {
772 curwcs = dd->wcs_extn[j-1];
773 if (i == 0 && j == 1) {
774 refwcs = dupwcs(curwcs);
777 nx = dd->nx_extn[j-1];
778 ny = dd->ny_extn[j-1];
779 outloc(curwcs,(
double)1.0,(
double)1.0,refwcs,&xout,&yout);
780 lowerleft[0] = min(lowerleft[0],xout);
781 lowerleft[1] = min(lowerleft[1],yout);
782 outloc(curwcs,(
double)1.0,(
double)ny,refwcs,&xout,&yout);
783 upperleft[0] = min(upperleft[0],xout);
784 upperleft[1] = max(upperleft[1],yout);
785 outloc(curwcs,(
double)nx,(
double)1.0,refwcs,&xout,&yout);
786 lowerright[0] = max(lowerright[0],xout);
787 lowerright[1] = min(lowerright[1],yout);
788 outloc(curwcs,(
double)nx,(
double)ny,refwcs,&xout,&yout);
789 upperright[0] = max(upperright[0],xout);
790 upperright[1] = max(upperright[1],yout);
796 ixo = casu_nint(max(lowerright[0]-lowerleft[0],
797 upperright[0]-upperleft[0])) + 5;
798 iyo = casu_nint(max(upperright[1]-lowerright[1],
799 upperleft[1]-lowerleft[1])) + 5;
800 xmin = min(lowerleft[0],upperleft[0]);
801 ymin = min(lowerleft[1],lowerright[1]);
808 outstr->outim = cpl_image_new((cpl_size)ixo,(cpl_size)iyo,CPL_TYPE_FLOAT);
809 data = cpl_image_get_data_float(outstr->outim);
810 memset(data,0,ixo*iyo*
sizeof(
float));
811 outstr->work = cpl_image_new((cpl_size)ixo,(cpl_size)iyo,CPL_TYPE_FLOAT);
812 data = cpl_image_get_data_float(outstr->work);
813 memset(data,0,ixo*iyo*
sizeof(
float));
814 outstr->outcim = cpl_image_new((cpl_size)ixo,(cpl_size)iyo,CPL_TYPE_INT);
815 idata = cpl_image_get_data_int(outstr->outcim);
816 memset(idata,0,ixo*iyo*
sizeof(
int));
820 outwcs = cpl_malloc(
sizeof(mywcs));
821 outwcs->crpix[0] = refwcs->crpix[0] - xmin + 1.0;
822 outwcs->crpix[1] = refwcs->crpix[1] - ymin + 1.0;
823 outwcs->crval[0] = refwcs->crval[0];
824 outwcs->crval[1] = refwcs->crval[1];
825 for (i = 0; i < 4; i++)
826 outwcs->cd[i] = refwcs->cd[i];
828 outwcs->pv23 = -0.33333333333;
833 outwcs->tand = tan(outwcs->crval[1]);
834 outwcs->secd = 1.0/cos(outwcs->crval[1]);
835 outstr->outwcs = outwcs;
840 xout = 0.5*(double)ixo;
841 yout = 0.5*(double)iyo;
842 xytord(outwcs,xout,yout,&ra,&dec);
843 outwcs->crpix[0] = xout;
844 outwcs->crpix[1] = yout;
845 outwcs->crval[0] = ra/DEGRAD;
846 outwcs->crval[1] = dec/DEGRAD;
847 outwcs->tand = tan(outwcs->crval[1]);
848 outwcs->secd = 1.0/cos(outwcs->crval[1]);
879 static float distort_corr(
double x,
double y, mywcs *w) {
880 double xi,xn,r,rprime,drprime_bydr,dc,tanr;
882 xi = (x - w->crpix[0])*(w->cd[0]) + (y - w->crpix[1])*(w->cd[1]);
883 xn = (x - w->crpix[0])*(w->cd[2]) + (y - w->crpix[1])*(w->cd[3]);
884 r = sqrt(xi*xi + xn*xn);
889 rprime = r*w->pv21 + pow(r,(
double)3.0)*w->pv23 +
890 pow(r,(
double)5.0)*w->pv25;
891 drprime_bydr = w->pv21 + 3.0*pow(r,(
double)2.0)*w->pv23 +
892 5.0*pow(r,(
double)4.0)*w->pv25;
894 dc = tanr*drprime_bydr*(1.0 + tanr*tanr)/r;
897 dc = (1.0 + tanr*tanr)*tanr/r;
931 static void outloc(mywcs *win,
double xin,
double yin, mywcs *wout,
932 double *xout,
double *yout) {
933 double xt,yt,xi,eta,r,rfac,aa,tandec,denom,rp;
939 xt = xin - win->crpix[0];
940 yt = yin - win->crpix[1];
941 xi = win->cd[0]*xt + win->cd[1]*yt;
942 eta = win->cd[2]*xt + win->cd[3]*yt;
944 if (fabs(xt) < 1.0e-6 && fabs(yt) < 1.0e-6) {
947 rp = sqrt(xi*xi + eta*eta);
949 for (i = 0; i < 3; i++) {
950 rfac = win->pv21 + win->pv23*pow(r,2.0) + win->pv25*pow(r,4.0);
960 aa = atan(xi*win->secd/(1.0-eta*win->tand));
962 tandec = (eta+win->tand)*sin(aa)/(xi*win->secd);
964 tandec = (eta+win->tand)/(1.0 - eta*win->tand);
968 aa += (win->crval[0] - wout->crval[0]);
969 denom = wout->tand*tandec + cos(aa);
970 xi = wout->secd*sin(aa)/denom;
971 eta = (tandec - wout->tand*cos(aa))/denom;
973 rp = sqrt(xi*xi + eta*eta);
975 rfac = wout->pv21 + wout->pv23*pow(rp,2.0) + wout->pv25*pow(rp,4.0);
982 denom = wout->cd[0]*wout->cd[3] - wout->cd[1]*wout->cd[2];
983 *xout = (xi*wout->cd[3] - eta*wout->cd[1])/denom + wout->crpix[0];
984 *yout = (eta*wout->cd[0] - xi*wout->cd[2])/denom + wout->crpix[1];
1013 static void xytord(mywcs *win,
double xin,
double yin,
double *ra,
1015 double xt,yt,xi,eta,r,rfac,aa;
1017 xt = xin - win->crpix[0];
1018 yt = yin - win->crpix[1];
1019 xi = win->cd[0]*xt + win->cd[1]*yt;
1020 eta = win->cd[2]*xt + win->cd[3]*yt;
1021 r = sqrt(xi*xi + eta*eta);
1023 rfac = win->pv21 + win->pv23*pow(r,2.0) + win->pv25*pow(r,4.0);
1025 rfac = win->pv21 + win->pv23*pow(r,2.0) + win->pv25*pow(r,4.0);
1036 aa = atan(xi*win->secd/(1.0-eta*win->tand));
1037 *ra = aa + win->crval[0];
1039 *dec = atan((eta + win->tand)*sin(aa)/(xi*win->secd));
1041 *dec = atan((eta + win->tand)/(1.0 - eta*win->tand));
1043 if (*ra > 2.0*CPL_MATH_PI)
1044 *ra -= 2.0*CPL_MATH_PI;
1046 *ra += 2.0*CPL_MATH_PI;
1094 static mywcs *dupwcs(mywcs *in) {
1098 out = cpl_malloc(
sizeof(mywcs));
1099 for (i = 0; i < 2; i++) {
1100 out->crval[i] = in->crval[i];
1101 out->crpix[i] = in->crpix[i];
1103 for (i = 0; i < 4; i++)
1104 out->cd[i] = in->cd[i];
1105 out->secd = in->secd;
1106 out->tand = in->tand;
1107 out->pv21 = in->pv21;
1108 out->pv23 = in->pv23;
1109 out->pv25 = in->pv25;
1112 out->istan = in->istan;
1134 static void dstrct_init(
int nfiles) {
1138 fileptrs = cpl_malloc(nfiles*
sizeof(dstrct));
1139 for (i = 0; i < nfiles; i++) {
1143 dd->global_sky = 0.0;
1144 dd->global_noise = 0.0;
1149 dd->wcs_extn = NULL;
1152 dd->magzpt_extn = NULL;
1153 dd->sky_extn = NULL;
1155 dd->scalefac = NULL;
1180 static void dstrct_extn_init(dstrct *dd,
int nhdu) {
1183 dd->wcs_extn = cpl_malloc(nhdu*
sizeof(mywcs *));
1184 for (i = 0; i < nhdu; i++)
1185 dd->wcs_extn[i] = NULL;
1186 dd->nx_extn = cpl_malloc(nhdu*
sizeof(
int));
1187 dd->ny_extn = cpl_malloc(nhdu*
sizeof(
int));
1188 dd->magzpt_extn = cpl_malloc(nhdu*
sizeof(
float));
1189 dd->sky_extn = cpl_malloc(nhdu*
sizeof(
float));
1190 dd->scalefac = cpl_malloc(nhdu*
sizeof(
float));
1191 dd->skydiff = cpl_malloc(nhdu*
sizeof(
float));
1223 static int dstrct_extn_fill_from_plist(dstrct *dd,
int extnum,
1225 cpl_propertylist *plist,
char *msg) {
1232 if (cpl_propertylist_has(plist,
"CRVAL1")) {
1233 dd->tpa = cpl_propertylist_get_double(plist,
"CRVAL1");
1235 (void)sprintf(msg,
"Missing CRVAL1 in extension %d",extnum);
1238 if (cpl_propertylist_has(plist,
"CRVAL2")) {
1239 dd->tpd = cpl_propertylist_get_double(plist,
"CRVAL2");
1241 (void)sprintf(msg,
"Missing CRVAL2 in extension %d",extnum);
1244 if (cpl_propertylist_has(plist,expkey)) {
1245 dd->exptime = cpl_propertylist_get_float(plist,expkey);
1247 (void)sprintf(msg,
"Missing %s in extension %d",expkey,extnum);
1255 if (cpl_propertylist_has(plist,
"NAXIS1")) {
1256 dd->nx_extn[extnum-1] = cpl_propertylist_get_int(plist,
"NAXIS1");
1258 (void)sprintf(msg,
"Missing NAXIS1 in extension %d",extnum);
1261 if (cpl_propertylist_has(plist,
"NAXIS2")) {
1262 dd->ny_extn[extnum-1] = cpl_propertylist_get_int(plist,
"NAXIS2");
1264 (void)sprintf(msg,
"Missing NAXIS2 in extension %d",extnum);
1267 if (cpl_propertylist_has(plist,
"ESO QC MAGZPT")) {
1268 dd->magzpt_extn[extnum-1] = cpl_propertylist_get_float(plist,
1271 (void)sprintf(msg,
"Missing ESO QC MAGZPT in extension %d",extnum);
1277 w = cpl_malloc(
sizeof(mywcs));
1278 if (strstr(cpl_propertylist_get_string(plist,
"CTYPE1"),
"TAN") == NULL)
1282 w->crval[0] = cpl_propertylist_get_double(plist,
"CRVAL1");
1283 w->crval[1] = cpl_propertylist_get_double(plist,
"CRVAL2");
1284 w->crpix[0] = cpl_propertylist_get_double(plist,
"CRPIX1");
1285 w->crpix[1] = cpl_propertylist_get_double(plist,
"CRPIX2");
1286 w->cd[0] = cpl_propertylist_get_double(plist,
"CD1_1");
1287 w->cd[1] = cpl_propertylist_get_double(plist,
"CD1_2");
1288 w->cd[2] = cpl_propertylist_get_double(plist,
"CD2_1");
1289 w->cd[3] = cpl_propertylist_get_double(plist,
"CD2_2");
1291 if (cpl_propertylist_has(plist,
"PV2_1"))
1292 w->pv21 = cpl_propertylist_get_double(plist,
"PV2_1");
1295 if (cpl_propertylist_has(plist,
"PV2_3"))
1296 w->pv23 = cpl_propertylist_get_double(plist,
"PV2_3");
1298 w->pv23 = -0.3333333333;
1299 if (cpl_propertylist_has(plist,
"PV2_5"))
1300 w->pv25 = cpl_propertylist_get_double(plist,
"PV2_5");
1305 w->pv23 = -0.33333333;
1308 w->nx = dd->nx_extn[extnum-1];
1309 w->ny = dd->ny_extn[extnum-1];
1313 for (i = 0; i < 2; i++)
1314 w->crval[i] /= DEGRAD;
1315 for (i = 0; i < 4; i++)
1320 w->tand = tan(w->crval[1]);
1321 w->secd = 1.0/cos(w->crval[1]);
1325 dd->wcs_extn[extnum-1] = w;
1347 static void dstrct_close(
int nfiles) {
1351 for (i = 0; i < nfiles; i++) {
1353 if (dd->wcs_extn != NULL) {
1354 for (j = 0; j < dd->nhdus; j++)
1355 freespace(dd->wcs_extn[j]);
1356 freespace(dd->wcs_extn);
1358 freespace(dd->nx_extn);
1359 freespace(dd->ny_extn);
1360 freespace(dd->magzpt_extn);
1361 freespace(dd->sky_extn);
1362 freespace(dd->scalefac);
1363 freespace(dd->skydiff);
1365 freespace(fileptrs);
1386 static void normal(outstrct *o) {
1388 float *odata,*work,renorm,val,junk;
1394 npo = o->nxo*o->nyo;
1395 odata = cpl_image_get_data_float(o->outim);
1396 work = cpl_image_get_data_float(o->work);
1397 ocdata = cpl_image_get_data_int(o->outcim);
1398 bpm = cpl_calloc(npo,
sizeof(
unsigned char));
1402 for (i = 0; i < npo; i++) {
1403 if (work[i] != 0.0) {
1404 odata[i] /= work[i];
1412 (void)
casu_qmedsig(odata,bpm,(
long)npo,3.0,3,-1000.0,65535.0,&val,&junk);
1413 for (i = 0; i < npo; i++)
1419 (void)
casu_qmedsig(work,bpm,(
long)npo,3.0,3,-1000.0,65535.0,&val,&junk);
1421 for (i = 0; i < npo; i++)
1422 ocdata[i] = max(0,min(1000,casu_nint(work[i]*renorm)));
cpl_image * casu_fits_get_image(casu_fits *p)
casu_fits * casu_fits_load(cpl_frame *frame, cpl_type type, int nexten)
void casu_fits_delete(casu_fits *p)
casu_fits * casu_fits_wrap(cpl_image *im, casu_fits *model, cpl_propertylist *phu, cpl_propertylist *ehu)
cpl_propertylist * casu_fits_get_ehu(casu_fits *p)
void casu_qmedsig(float *data, unsigned char *bpm, long npts, float thresh, int niter, float lowv, float highv, float *median, float *sigma)
int vircam_mosaic(cpl_frameset *infiles, cpl_frameset *inconf, int interp, int skyflag, float skywish_in, const char *expkey, int conflim, casu_fits **out, casu_fits **outc, int *status)
Create a vircam mosaic.