39 #include "vircam_mods.h"
40 #include "vircam_stats.h"
41 #include "vircam_utils.h"
45 #define NGRIDMAX_XY 61
46 #define NGRIDMAX_STD 31
48 static cpl_table *vircam_mkmstd_table(cpl_table *objtab, cpl_table *stdstab);
105 float *xoffset,
float *yoffset,
int *nm,
106 cpl_table **outtab,
int *status) {
108 float *xprog,*yprog,*xtemp,*ytemp,aveden,errlim,xoffbest,yoffbest,xoff;
109 float yoff,x,y,*xoffs,*yoffs;
110 const char *fctid =
"vircam_matchxy";
111 int nprog,ntemp,ngrid,ngrid2,ibest,ig,jg,nmatch,k,jm;
119 if (*status != VIR_OK)
124 nprog = (int)cpl_table_get_nrow(progtab);
125 ntemp = (int)cpl_table_get_nrow(
template);
127 cpl_msg_warning(fctid,
"Program table has no rows");
129 }
else if (ntemp == 0) {
130 cpl_msg_warning(fctid,
"Template table has no rows");
136 p = cpl_propertylist_new();
137 cpl_propertylist_append_bool(p,
"Y_coordinate",0);
138 if (cpl_table_sort(progtab,p) != CPL_ERROR_NONE) {
139 cpl_propertylist_delete(p);
142 if (cpl_table_sort(
template,p) != CPL_ERROR_NONE) {
143 cpl_propertylist_delete(p);
146 cpl_propertylist_delete(p);
150 xprog = cpl_table_get_data_float(progtab,
"X_coordinate");
151 yprog = cpl_table_get_data_float(progtab,
"Y_coordinate");
152 xtemp = cpl_table_get_data_float(
template,
"X_coordinate");
153 ytemp = cpl_table_get_data_float(
template,
"Y_coordinate");
154 if (xprog == NULL || yprog == NULL || xtemp == NULL || ytemp == NULL)
159 aveden = (float)ntemp/(
float)(NX*NY);
160 errlim = 1.0/sqrt(4.0*CPL_MATH_PI*aveden);
161 errlim = min(errlim,15.0);
162 ngrid = (int)(srad/errlim);
163 ngrid = (ngrid/2)*2 + 1;
164 ngrid = max(5,min(NGRIDMAX_XY,ngrid));
165 ngrid2 = ngrid/2 + 1;
172 for (ig = -ngrid2; ig <= ngrid2; ig++) {
173 xoff = (float)ig*errlim*CPL_MATH_SQRT2;
174 for (jg = -ngrid2; jg <= ngrid2; jg++) {
175 yoff = (float)jg*errlim*CPL_MATH_SQRT2;
177 for (k = 0; k < nprog; k++) {
183 if (nmatch > ibest) {
194 xoffs = cpl_malloc(nprog*
sizeof(*xoffs));
195 yoffs = cpl_malloc(nprog*
sizeof(*yoffs));
200 for (k = 0; k < nprog; k++) {
201 x = xprog[k] + xoffbest;
202 y = yprog[k] + yoffbest;
205 xoffs[nmatch] = xtemp[jm] - xprog[k];
206 yoffs[nmatch] = ytemp[jm] - yprog[k];
221 *outtab = cpl_table_new((cpl_size)nprog);
222 cpl_table_new_column(*outtab,
"X_coordinate_1",CPL_TYPE_FLOAT);
223 cpl_table_new_column(*outtab,
"Y_coordinate_1",CPL_TYPE_FLOAT);
224 cpl_table_new_column(*outtab,
"X_coordinate_2",CPL_TYPE_FLOAT);
225 cpl_table_new_column(*outtab,
"Y_coordinate_2",CPL_TYPE_FLOAT);
227 for (k = 0; k < nprog; k++) {
228 x = xprog[k] + *xoffset;
229 y = yprog[k] + *yoffset;
232 cpl_table_set_float(*outtab,
"X_coordinate_1",(cpl_size)nmatch,
234 cpl_table_set_float(*outtab,
"Y_coordinate_1",(cpl_size)nmatch,
236 cpl_table_set_float(*outtab,
"X_coordinate_2",(cpl_size)nmatch,
238 cpl_table_set_float(*outtab,
"Y_coordinate_2",(cpl_size)nmatch,
243 cpl_table_set_size(*outtab,(cpl_size)nmatch);
300 cpl_table **outtab,
int *status) {
301 const char *fctid =
"vircam_matchstds";
303 int nobj,nstd,ngrid,ngrid2,ibest,ig,jg,nmatch,k,*matches,jm,l,dont,null;
304 float *xstd,*ystd,*xobj,*yobj,aveden,errlim,xoffbest,yoffbest,*xoffs;
305 float *yoffs,x,y,xx2,yy2,r2,xx1,yy1,r1,xoffmed,sigx,yoffmed,sigy,xoff,yoff;
312 if (*status != VIR_OK)
317 nobj = (int)cpl_table_get_nrow(objtab);
318 nstd = (int)cpl_table_get_nrow(stdstab);
320 cpl_msg_warning(fctid,
"Object table has no rows");
321 mstds = vircam_mkmstd_table(objtab,stdstab);
322 *outtab = cpl_table_extract_selected(mstds);
323 cpl_table_delete(mstds);
325 }
else if (nstd == 0) {
326 cpl_msg_warning(fctid,
"Standards RA/DEC table has no rows");
327 mstds = vircam_mkmstd_table(objtab,stdstab);
328 *outtab = cpl_table_extract_selected(mstds);
329 cpl_table_delete(mstds);
335 p = cpl_propertylist_new();
336 cpl_propertylist_append_bool(p,
"Y_coordinate",0);
337 if (cpl_table_sort(objtab,p) != CPL_ERROR_NONE) {
338 cpl_propertylist_delete(p);
341 cpl_propertylist_erase(p,
"Y_coordinate");
342 cpl_propertylist_append_bool(p,
"ypredict",0);
343 if (cpl_table_sort(stdstab,p) != CPL_ERROR_NONE) {
344 cpl_propertylist_delete(p);
347 cpl_propertylist_delete(p);
351 xobj = cpl_table_get_data_float(objtab,
"X_coordinate");
352 yobj = cpl_table_get_data_float(objtab,
"Y_coordinate");
353 xstd = cpl_table_get_data_float(stdstab,
"xpredict");
354 ystd = cpl_table_get_data_float(stdstab,
"ypredict");
355 if (xstd == NULL || ystd == NULL || xobj == NULL || yobj == NULL)
360 aveden = (float)max(nstd,nobj)/(float)(NX*NY);
361 errlim = 1.0/sqrt(4.0*CPL_MATH_PI*aveden);
362 errlim = min(errlim,15.0);
363 ngrid = (int)(srad/errlim);
364 ngrid = (ngrid/2)*2 + 1;
365 ngrid = max(5,min(NGRIDMAX_STD,ngrid));
366 ngrid2 = ngrid/2 + 1;
373 for (ig = -ngrid2; ig <= ngrid2; ig++) {
374 xoff = (float)ig*errlim*CPL_MATH_SQRT2;
375 for (jg = -ngrid2; jg <= ngrid2; jg++) {
376 yoff = (float)jg*errlim*CPL_MATH_SQRT2;
378 for (k = 0; k < nobj; k++) {
384 if (nmatch > ibest) {
395 xoffs = cpl_malloc(nstd*
sizeof(*xoffs));
396 yoffs = cpl_malloc(nstd*
sizeof(*yoffs));
397 matches = cpl_malloc(nstd*
sizeof(*matches));
398 for (k = 0; k < nstd; k++)
404 for (k = 0; k < nstd; k++) {
405 x = xstd[k] - xoffbest;
406 y = ystd[k] - yoffbest;
412 r2 = sqrt(xx2*xx2 + yy2*yy2);
413 for (l = 0; l < nstd; l++) {
414 if (matches[l] == jm) {
415 xx1 = xobj[jm] - (xstd[l] - xoffbest);
416 yy1 = yobj[jm] - (ystd[l] - yoffbest);
417 r1 = sqrt(xx1*xx1 + yy1*yy1);
432 for (k = 0; k < nstd; k++) {
435 xoffs[nmatch] = xobj[jm] - xstd[k];
436 yoffs[nmatch] = yobj[jm] - ystd[k];
455 errlim = 3.0*max(sigx,sigy);
456 for (k = 0; k < nstd; k++)
458 for (k = 0; k < nstd; k++) {
459 x = xstd[k] + xoffmed;
460 y = ystd[k] + yoffmed;
466 r2 = sqrt(xx2*xx2 + yy2*yy2);
467 for (l = 0; l < nstd; l++) {
468 if (matches[l] == jm) {
469 xx1 = xobj[jm] - (xstd[l] + xoffmed);
470 yy1 = yobj[jm] - (ystd[l] + yoffmed);
471 r1 = sqrt(xx1*xx1 + yy1*yy1);
489 mstds = cpl_table_duplicate(stdstab);
490 colname = (
char *)cpl_table_get_column_name(objtab);
491 while (colname != NULL) {
492 if (strcmp(colname,
"RA") && strcmp(colname,
"DEC"))
493 cpl_table_new_column(mstds,colname,
494 cpl_table_get_column_type(objtab,colname));
495 colname = (
char *)cpl_table_get_column_name(NULL);
497 cpl_table_unselect_all(mstds);
501 for (k = 0; k < nstd; k++) {
504 colname = (
char *)cpl_table_get_column_name(objtab);
505 while (colname != NULL) {
506 if (!strcmp(colname,
"RA") || !strcmp(colname,
"DEC")) {
507 colname = (
char *)cpl_table_get_column_name(NULL);
511 switch (cpl_table_get_column_type(objtab,colname)) {
513 cpl_table_set_int(mstds,colname,(cpl_size)k,
514 cpl_table_get_int(objtab,colname,
515 (cpl_size)jm,&null));
518 cpl_table_set_float(mstds,colname,(cpl_size)k,
519 cpl_table_get_float(objtab,colname,
520 (cpl_size)jm,&null));
522 case CPL_TYPE_DOUBLE:
523 cpl_table_set_double(mstds,colname,(cpl_size)k,
524 cpl_table_get_double(objtab,colname,
525 (cpl_size)jm,&null));
528 cpl_table_set_float(mstds,colname,(cpl_size)k,
529 cpl_table_get_float(objtab,colname,
530 (cpl_size)jm,&null));
533 colname = (
char *)cpl_table_get_column_name(NULL);
535 cpl_table_select_row(mstds,(cpl_size)k);
541 *outtab = cpl_table_extract_selected(mstds);
542 cpl_table_delete(mstds);
552 extern int vircam_tpoffset(cpl_table *progtab, cpl_table *
template,
553 const cpl_wcs *progwcs,
const cpl_wcs *tempwcs,
554 float srad,
double *xoffset,
double *yoffset,
555 int *nm,
float *xoff_pix,
float *yoff_pix,
557 int nprog,ntemp,nmatch,k,jm;
558 const char *fctid =
"vircam_tpoffset";
559 float *xprog,*yprog,*xtemp,*ytemp,x,y,xoff,yoff;
560 double *xoffs,*yoffs;
561 cpl_matrix *in,*outt,*outp;
572 if (*status != VIR_OK)
577 (void)
vircam_matchxy(progtab,
template,srad,&xoff,&yoff,&nmatch,&outxy,
580 if (*status != VIR_OK) {
581 cpl_msg_warning(fctid,
"Error getting xy offset");
590 nprog = (int)cpl_table_get_nrow(progtab);
591 ntemp = (int)cpl_table_get_nrow(
template);
592 xprog = cpl_table_get_data_float(progtab,
"X_coordinate");
593 yprog = cpl_table_get_data_float(progtab,
"Y_coordinate");
594 xtemp = cpl_table_get_data_float(
template,
"X_coordinate");
595 ytemp = cpl_table_get_data_float(
template,
"Y_coordinate");
600 xoffs = cpl_malloc(nprog*
sizeof(*xoffs));
601 yoffs = cpl_malloc(nprog*
sizeof(*yoffs));
602 in = cpl_matrix_new(1,2);
607 for (k = 0; k < nprog; k++) {
612 cpl_matrix_set(in,0,0,(
double)xtemp[jm]);
613 cpl_matrix_set(in,0,1,(
double)ytemp[jm]);
614 cpl_wcs_convert(tempwcs,in,&outt,&st,CPL_WCS_PHYS2WORLD);
615 cpl_array_delete(st);
616 cpl_matrix_set(in,0,0,(
double)xprog[k]);
617 cpl_matrix_set(in,0,1,(
double)yprog[k]);
618 cpl_wcs_convert(progwcs,in,&outp,&st,CPL_WCS_PHYS2WORLD);
619 cpl_array_delete(st);
620 xoffs[nmatch] = cpl_matrix_get(outt,0,0) - cpl_matrix_get(outp,0,0);
621 yoffs[nmatch] = cpl_matrix_get(outt,0,1) - cpl_matrix_get(outp,0,1);
623 cpl_matrix_delete(outt);
624 cpl_matrix_delete(outp);
638 cpl_matrix_delete(in);
666 static cpl_table *vircam_mkmstd_table(cpl_table *objtab, cpl_table *stdstab) {
672 mstds = cpl_table_duplicate(stdstab);
677 colname = (
char *)cpl_table_get_column_name(objtab);
678 while (colname != NULL) {
679 if (strcmp(colname,
"RA") && strcmp(colname,
"DEC"))
680 cpl_table_new_column(mstds,colname,
681 cpl_table_get_column_type(objtab,colname));
682 colname = (
char *)cpl_table_get_column_name(NULL);
684 cpl_table_unselect_all(mstds);