diff --git a/dev/regions_pyregion_comparison.csv b/dev/regions_pyregion_comparison.csv index 8ffee34c..db240507 100644 --- a/dev/regions_pyregion_comparison.csv +++ b/dev/regions_pyregion_comparison.csv @@ -1,106 +1,52 @@ filename,time_regions,time_pyregion,compl_pyregion,compl_regions -<<<<<<< HEAD -ds9.linear.wcsi.reg,0.008,0.751,100.0%,34.3% -ds9.mosaic.fk4.hms.reg,0.022,0.733,100.0%,34.3% +ds9.linear.wcsi.reg,0.005,0.842,100.0%,37.1% +ds9.mosaic.fk4.hms.reg,0.029,0.747,100.0%,37.1% ds9.color.reg,0.005,0.229,100.0%,100.0% -ds9.fk5.strip.reg,0.008,0.341,100.0%,40.0% -ds9.fk5.reg,0.009,0.465,100.0%,33.3% -ds9.physical.strip.reg,0.002,0.320,100.0%,40.0% -ds9.physical.windows.reg,0.002,0.427,100.0%,34.3% -ds9.fk5.hms.reg,0.010,0.478,100.0%,33.3% -ds9.icrs.hms.reg,0.010,0.468,100.0%,33.3% -ds9.icrs.strip.reg,0.008,0.343,100.0%,40.0% -ds9.color.spaces.reg,0.005,0.229,100.0%,100.0% -ds9.mosaic.ecliptic.hms.reg,0.019,0.734,100.0%,34.3% -ds9.linear.wcs.reg,0.004,0.721,100.0%,34.3% -ds9.mosaic.ecliptic.reg,0.015,0.729,100.0%,34.3% -ds9.linear.wcsc.reg,0.004,0.752,100.0%,34.3% -ds9.fk4.hms.strip.reg,0.011,0.340,100.0%,40.0% -ds9.mosaic.galactic.reg,0.016,0.730,100.0%,34.3% -ds9.linear.wcsd.reg,0.004,0.757,100.0%,34.3% -physical_reference.reg,0.001,0.226,100.0%,100.0% -ds9.fk4.reg,0.009,0.480,100.0%,33.3% -ds9.image.strip.reg,0.002,0.356,100.0%,40.0% -ds9.icrs.hms.strip.reg,0.010,0.357,100.0%,40.0% -ds9.image.reg,0.002,0.461,100.0%,33.3% -ds9.mosaic.fk5.hms.reg,0.021,0.768,100.0%,34.3% -ds9.mosaic.image.reg,0.004,0.762,100.0%,34.3% -ds9.physical.reg,0.002,0.438,100.0%,33.3% -ds9.ecliptic.reg,0.008,0.502,100.0%,33.3% -ds9.ecliptic.strip.reg,0.008,0.365,100.0%,40.0% -ds9.fits.reg,0.001,0.267,100.0%,88.9% -ds9.icrs.reg,0.009,0.490,100.0%,33.3% -ds9.mosaic.fk4.reg,0.019,0.788,100.0%,34.3% -ds9.mosaic.icrs.hms.reg,0.020,0.747,100.0%,34.3% -ds9.ecliptic.hms.reg,0.009,0.464,100.0%,33.3% -ds9.fk4.hms.reg,0.011,0.466,100.0%,33.3% -ds9.mosaic.galactic.hms.reg,0.019,0.729,100.0%,34.3% -ds9.mosaic.icrs.reg,0.016,0.729,100.0%,34.3% +ds9.fk5.strip.reg,0.010,0.345,100.0%,43.3% +ds9.fk5.reg,0.011,0.683,100.0%,36.1% +ds9.physical.strip.reg,0.002,0.368,100.0%,43.3% +ds9.physical.windows.reg,0.002,0.498,100.0%,37.1% +ds9.fk5.hms.reg,0.013,0.477,100.0%,36.1% +ds9.icrs.hms.reg,0.012,0.479,100.0%,36.1% +ds9.icrs.strip.reg,0.010,0.341,100.0%,43.3% +ds9.color.spaces.reg,0.005,0.224,100.0%,100.0% +ds9.mosaic.ecliptic.hms.reg,0.022,0.740,100.0%,37.1% +ds9.linear.wcs.reg,0.004,0.742,100.0%,37.1% +ds9.mosaic.ecliptic.reg,0.019,0.734,100.0%,37.1% +ds9.linear.wcsc.reg,0.004,0.813,100.0%,37.1% +ds9.fk4.hms.strip.reg,0.016,0.400,100.0%,43.3% +ds9.mosaic.galactic.reg,0.021,0.794,100.0%,37.1% +ds9.linear.wcsd.reg,0.004,0.767,100.0%,37.1% +physical_reference.reg,0.001,0.220,100.0%,100.0% +ds9.fk4.reg,0.012,0.467,100.0%,36.1% +ds9.image.strip.reg,0.002,0.321,100.0%,43.3% +ds9.icrs.hms.strip.reg,0.012,0.351,100.0%,43.3% +ds9.image.reg,0.002,0.499,100.0%,36.1% +ds9.mosaic.fk5.hms.reg,0.029,0.777,100.0%,37.1% +ds9.mosaic.image.reg,0.004,0.727,100.0%,37.1% +ds9.physical.reg,0.002,0.437,100.0%,36.1% +ds9.ecliptic.reg,0.010,0.472,100.0%,36.1% +ds9.ecliptic.strip.reg,0.009,0.342,100.0%,43.3% +ds9.fits.reg,0.001,0.253,100.0%,100.0% +ds9.icrs.reg,0.010,0.465,100.0%,36.1% +ds9.mosaic.fk4.reg,0.023,0.739,100.0%,37.1% +ds9.mosaic.icrs.hms.reg,0.023,0.824,100.0%,37.1% +ds9.ecliptic.hms.reg,0.011,0.508,100.0%,36.1% +ds9.fk4.hms.reg,0.014,0.570,100.0%,36.1% +ds9.mosaic.galactic.hms.reg,0.038,0.834,100.0%,37.1% +ds9.mosaic.icrs.reg,0.023,0.820,100.0%,37.1% ds9.comment.reg,0.000,-1.000,0.0%,nan% -fk5_reference.reg,0.002,0.216,100.0%,100.0% -ds9.mosaic.fk5.reg,0.017,0.737,100.0%,34.3% -ds9.fk4.strip.reg,0.009,0.340,100.0%,40.0% -ds9.galactic.strip.reg,0.008,0.341,100.0%,40.0% -ds9.galactic.reg,0.008,0.467,100.0%,33.3% -ds9.composite.reg,0.012,0.480,100.0%,0.0% -ds9.linear.wcsa.reg,0.004,0.759,100.0%,34.3% -ds9.linear.wcsp.reg,0.004,0.720,100.0%,34.3% -ds9.fk5.hms.strip.reg,0.010,0.341,100.0%,40.0% -ds9.galactic.hms.reg,0.010,0.511,100.0%,33.3% -galactic_reference.reg,0.002,0.221,100.0%,100.0% -ds9.galactic.hms.strip.reg,0.010,0.347,100.0%,40.0% -ds9.mosaic.physical.reg,0.004,0.720,100.0%,34.3% -ds9.ecliptic.hms.strip.reg,0.009,0.344,100.0%,40.0% -======= -ds9.linear.wcsi.reg,0.035,5.132,91.4%,34.3% -ds9.mosaic.fk4.hms.reg,0.163,5.549,91.4%,34.3% -ds9.color.reg,0.019,1.935,100.0%,100.0% -ds9.fk5.strip.reg,0.082,-1.000,0.0%,40.0% -ds9.fk5.reg,0.034,2.360,91.7%,33.3% -ds9.physical.strip.reg,0.006,-1.000,0.0%,40.0% -ds9.physical.windows.reg,0.007,1.576,91.4%,34.3% -ds9.fk5.hms.reg,0.041,1.687,91.7%,33.3% -ds9.icrs.hms.reg,0.037,1.728,91.7%,33.3% -ds9.icrs.strip.reg,0.029,-1.000,0.0%,40.0% -ds9.color.spaces.reg,0.020,0.860,100.0%,100.0% -ds9.mosaic.ecliptic.hms.reg,0.073,2.668,91.4%,34.3% -ds9.linear.wcs.reg,0.014,3.252,91.4%,34.3% -ds9.mosaic.ecliptic.reg,0.076,2.663,91.4%,34.3% -ds9.linear.wcsc.reg,0.014,3.605,91.4%,34.3% -ds9.fk4.hms.strip.reg,0.156,-1.000,0.0%,40.0% -ds9.mosaic.galactic.reg,0.061,5.826,91.4%,34.3% -ds9.linear.wcsd.reg,0.062,2.777,91.4%,34.3% -physical_reference.reg,0.003,0.789,100.0%,100.0% -ds9.fk4.reg,0.035,1.686,91.7%,33.3% -ds9.image.strip.reg,0.006,-1.000,0.0%,40.0% -ds9.icrs.hms.strip.reg,0.035,-1.000,0.0%,40.0% -ds9.image.reg,0.007,1.544,91.7%,33.3% -ds9.mosaic.fk5.hms.reg,0.078,2.604,91.4%,34.3% -ds9.mosaic.image.reg,0.014,2.541,91.4%,34.3% -ds9.physical.reg,0.007,1.529,91.7%,33.3% -ds9.ecliptic.reg,0.029,2.727,91.7%,33.3% -ds9.ecliptic.strip.reg,0.028,-1.000,0.0%,40.0% -ds9.fits.reg,0.006,1.087,100.0%,88.9% -ds9.icrs.reg,0.030,2.249,91.7%,33.3% -ds9.mosaic.fk4.reg,0.070,2.739,91.4%,34.3% -ds9.mosaic.icrs.hms.reg,0.080,3.020,91.4%,34.3% -ds9.ecliptic.hms.reg,0.081,4.070,91.7%,33.3% -ds9.fk4.hms.reg,0.102,4.080,91.7%,33.3% -ds9.mosaic.galactic.hms.reg,0.183,2.608,91.4%,34.3% -ds9.mosaic.icrs.reg,0.059,2.928,91.4%,34.3% -ds9.comment.reg,0.009,-1.000,0.0%,nan% -fk5_reference.reg,0.009,0.780,100.0%,100.0% -ds9.mosaic.fk5.reg,0.065,2.601,91.4%,34.3% -ds9.fk4.strip.reg,0.033,-1.000,0.0%,40.0% -ds9.galactic.strip.reg,0.030,-1.000,0.0%,40.0% -ds9.galactic.reg,0.034,1.648,91.7%,33.3% -ds9.composite.reg,0.035,2.998,91.7%,0.0% -ds9.linear.wcsa.reg,0.036,5.855,91.4%,34.3% -ds9.linear.wcsp.reg,0.036,5.473,91.4%,34.3% -ds9.fk5.hms.strip.reg,0.093,-1.000,0.0%,40.0% -ds9.galactic.hms.reg,0.102,2.551,91.7%,33.3% -galactic_reference.reg,0.008,0.784,100.0%,100.0% -ds9.galactic.hms.strip.reg,0.036,-1.000,0.0%,40.0% -ds9.mosaic.physical.reg,0.014,2.570,91.4%,34.3% -ds9.ecliptic.hms.strip.reg,0.035,-1.000,0.0%,40.0% ->>>>>>> changes to dev tools +fk5_reference.reg,0.002,0.217,100.0%,100.0% +ds9.mosaic.fk5.reg,0.024,0.847,100.0%,37.1% +ds9.fk4.strip.reg,0.011,0.356,100.0%,43.3% +ds9.galactic.strip.reg,0.013,0.390,100.0%,43.3% +ds9.galactic.reg,0.010,0.543,100.0%,36.1% +ds9.composite.reg,0.011,0.485,100.0%,0.0% +ds9.linear.wcsa.reg,0.005,0.765,100.0%,37.1% +ds9.linear.wcsp.reg,0.005,0.757,100.0%,37.1% +ds9.fk5.hms.strip.reg,0.013,0.342,100.0%,43.3% +ds9.galactic.hms.reg,0.012,0.467,100.0%,36.1% +galactic_reference.reg,0.002,0.219,100.0%,100.0% +ds9.galactic.hms.strip.reg,0.012,0.342,100.0%,43.3% +ds9.mosaic.physical.reg,0.004,0.765,100.0%,37.1% +ds9.ecliptic.hms.strip.reg,0.011,0.343,100.0%,43.3% diff --git a/regions/io/read_ds9.py b/regions/io/read_ds9.py index 0185794b..dd9114f9 100644 --- a/regions/io/read_ds9.py +++ b/regions/io/read_ds9.py @@ -10,7 +10,7 @@ from astropy import log from astropy.utils.exceptions import AstropyUserWarning from warnings import warn -from ..shapes import circle, rectangle, polygon, ellipse, point +from ..shapes import circle, rectangle, polygon, ellipse, point, line, annulus from ..core import PixCoord __all__ = [ @@ -123,6 +123,8 @@ def parse_angular_length_quantity(string_rep): 'ellipse': itertools.chain((coordinate, coordinate), itertools.cycle((radius,))), 'box': (coordinate, coordinate, width, height, angle), 'polygon': itertools.cycle((coordinate,)), + 'line': (coordinate, coordinate, coordinate, coordinate), + 'annulus': itertools.chain((coordinate, coordinate), itertools.cycle((radius,))), } coordinate_systems = ['fk5', 'fk4', 'icrs', 'galactic', 'wcs', 'physical', 'image', 'ecliptic'] @@ -214,6 +216,23 @@ def ds9_region_list_to_objects(region_list): reg = point.PointPixelRegion(coord_list[0]) else: raise DS9RegionParserError("No central coordinate") + elif region_type == 'line': + if isinstance(coord_list[0], BaseCoordinateFrame): + reg = line.LineSkyRegion(coord_list[0], coord_list[1]) + elif isinstance(coord_list[0], PixCoord): + reg = line.LinePixelRegion(coord_list[0], coord_list[1]) + else: + raise DS9RegionParserError("No central coordinate") + elif region_type == 'annulus': + # Do not read more than one annulus for now + if len(coord_list) > 3: + continue + if isinstance(coord_list[0], BaseCoordinateFrame): + reg = annulus.CircleAnnulusSkyRegion(coord_list[0], coord_list[1], coord_list[2]) + elif isinstance(coord_list[0], PixCoord): + reg = annulus.CircleAnnulusPixelRegion(coord_list[0], coord_list[1], coord_list[2]) + else: + raise DS9RegionParserError("No central coordinate") else: # Note: this should effectively never happen, because it would # imply that the line_parser found a region that didn't match the @@ -401,8 +420,8 @@ def line_parser(line, coordsys=None, errors='strict'): parsed = type_parser(coords_etc, language_spec[region_type], coordsys_name_mapping[coordsys]) - # Reset iterator for ellipse annulus - if region_type == 'ellipse': + # Reset iterator for ellipse annulus and annulus + if region_type in ['ellipse', 'annulus']: language_spec[region_type] = itertools.chain((coordinate, coordinate), itertools.cycle((radius,))) parsed_angles = [(x, y) @@ -420,9 +439,11 @@ def line_parser(line, coordsys=None, errors='strict'): # otherwise, they are vector quantitites lon, lat = u.Quantity(lon), u.Quantity(lat) sphcoords = coordinates.UnitSphericalRepresentation(lon, lat) - coords = frame(sphcoords) - - return region_type, [coords] + parsed[len(coords) * 2:], parsed_meta, composite, include + coords = [frame(sphcoords)] + if region_type == 'line': + coords = [coords[0][0], coords[0][1]] + # line constructor expectes two scalar coordinates + return region_type, coords + parsed[len(coords) * 2:], parsed_meta, composite, include else: parsed = type_parser(coords_etc, language_spec[region_type], coordsys) @@ -431,13 +452,18 @@ def line_parser(line, coordsys=None, errors='strict'): # b/c can't typecheck when iterating as in sky coord case coord = PixCoord(parsed[0::2], parsed[1::2]) parsed_return = [coord] + elif region_type == 'line': + # special case line because it contains two coordinate points + coord1 = PixCoord(parsed[0], parsed[1]) + coord2 = PixCoord(parsed[2], parsed[3]) + parsed_return = [coord1, coord2] + parsed[4:] else: parsed = [_.value for _ in parsed] coord = PixCoord(parsed[0], parsed[1]) parsed_return = [coord] + parsed[2:] - # Reset iterator for ellipse annulus - if region_type == 'ellipse': + # Reset iterator for ellipse annulus, annulus + if region_type in ['ellipse', 'annulus']: language_spec[region_type] = itertools.chain((coordinate, coordinate), itertools.cycle((radius,))) return region_type, parsed_return, parsed_meta, composite, include