fors_cpl_wcs-test.c

00001 /* $Id: fors_cpl_wcs-test.c,v 1.2 2008/02/07 14:41:21 cizzo Exp $
00002  *
00003  * This file is part of the ESO Common Pipeline Library
00004  * Copyright (C) 2001-2004 European Southern Observatory
00005  *
00006  * This program is free software; you can redistribute it and/or modify
00007  * it under the terms of the GNU General Public License as published by
00008  * the Free Software Foundation; either version 2 of the License, or
00009  * (at your option) any later version.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program; if not, write to the Free Software
00018  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019  */
00020 
00021 /*
00022  * $Author: cizzo $
00023  * $Date: 2008/02/07 14:41:21 $
00024  * $Revision: 1.2 $
00025  * $Name: fors-4_8_6 $
00026  */
00027 
00028 #ifdef HAVE_WCS
00029 
00030 /*----------------------------------------------------------------------------
00031                                    Includes
00032  ----------------------------------------------------------------------------*/
00033 
00034 #include <stdio.h>
00035 #include <stdlib.h>
00036 #include <string.h>
00037 #include <math.h>
00038 #include <float.h>
00039 
00040 #include <cpl_wcs.h>
00041 #include <cpl.h>
00042 //#include "cpl_tools.h"
00043 
00044 #define NSK 2
00045 #define NDK 13
00046 #define NIK 3
00047 
00048 
00049 
00050 #define fors_cpl_test(bool) \
00051   ((bool) ? (cpl_msg_debug(__FILE__, \
00052      "OK in line %d (CPL-error state: '%s' in %s): %s",__LINE__, \
00053        cpl_error_get_message(), cpl_error_get_where(), #bool), 0) \
00054     : (cpl_msg_error(__FILE__, \
00055      "Failure in line %d (CPL-error state: '%s' in %s): %s",__LINE__, \
00056        cpl_error_get_message(), cpl_error_get_where(), #bool), 1))
00057 
00058 
00059 
00060 
00061 
00062 static const char *skeys[NSK] = {"CTYPE1", "CTYPE2"};
00063 
00064 static const char *dkeys[NDK] = {"CRVAL1", "CRVAL2", "CRPIX1", "CRPIX2", 
00065                  "CD1_1", "CD1_2", "CD2_1", "CD2_2", "PV2_1",
00066                  "PV2_2", "PV2_3", "PV2_4", "PV2_5"};
00067 static const char *ikeys[NIK] = {"NAXIS","NAXIS1","NAXIS2"};
00068 
00069 
00070 static const char *svals[NSK] = {"RA---ZPN", "DEC--ZPN"};
00071 static const double dvals[NDK] = {5.57368333333, -72.0576388889, 5401.6, 6860.8,
00072                   5.81347849634012E-21, 9.49444444444444E-05,
00073                   -9.49444444444444E-05, -5.81347849634012E-21,
00074                   1.0, 0.0, 42.0, 0.0, 0.0};
00075 static const int ivals[NIK] = {2, 2048, 2048};
00076 
00077 #define NP 2
00078 static double physin[2*NP] = {1024.0, 1024.0, 1025.0, 1023.0};
00079 
00080 static double worldout[2*NP] = {3.825029720, -71.636524754,
00081                 3.824722171, -71.636616487};
00082 static double stdcout[2] = {-0.554171733, 0.415628800};
00083 
00084 
00085 static double worldin[2] = {3.824875946, -71.636570620};
00086 static double physout[2] = {1024.5, 1023.5};
00087 
00088 
00089 int main (void) {
00090     cpl_boolean is_debug;
00091     int i,nfail;
00092     cpl_propertylist *pl;
00093     cpl_wcs *wcs;
00094     cpl_matrix *from,*to;
00095     cpl_array *status;
00096     double d1,d2;
00097 
00098     /* Initialise */
00099 
00100     cpl_init(CPL_INIT_DEFAULT);
00101     cpl_msg_set_level(CPL_MSG_WARNING);
00102     cpl_msg_set_level_from_env();
00103     cpl_msg_set_domain_off();
00104     is_debug = cpl_msg_get_level() <= CPL_MSG_DEBUG ? TRUE : FALSE;
00105 
00106     /* Read in all the WCS properties, except for NAXIS? entries*/
00107 
00108     pl = cpl_propertylist_new();
00109     for (i = 0; i < NSK; i++) 
00110     cpl_propertylist_append_string(pl,skeys[i],svals[i]);
00111     for (i = 0; i < NDK; i++) 
00112     cpl_propertylist_append_double(pl,dkeys[i],dvals[i]);
00113 
00114     /* Now test cpl_wcs_new_from_propertylist to make sure we get the
00115        correct errors */
00116 
00117     nfail = 0;
00118     wcs = cpl_wcs_new_from_propertylist(NULL);
00119     nfail += fors_cpl_test(cpl_error_get_code() == CPL_ERROR_NULL_INPUT);
00120     nfail += fors_cpl_test(wcs == NULL);
00121     cpl_error_reset();
00122     if (wcs != NULL)
00123     cpl_wcs_delete(wcs);
00124     wcs = cpl_wcs_new_from_propertylist(pl);
00125     nfail += fors_cpl_test(cpl_error_get_code() == CPL_ERROR_NONE);
00126     nfail += fors_cpl_test(wcs != NULL);
00127     cpl_error_reset();
00128     if (wcs != NULL)
00129     cpl_wcs_delete(wcs);
00130 
00131     /* OK, now insert the rest of the propertylist */
00132 
00133     for (i = 0; i < NIK; i++) 
00134     cpl_propertylist_append_int(pl,ikeys[i],ivals[i]);
00135 
00136     /* Get a wcs structure */
00137 
00138     wcs = cpl_wcs_new_from_propertylist(pl);
00139     nfail += fors_cpl_test(wcs != NULL);
00140     cpl_propertylist_delete(pl);
00141 
00142     /* Test cpl_wcs_convert to see if we get the correct error messages */
00143 
00144     nfail += fors_cpl_test(cpl_wcs_convert(NULL,NULL,&to,&status,
00145                       CPL_WCS_PHYS2WORLD) == CPL_ERROR_NULL_INPUT);
00146     cpl_error_reset();
00147     nfail += fors_cpl_test(cpl_wcs_convert(wcs,NULL,&to,&status,
00148                       CPL_WCS_PHYS2WORLD) == CPL_ERROR_NULL_INPUT);
00149     cpl_error_reset();
00150 
00151     /* Ok, do a conversion of physical to world coordinates */
00152 
00153     cpl_msg_info("","Transform physical -> world (2 points)");
00154     from = cpl_matrix_wrap(NP,2,physin);
00155     cpl_wcs_convert(wcs,from,&to,&status,CPL_WCS_PHYS2WORLD);
00156     nfail += (cpl_error_get_code() != CPL_ERROR_NONE);
00157     cpl_error_reset();
00158     cpl_matrix_unwrap(from);
00159     
00160     /* Test the output values. The status should all be 0. The output matrix
00161        is compared to predifined world coordinate values */
00162 
00163     for (i = 0; i < NP; i++)
00164         nfail += fors_cpl_test(cpl_array_get_data_int(status)[i] == 0);
00165     d1 = fabs(worldout[0] - cpl_matrix_get(to,0,0));
00166     d2 = fabs(worldout[1] - cpl_matrix_get(to,0,1));
00167     cpl_msg_info("","phys1,phys2:   %15.9f %15.9f",physin[0],physin[1]);
00168     cpl_msg_info("","world1,world2: %15.9f %15.9f",worldout[0],worldout[1]);
00169     cpl_msg_info("","calc1,calc2:   %15.9f %15.9f",cpl_matrix_get(to,0,0),
00170         cpl_matrix_get(to,0,1));
00171     cpl_msg_info("","diff1,diff2:   %15.9f %15.9f",d1,d2);
00172     cpl_msg_info("","status:        %d",(cpl_array_get_data_int(status)[0]));
00173     nfail += fors_cpl_test(d1 < 1.0e-6);
00174     nfail += fors_cpl_test(d2 < 1.0e-6);
00175     d1 = fabs(worldout[2] - cpl_matrix_get(to,1,0));
00176     d2 = fabs(worldout[3] - cpl_matrix_get(to,1,1));
00177     cpl_msg_info("","phys1,phys2:   %15.9f %15.9f",physin[2],physin[3]);
00178     cpl_msg_info("","world1,world2: %15.9f %15.9f",worldout[2],worldout[3]);
00179     cpl_msg_info("","calc1,calc2:   %15.9f %15.9f",cpl_matrix_get(to,1,0),
00180         cpl_matrix_get(to,1,1));
00181     cpl_msg_info("","diff1,diff2:   %15.9f %15.9f",d1,d2);
00182     cpl_msg_info("","status:        %d",
00183          (cpl_array_get_data_int(status)[1]));
00184     nfail += fors_cpl_test(d1 < 1.0e-6);
00185     nfail += fors_cpl_test(d2 < 1.0e-6);
00186     cpl_matrix_delete(to);
00187     cpl_array_delete(status);
00188 
00189     /* Do world to physical conversion */
00190 
00191     cpl_msg_info("","Transform world -> physical");
00192     from = cpl_matrix_wrap(1,2,worldin);
00193 //    cpl_matrix_dump(from, stdout);
00194     cpl_wcs_convert(wcs,from,&to,&status,CPL_WCS_WORLD2PHYS);
00195     nfail += (cpl_error_get_code() != CPL_ERROR_NONE);
00196     cpl_error_reset();
00197     cpl_matrix_unwrap(from);
00198     
00199     /* Test the output values again */
00200 
00201     nfail += fors_cpl_test(cpl_array_get_data_int(status)[0] == 0);
00202     d1 = fabs(physout[0] - cpl_matrix_get(to,0,0));
00203     d2 = fabs(physout[1] - cpl_matrix_get(to,0,1));
00204     cpl_msg_info("","world1,world2: %15.9f %15.9f",worldin[0],worldin[1]);
00205     cpl_msg_info("","phys1,phys2:   %15.9f %15.9f",physout[0],physout[1]);
00206     cpl_msg_info("","calc1,calc2:   %15.9f %15.9f",cpl_matrix_get(to,0,0),
00207         cpl_matrix_get(to,0,1));
00208     cpl_msg_info("","diff1,diff2:   %15.9f %15.9f",d1,d2);
00209     cpl_msg_info("","status:        %d",(cpl_array_get_data_int(status)[0]));
00210     nfail += fors_cpl_test(d1 < 2.5e-4);
00211     nfail += fors_cpl_test(d2 < 2.5e-4);
00212     cpl_matrix_delete(to);
00213     cpl_array_delete(status);
00214 
00215     /* Do physical to standard */
00216 
00217     cpl_msg_info("","Transform physical -> standard");
00218     from = cpl_matrix_wrap(1,2,physin);
00219 //    cpl_matrix_dump(from, stdout);
00220 
00221     cpl_wcs_convert(wcs,from,&to,&status,CPL_WCS_PHYS2STD);
00222     nfail += (cpl_error_get_code() != CPL_ERROR_NONE);
00223     cpl_error_reset();
00224     cpl_matrix_unwrap(from);
00225 
00226     /* Test the output values again */
00227 
00228     nfail += fors_cpl_test(cpl_array_get_data_int(status)[0] == 0);
00229     d1 = fabs(stdcout[0] - cpl_matrix_get(to,0,0));
00230     d2 = fabs(stdcout[1] - cpl_matrix_get(to,0,1));
00231     cpl_msg_info("","phys1,phys2:   %15.9f %15.9f",physin[0],physin[1]);
00232     cpl_msg_info("","std1,std2:     %15.9f %15.9f",stdcout[0],stdcout[1]);
00233     cpl_msg_info("","calc1,calc2:   %15.9f %15.9f",cpl_matrix_get(to,0,0),
00234         cpl_matrix_get(to,0,1));
00235     cpl_msg_info("","diff1,diff2:   %15.9f %15.9f",d1,d2);
00236     cpl_msg_info("","status:        %d",(cpl_array_get_data_int(status)[0]));
00237     nfail += fors_cpl_test(d1 < 1.7e-9);
00238     nfail += fors_cpl_test(d2 < 1.7e-9);
00239     cpl_matrix_delete(to);
00240     cpl_array_delete(status);
00241 
00242     /* Do world to standard */
00243 
00244     cpl_msg_info("","Transform world -> standard");
00245     from = cpl_matrix_wrap(1,2,worldout);
00246 //    cpl_matrix_dump(from, stdout);
00247 
00248     cpl_wcs_convert(wcs,from,&to,&status,CPL_WCS_WORLD2STD);
00249     nfail += (cpl_error_get_code() != CPL_ERROR_NONE);
00250     cpl_error_reset();
00251     cpl_matrix_unwrap(from);
00252 
00253     /* Test the output values again */
00254 
00255     nfail += fors_cpl_test(cpl_array_get_data_int(status)[0] == 0);
00256     d1 = fabs(stdcout[0] - cpl_matrix_get(to,0,0));
00257     d2 = fabs(stdcout[1] - cpl_matrix_get(to,0,1));
00258     cpl_msg_info("","world1,world2: %15.9f %15.9f",worldout[0],worldout[1]);
00259     cpl_msg_info("","std1,std2:     %15.9f %15.9f",stdcout[0],stdcout[1]);
00260     cpl_msg_info("","calc1,calc2:   %15.9f %15.9f",cpl_matrix_get(to,0,0),
00261         cpl_matrix_get(to,0,1));
00262     cpl_msg_info("","diff1,diff2:   %15.9f %15.9f",d1,d2);
00263     cpl_msg_info("","status:        %d",(cpl_array_get_data_int(status)[0]));
00264     nfail += fors_cpl_test(d1 < 1.7e-9);
00265     nfail += fors_cpl_test(d2 < 1.7e-9);
00266     cpl_matrix_delete(to);
00267     cpl_array_delete(status);
00268 
00269     /* Tidy */
00270 
00271     cpl_wcs_delete(wcs);
00272 
00273     /* Are there any memory leaks (NB: this only covers CPL. Memory is 
00274        allocated separately by WCSLIB */
00275 
00276     nfail += fors_cpl_test(cpl_memory_is_empty());
00277 
00278     /* Did any tests fail? */
00279 
00280     cpl_msg_info("","%d test(s) failed",nfail);
00281 
00282     /* Tidy and exit */
00283     
00284     if (is_debug || !cpl_memory_is_empty())
00285     cpl_memory_dump();
00286     cpl_end();
00287     return(nfail);
00288 }
00289     
00290     
00291 #else
00292 
00293 #include <test.h>
00294 #include <cpl.h>
00295 #include <stdio.h>
00296 #include <stdlib.h>
00297 int main(void)
00298 {
00299     TEST_INIT;
00300     
00301     cpl_msg_info(cpl_func, "WCS module not available");
00302 
00303     TEST_END;
00304 }
00305     
00306 #endif
00307         
00308     
00309 
00310 
00311 
00312     

Generated on Fri Mar 4 09:46:00 2011 for FORS Pipeline Reference Manual by  doxygen 1.4.7