36 #include "vircam_mods.h"
37 #include "vircam_utils.h"
38 #include "vircam_fits.h"
39 #include "vircam_stats.h"
40 #include "vircam_pfits.h"
41 #include "vircam_wcsutils.h"
42 #include "vircam_tfits.h"
76 static dstrct *fileptrs = NULL;
77 static vir_fits *outfits = NULL;
78 static vir_fits *outconf = NULL;
79 static mywcs *outwcs = NULL;
85 static float *outdata;
88 static float sumweight;
90 static void outloc(mywcs *win,
double xin,
double yin, mywcs *wout,
91 cpl_array *trans,
double *xout,
double *yout);
92 static void seeing_wt(
void);
93 static void backgrnd_ov(
void);
94 static void skyest(
float *data,
int *cdata,
long npts,
float thresh,
95 float *skymed,
float *skynoise);
96 static cpl_array *transinit(
void);
97 static void fileptrs_close(
void);
98 static cpl_table *mknewtab(vir_tfits *catref, dstrct *dd);
99 static void output_files(
void);
100 static int stack_nn(
void);
101 static int stack_lin(
void);
102 static void do_averages(
int ncontrib,
float *data,
float *wconf,
float *conf,
103 unsigned char *
id,
float lclip,
float hclip,
104 float extra,
short int *lowcl,
short int *highcl,
105 float *outval,
float *outvalc);
106 static mywcs *getwcsinfo(cpl_propertylist *plist);
107 static void diffxy(mywcs *wref, mywcs *wprog,
float *dx,
float *dy);
108 static void tidy(
void);
175 int nimages,
int nconfs,
float lthr,
float hthr,
176 int method,
int seeing, vir_fits **out,
177 vir_fits **outc,
int *status) {
181 float expref,exposure,xoff,yoff;
184 cpl_table *newtab,*mtab;
185 const char *fctid =
"vircam_imstack";
191 if (*status != VIR_OK)
197 cpl_msg_error(fctid,
"No input files to combine");
210 in = cpl_matrix_new(1,2);
211 cpl_matrix_set(in,0,0,0.0);
212 cpl_matrix_set(in,0,1,0.0);
216 fileptrs = cpl_malloc(nimages*
sizeof(dstrct));
218 expref = max(0.5,exposure);
220 for (i = 0; i < nimages; i++) {
226 }
else if (nconfs == 1) {
227 dd->conf = inconf[0];
230 dd->conf = inconf[i];
234 dd->expscale = exposure/expref;
255 cpl_msg_error(fctid,
"Image %s and Confidence map %s don't match",
258 cpl_matrix_delete(in);
265 diffxy(fileptrs->vwcs,dd->vwcs,&(dd->xoff),&(dd->yoff));
271 if (catref == NULL && cats[i] != NULL)
273 if (i == 0 || cats[i] == NULL) {
274 dd->trans = transinit();
276 newtab = mknewtab(catref,dd);
278 1024,&xoff,&yoff,&nm,&mtab,status);
279 if (*status != VIR_OK) {
280 freearray(dd->trans);
281 dd->trans = transinit();
284 (void)vircam_platexy(mtab,6,&(dd->trans),status);
293 cpl_matrix_delete(in);
339 static void seeing_wt(
void) {
342 cpl_propertylist *plist;
344 const char *fctid =
"seeing_wt";
348 seeing = cpl_malloc(nim*
sizeof(*seeing));
354 for (i = 0; i < nim; i++) {
357 if (cpl_propertylist_has(plist,
"ESO DRS SEEING")) {
358 seeing[i] = cpl_propertylist_get_float(plist,
"ESO DRS SEEING");
359 if (seeing[i] <= 0.0) {
373 sumweight = fileptrs->weight;
374 for (i = 1; i < nim; i++) {
376 dd->weight *= seeing[0]/seeing[i];
377 sumweight += dd->weight;
380 cpl_msg_warning(fctid,
"No seeing weighting will be done");
403 static int stack_lin(
void) {
404 cpl_image *outim,*outimc;
406 int npts,i,*cdata,ix,iy,ind1,ind,ox,oy,m,jj,ii,nn,nx,ny,n;
407 float *workbufw,*data,wt,dx,dy,w[4],value,cval;
415 nxo = (int)cpl_image_get_size_x(outim);
416 nyo = (int)cpl_image_get_size_y(outim);
421 workbufw = cpl_calloc(nxo*nyo,
sizeof(*workbufw));
425 outdata = cpl_image_get_data_float(outim);
426 outdatac = cpl_image_get_data_int(outimc);
431 for (i = 0; i < npts; i++) {
439 for (i = 0; i < nim; i++) {
451 for (iy = 0; iy < ny; iy++) {
453 for (ix = 0; ix < nx; ix++) {
455 outloc(dd->vwcs,(
double)ix,(
double)iy,outwcs,dd->trans,
457 if (oxf < 0.0 || oyf < 0.0)
461 if ((dd->bpm)[ind] != 0)
463 if (ox < 0 || ox >= nxo || oy < 0 || oy >= nyo ||
468 w[0] = (1.0-dx)*(1.0-dy);
473 value = data[ind]/(dd->expscale) + dd->skydiff;
474 cval = (
float)cdata[ind];
475 for (jj = 0; jj <= 1; jj++) {
476 for (ii = 0; ii <= 1; ii++) {
477 nn = (oy+jj)*nxo + ox + ii;
478 if (nn >= npts || ox+ii >= nxo || oy+jj >= nyo)
480 outdata[nn] += w[m]*value*wt*cval;
481 workbufw[nn] += w[m]*wt*cval;
491 for (i = 0; i < npts; i++) {
492 if (workbufw[i] != 0.0)
493 outdata[i] /= workbufw[i];
495 outdata[i] = fileptrs->sky;
496 workbufw[i] /= sumweight;
499 for (i = 0; i < npts; i++) {
500 workbufw[i] *= (100.0/med);
501 outdatac[i] = max(0,min(1000,vircam_nint(workbufw[i])));
525 static int stack_nn(
void) {
526 float *workbuf,*workbufc,*workbufw,lclip,hclip,*data,wt,med,noise,outvalc;
527 float value,*dbuf,*wbuf,*cbuf,outval,avlev,avvar,*confwork;
529 int *iloc,i,npts,ix,iy,ind1,ind,ox,oy,nn,bufloc,ncontrib,*lbuf;
530 int j,*cdata,nx,ny,n,nz;
531 short int clipped_low,clipped_high;
533 unsigned char *id,*clipmap,*cc,*cclast,*ibuf;
535 cpl_image *outim,*outimc;
541 nxo = (int)cpl_image_get_size_x(outim);
542 nyo = (int)cpl_image_get_size_y(outim);
547 workbuf = cpl_calloc(nz*nxo*nyo,
sizeof(*workbuf));
548 workbufc = cpl_calloc(nz*nxo*nyo,
sizeof(*workbufc));
549 workbufw = cpl_calloc(nz*nxo*nyo,
sizeof(*workbufw));
550 id = cpl_calloc(nz*nxo*nyo,
sizeof(*
id));
551 iloc = cpl_calloc(nz*nxo*nyo,
sizeof(*iloc));
552 nbuf = cpl_calloc(nxo*nyo,
sizeof(*nbuf));
553 confwork = cpl_calloc(nxo*nyo,
sizeof(*confwork));
557 clipmap = cpl_calloc(2*nxo,
sizeof(*clipmap));
561 dbuf = cpl_calloc(2*nz,
sizeof(*dbuf));
562 wbuf = cpl_calloc(2*nz,
sizeof(*wbuf));
563 cbuf = cpl_calloc(2*nz,
sizeof(*cbuf));
564 ibuf = cpl_calloc(2*nz,
sizeof(*ibuf));
565 lbuf = cpl_calloc(2*nz,
sizeof(*lbuf));
569 outdata = cpl_image_get_data_float(outim);
570 outdatac = cpl_image_get_data_int(outimc);
574 lclip = fileptrs->sky - lsig*(fileptrs->noise);
575 hclip = fileptrs->sky + hsig*(fileptrs->noise);
580 for (i = 0; i < nim; i++) {
593 for (iy = 0; iy < ny; iy++) {
595 for (ix = 0; ix < nx; ix++) {
597 outloc(dd->vwcs,(
double)ix,(
double)iy,outwcs,dd->trans,
599 ox = vircam_nint(oxf) - 1;
600 oy = vircam_nint(oyf) - 1;
601 if (ox < 0 || ox >= nxo || oy < 0 || oy >= nyo ||
605 bufloc = oy*nxo*nz + ox*nz + nbuf[nn];
606 value = data[ind]/(dd->expscale) + dd->skydiff;
607 workbuf[bufloc] = value;
608 workbufw[bufloc] = wt*(
float)cdata[ind];
609 workbufc[bufloc] = (float)cdata[ind];
620 for (iy = 0; iy < nyo; iy++) {
622 cc = clipmap + (iy % 2)*nxo;
623 cclast = clipmap + ((iy-1) % 2)*nxo;
624 for (ix = 0; ix < nxo; ix++) {
626 bufloc = iy*nxo*nz + ix*nz;
627 ncontrib = nbuf[ind];
629 outdata[ind] = fileptrs->sky;
637 for (i = 0; i < ncontrib; i++) {
638 dbuf[i] = workbuf[bufloc+i];
639 wbuf[i] = workbufw[bufloc+i];
640 cbuf[i] = workbufc[bufloc+i];
641 ibuf[i] =
id[bufloc+i];
642 lbuf[i] = iloc[bufloc+i];
647 do_averages(ncontrib,dbuf,wbuf,cbuf,ibuf,lclip,hclip,0.0,
648 &clipped_low,&clipped_high,&outval,&outvalc);
652 outdata[ind] = outval;
653 confwork[ind] = outvalc;
654 cc[ix] = (clipped_high >= 0);
655 if (clipped_low >= 0)
656 ((fileptrs+ibuf[clipped_low])->bpm)[lbuf[clipped_low]] = 2;
657 if (clipped_high >= 0)
658 ((fileptrs+ibuf[clipped_high])->bpm)[lbuf[clipped_high]] = 1;
667 for (ix = 1; ix < nxo-1; ix++) {
670 ind = (iy-1)*nxo + ix;
671 bufloc = (iy-1)*nxo*nz + ix*nz;
672 ncontrib = nbuf[ind];
676 for (i = -1; i <= 1; i++)
677 for (j = -1; j <= 1; j++)
678 avlev += outdata[ind + i*nxo + j];
681 for (i = -1; i <= 1; i++)
682 for (j = -1; j <= 1; j++)
683 avvar += (
float)fabs(avlev - outdata[ind + i*nxo + j]);
685 if (avlev <= hclip && avvar <= 2.0*(fileptrs->sky))
690 for (i = 0; i < ncontrib; i++) {
691 dbuf[i] = workbuf[bufloc+i];
692 wbuf[i] = workbufw[bufloc+i];
693 cbuf[i] = workbufc[bufloc+i];
694 ibuf[i] =
id[bufloc+i];
695 lbuf[i] = iloc[bufloc+i];
696 (fileptrs+ibuf[i])->bpm[lbuf[i]] = 0;
701 do_averages(ncontrib,dbuf,wbuf,cbuf,ibuf,lclip,hclip,avvar,
702 &clipped_low,&clipped_high,&outval,&outvalc);
706 outdata[ind] = outval;
707 confwork[ind] = outvalc;
708 if (clipped_low >= 0)
709 ((fileptrs+ibuf[clipped_low])->bpm)[lbuf[clipped_low]] = 2;
710 if (clipped_high >= 0)
711 ((fileptrs+ibuf[clipped_high])->bpm)[lbuf[clipped_high]] = 1;
718 vircam_qmedsig(confwork,NULL,npts,3.0,2,25.0,65535.0,&med,&noise);
719 for (i = 0; i < npts; i++) {
720 confwork[i] *= (100.0/med);
721 outdatac[i] = max(0,min(1000,vircam_nint(confwork[i])));
782 static void do_averages(
int ncontrib,
float *data,
float *wconf,
float *conf,
783 unsigned char *
id,
float lclip,
float hclip,
784 float extra,
short int *lowcl,
short int *highcl,
785 float *outval,
float *outvalc) {
786 float minval,maxval,sum,wsum,csum,reflev,clipval,clipscale;
799 for (i = 0; i < ncontrib; i++) {
800 sum += data[i]*wconf[i];
803 if (data[i] > maxval) {
807 if (data[i] < minval) {
818 *outval = fileptrs->sky;
824 if (maxval > hclip && wsum > 150.0 && csum > 150.0 &&
825 imin != -1 && imax != -1) {
826 reflev = (sum - data[imax]*wconf[imax])/(wsum - wconf[imax]);
827 clipscale = max(1.0,reflev)/max(1.0,(fileptrs+
id[imax])->sky);
828 clipval = reflev + clipscale*hsig*(fileptrs+
id[imax])->noise;
833 if (maxval > clipval) {
834 sum -= data[imax]*wconf[imax];
844 if (minval < lclip && wsum > 150.0 && csum > 150.0 &&
845 imin != -1 && imax != -1) {
846 reflev = (sum - data[imin]*wconf[imin])/(wsum - wconf[imin]);
847 clipscale = max(1.0,reflev)/max(1.0,(fileptrs+
id[imin])->sky);
848 clipval = reflev + clipscale*hsig*(fileptrs+
id[imin])->noise;
849 if (minval < clipval) {
850 sum -= data[imin]*wconf[imin];
859 *outvalc = wsum/sumweight;
878 static void output_files(
void) {
879 cpl_image *newim,*newconf;
880 double lowerleft[2],upperleft[2],lowerright[2],upperright[2],xout,yout;
881 double xmin,ymin,sh[2];
891 upperleft[1] = (double)fileptrs->ny;
892 lowerright[0] = (
double)fileptrs->nx;
894 upperright[0] = (double)fileptrs->nx;
895 upperright[1] = (
double)fileptrs->ny;
899 for (i = 1; i < nim; i++) {
901 outloc(dd->vwcs,(
double)1.0,(
double)1.0,fileptrs->vwcs,dd->trans,
903 lowerleft[0] = min(lowerleft[0],xout);
904 lowerleft[1] = min(lowerleft[1],yout);
905 outloc(dd->vwcs,(
double)1.0,(
double)dd->ny,fileptrs->vwcs,dd->trans,
907 upperleft[0] = min(upperleft[0],xout);
908 upperleft[1] = max(upperleft[1],yout);
909 outloc(dd->vwcs,(
double)dd->nx,(
double)1.0,fileptrs->vwcs,dd->trans,
911 lowerright[0] = max(lowerright[0],xout);
912 lowerright[1] = min(lowerright[1],yout);
913 outloc(dd->vwcs,(
double)dd->nx,(
double)dd->ny,fileptrs->vwcs,dd->trans,
915 upperright[0] = max(upperright[0],xout);
916 upperright[1] = max(upperright[1],yout);
921 ixo = vircam_nint(max(lowerright[0]-lowerleft[0],upperright[0]-upperleft[0])) + 1;
922 iyo = vircam_nint(max(upperright[1]-lowerright[1],upperleft[1]-lowerleft[1])) + 1;
923 xmin = min(lowerleft[0],upperleft[0]);
924 ymin = min(lowerleft[1],lowerright[1]);
928 newim = cpl_image_new((cpl_size)ixo,(cpl_size)iyo,CPL_TYPE_FLOAT);
942 newconf = cpl_image_new((cpl_size)ixo,(cpl_size)iyo,CPL_TYPE_INT);
971 static void diffxy(mywcs *wref, mywcs *wprog,
float *dx,
float *dy) {
972 double xref,yref,xprog,yprog;
976 xref = 0.5*(double)wref->nx;
977 yref = 0.5*(
double)wref->ny;
981 outloc(wref,xref,yref,wprog,NULL,&xprog,&yprog);
985 *dx = (float)(xref - xprog);
986 *dy = (float)(yref - yprog);
1020 static void outloc(mywcs *win,
double xin,
double yin, mywcs *wout,
1021 cpl_array *trans,
double *xout,
double *yout) {
1022 double xt,yt,xi,eta,r,rfac,aa,tandec,denom,rp,*tdata;
1028 xt = xin - win->crpix[0];
1029 yt = yin - win->crpix[1];
1030 xi = win->cd[0]*xt + win->cd[1]*yt;
1031 eta = win->cd[2]*xt + win->cd[3]*yt;
1032 if (fabs(xt) < 1.0e-6 && fabs(yt) < 1.0e-6) {
1035 rp = sqrt(xi*xi + eta*eta);
1037 for (i = 0; i < 3; i++) {
1038 rfac = win->pv21 + win->pv23*pow(r,2.0) + win->pv25*pow(r,4.0);
1045 aa = atan(xi*win->secd/(1.0-eta*win->tand));
1047 tandec = (eta+win->tand)*sin(aa)/(xi*win->secd);
1049 tandec = (eta+win->tand)/(1.0 - eta*win->tand);
1053 aa += (win->crval[0] - wout->crval[0]);
1054 denom = wout->tand*tandec + cos(aa);
1055 xi = wout->secd*sin(aa)/denom;
1056 eta = (tandec - wout->tand*cos(aa))/denom;
1057 rp = sqrt(xi*xi + eta*eta);
1059 rfac = wout->pv21 + wout->pv23*pow(rp,2.0) + wout->pv25*pow(rp,4.0);
1063 denom = wout->cd[0]*wout->cd[3] - wout->cd[1]*wout->cd[2];
1064 xt = (xi*wout->cd[3] - eta*wout->cd[1])/denom + wout->crpix[0];
1065 yt = (eta*wout->cd[0] - xi*wout->cd[2])/denom + wout->crpix[1];
1069 if (trans != NULL) {
1070 tdata = cpl_array_get_data_double(trans);
1071 *xout = xt*tdata[0] + yt*tdata[1] + tdata[2];
1072 *yout = xt*tdata[3] + yt*tdata[4] + tdata[5];
1097 static void backgrnd_ov(
void) {
1098 int i,dx,dy,*cdata,n,jj,ind1,nx,ii,ind;
1099 long npts1,npts,start[2],end[2];
1101 float *data,sky1,skynoise1,sky2,skynoise2,frac;
1106 npts1 = dd1->nx*dd1->ny;
1110 skyest(dd1->data,dd1->cdata,npts1,3.0,&sky1,&skynoise1);
1112 dd1->noise = skynoise1;
1113 dd1->sky /= dd1->expscale;
1120 for (i = 1; i < nim; i++) {
1125 dx = vircam_nint(dd1->xoff - dd2->xoff);
1126 dy = vircam_nint(dd1->yoff - dd2->yoff);
1134 start[0] = max(0,-dx);
1135 start[1] = max(0,-dy);
1136 end[0] = min(dd1->nx-1,(dd1->nx)-dx-1);
1137 end[1] = min(dd1->ny-1,(dd1->ny)-dy-1);
1142 npts = (end[0]-start[0]+1)*(end[1]-start[1]+1);
1143 frac = (float)npts/(
float)npts1;
1149 data = cpl_malloc(npts*
sizeof(*data));
1150 cdata = cpl_malloc(npts*
sizeof(*cdata));
1152 for (jj = start[1]; jj <= end[1]; jj++) {
1154 for (ii = start[0]; ii <= end[0]; ii++) {
1156 data[n] = (dd1->data)[ind];
1157 cdata[n++] = (dd1->cdata)[ind];
1160 skyest(data,cdata,npts,3.0,&sky1,&skynoise1);
1171 start[0] = max(0,dx);
1172 start[1] = max(0,dy);
1173 end[0] = min(dd2->nx-1,(dd2->nx)+dx-1);
1174 end[1] = min(dd2->ny-1,(dd2->ny)+dy-1);
1176 npts = (end[0]-start[0]+1)*(end[1]-start[1]+1);
1177 data = cpl_malloc(npts*
sizeof(*data));
1178 cdata = cpl_malloc(npts*
sizeof(*cdata));
1180 for (jj = start[1]; jj <= end[1]; jj++) {
1182 for (ii = start[0]; ii <= end[0]; ii++) {
1184 data[n] = dd2->data[ind];
1185 cdata[n++] = dd2->cdata[ind];
1188 skyest(data,cdata,npts,3.0,&sky2,&skynoise2);
1192 npts = (dd2->nx)*(dd2->ny);
1193 skyest(dd2->data,dd2->cdata,npts,3.0,&sky2,&skynoise2);
1198 dd2->sky = sky2/dd2->expscale;
1199 dd2->skydiff = sky1 - sky2;
1200 dd2->noise = skynoise2/dd2->expscale;
1201 if (dd2->noise != 0.0 && dd2->sky != 0.0)
1202 dd2->weight = (float)(pow(dd1->noise,2.0)/pow(dd2->noise,2.0));
1205 sumweight += dd2->weight;
1237 static void skyest(
float *data,
int *cdata,
long npts,
float thresh,
1238 float *skymed,
float *skynoise) {
1244 bpm = cpl_calloc(npts,
sizeof(*bpm));
1245 for (i = 0; i < npts; i++)
1246 bpm[i] = (cdata[i] == 0);
1250 vircam_qmedsig(data,bpm,npts,thresh,2,-1000.0,65535.0,skymed,skynoise);
1281 static cpl_table *mknewtab(vir_tfits *catref, dstrct *dd) {
1283 double xx,yy,xx2,yy2;
1290 nr = (int)cpl_table_get_nrow(newtab);
1294 x = cpl_table_get_data_float(newtab,
"X_coordinate");
1295 y = cpl_table_get_data_float(newtab,
"Y_coordinate");
1299 for (i = 0; i < nr; i++) {
1302 outloc(fileptrs->vwcs,xx,yy,dd->vwcs,NULL,&xx2,&yy2);
1326 static cpl_array *transinit(
void) {
1330 t = cpl_array_new(6,CPL_TYPE_DOUBLE);
1331 td = cpl_array_get_data_double(t);
1356 static void fileptrs_close(
void) {
1359 for (i = 0; i < nim; i++) {
1360 freespace((fileptrs+i)->vwcs);
1361 freearray((fileptrs+i)->trans);
1363 freespace(fileptrs);
1384 static mywcs *getwcsinfo(cpl_propertylist *plist) {
1390 w = cpl_malloc(
sizeof(mywcs));
1407 for (i = 0; i < 2; i++)
1408 w->crval[i] /= DEGRAD;
1409 for (i = 0; i < 4; i++)
1414 w->tand = tan(w->crval[1]);
1415 w->secd = 1.0/cos(w->crval[1]);
1422 static void tidy(
void) {
cpl_table * vircam_tfits_get_table(vir_tfits *p)
void vircam_qmedsig(float *data, unsigned char *bpm, long npts, float thresh, int niter, float lowv, float highv, float *median, float *sigma)
int vircam_pfits_get_pv23(const cpl_propertylist *plist, double *pv23)
Get the value of pv2_3.
int vircam_imstack(vir_fits **inf, vir_fits **inconf, vir_tfits **cats, int nimages, int nconfs, float lthr, float hthr, int method, int seeing, vir_fits **out, vir_fits **outc, int *status)
Stack images into a mean image using WCS info.
vir_fits * vircam_fits_wrap(cpl_image *im, vir_fits *model, cpl_propertylist *phu, cpl_propertylist *ehu)
int vircam_pfits_get_crpix2(const cpl_propertylist *plist, double *crpix2)
Get the value of crpix2.
int vircam_pfits_get_crval1(const cpl_propertylist *plist, double *crval1)
Get the value of crval1.
int vircam_pfits_get_exptime(const cpl_propertylist *plist, float *exptime)
Get the value of exposure time.
int vircam_pfits_get_crpix1(const cpl_propertylist *plist, double *crpix1)
Get the value of crpix1.
char * vircam_fits_get_fullname(vir_fits *p)
cpl_image * vircam_fits_get_image(vir_fits *p)
int vircam_pfits_get_crval2(const cpl_propertylist *plist, double *crval2)
Get the value of crval2.
int vircam_pfits_get_cd22(const cpl_propertylist *plist, double *cd22)
Get the value of cd2_2.
int vircam_pfits_get_cd12(const cpl_propertylist *plist, double *cd12)
Get the value of cd1_2.
int vircam_crpixshift(cpl_propertylist *p, double scalefac, double sh[])
int vircam_pfits_get_cd21(const cpl_propertylist *plist, double *cd21)
Get the value of cd2_1.
int vircam_pfits_get_naxis2(const cpl_propertylist *plist, long *naxis2)
Get the value of naxis2.
void seeing(ap_t *ap, int nrows, float *ellipt, float *pkht, float **areal, float *work, float *fwhm)
Work out the median seeing.
cpl_propertylist * vircam_fits_get_phu(vir_fits *p)
int vircam_pfits_get_naxis1(const cpl_propertylist *plist, long *naxis1)
Get the value of naxis1.
int vircam_pfits_get_pv25(const cpl_propertylist *plist, double *pv25)
Get the value of pv2_5.
cpl_propertylist * vircam_fits_get_ehu(vir_fits *p)
int vircam_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...
int vircam_pfits_get_pv21(const cpl_propertylist *plist, double *pv21)
Get the value of pv2_1.
int vircam_pfits_get_cd11(const cpl_propertylist *plist, double *cd11)
Get the value of cd1_1.
void vircam_prov(cpl_propertylist *p, vir_fits **inlist, int n)