diff --git a/regions/io/ds9_language.py b/regions/io/ds9_language.py index 5bc6814d..86b6e62f 100644 --- a/regions/io/ds9_language.py +++ b/regions/io/ds9_language.py @@ -119,8 +119,8 @@ def objects_to_ds9_string(obj_list, coordsys='fk5'): "": 'ellipse', "": 'polygone'} - ds9_strings = {'circle': 'circle({x:.4f},{y:.4f},{r:.4f})\n', - 'ellipse': 'ellipse({x:.4f},{y:.4f},{r1:.4f},{r2:.4f},{ang:.4f})\n', + ds9_strings = {'circle': 'circle({x:.3f},{y:.3f},{r:.2f}")\n', + 'ellipse': 'ellipse({x:.3f},{y:.3f},{r1:.2f},{r2:.2f},{ang:.4f})\n', 'polygone': 'polygon({c})\n'} output = '# Region file format: DS9 astropy/regions\n' @@ -134,17 +134,17 @@ def objects_to_ds9_string(obj_list, coordsys='fk5'): # TODO: Why is circle.center a list of SkyCoords? x = reg.center.ra.to('deg').value[0] y = reg.center.dec.to('deg').value[0] - r = reg.radius.to('deg').value + r = reg.radius.to('arcsec').value elif t == 'ellipse': x = reg.center.ra.to('deg').value[0] y = reg.center.dec.to('deg').value[0] - r1 = reg.major.to('deg').value - r2 = reg.minor.to('deg').value + r1 = reg.major.to('arcsec').value + r2 = reg.minor.to('arcsec').value ang = reg.angle.to('deg').value elif t == 'polygone': v = reg.vertices coords = [(x.to('deg').value, y.to('deg').value) for x in v.ra for y in v.dec] - temp = ["{:.4f}".format(x) for _ in coords for x in _] + temp = ["{:.3f}".format(x) for _ in coords for x in _] c = ", ".join(temp) output += ds9_strings[t].format(**locals()) diff --git a/regions/io/setup_package.py b/regions/io/setup_package.py index b337189f..f9825e03 100644 --- a/regions/io/setup_package.py +++ b/regions/io/setup_package.py @@ -3,5 +3,8 @@ def get_package_data(): parser_test = [os.path.join('data', 'ds9.fk5.reg'), + os.path.join('data', 'ds9.fk5.strip.reg'), + os.path.join('data', 'ds9.fk5.hms.reg'), + os.path.join('data', 'ds9.fk5.hms.strip.reg'), os.path.join('data', 'fk5_reference.reg')] return {'regions.io.tests': parser_test} diff --git a/regions/io/tests/data/ds9.fk5.hms.reg b/regions/io/tests/data/ds9.fk5.hms.reg new file mode 100644 index 00000000..302443fa --- /dev/null +++ b/regions/io/tests/data/ds9.fk5.hms.reg @@ -0,0 +1,39 @@ +# Region file format: DS9 version 4.1 +global color=green dashlist=8 3 width=1 font="helvetica 10 normal roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 +fk5 +circle(13:29:56.743,+47:12:30.42,3.964") # color=pink width=3 font="times 10 normal roman" text={Circle} tag={foo} tag={foo bar} This is a Comment +-ellipse(13:29:55.792,+47:12:16.94,7.928",3.964",2.39831) # color=#0ff font="helvetica 10 normal italic" text={Ellipse} background +-box(13:29:54.530,+47:12:04.57,15.856",7.928",2.39831) # color=yellow font="helvetica 10 bold roman" text={Box} +polygon(13:29:53.394,+47:11:56.88,13:29:52.357,+47:11:57.32,13:29:52.314,+47:11:46.75,13:29:53.351,+47:11:46.31) # font="courier 10 normal roman" text={Polygon} edit=0 rotate=0 +-line(13:29:52.267,+47:11:39.58,13:29:50.737,+47:11:38.97) # line=1 1 color=cyan text={Line} +# vector(13:29:50.632,+47:11:30.18,7.928",2.39831) vector=1 color=red text={Vector} +# text(13:29:50.030,+47:11:20.75) color=magenta font="helvetica 14 bold roman" text={Region} +# ruler(13:29:55.474,+47:11:39.76,13:29:53.782,+47:11:39.78) ruler=physical physical color=white font="helvetica 12 normal roman" text={Ruler} +annulus(13:29:58.217,+47:12:14.07,1.982",3.964",5.946") # color=magenta font="helvetica 10 bold roman" text={Annulus} +ellipse(13:29:57.053,+47:12:02.09,2.973",1.4865",5.946",2.973",2.39831) # color=red width=3 font="helvetica 10 bold roman" text={Ellipse Annulus} +box(13:29:55.820,+47:11:50.27,7.928",3.964",11.892",5.946",2.39831) # font="helvetica 10 bold roman" text={Box Annulus} +point(13:29:59.541,+47:12:01.44) # point=circle text={Circle Point} +point(13:29:58.293,+47:11:49.21) # point=box color=red width=3 text={Box Point} +point(13:29:57.107,+47:11:38.64) # point=diamond text={Diamond Point} +point(13:29:59.971,+47:11:52.28) # point=cross color=blue text={Cross Point} +point(13:29:58.870,+47:11:42.23) # point=x text={X Point} +point(13:29:57.807,+47:11:31.47) # point=arrow color=magenta text={Arrow Point} +point(13:29:59.526,+47:11:34.38) # point=boxcircle text={BoxCircle Point} +# projection(13:29:54.118,+47:11:24.35,13:29:51.918,+47:11:21.50,3.964") text={Projection} +panda(13:29:55.690,+47:11:25.36,317.398,587.398,3,0",5.946",2) # text={Panda} +panda(13:29:56.859,+47:11:11.81,8.98021,47.3983,1,0",2.973",1) # panda=(8.98021 47.3983 137.398 227.398)(0" 2.973" 5.946") text={Panda 2} +panda(13:29:56.859,+47:11:11.81,8.98021,47.3983,1,2.973",5.946",1) # panda=ignore +panda(13:29:56.859,+47:11:11.81,47.3983,137.398,1,0",2.973",1) # panda=ignore +panda(13:29:56.859,+47:11:11.81,47.3983,137.398,1,2.973",5.946",1) # panda=ignore +panda(13:29:56.859,+47:11:11.81,137.398,227.398,1,0",2.973",1) # panda=ignore +panda(13:29:56.859,+47:11:11.81,137.398,227.398,1,2.973",5.946",1) # panda=ignore +# compass(13:29:52.095,+47:11:11.04,7.928") compass=physical {N} {E} 1 1 text={Compass} +epanda(13:29:54.622,+47:11:13.19,317.398,587.398,3,2.973",1.4865",5.946",2.973",1,2.39831) # text={Epanda} +epanda(13:29:55.750,+47:10:59.80,2.39831,47.3983,1,2.973",1.4865",5.946",2.973",1,2.39831) # epanda=(2.39831 47.3983 137.398 227.398)(2.973" 1.4865" 5.946" 2.973")(2.39831) text={Epanda 2} +epanda(13:29:55.750,+47:10:59.80,47.3983,137.398,1,2.973",1.4865",5.946",2.973",1,2.39831) # epanda=ignore +epanda(13:29:55.750,+47:10:59.80,137.398,227.398,1,2.973",1.4865",5.946",2.973",1,2.39831) # epanda=ignore +bpanda(13:29:53.377,+47:11:01.52,317.398,587.398,3,7.928",3.964",11.892",5.946",1,2.39831) # text={Bpanda} +bpanda(13:29:54.593,+47:10:49.22,2.39831,47.3983,1,7.928",3.964",11.892",5.946",1,2.39831) # bpanda=(2.39831 47.3983 137.398 227.398)(7.928" 3.964" 11.892" 5.946")(2.39831) text={Bpanda 2} +bpanda(13:29:54.593,+47:10:49.22,47.3983,137.398,1,7.928",3.964",11.892",5.946",1,2.39831) # bpanda=ignore +bpanda(13:29:54.593,+47:10:49.22,137.398,227.398,1,7.928",3.964",11.892",5.946",1,2.39831) # bpanda=ignore +# segment(13:29:49.122,+47:11:27.59,13:29:49.448,+47:11:19.88,13:29:49.076,+47:11:16.39) text={Segment} diff --git a/regions/io/tests/data/ds9.fk5.hms.strip.reg b/regions/io/tests/data/ds9.fk5.hms.strip.reg new file mode 100644 index 00000000..1c97a4b6 --- /dev/null +++ b/regions/io/tests/data/ds9.fk5.hms.strip.reg @@ -0,0 +1 @@ +fk5;circle(13:29:56.743,+47:12:30.42,3.964");-ellipse(13:29:55.792,+47:12:16.94,7.928",3.964",2.39831);-box(13:29:54.530,+47:12:04.57,15.856",7.928",2.39831);polygon(13:29:53.394,+47:11:56.88,13:29:52.357,+47:11:57.32,13:29:52.314,+47:11:46.75,13:29:53.351,+47:11:46.31);-line(13:29:52.267,+47:11:39.58,13:29:50.737,+47:11:38.97);annulus(13:29:58.217,+47:12:14.07,1.982",3.964",5.946");ellipse(13:29:57.053,+47:12:02.09,2.973",1.4865",5.946",2.973",2.39831);box(13:29:55.820,+47:11:50.27,7.928",3.964",11.892",5.946",2.39831);point(13:29:59.541,+47:12:01.44);point(13:29:58.293,+47:11:49.21);point(13:29:57.107,+47:11:38.64);point(13:29:59.971,+47:11:52.28);point(13:29:58.870,+47:11:42.23);point(13:29:57.807,+47:11:31.47);point(13:29:59.526,+47:11:34.38);panda(13:29:55.690,+47:11:25.36,317.398,587.398,3,0",5.946",2);panda(13:29:56.859,+47:11:11.81,8.98021,47.3983,1,0",2.973",1);panda(13:29:56.859,+47:11:11.81,8.98021,47.3983,1,2.973",5.946",1);panda(13:29:56.859,+47:11:11.81,47.3983,137.398,1,0",2.973",1);panda(13:29:56.859,+47:11:11.81,47.3983,137.398,1,2.973",5.946",1);panda(13:29:56.859,+47:11:11.81,137.398,227.398,1,0",2.973",1);panda(13:29:56.859,+47:11:11.81,137.398,227.398,1,2.973",5.946",1);epanda(13:29:54.622,+47:11:13.19,317.398,587.398,3,2.973",1.4865",5.946",2.973",1,2.39831);epanda(13:29:55.750,+47:10:59.80,2.39831,47.3983,1,2.973",1.4865",5.946",2.973",1,2.39831);epanda(13:29:55.750,+47:10:59.80,47.3983,137.398,1,2.973",1.4865",5.946",2.973",1,2.39831);epanda(13:29:55.750,+47:10:59.80,137.398,227.398,1,2.973",1.4865",5.946",2.973",1,2.39831);bpanda(13:29:53.377,+47:11:01.52,317.398,587.398,3,7.928",3.964",11.892",5.946",1,2.39831);bpanda(13:29:54.593,+47:10:49.22,2.39831,47.3983,1,7.928",3.964",11.892",5.946",1,2.39831);bpanda(13:29:54.593,+47:10:49.22,47.3983,137.398,1,7.928",3.964",11.892",5.946",1,2.39831);bpanda(13:29:54.593,+47:10:49.22,137.398,227.398,1,7.928",3.964",11.892",5.946",1,2.39831); \ No newline at end of file diff --git a/regions/io/tests/data/ds9.fk5.strip.reg b/regions/io/tests/data/ds9.fk5.strip.reg new file mode 100644 index 00000000..78afd15b --- /dev/null +++ b/regions/io/tests/data/ds9.fk5.strip.reg @@ -0,0 +1 @@ +fk5;circle(202.48643,47.208449,3.9640007");-ellipse(202.48247,47.204704,7.9280014",3.9640007",2.3983109);-box(202.47721,47.201269,15.856003",7.9280014",2.3983109);polygon(202.47248,47.199134,202.46815,47.199257,202.46797,47.19632,202.4723,47.196197);-line(202.46778,47.194329,202.4614,47.194158);annulus(202.49257,47.20391,1.9820003",3.9640007",5.946001");ellipse(202.48772,47.20058,2.9730005",1.4865003",5.946001",2.9730005",2.3983109);box(202.48258,47.197298,7.9280014",3.9640007",11.892002",5.946001",2.3983109);point(202.49809,47.200401);point(202.49289,47.197004);point(202.48795,47.194067);point(202.49988,47.197856);point(202.49529,47.195065);point(202.49086,47.192074);point(202.49802,47.192883);panda(202.48204,47.190378,317.39831,587.39831,3,0",5.946001",2);panda(202.48691,47.186615,8.9802109,47.398311,1,0",2.9730005",1);panda(202.48691,47.186615,8.9802109,47.398311,1,2.9730005",5.946001",1);panda(202.48691,47.186615,47.398311,137.39831,1,0",2.9730005",1);panda(202.48691,47.186615,47.398311,137.39831,1,2.9730005",5.946001",1);panda(202.48691,47.186615,137.39831,227.39831,1,0",2.9730005",1);panda(202.48691,47.186615,137.39831,227.39831,1,2.9730005",5.946001",1);epanda(202.47759,47.186997,317.39831,587.39831,3,2.9730005",1.4865003",5.946001",2.9730005",1,2.3983109);epanda(202.48229,47.183279,2.3983109,47.398311,1,2.9730005",1.4865003",5.946001",2.9730005",1,2.3983109);epanda(202.48229,47.183279,47.398311,137.39831,1,2.9730005",1.4865003",5.946001",2.9730005",1,2.3983109);epanda(202.48229,47.183279,137.39831,227.39831,1,2.9730005",1.4865003",5.946001",2.9730005",1,2.3983109);bpanda(202.47241,47.183755,317.39831,587.39831,3,7.9280014",3.9640007",11.892002",5.946001",1,2.3983109);bpanda(202.47747,47.180338,2.3983109,47.398311,1,7.9280014",3.9640007",11.892002",5.946001",1,2.3983109);bpanda(202.47747,47.180338,47.398311,137.39831,1,7.9280014",3.9640007",11.892002",5.946001",1,2.3983109);bpanda(202.47747,47.180338,137.39831,227.39831,1,7.9280014",3.9640007",11.892002",5.946001",1,2.3983109); \ No newline at end of file diff --git a/regions/io/tests/data/fk5_reference.reg b/regions/io/tests/data/fk5_reference.reg index 0154504c..fa2693e7 100644 --- a/regions/io/tests/data/fk5_reference.reg +++ b/regions/io/tests/data/fk5_reference.reg @@ -1,6 +1,6 @@ # Region file format: DS9 astropy/regions fk5 -circle(202.4864,47.2084,0.0011) -ellipse(202.4825,47.2047,0.0011,0.0022,2.3983) -polygon(202.4725, 47.1991, 202.4725, 47.1993, 202.4725, 47.1963, 202.4725, 47.1962, 202.4682, 47.1991, 202.4682, 47.1993, 202.4682, 47.1963, 202.4682, 47.1962, 202.4680, 47.1991, 202.4680, 47.1993, 202.4680, 47.1963, 202.4680, 47.1962, 202.4723, 47.1991, 202.4723, 47.1993, 202.4723, 47.1963, 202.4723, 47.1962) -ellipse(202.4877,47.2006,0.0004,0.0008,0.0017) +circle(202.486,47.208,3.96") +ellipse(202.482,47.205,3.96,7.93,2.3983) +polygon(202.472, 47.199, 202.472, 47.199, 202.472, 47.196, 202.472, 47.196, 202.468, 47.199, 202.468, 47.199, 202.468, 47.196, 202.468, 47.196, 202.468, 47.199, 202.468, 47.199, 202.468, 47.196, 202.468, 47.196, 202.472, 47.199, 202.472, 47.199, 202.472, 47.196, 202.472, 47.196) +ellipse(202.488,47.201,1.49,2.97,0.0017) diff --git a/regions/io/tests/test_ds9_language.py b/regions/io/tests/test_ds9_language.py index f6f3bd26..ef5b1c63 100644 --- a/regions/io/tests/test_ds9_language.py +++ b/regions/io/tests/test_ds9_language.py @@ -4,14 +4,22 @@ from ..ds9_language import ds9_parser, region_list_to_objects, objects_to_ds9_string from astropy.utils.data import get_pkg_data_filename +from astropy.tests.helper import pytest -def test_fk5(tmpdir): - filename = get_pkg_data_filename('data/ds9.fk5.reg') +@pytest.mark.parametrize('filename', + ['data/ds9.fk5.reg', + 'data/ds9.fk5.hms.reg', + 'data/ds9.fk5.hms.strip.reg', + 'data/ds9.fk5.strip.reg']) + +def test_fk5(filename): + filename = get_pkg_data_filename(filename) temp = ds9_parser(filename) regs = region_list_to_objects(temp) actual = objects_to_ds9_string(regs, coordsys='fk5') + reference_file = get_pkg_data_filename('data/fk5_reference.reg') with open(reference_file, 'r') as fh: desired = fh.read()