37 #include "vircam_mods.h"
38 #include "vircam_utils.h"
39 #include "vircam_fits.h"
40 #include "vircam_stats.h"
41 #include "vircam_wcsutils.h"
87 static dstrct *fileptrs = NULL;
89 static void prov(
int interp, vir_fits *file, cpl_frameset *fset);
90 static void writewcs(vir_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,
100 static void rdtoxy(mywcs *win,
double ra,
double dec,
double *x,
double *y);
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,
char *expkey,
104 cpl_propertylist *plist,
char *msg);
105 static void dstrct_close(
int nfiles);
106 static void normal(outstrct *o);
109 extern int vircam_mosaic(cpl_frameset *infiles, cpl_frameset *inconf,
110 int interp,
int skyflag,
float skywish_in,
111 char *expkey,
int conflim, vir_fits **out,
112 vir_fits **outc,
int *status) {
113 cpl_size i,nimages,nconfs;
114 int nerrs,nhdu,j,nstart,nalloc,npts,*cdata,jj,ind1,ind,ii;
118 cpl_propertylist *plist1,*plist2;
120 float *alldata,back,noise,skywish,zpt1,exp1,sky1,scalefac,ds,*data,distort;
124 const char *fctid=
"vircam_mosaic";
130 if (*status != VIR_OK)
135 nimages = cpl_frameset_get_size(infiles);
136 nconfs = cpl_frameset_get_size(inconf);
138 cpl_msg_error(fctid,
"No images to combine");
141 if (nconfs != 1 && nconfs != nimages) {
142 cpl_msg_error(fctid,
"Number of conf maps must be 1 or nimages");
148 dstrct_init(nimages);
155 for (i = 0; i < nimages; i++) {
157 fr = cpl_frameset_get_frame(infiles,i);
160 frc = cpl_frameset_get_frame(inconf,0);
162 frc = cpl_frameset_get_frame(inconf,i);
167 if (cpl_frame_get_nextensions(fr) != cpl_frame_get_nextensions(frc)) {
168 cpl_msg_error(fctid,
"Number of extensions in %s and %s must match",
169 cpl_frame_get_filename(fr),
170 cpl_frame_get_filename(frc));
178 nhdu = (int)cpl_frame_get_nextensions(fr);
179 dstrct_extn_init(dd,nhdu);
180 for (j = 1; j <= nhdu; j++) {
181 plist1 = cpl_propertylist_load(cpl_frame_get_filename(fr),j);
182 if (cpl_error_get_code() != 0) {
184 cpl_msg_error(fctid,
"Unable to get header from %s[%d]",
185 cpl_frame_get_filename(fr),j);
188 plist2 = cpl_propertylist_load(cpl_frame_get_filename(frc),j);
189 if (cpl_error_get_code() != 0) {
191 cpl_msg_error(fctid,
"Unable to get header from %s[%d]",
192 cpl_frame_get_filename(frc),j);
193 cpl_propertylist_delete(plist1);
196 if (cpl_propertylist_get_int(plist1,
"NAXIS1") !=
197 cpl_propertylist_get_int(plist2,
"NAXIS1") ||
198 cpl_propertylist_get_int(plist1,
"NAXIS2") !=
199 cpl_propertylist_get_int(plist2,
"NAXIS2")) {
201 cpl_msg_error(fctid,
"%s[%d] and %s[%d] image dimensions don't match",
202 cpl_frame_get_filename(fr),j,
203 cpl_frame_get_filename(frc),j);
204 cpl_propertylist_delete(plist1);
205 cpl_propertylist_delete(plist2);
211 if (dstrct_extn_fill_from_plist(dd,j,expkey,plist1,msg) != VIR_OK) {
213 cpl_msg_error(fctid,
"Error reading header in %s[%d] -- %s",
214 cpl_frame_get_filename(fr),j,msg);
215 cpl_propertylist_delete(plist1);
216 cpl_propertylist_delete(plist2);
219 cpl_propertylist_delete(plist1);
220 cpl_propertylist_delete(plist2);
224 cpl_msg_error(fctid,
"%d fatal errors",nerrs);
230 for (i = 0; i < nimages; i++) {
235 for (j = 1; j <= dd->nhdus; j++) {
240 npts = (dd->nx_extn[j-1])*(dd->ny_extn[j-1]);
242 alldata = cpl_realloc(alldata,nalloc*
sizeof(
float));
246 im = cpl_image_load(cpl_frame_get_filename(dd->infile),
248 memmove(alldata+nstart,cpl_image_get_data_float(im),
254 3.0,3,-1000.0,65535.0,&back,&noise);
255 dd->sky_extn[j-1] = back;
256 cpl_image_delete(im);
263 dd->global_sky = back;
264 dd->global_noise = noise;
273 for (i = 0; i < nimages; i++)
274 skywish += (fileptrs+i)->global_sky;
275 skywish /= (float)nimages;
276 }
else if (skyflag == 1) {
277 skywish = skywish_in;
282 for (i = 0; i < nimages; i++)
283 (fileptrs+i)->global_sky = skywish;
288 zpt1 = fileptrs->magzpt_extn[0];
289 exp1 = fileptrs->exptime;
290 sky1 = fileptrs->global_sky;
291 for (i = 0; i < nimages; i++) {
293 for (j = 1; j <= dd->nhdus; j++) {
294 scalefac = (exp1/dd->exptime)*pow(10.0,0.4*(zpt1-dd->magzpt_extn[j-1]));
295 ds = sky1 - scalefac*(dd->global_sky);
296 dd->scalefac[j-1] = scalefac;
297 dd->skydiff[j-1] = ds;
303 output_images((
int)nimages,&outstr);
307 for (i = 0; i < nimages; i++) {
309 for (j = 1; j <= dd->nhdus; j++) {
310 im = cpl_image_load(cpl_frame_get_filename(dd->infile),
311 CPL_TYPE_FLOAT,0,(cpl_size)j);
312 data = cpl_image_get_data_float(im);
313 cim = cpl_image_load(cpl_frame_get_filename(dd->conf),
314 CPL_TYPE_INT,0,(cpl_size)j);
315 cdata = cpl_image_get_data_int(cim);
322 for (jj = 0; jj < dd->ny_extn[j-1]; jj++) {
323 ind1 = jj*(dd->nx_extn[j-1]);
324 y = (double)(jj + 1);
325 for (ii = 0; ii < dd->nx_extn[j-1]; ii++) {
327 x = (double)(ii + 1);
328 distort = distort_corr(x,y,dd->wcs_extn[j-1]);
329 data[ind] = (data[ind] - dd->sky_extn[j-1])*distort +
337 average(dd,j,data,cdata,&outstr,interp,conflim);
338 cpl_image_delete(im);
339 cpl_image_delete(cim);
358 writewcs(*out,outstr.outwcs);
359 writewcs(*outc,outstr.outwcs);
363 prov(interp,*out,infiles);
364 prov(interp,*outc,infiles);
372 "Interpolation method");
377 freespace(outstr.outwcs);
378 cpl_image_delete(outstr.work);
379 dstrct_close(nimages);
383 static void prov(
int interp, vir_fits *file, cpl_frameset *fset) {
385 cpl_propertylist *ehu;
386 char value[81],key[9],comment[81];
387 const char *algorithm[] = {
"Nearest-neighbour",
"Bi-linear interpolation"};
392 cpl_propertylist_erase_regexp(ehu,
"PROV*",0);
397 (void)snprintf(key,9,
"PROV%04d",ncard);
398 (void)snprintf(value,81,
"File formed from %s of",algorithm[interp]);
399 (void)snprintf(comment,81,
"File combination algorithm");
400 cpl_propertylist_update_string(ehu,key,value);
401 cpl_propertylist_set_comment(ehu,key,comment);
405 nfset = cpl_frameset_get_size(fset);
406 for (i = 0; i < nfset; i++) {
408 (void)snprintf(key,9,
"PROV%04d",ncard);
409 (void)snprintf(value,81,
"%s",
410 basename((
char *)cpl_frame_get_filename(cpl_frameset_get_frame(fset,i))));
411 (void)snprintf(comment,81,
"Card # %d",ncard);
412 cpl_propertylist_update_string(ehu,key,value);
413 cpl_propertylist_set_comment(ehu,key,comment);
417 static void writewcs(vir_fits *fitsfile, mywcs *o) {
418 char key[16],sval[16],proj[4];
422 cpl_propertylist *ehu;
431 (void)strcpy(proj,
"TAN");
433 (
void)strcpy(proj,
"ZPN");
435 for (i = 1; i <= 2; i++) {
436 (void)sprintf(key,
"CTYPE%d",i);
438 (void)sprintf(sval,
"RA---%s",proj);
440 (
void)sprintf(sval,
"DEC--%s",proj);
441 (void)cpl_propertylist_update_string(ehu,key,sval);
446 for (i = 1; i <= 2; i++) {
447 (void)sprintf(key,
"CRVAL%d",i);
448 dval = (o->crval[i-1])*DEGRAD;
449 cpl_propertylist_update_double(ehu,key,dval);
451 for (i = 1; i <= 2; i++) {
452 (void)sprintf(key,
"CRPIX%d",i);
453 dval = (o->crpix[i-1]);
454 cpl_propertylist_update_double(ehu,key,dval);
460 for (j = 1; j <= 2; j++) {
461 for (i = 1; i <= 2; i++) {
462 (void)sprintf(key,
"CD%d_%d",j,i);
463 dval = (o->cd[n])*DEGRAD;
464 cpl_propertylist_update_double(ehu,key,dval);
472 val = (float)(o->pv21);
473 cpl_propertylist_update_float(ehu,
"PV2_1",val);
474 val = (float)(o->pv23);
475 cpl_propertylist_update_float(ehu,
"PV2_3",val);
476 val = (float)(o->pv25);
477 cpl_propertylist_update_float(ehu,
"PV2_5",val);
479 if (cpl_propertylist_has(ehu,
"PV2_1"))
480 cpl_propertylist_erase(ehu,
"PV2_1");
481 if (cpl_propertylist_has(ehu,
"PV2_3"))
482 cpl_propertylist_erase(ehu,
"PV2_3");
483 if (cpl_propertylist_has(ehu,
"PV2_5"))
484 cpl_propertylist_erase(ehu,
"PV2_5");
488 static void average(dstrct *dd,
int nextn,
float *data,
int *cdata,
489 outstrct *outstr,
int interp,
int conflim) {
490 int i,j,ind1,ind,outind,j_1,j_2,i_1,i_2,jj,ii,ind1o,indo,ixo,iyo;
491 float *odata,*work,wi,wj,scf,fcd,ds;
492 double x_in,y_in,x_out,y_out;
496 odata = cpl_image_get_data_float(outstr->outim);
497 scf = dd->scalefac[nextn-1];
498 ds = dd->skydiff[nextn-1];
502 work = cpl_image_get_data_float(outstr->work);
508 for (j = 0; j < dd->ny_extn[nextn-1]; j++) {
509 ind1 = j*dd->nx_extn[nextn-1];
510 y_in = (double)(j+1);
511 for (i = 0; i < dd->nx_extn[nextn-1]; i++) {
513 if (cdata[ind] <= conflim)
515 x_in = (double)(i+1);
516 outloc(dd->wcs_extn[nextn-1],x_in,y_in,outstr->outwcs,
518 ixo = vircam_nint(x_out);
519 iyo = vircam_nint(y_out);
520 if (ixo < 1 || ixo > outstr->nxo || iyo < 1 ||
523 outind = (iyo-1)*outstr->nxo + ixo - 1;
524 fcd = (
float)cdata[ind];
525 odata[outind] += fcd*(data[ind]*scf + ds);
530 for (j = 0; j < dd->ny_extn[nextn-1]; j++) {
531 ind1 = j*dd->nx_extn[nextn-1];
532 y_in = (double)(j+1);
533 for (i = 0; i < dd->nx_extn[nextn-1]; i++) {
535 if (cdata[ind] <= conflim)
537 x_in = (double)(i+1);
538 outloc(dd->wcs_extn[nextn-1],x_in,y_in,outstr->outwcs,
540 if (x_out < 1.0 || y_out < 1.0 || x_out >= outstr->nxo || y_out >= outstr->nyo) {
552 fcd = (float)cdata[ind];
553 for (jj = j_1; jj <= j_2; jj++) {
554 wj = 1.0 - fabs(y_out - (
double)jj);
555 ind1o = (jj - 1)*outstr->nxo;
556 for (ii = i_1; ii <= i_2; ii++) {
557 indo = ind1o + ii - 1;
558 wi = 1.0 - fabs(x_out - (
double)ii);
559 odata[indo] += wi*wj*fcd*(scf*data[ind] + ds);
560 work[indo] += wi*wj*fcd;
568 static void output_images(
int nimages, outstrct *outstr) {
569 double lowerleft[2],upperleft[2],lowerright[2],upperright[2];
570 double xout,yout,xmin,ymin,ra,dec;
572 int i,*idata,j,nx,ny,ixo,iyo;
574 mywcs *refwcs,*curwcs,*outwcs;
578 lowerleft[0] = 1.0e8;
579 lowerleft[1] = 1.0e8;
580 upperleft[0] = 1.0e8;
581 upperleft[1] = -1.0e8;
582 lowerright[0] = -1.0e8;
583 lowerright[1] = 1.0e8;
584 upperright[0] = -1.0e8;
585 upperright[1] = -1.0e8;
590 for (i = 0; i < nimages; i++) {
595 for (j = 1; j <= dd->nhdus; j++) {
596 curwcs = dd->wcs_extn[j-1];
597 if (i == 0 && j == 1) {
598 refwcs = dupwcs(curwcs);
601 nx = dd->nx_extn[j-1];
602 ny = dd->ny_extn[j-1];
603 outloc(curwcs,(
double)1.0,(
double)1.0,refwcs,&xout,&yout);
604 lowerleft[0] = min(lowerleft[0],xout);
605 lowerleft[1] = min(lowerleft[1],yout);
606 outloc(curwcs,(
double)1.0,(
double)ny,refwcs,&xout,&yout);
607 upperleft[0] = min(upperleft[0],xout);
608 upperleft[1] = max(upperleft[1],yout);
609 outloc(curwcs,(
double)nx,(
double)1.0,refwcs,&xout,&yout);
610 lowerright[0] = max(lowerright[0],xout);
611 lowerright[1] = min(lowerright[1],yout);
612 outloc(curwcs,(
double)nx,(
double)ny,refwcs,&xout,&yout);
613 upperright[0] = max(upperright[0],xout);
614 upperright[1] = max(upperright[1],yout);
620 ixo = vircam_nint(max(lowerright[0]-lowerleft[0],
621 upperright[0]-upperleft[0])) + 5;
622 iyo = vircam_nint(max(upperright[1]-lowerright[1],
623 upperleft[1]-lowerleft[1])) + 5;
624 xmin = min(lowerleft[0],upperleft[0]);
625 ymin = min(lowerleft[1],lowerright[1]);
632 outstr->outim = cpl_image_new((cpl_size)ixo,(cpl_size)iyo,CPL_TYPE_FLOAT);
633 data = cpl_image_get_data_float(outstr->outim);
634 memset(data,0,ixo*iyo*
sizeof(
float));
635 outstr->work = cpl_image_new((cpl_size)ixo,(cpl_size)iyo,CPL_TYPE_FLOAT);
636 data = cpl_image_get_data_float(outstr->work);
637 memset(data,0,ixo*iyo*
sizeof(
float));
638 outstr->outcim = cpl_image_new((cpl_size)ixo,(cpl_size)iyo,CPL_TYPE_INT);
639 idata = cpl_image_get_data_int(outstr->outcim);
640 memset(idata,0,ixo*iyo*
sizeof(
int));
644 outwcs = cpl_malloc(
sizeof(mywcs));
645 outwcs->crpix[0] = refwcs->crpix[0] - xmin + 1.0;
646 outwcs->crpix[1] = refwcs->crpix[1] - ymin + 1.0;
647 outwcs->crval[0] = refwcs->crval[0];
648 outwcs->crval[1] = refwcs->crval[1];
649 for (i = 0; i < 4; i++)
650 outwcs->cd[i] = refwcs->cd[i];
652 outwcs->pv23 = -0.33333333333;
657 outwcs->tand = tan(outwcs->crval[1]);
658 outwcs->secd = 1.0/cos(outwcs->crval[1]);
659 outstr->outwcs = outwcs;
664 xout = 0.5*(double)ixo;
665 yout = 0.5*(double)iyo;
666 xytord(outwcs,xout,yout,&ra,&dec);
667 outwcs->crpix[0] = xout;
668 outwcs->crpix[1] = yout;
669 outwcs->crval[0] = ra/DEGRAD;
670 outwcs->crval[1] = dec/DEGRAD;
671 outwcs->tand = tan(outwcs->crval[1]);
672 outwcs->secd = 1.0/cos(outwcs->crval[1]);
676 static float distort_corr(
double x,
double y, mywcs *w) {
677 double xi,xn,r,rprime,drprime_bydr,dc,tanr;
679 xi = (x - w->crpix[0])*(w->cd[0]) + (y - w->crpix[1])*(w->cd[1]);
680 xn = (x - w->crpix[0])*(w->cd[2]) + (y - w->crpix[1])*(w->cd[3]);
681 r = sqrt(xi*xi + xn*xn);
686 rprime = r*w->pv21 + pow(r,(
double)3.0)*w->pv23 +
687 pow(r,(
double)5.0)*w->pv25;
688 drprime_bydr = w->pv21 + 3.0*pow(r,(
double)2.0)*w->pv23 +
689 5.0*pow(r,(
double)4.0)*w->pv25;
691 dc = tanr*drprime_bydr*(1.0 + tanr*tanr)/r;
694 dc = (1.0 + tanr*tanr)*tanr/r;
700 static void outloc(mywcs *win,
double xin,
double yin, mywcs *wout,
701 double *xout,
double *yout) {
702 double xt,yt,xi,eta,r,rfac,aa,tandec,denom,rp;
708 xt = xin - win->crpix[0];
709 yt = yin - win->crpix[1];
710 xi = win->cd[0]*xt + win->cd[1]*yt;
711 eta = win->cd[2]*xt + win->cd[3]*yt;
713 if (fabs(xt) < 1.0e-6 && fabs(yt) < 1.0e-6) {
716 rp = sqrt(xi*xi + eta*eta);
718 for (i = 0; i < 3; i++) {
719 rfac = win->pv21 + win->pv23*pow(r,2.0) + win->pv25*pow(r,4.0);
729 aa = atan(xi*win->secd/(1.0-eta*win->tand));
731 tandec = (eta+win->tand)*sin(aa)/(xi*win->secd);
733 tandec = (eta+win->tand)/(1.0 - eta*win->tand);
737 aa += (win->crval[0] - wout->crval[0]);
738 denom = wout->tand*tandec + cos(aa);
739 xi = wout->secd*sin(aa)/denom;
740 eta = (tandec - wout->tand*cos(aa))/denom;
742 rp = sqrt(xi*xi + eta*eta);
744 rfac = wout->pv21 + wout->pv23*pow(rp,2.0) + wout->pv25*pow(rp,4.0);
751 denom = wout->cd[0]*wout->cd[3] - wout->cd[1]*wout->cd[2];
752 *xout = (xi*wout->cd[3] - eta*wout->cd[1])/denom + wout->crpix[0];
753 *yout = (eta*wout->cd[0] - xi*wout->cd[2])/denom + wout->crpix[1];
756 static void xytord(mywcs *win,
double xin,
double yin,
double *ra,
758 double xt,yt,xi,eta,r,rfac,aa;
760 xt = xin - win->crpix[0];
761 yt = yin - win->crpix[1];
762 xi = win->cd[0]*xt + win->cd[1]*yt;
763 eta = win->cd[2]*xt + win->cd[3]*yt;
764 r = sqrt(xi*xi + eta*eta);
766 rfac = win->pv21 + win->pv23*pow(r,2.0) + win->pv25*pow(r,4.0);
768 rfac = win->pv21 + win->pv23*pow(r,2.0) + win->pv25*pow(r,4.0);
779 aa = atan(xi*win->secd/(1.0-eta*win->tand));
780 *ra = aa + win->crval[0];
782 *dec = atan((eta + win->tand)*sin(aa)/(xi*win->secd));
784 *dec = atan((eta + win->tand)/(1.0 - eta*win->tand));
786 if (*ra > 2.0*CPL_MATH_PI)
787 *ra -= 2.0*CPL_MATH_PI;
789 *ra += 2.0*CPL_MATH_PI;
794 static void rdtoxy(mywcs *win,
double ra,
double dec,
double *x,
double *y) {
795 double xi,eta,rra,ddec,denom,rp,rfac;
797 rra = ra/DEGRAD - win->crval[0];
799 denom = win->tand*tan(ddec) + cos(rra);
800 xi = win->secd*sin(rra)/denom;
801 eta = (tan(ddec) - win->tand*cos(rra))/denom;
802 rp = sqrt(xi*xi + eta*eta);
809 rfac = win->pv21 + win->pv23*pow(rp,2.0) + win->pv25*pow(rp,4.0);
813 denom = win->cd[0]*win->cd[3] - win->cd[1]*win->cd[2];
814 *x = (xi*win->cd[3] - eta*win->cd[1])/denom + win->crpix[0];
815 *y = (eta*win->cd[0] - xi*win->cd[2])/denom + win->crpix[1];
818 static mywcs *dupwcs(mywcs *in) {
822 out = cpl_malloc(
sizeof(mywcs));
823 for (i = 0; i < 2; i++) {
824 out->crval[i] = in->crval[i];
825 out->crpix[i] = in->crpix[i];
827 for (i = 0; i < 4; i++)
828 out->cd[i] = in->cd[i];
829 out->secd = in->secd;
830 out->tand = in->tand;
831 out->pv21 = in->pv21;
832 out->pv23 = in->pv23;
833 out->pv25 = in->pv25;
836 out->istan = in->istan;
840 static void dstrct_init(
int nfiles) {
844 fileptrs = cpl_malloc(nfiles*
sizeof(dstrct));
845 for (i = 0; i < nfiles; i++) {
849 dd->global_sky = 0.0;
850 dd->global_noise = 0.0;
858 dd->magzpt_extn = NULL;
866 static void dstrct_extn_init(dstrct *dd,
int nhdu) {
869 dd->wcs_extn = cpl_malloc(nhdu*
sizeof(mywcs *));
870 for (i = 0; i < nhdu; i++)
871 dd->wcs_extn[i] = NULL;
872 dd->nx_extn = cpl_malloc(nhdu*
sizeof(
int));
873 dd->ny_extn = cpl_malloc(nhdu*
sizeof(
int));
874 dd->magzpt_extn = cpl_malloc(nhdu*
sizeof(
float));
875 dd->sky_extn = cpl_malloc(nhdu*
sizeof(
float));
876 dd->scalefac = cpl_malloc(nhdu*
sizeof(
float));
877 dd->skydiff = cpl_malloc(nhdu*
sizeof(
float));
880 static int dstrct_extn_fill_from_plist(dstrct *dd,
int extnum,
char *expkey,
881 cpl_propertylist *plist,
char *msg) {
888 if (cpl_propertylist_has(plist,
"CRVAL1")) {
889 dd->tpa = cpl_propertylist_get_double(plist,
"CRVAL1");
891 (void)sprintf(msg,
"Missing CRVAL1 in extension %d",extnum);
894 if (cpl_propertylist_has(plist,
"CRVAL2")) {
895 dd->tpd = cpl_propertylist_get_double(plist,
"CRVAL2");
897 (void)sprintf(msg,
"Missing CRVAL2 in extension %d",extnum);
900 if (cpl_propertylist_has(plist,expkey)) {
901 dd->exptime = cpl_propertylist_get_float(plist,expkey);
903 (void)sprintf(msg,
"Missing %s in extension %d",expkey,extnum);
911 if (cpl_propertylist_has(plist,
"NAXIS1")) {
912 dd->nx_extn[extnum-1] = cpl_propertylist_get_int(plist,
"NAXIS1");
914 (void)sprintf(msg,
"Missing NAXIS1 in extension %d",extnum);
917 if (cpl_propertylist_has(plist,
"NAXIS2")) {
918 dd->ny_extn[extnum-1] = cpl_propertylist_get_int(plist,
"NAXIS2");
920 (void)sprintf(msg,
"Missing NAXIS2 in extension %d",extnum);
923 if (cpl_propertylist_has(plist,
"ESO QC MAGZPT")) {
924 dd->magzpt_extn[extnum-1] = cpl_propertylist_get_float(plist,
927 (void)sprintf(msg,
"Missing ESO QC MAGZPT in extension %d",extnum);
933 w = cpl_malloc(
sizeof(mywcs));
934 if (strstr(cpl_propertylist_get_string(plist,
"CTYPE1"),
"TAN") == NULL)
938 w->crval[0] = cpl_propertylist_get_double(plist,
"CRVAL1");
939 w->crval[1] = cpl_propertylist_get_double(plist,
"CRVAL2");
940 w->crpix[0] = cpl_propertylist_get_double(plist,
"CRPIX1");
941 w->crpix[1] = cpl_propertylist_get_double(plist,
"CRPIX2");
942 w->cd[0] = cpl_propertylist_get_double(plist,
"CD1_1");
943 w->cd[1] = cpl_propertylist_get_double(plist,
"CD1_2");
944 w->cd[2] = cpl_propertylist_get_double(plist,
"CD2_1");
945 w->cd[3] = cpl_propertylist_get_double(plist,
"CD2_2");
947 if (cpl_propertylist_has(plist,
"PV2_1"))
948 w->pv21 = cpl_propertylist_get_double(plist,
"PV2_1");
951 if (cpl_propertylist_has(plist,
"PV2_3"))
952 w->pv23 = cpl_propertylist_get_double(plist,
"PV2_3");
954 w->pv23 = -0.3333333333;
955 if (cpl_propertylist_has(plist,
"PV2_5"))
956 w->pv25 = cpl_propertylist_get_double(plist,
"PV2_5");
961 w->pv23 = -0.33333333;
964 w->nx = dd->nx_extn[extnum-1];
965 w->ny = dd->ny_extn[extnum-1];
969 for (i = 0; i < 2; i++)
970 w->crval[i] /= DEGRAD;
971 for (i = 0; i < 4; i++)
976 w->tand = tan(w->crval[1]);
977 w->secd = 1.0/cos(w->crval[1]);
981 dd->wcs_extn[extnum-1] = w;
985 static void dstrct_close(
int nfiles) {
989 for (i = 0; i < nfiles; i++) {
991 if (dd->wcs_extn != NULL) {
992 for (j = 0; j < dd->nhdus; j++)
993 freespace(dd->wcs_extn[j]);
994 freespace(dd->wcs_extn);
996 freespace(dd->nx_extn);
997 freespace(dd->ny_extn);
998 freespace(dd->magzpt_extn);
999 freespace(dd->sky_extn);
1000 freespace(dd->scalefac);
1001 freespace(dd->skydiff);
1003 freespace(fileptrs);
1006 static void normal(outstrct *o) {
1008 float *odata,*work,renorm,val,junk;
1013 npo = o->nxo*o->nyo;
1014 odata = cpl_image_get_data_float(o->outim);
1015 work = cpl_image_get_data_float(o->work);
1016 ocdata = cpl_image_get_data_int(o->outcim);
1020 for (i = 0; i < npo; i++)
1022 odata[i] /= work[i];
1026 (void)
vircam_qmedsig(odata,NULL,(
long)npo,3.0,3,-1000.0,65535.0,&val,&junk);
1027 for (i = 0; i < npo; i++)
1033 (void)
vircam_qmedsig(work,NULL,(
long)npo,3.0,3,-1000.0,65535.0,&val,&junk);
1035 for (i = 0; i < npo; i++)
1036 ocdata[i] = max(0,min(1000,vircam_nint(work[i]*renorm)));
void vircam_qmedsig(float *data, unsigned char *bpm, long npts, float thresh, int niter, float lowv, float highv, float *median, float *sigma)
vir_fits * vircam_fits_wrap(cpl_image *im, vir_fits *model, cpl_propertylist *phu, cpl_propertylist *ehu)
void vircam_fits_delete(vir_fits *p)
vir_fits * vircam_fits_load(cpl_frame *frame, cpl_type type, int nexten)
cpl_propertylist * vircam_fits_get_ehu(vir_fits *p)