From 5e082008104e6c40161f4933181f309b75be89ad Mon Sep 17 00:00:00 2001 From: Brigitta Sipocz Date: Fri, 8 Aug 2014 16:52:09 +0100 Subject: [PATCH 1/9] Accept space separated <6 values --- astropy/coordinates/sky_coordinate.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/astropy/coordinates/sky_coordinate.py b/astropy/coordinates/sky_coordinate.py index 94960b9..1297c21 100644 --- a/astropy/coordinates/sky_coordinate.py +++ b/astropy/coordinates/sky_coordinate.py @@ -3,6 +3,7 @@ import collections import numpy as np +import re from ..utils.compat.misc import override__dir__ from ..extern import six @@ -915,8 +916,12 @@ def _parse_coordinate_arg(coords, frame, units): if isinstance(coord, six.string_types): coord1 = coord.split() if len(coord1) == 6: - coord1 = (' '.join(coord1[:3]), ' '.join(coord1[3:])) - coord = coord1 + coord = (' '.join(coord1[:3]), ' '.join(coord1[3:])) + elif len(coord1) > 2: + coord = re.split('(\+|\-)', coord) + coord = (coord[0], ' '.join(coord[1:])) + else: + coord = coord1 vals.append(coord) # This assumes coord is a sequence at this point From 3cbc610e65a50b8291f443e6cf2b57fd11034ebb Mon Sep 17 00:00:00 2001 From: Brigitta Sipocz Date: Fri, 8 Aug 2014 17:43:10 +0100 Subject: [PATCH 2/9] Accept float sexagesimal minutes when seconds are missing --- astropy/coordinates/angle_utilities.py | 19 ++++++++++++------- astropy/coordinates/angles.py | 3 +-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/astropy/coordinates/angle_utilities.py b/astropy/coordinates/angle_utilities.py index ce3e478..372dc41 100644 --- a/astropy/coordinates/angle_utilities.py +++ b/astropy/coordinates/angle_utilities.py @@ -149,7 +149,7 @@ def p_ufloat(p): def p_colon(p): ''' - colon : sign UINT COLON UINT + colon : sign UINT COLON ufloat | sign UINT COLON UINT COLON ufloat ''' if len(p) == 5: @@ -159,7 +159,7 @@ def p_colon(p): def p_spaced(p): ''' - spaced : sign UINT UINT + spaced : sign UINT ufloat | sign UINT UINT ufloat ''' if len(p) == 4: @@ -361,7 +361,7 @@ def degrees_to_dms(d): return np.floor(sign * d), sign * np.floor(m), sign * s -def dms_to_degrees(d, m, s): +def dms_to_degrees(d, m, s=0): """ Convert degrees, arcminute, arcsecond to a float degrees value. """ @@ -374,10 +374,12 @@ def dms_to_degrees(d, m, s): # TODO: This will fail if d or m have values after the decimal # place - try: d = np.floor(np.abs(np.asarray(d))) - m = np.floor(np.abs(np.asarray(m))) + if np.isscalar(s) and s == 0: + m = np.abs(m) + else: + m = np.floor(np.abs(np.asarray(m))) s = np.abs(s) except ValueError: raise ValueError(format_exception( @@ -387,7 +389,7 @@ def dms_to_degrees(d, m, s): return sign * (d + m / 60. + s / 3600.) -def hms_to_hours(h, m, s): +def hms_to_hours(h, m, s=0): """ Convert hour, minute, second to a float hour value. """ @@ -402,7 +404,10 @@ def hms_to_hours(h, m, s): try: h = np.floor(np.abs(h)) - m = np.floor(np.abs(m)) + if np.isscalar(s) and s == 0: + m = np.abs(m) + else: + m = np.floor(np.abs(np.asarray(m))) s = np.abs(s) except ValueError: raise ValueError(format_exception( diff --git a/astropy/coordinates/angles.py b/astropy/coordinates/angles.py index 72353c3..08353eb 100644 --- a/astropy/coordinates/angles.py +++ b/astropy/coordinates/angles.py @@ -137,13 +137,12 @@ def __new__(cls, angle, unit=None, dtype=None, copy=True): @staticmethod def _tuple_to_float(angle, unit): """ - Converts an angle represented as a 3-tuple into a floating + Converts an angle represented as a 3-tuple or 2-tuple into a floating point number in the given unit. """ if isinstance(angle, tuple): # TODO: Numpy array of tuples? if unit is u.hourangle: - util.check_hms_ranges(*angle) angle = util.hms_to_hours(*angle) elif unit is u.degree: angle = util.dms_to_degrees(*angle) From 01a7e4bbd4dd90fe39554265a380a589def0c8ab Mon Sep 17 00:00:00 2001 From: Brigitta Sipocz Date: Tue, 20 May 2014 03:30:09 +0100 Subject: [PATCH 3/9] Adding test Conflicts: astropy/coordinates/tests/test_sky_coord.py --- astropy/coordinates/tests/test_sky_coord.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/astropy/coordinates/tests/test_sky_coord.py b/astropy/coordinates/tests/test_sky_coord.py index aa5a1e8..ef9bac0 100644 --- a/astropy/coordinates/tests/test_sky_coord.py +++ b/astropy/coordinates/tests/test_sky_coord.py @@ -132,9 +132,10 @@ def test_coord_init_string(): assert allclose(sc1.ra, Angle(120 * u.deg)) assert allclose(sc1.dec, Angle(5 * u.deg)) - with pytest.raises(ValueError) as err: - SkyCoord('8 00 -5 00 00.0', unit=(u.hour, u.deg), frame='icrs') - assert 'coordinates have 5 values but spherical representation only accepts 3' in str(err) + sc2 = SkyCoord('8 00 -5 00 00.0', unit=(u.hour, u.deg), frame='icrs') + assert isinstance(sc2, SkyCoord) + assert allclose(sc2.ra, Angle(120 * u.deg)) + assert allclose(sc2.dec, Angle(-5 * u.deg)) def test_coord_init_unit(): From 265c408bb1212542cf6c9cedd8e933362aab521f Mon Sep 17 00:00:00 2001 From: Brigitta Sipocz Date: Sun, 10 Aug 2014 22:43:27 +0100 Subject: [PATCH 4/9] add more tests --- astropy/coordinates/tests/test_sky_coord.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/astropy/coordinates/tests/test_sky_coord.py b/astropy/coordinates/tests/test_sky_coord.py index ef9bac0..60b3300 100644 --- a/astropy/coordinates/tests/test_sky_coord.py +++ b/astropy/coordinates/tests/test_sky_coord.py @@ -137,6 +137,11 @@ def test_coord_init_string(): assert allclose(sc2.ra, Angle(120 * u.deg)) assert allclose(sc2.dec, Angle(-5 * u.deg)) + sc3 = SkyCoord('8 00 -5 00.6', unit=(u.hour, u.deg), frame='icrs') + assert isinstance(sc3, SkyCoord) + assert allclose(sc3.ra, Angle(120 * u.deg)) + assert allclose(sc3.dec, Angle(-5.01 * u.deg)) + def test_coord_init_unit(): """ From 7d8590d8cbe7c2b30e5f0ca8b0456fdcf45d900c Mon Sep 17 00:00:00 2001 From: Brigitta Sipocz Date: Mon, 11 Aug 2014 12:00:19 +0100 Subject: [PATCH 5/9] addressing PR comments --- astropy/coordinates/sky_coordinate.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/astropy/coordinates/sky_coordinate.py b/astropy/coordinates/sky_coordinate.py index 1297c21..d7c19e1 100644 --- a/astropy/coordinates/sky_coordinate.py +++ b/astropy/coordinates/sky_coordinate.py @@ -19,6 +19,8 @@ __all__ = ['SkyCoord'] +PMRE = re.compile('(\+|\-)') + # Define a convenience mapping. This is used like a module constants # but is actually dynamically evaluated. @@ -918,7 +920,7 @@ def _parse_coordinate_arg(coords, frame, units): if len(coord1) == 6: coord = (' '.join(coord1[:3]), ' '.join(coord1[3:])) elif len(coord1) > 2: - coord = re.split('(\+|\-)', coord) + coord = PMRE.split(coord) coord = (coord[0], ' '.join(coord[1:])) else: coord = coord1 From b2fd1877e6e5c5e8282cbea44cda51a22429d3c7 Mon Sep 17 00:00:00 2001 From: Brigitta Sipocz Date: Mon, 11 Aug 2014 14:41:58 +0100 Subject: [PATCH 6/9] Adding support for JHHMMSS.ss+DDMMSS.s format --- astropy/coordinates/sky_coordinate.py | 12 +++++++++++- astropy/coordinates/tests/test_sky_coord.py | 5 +++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/astropy/coordinates/sky_coordinate.py b/astropy/coordinates/sky_coordinate.py index d7c19e1..f3308ec 100644 --- a/astropy/coordinates/sky_coordinate.py +++ b/astropy/coordinates/sky_coordinate.py @@ -19,7 +19,8 @@ __all__ = ['SkyCoord'] -PMRE = re.compile('(\+|\-)') +PMRE = re.compile(r'(\+|\-)') +JPMRE = re.compile(r'J([0-9]{6}\.?[0-9]{0,2})([\+\-][0-9]{6}\.?[0-9]{0,2})\s*$') # Define a convenience mapping. This is used like a module constants @@ -922,6 +923,15 @@ def _parse_coordinate_arg(coords, frame, units): elif len(coord1) > 2: coord = PMRE.split(coord) coord = (coord[0], ' '.join(coord[1:])) + elif len(coord1) == 1: + try: + coord = JPMRE.match(coord).groups() + coord = ('{0} {1} {2}'. + format(coord[0][0:2], coord[0][2:4], coord[0][4:]), + '{0} {1} {2}'. + format(coord[1][0:3], coord[1][3:5], coord[1][5:])) + except: + coord = coord1 else: coord = coord1 diff --git a/astropy/coordinates/tests/test_sky_coord.py b/astropy/coordinates/tests/test_sky_coord.py index 60b3300..9f398cc 100644 --- a/astropy/coordinates/tests/test_sky_coord.py +++ b/astropy/coordinates/tests/test_sky_coord.py @@ -142,6 +142,11 @@ def test_coord_init_string(): assert allclose(sc3.ra, Angle(120 * u.deg)) assert allclose(sc3.dec, Angle(-5.01 * u.deg)) + sc4 = SkyCoord('J080000.0-050036.0', unit=(u.hour, u.deg), frame='icrs') + assert isinstance(sc4, SkyCoord) + assert allclose(sc4.ra, Angle(120 * u.deg)) + assert allclose(sc4.dec, Angle(-5.01 * u.deg)) + def test_coord_init_unit(): """ From dd6a88a8d95904fc78d166f063baf648411f4c38 Mon Sep 17 00:00:00 2001 From: Brigitta Sipocz Date: Mon, 11 Aug 2014 16:14:38 +0100 Subject: [PATCH 7/9] add support for 'dm' and 'hm' formats with float minute values --- astropy/coordinates/angle_utilities.py | 6 ++++-- astropy/coordinates/tests/test_sky_coord.py | 5 +++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/astropy/coordinates/angle_utilities.py b/astropy/coordinates/angle_utilities.py index 372dc41..e6bea20 100644 --- a/astropy/coordinates/angle_utilities.py +++ b/astropy/coordinates/angle_utilities.py @@ -182,8 +182,9 @@ def p_generic(p): def p_hms(p): ''' hms : sign UINT HOUR - | sign UINT HOUR UINT + | sign UINT HOUR ufloat | sign UINT HOUR UINT MINUTE + | sign UINT HOUR UFLOAT MINUTE | sign UINT HOUR UINT MINUTE ufloat | sign UINT HOUR UINT MINUTE ufloat SECOND | generic HOUR @@ -200,8 +201,9 @@ def p_hms(p): def p_dms(p): ''' dms : sign UINT DEGREE - | sign UINT DEGREE UINT + | sign UINT DEGREE ufloat | sign UINT DEGREE UINT MINUTE + | sign UINT DEGREE UFLOAT MINUTE | sign UINT DEGREE UINT MINUTE ufloat | sign UINT DEGREE UINT MINUTE ufloat SECOND | generic DEGREE diff --git a/astropy/coordinates/tests/test_sky_coord.py b/astropy/coordinates/tests/test_sky_coord.py index 9f398cc..63b255c 100644 --- a/astropy/coordinates/tests/test_sky_coord.py +++ b/astropy/coordinates/tests/test_sky_coord.py @@ -147,6 +147,11 @@ def test_coord_init_string(): assert allclose(sc4.ra, Angle(120 * u.deg)) assert allclose(sc4.dec, Angle(-5.01 * u.deg)) + sc5 = SkyCoord('8h 00.6m -5d 00.6m', unit=(u.hour, u.deg), frame='icrs') + assert isinstance(sc5, SkyCoord) + assert allclose(sc5.ra, Angle(120.15 * u.deg)) + assert allclose(sc5.dec, Angle(-5.01 * u.deg)) + def test_coord_init_unit(): """ From 15fcbcd82accad9fd70e61d7cc14ecd73d05e72e Mon Sep 17 00:00:00 2001 From: Brigitta Sipocz Date: Tue, 12 Aug 2014 14:46:05 +0100 Subject: [PATCH 8/9] Addressing PR comments, remove asarrays --- astropy/coordinates/angle_utilities.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/astropy/coordinates/angle_utilities.py b/astropy/coordinates/angle_utilities.py index e6bea20..fe35d62 100644 --- a/astropy/coordinates/angle_utilities.py +++ b/astropy/coordinates/angle_utilities.py @@ -374,14 +374,12 @@ def dms_to_degrees(d, m, s=0): # determine sign sign = np.copysign(1.0, d) - # TODO: This will fail if d or m have values after the decimal - # place try: - d = np.floor(np.abs(np.asarray(d))) + d = np.floor(np.abs(d)) if np.isscalar(s) and s == 0: m = np.abs(m) else: - m = np.floor(np.abs(np.asarray(m))) + m = np.floor(np.abs(m)) s = np.abs(s) except ValueError: raise ValueError(format_exception( @@ -401,15 +399,12 @@ def hms_to_hours(h, m, s=0): # determine sign sign = np.copysign(1.0, h) - # TODO: This will fail if d or m have values after the decimal - # place - try: h = np.floor(np.abs(h)) if np.isscalar(s) and s == 0: m = np.abs(m) else: - m = np.floor(np.abs(np.asarray(m))) + m = np.floor(np.abs(m)) s = np.abs(s) except ValueError: raise ValueError(format_exception( From 02bff301d0dd3dbca5ca5137391ba6c800480b79 Mon Sep 17 00:00:00 2001 From: Brigitta Sipocz Date: Tue, 12 Aug 2014 15:06:55 +0100 Subject: [PATCH 9/9] Changing s default to None --- astropy/coordinates/angle_utilities.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/astropy/coordinates/angle_utilities.py b/astropy/coordinates/angle_utilities.py index fe35d62..2a7a9b6 100644 --- a/astropy/coordinates/angle_utilities.py +++ b/astropy/coordinates/angle_utilities.py @@ -153,7 +153,7 @@ def p_colon(p): | sign UINT COLON UINT COLON ufloat ''' if len(p) == 5: - p[0] = (p[1] * p[2], p[4], 0.0) + p[0] = (p[1] * p[2], p[4]) elif len(p) == 7: p[0] = (p[1] * p[2], p[4], p[6]) @@ -163,7 +163,7 @@ def p_spaced(p): | sign UINT UINT ufloat ''' if len(p) == 4: - p[0] = (p[1] * p[2], p[3], 0.0) + p[0] = (p[1] * p[2], p[3]) elif len(p) == 5: p[0] = (p[1] * p[2], p[3], p[4]) @@ -194,7 +194,7 @@ def p_hms(p): elif len(p) == 4: p[0] = (p[1] * p[2], u.hourangle) elif len(p) in (5, 6): - p[0] = ((p[1] * p[2], p[4], 0.0), u.hourangle) + p[0] = ((p[1] * p[2], p[4]), u.hourangle) elif len(p) in (7, 8): p[0] = ((p[1] * p[2], p[4], p[6]), u.hourangle) @@ -213,7 +213,7 @@ def p_dms(p): elif len(p) == 4: p[0] = (p[1] * p[2], u.degree) elif len(p) in (5, 6): - p[0] = ((p[1] * p[2], p[4], 0.0), u.degree) + p[0] = ((p[1] * p[2], p[4]), u.degree) elif len(p) in (7, 8): p[0] = ((p[1] * p[2], p[4], p[6]), u.degree) @@ -299,6 +299,8 @@ def _check_second_range(sec): """ if np.any(sec == 60.): warn(IllegalSecondWarning(sec, 'Treating as 0 sec, +1 min')) + elif sec is None: + pass elif np.any(sec < -60.) or np.any(sec > 60.): # "Error: seconds not in range [-60,60) ({0}).".format(sec)) raise IllegalSecondError(sec) @@ -363,7 +365,7 @@ def degrees_to_dms(d): return np.floor(sign * d), sign * np.floor(m), sign * s -def dms_to_degrees(d, m, s=0): +def dms_to_degrees(d, m, s=None): """ Convert degrees, arcminute, arcsecond to a float degrees value. """ @@ -376,11 +378,12 @@ def dms_to_degrees(d, m, s=0): try: d = np.floor(np.abs(d)) - if np.isscalar(s) and s == 0: + if s is None: m = np.abs(m) + s = 0 else: m = np.floor(np.abs(m)) - s = np.abs(s) + s = np.abs(s) except ValueError: raise ValueError(format_exception( "{func}: dms values ({1[0]},{2[1]},{3[2]}) could not be " @@ -389,7 +392,7 @@ def dms_to_degrees(d, m, s=0): return sign * (d + m / 60. + s / 3600.) -def hms_to_hours(h, m, s=0): +def hms_to_hours(h, m, s=None): """ Convert hour, minute, second to a float hour value. """ @@ -401,11 +404,12 @@ def hms_to_hours(h, m, s=0): try: h = np.floor(np.abs(h)) - if np.isscalar(s) and s == 0: + if s is None: m = np.abs(m) + s = 0 else: m = np.floor(np.abs(m)) - s = np.abs(s) + s = np.abs(s) except ValueError: raise ValueError(format_exception( "{func}: HMS values ({1[0]},{2[1]},{3[2]}) could not be "