def test_regression_8615(): # note this is a "higher-level" symptom of the problem that a test now moved # to pyerfa (erfa/tests/test_erfa:test_float32_input) is testing for, but we keep # it here as well due to being a more practical version of the issue. crf = CartesianRepresentation(np.array([3, 0, 4], dtype=float) * u.pc) srf = SphericalRepresentation.from_cartesian(crf) # does not error in 8615 cr = CartesianRepresentation(np.array([3, 0, 4], dtype='f4') * u.pc) sr = SphericalRepresentation.from_cartesian(cr) # errors in 8615 assert_quantity_allclose(sr.distance, 5 * u.pc) assert_quantity_allclose(srf.distance, 5 * u.pc)
def __getcoordinatearrays__(rotate=True, representation='Cylindrical', **kwargs): """ This function will create a 2D/3D array from the requested shape in kwargs['shape']. It can either return this array into cartesian, polar/cylindrical or spherical coordinates. Using the optional rotate keyword the array can also be rotated into the plane of the sky. This requires the position angle, 'PA', and the inclinatio, 'Incl'. Parameters ---------- rotate : 'True' | 'False' This will either return the rotated or non-rotated array. representation : 'Cylindrical' | 'Cartesian' | 'Spherical' Representation to use for the returned array. Returns ------- 2 or 3 numpy arrays corresponding to the rho, phi, (z) array, the x, y, (z) array or the rho, lon, (lat array). """ # create x, y ,and z arrays tshape = np.array(kwargs['shape']) shape = (tshape[-1], tshape[-2], np.max(tshape)) Indices = np.indices(shape, dtype=float) # translate the array Indices[0] = Indices[0] - kwargs['par']['Xcen'] Indices[1] = Indices[1] - kwargs['par']['Ycen'] Indices[2] = Indices[2] - int(kwargs['shape'][2] / 2.) # make a cartesian representation for matrix rotation CarRep = CartesianRepresentation(Indices, unit=u.pix) if rotate: # rotation due to PA (NOTE different axis definition) CarRep = CarRep.transform( rm(kwargs['par']['PA'] + np.pi / 2, axis='z', unit=u.rad)) # rotation due to inclination (NOTE different axis definition) CarRep = CarRep.transform( rm(kwargs['par']['Incl'], axis='x', unit=u.rad)) else: # rotate by 90 degrees because of definition of PA CarRep = CarRep.transform(rm(np.pi / 2, axis='z', unit=u.rad)) # the representation to use and the return values if representation == 'Cartesian': return CarRep.x.value, CarRep.y.value, CarRep.z.value elif representation == 'Cylindrical': Rep = CylindricalRepresentation.from_cartesian(CarRep) return Rep.rho.value, Rep.phi.value, Rep.z.value elif representation == 'Spherical': Rep = SphericalRepresentation.from_cartesian(CarRep) return Rep.distance.value, Rep.lon.value, Rep.lat.value