LAL  7.5.0.1-89842e6
TranslateAnglesTest.c
Go to the documentation of this file.
1 //
2 // Copyright (C) 2015 Reinhard Prix
3 //
4 // This program is free software; you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation; either version 2 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with with program; see the file COPYING. If not, write to the
16 // Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
17 // MA 02110-1301 USA
18 //
19 
20 // Tests of the unit conversion functions in the UserInputParser.[ch] module
21 
22 #include <stdio.h>
23 #include <math.h>
24 #include <string.h>
25 
26 #include <lal/XLALError.h>
27 #include <lal/LALMalloc.h>
28 #include <lal/LALConstants.h>
29 #include <lal/TranslateAngles.h>
30 
31 // ---------- local prototypes ----------
32 int test_HMS_RAD ( void );
33 int test_DMS_RAD ( void );
34 
35 // ==================== function definitions ====================
36 int main(void)
37 {
38 
39  // ---------- test angle conversions ----------
42 
43  // check for memory leaks
45 
46  return EXIT_SUCCESS;
47 
48 } // main()
49 
50 ///
51 /// test angle conversions between HMS and RAD: XLALTranslateHMStoRAD() and XLALTranslateRADtoHMS()
52 ///
53 int
54 test_HMS_RAD ( void )
55 {
56  REAL8 diff, tol = 3e-15;
57  REAL8 rads, radsRef;
58  const char *hmsRef;
59  char *hms;
60 
61  hmsRef = "06:52:16.8750000";
62  radsRef = 1.79891631418447; // octave> hms_to_rad ( "6:52:16.875" )
63  XLAL_CHECK ( XLALTranslateHMStoRAD ( &rads, hmsRef ) == XLAL_SUCCESS, XLAL_EFUNC );
64  XLAL_CHECK ( (diff=fabs(rads - radsRef)) < tol, XLAL_ETOL, "Result XLALTranslateHMStoRAD(%s)=%.16g differs from reference '%.16g' by %g > tolerance %g\n", hmsRef, rads, radsRef, diff, tol );
65 
66  XLAL_CHECK ( (hms = XLALTranslateRADtoHMS ( rads )) != NULL, XLAL_EFUNC );
67  XLAL_CHECK ( strcmp ( hms, hmsRef ) == 0, XLAL_ETOL, "Returned hms string '%s' differs from input '%s'\n", hms, hmsRef );
68  XLALPrintInfo ("Translated HMS '%s' into %.16g rad, and back into '%s'\n", hmsRef, rads, hms );
69  XLALFree ( hms );
70 
71  /* test with form HH:MM */
72  hmsRef = "06:52";
73  radsRef = 1.797689129554159; // pulsarpputils.ra_to_rad ( "06:52" )
74  XLAL_CHECK ( XLALTranslateHMStoRAD ( &rads, hmsRef ) == XLAL_SUCCESS, XLAL_EFUNC );
75  XLAL_CHECK ( (diff=fabs(rads - radsRef)) < tol, XLAL_ETOL, "Result XLALTranslateHMStoRAD(%s)=%.16g differs from reference '%.16g' by %g > tolerance %g\n", hmsRef, rads, radsRef, diff, tol );
76 
77  XLAL_CHECK ( (hms = XLALTranslateRADtoHMS ( rads )) != NULL, XLAL_EFUNC );
78  XLAL_CHECK ( strcmp ( hms, "06:52:00.0000000" ) == 0, XLAL_ETOL, "Returned hms string '%s' differs from input '%s'\n", hms, hmsRef );
79  XLALPrintInfo ("Translated HMS '%s' into %.16g rad, and back into '%s'\n", hmsRef, rads, hms );
80  XLALFree ( hms );
81 
82  /* test with form HH */
83  hmsRef = "06";
84  radsRef = 1.570796326794897; // pulsarpputils.ra_to_rad ( "06" )
85  XLAL_CHECK ( XLALTranslateHMStoRAD ( &rads, hmsRef ) == XLAL_SUCCESS, XLAL_EFUNC );
86  XLAL_CHECK ( (diff=fabs(rads - radsRef)) < tol, XLAL_ETOL, "Result XLALTranslateHMStoRAD(%s)=%.16g differs from reference '%.16g' by %g > tolerance %g\n", hmsRef, rads, radsRef, diff, tol );
87 
88  XLAL_CHECK ( (hms = XLALTranslateRADtoHMS ( rads )) != NULL, XLAL_EFUNC );
89  XLAL_CHECK ( strcmp ( hms, "06:00:00.0000000" ) == 0, XLAL_ETOL, "Returned hms string '%s' differs from input '%s'\n", hms, hmsRef );
90  XLALPrintInfo ("Translated HMS '%s' into %.16g rad, and back into '%s'\n", hmsRef, rads, hms );
91  XLALFree ( hms );
92 
93  hmsRef = "00:52:16.8753234";
94  radsRef = 0.228120010907883; // octave> hms_to_rad ( "00:52:16.8753234" )
95  XLAL_CHECK ( XLALTranslateHMStoRAD ( &rads, hmsRef ) == XLAL_SUCCESS, XLAL_EFUNC );
96  XLAL_CHECK ( (diff=fabs(rads - radsRef)) < tol, XLAL_ETOL, "Result XLALTranslateHMStoRAD(%s)=%.16g differs from reference '%.16g' by %g > tolerance %g\n", hmsRef, rads, radsRef, diff, tol );
97 
98  XLAL_CHECK ( (hms = XLALTranslateRADtoHMS ( rads )) != NULL, XLAL_EFUNC );
99  XLAL_CHECK ( strcmp ( hms, hmsRef ) == 0, XLAL_ETOL, "Returned hms string '%s' differs from input '%s'\n", hms, hmsRef );
100  XLALPrintInfo ("Translated HMS '%s' into %.16g rad, and back into '%s'\n", hmsRef, rads, hms );
101  XLALFree ( hms );
102 
103  /* test with form HH:MM */
104  hmsRef = "00:52";
105  radsRef = 0.226892802759263; // pulsarpputils.ra_to_rad ( "00:52" )
106  XLAL_CHECK ( XLALTranslateHMStoRAD ( &rads, hmsRef ) == XLAL_SUCCESS, XLAL_EFUNC );
107  XLAL_CHECK ( (diff=fabs(rads - radsRef)) < tol, XLAL_ETOL, "Result XLALTranslateHMStoRAD(%s)=%.16g differs from reference '%.16g' by %g > tolerance %g\n", hmsRef, rads, radsRef, diff, tol );
108 
109  XLAL_CHECK ( (hms = XLALTranslateRADtoHMS ( rads )) != NULL, XLAL_EFUNC );
110  XLAL_CHECK ( strcmp ( hms, "00:52:00.0000000" ) == 0, XLAL_ETOL, "Returned hms string '%s' differs from input '%s'\n", hms, hmsRef );
111  XLALPrintInfo ("Translated HMS '%s' into %.16g rad, and back into '%s'\n", hmsRef, rads, hms );
112  XLALFree ( hms );
113 
114  /* test with form HH */
115  hmsRef = "00";
116  radsRef = 0.0; // pulsarpputils.ra_to_rad ( "00" )
117  XLAL_CHECK ( XLALTranslateHMStoRAD ( &rads, hmsRef ) == XLAL_SUCCESS, XLAL_EFUNC );
118  XLAL_CHECK ( (diff=fabs(rads - radsRef)) < tol, XLAL_ETOL, "Result XLALTranslateHMStoRAD(%s)=%.16g differs from reference '%.16g' by %g > tolerance %g\n", hmsRef, rads, radsRef, diff, tol );
119 
120  XLAL_CHECK ( (hms = XLALTranslateRADtoHMS ( rads )) != NULL, XLAL_EFUNC );
121  XLAL_CHECK ( strcmp ( hms, "00:00:00.0000000" ) == 0, XLAL_ETOL, "Returned hms string '%s' differs from input '%s'\n", hms, hmsRef );
122  XLALPrintInfo ("Translated HMS '%s' into %.16g rad, and back into '%s'\n", hmsRef, rads, hms );
123  XLALFree ( hms );
124 
125  return XLAL_SUCCESS;
126 } // test_HMS_RAD()
127 
128 ///
129 /// test angle conversions between DMS and RAD: XLALTranslateDMStoRAD() and XLALTranslateRADtoDMS()
130 ///
131 int
132 test_DMS_RAD ( void )
133 {
134  REAL8 diff, tol = 3e-15;
135  REAL8 rads, radsRef;
136  const char *dmsRef;
137  char *dms;
138 
139  dmsRef = "-06:52:16.87500";
140  radsRef = -0.119927754278965; // octave> dms_to_rad ( "-06:52:16.875" )
141  XLAL_CHECK ( XLALTranslateDMStoRAD ( &rads, dmsRef ) == XLAL_SUCCESS, XLAL_EFUNC );
142  XLAL_CHECK ( (diff=fabs(rads - radsRef)) < tol, XLAL_ETOL, "Result XLALTranslateDMStoRAD(%s)=%.16g differs from reference '%.16g' by %g > tolerance %g\n", dmsRef, rads, radsRef, diff, tol );
143 
144  XLAL_CHECK ( (dms = XLALTranslateRADtoDMS ( rads )) != NULL, XLAL_EFUNC );
145  XLAL_CHECK ( strcmp ( dms, dmsRef ) == 0, XLAL_ETOL, "Returned dms string '%s' differs from input '%s'\n", dms, dmsRef );
146  XLALPrintInfo ("Translated DMS '%s' into %.16g rad, and back into '%s'\n", dmsRef, rads, dms );
147  XLALFree ( dms );
148 
149  /* test with form DD:MM */
150  dmsRef = "-06:52";
151  radsRef = -0.119845941970277; // pulsarpputils.ra_to_rad ( "-06:52" )
152  XLAL_CHECK ( XLALTranslateDMStoRAD ( &rads, dmsRef ) == XLAL_SUCCESS, XLAL_EFUNC );
153  XLAL_CHECK ( (diff=fabs(rads - radsRef)) < tol, XLAL_ETOL, "Result XLALTranslateDMStoRAD(%s)=%.16g differs from reference '%.16g' by %g > tolerance %g\n", dmsRef, rads, radsRef, diff, tol );
154 
155  XLAL_CHECK ( (dms = XLALTranslateRADtoDMS ( rads )) != NULL, XLAL_EFUNC );
156  XLAL_CHECK ( strcmp ( dms, "-06:52:00.00000" ) == 0, XLAL_ETOL, "Returned dms string '%s' differs from input '%s'\n", dms, dmsRef );
157  XLALPrintInfo ("Translated DMS '%s' into %.16g rad, and back into '%s'\n", dmsRef, rads, dms );
158  XLALFree ( dms );
159 
160  /* test with form DD */
161  dmsRef = "-06";
162  radsRef = -0.104719755119660; // pulsarpputils.ra_to_rad ( "-06" )
163  XLAL_CHECK ( XLALTranslateDMStoRAD ( &rads, dmsRef ) == XLAL_SUCCESS, XLAL_EFUNC );
164  XLAL_CHECK ( (diff=fabs(rads - radsRef)) < tol, XLAL_ETOL, "Result XLALTranslateDMStoRAD(%s)=%.16g differs from reference '%.16g' by %g > tolerance %g\n", dmsRef, rads, radsRef, diff, tol );
165 
166  XLAL_CHECK ( (dms = XLALTranslateRADtoDMS ( rads )) != NULL, XLAL_EFUNC );
167  XLAL_CHECK ( strcmp ( dms, "-06:00:00.00000" ) == 0, XLAL_ETOL, "Returned dms string '%s' differs from input '%s'\n", dms, dmsRef );
168  XLALPrintInfo ("Translated DMS '%s' into %.16g rad, and back into '%s'\n", dmsRef, rads, dms );
169  XLALFree ( dms );
170 
171  dmsRef = "+00:52:16.87532";
172  radsRef = 0.0152080007107085; // octave> dms_to_rad ( "00:52:16.87532");
173  XLAL_CHECK ( XLALTranslateDMStoRAD ( &rads, dmsRef ) == XLAL_SUCCESS, XLAL_EFUNC );
174  XLAL_CHECK ( (diff=fabs(rads - radsRef)) < tol, XLAL_ETOL, "Result XLALTranslateDMStoRAD(%s)=%.16g differs from reference '%.16g' by %g > tolerance %g\n", dmsRef, rads, radsRef, diff, tol );
175 
176  XLAL_CHECK ( (dms = XLALTranslateRADtoDMS ( rads )) != NULL, XLAL_EFUNC );
177  XLAL_CHECK ( strcmp ( dms, dmsRef ) == 0, XLAL_ETOL, "Returned dms string '%s' differs from input '%s'\n", dms, dmsRef );
178  XLALPrintInfo ("Translated DMS '%s' into %.16g rad, and back into '%s'\n", dmsRef, rads, dms );
179  XLALFree ( dms );
180 
181  /* test with form DD:MM */
182  dmsRef = "+00:52";
183  radsRef = 0.015126186850618; // pulsarpputils.ra_to_rad ( "+00:52" )
184  XLAL_CHECK ( XLALTranslateDMStoRAD ( &rads, dmsRef ) == XLAL_SUCCESS, XLAL_EFUNC );
185  XLAL_CHECK ( (diff=fabs(rads - radsRef)) < tol, XLAL_ETOL, "Result XLALTranslateDMStoRAD(%s)=%.16g differs from reference '%.16g' by %g > tolerance %g\n", dmsRef, rads, radsRef, diff, tol );
186 
187  XLAL_CHECK ( (dms = XLALTranslateRADtoDMS ( rads )) != NULL, XLAL_EFUNC );
188  XLAL_CHECK ( strcmp ( dms, "+00:52:00.00000" ) == 0, XLAL_ETOL, "Returned dms string '%s' differs from input '%s'\n", dms, dmsRef );
189  XLALPrintInfo ("Translated DMS '%s' into %.16g rad, and back into '%s'\n", dmsRef, rads, dms );
190  XLALFree ( dms );
191 
192  /* test with form DD:MM */
193  dmsRef = "+00";
194  radsRef = 0.0; // pulsarpputils.ra_to_rad ( "+00" )
195  XLAL_CHECK ( XLALTranslateDMStoRAD ( &rads, dmsRef ) == XLAL_SUCCESS, XLAL_EFUNC );
196  XLAL_CHECK ( (diff=fabs(rads - radsRef)) < tol, XLAL_ETOL, "Result XLALTranslateDMStoRAD(%s)=%.16g differs from reference '%.16g' by %g > tolerance %g\n", dmsRef, rads, radsRef, diff, tol );
197 
198  XLAL_CHECK ( (dms = XLALTranslateRADtoDMS ( rads )) != NULL, XLAL_EFUNC );
199  XLAL_CHECK ( strcmp ( dms, "+00:00:00.00000" ) == 0, XLAL_ETOL, "Returned dms string '%s' differs from input '%s'\n", dms, dmsRef );
200  XLALPrintInfo ("Translated DMS '%s' into %.16g rad, and back into '%s'\n", dmsRef, rads, dms );
201  XLALFree ( dms );
202 
203  return XLAL_SUCCESS;
204 } // test_DMS_RAD()
void LALCheckMemoryLeaks(void)
Definition: LALMalloc.c:784
int test_HMS_RAD(void)
test angle conversions between HMS and RAD: XLALTranslateHMStoRAD() and XLALTranslateRADtoHMS()
int main(void)
int test_DMS_RAD(void)
test angle conversions between DMS and RAD: XLALTranslateDMStoRAD() and XLALTranslateRADtoDMS()
int XLALPrintInfo(const char *fmt,...)
Definition: XLALError.c:90
double REAL8
Double precision real floating-point number (8 bytes).
#define XLALFree(p)
Definition: LALMalloc.h:47
int XLALTranslateHMStoRAD(REAL8 *radians, const CHAR *hms)
Translate a string representing an angle in the form "hours:minutes:seconds" into radians.
CHAR * XLALTranslateRADtoHMS(REAL8 radians)
Translate (longitude, right-ascencsion, RA) radians into hours:minutes:seconds (HMS) format,...
int XLALTranslateDMStoRAD(REAL8 *radians, const CHAR *dms)
Translate a string representing an angle in the form "degrees:minutes:seconds" into radians.
CHAR * XLALTranslateRADtoDMS(REAL8 radians)
Translate (latitude, declination, DEC) radians into "sign*degrees:minutes:seconds" (DMS) format,...
#define XLAL_CHECK(assertion,...)
Macro to test an assertion and invoke a failure if it is not true in a function that returns an integ...
Definition: XLALError.h:810
#define XLAL_CHECK_MAIN(assertion,...)
Macro to test an assertion and invoke a failure if it is not true in a C main() routine.
Definition: XLALError.h:885
@ XLAL_SUCCESS
Success return value (not an error number)
Definition: XLALError.h:401
@ XLAL_EFUNC
Internal function call failed bit: "or" this with existing error number.
Definition: XLALError.h:462
@ XLAL_ETOL
Failed to reach specified tolerance.
Definition: XLALError.h:458