def testSetterUnknownUnit(self): print 'Testing PyMeasurement: setter, correct exceptions when unit unknown' with self.assertRaises(TypeError): m = cp.PyMeasurement('speed', 12.345, 0.987, 1000) with self.assertRaises(TypeError): m = cp.PyMeasurement() m.setM('speed', 12.345, 0.987, 1000)
def testCopy(self): print 'Testing PyMeasurement: make sure, copies are deep' m1 = cp.PyMeasurement('dist', 1.0, 0.0, 'm') m2 = cp.PyMeasurement(m1) m2.setM('temp', 2.0, 1.0, 'K') self.assertEqual(m1.name, 'dist') self.assertEqual(m1.value, 1.0) self.assertEqual(m1.uncertainty, 0.0) self.assertEqual(m1.unit.asString(), 'm')
def testCopy(self): print 'Testing PySource: make sure, copies are deep' s1 = cp.PySource() m1 = cp.PyMeasurement('dist', 1.0, 0.5, 'm') s1.setParameter(m1) s1.ID = 10 s1.name = 'source1' s2 = s1.copy() s2.clear() s2.setParameter('temp', 2.0, 1.0, 'K') s2.ID = 20 s2.name = 'source2' self.assertEqual(m1.name, 'dist') self.assertEqual(m1.value, 1.0) self.assertEqual(m1.uncertainty, 0.5) self.assertEqual(m1.unit.asString(), 'm') m1 = s1.getParameter('dist') self.assertEqual(m1.name, 'dist') self.assertEqual(m1.value, 1.0) self.assertEqual(m1.uncertainty, 0.5) self.assertEqual(m1.unit.asString(), 'm') self.assertEqual(s1.ID, 10) self.assertEqual(s2.ID, 20) self.assertEqual(s1.name, 'source1') self.assertEqual(s2.name, 'source2')
def testSetParameter(self): print 'Testing PySource: setting single parameter' s = cp.PySource() m = cp.PyMeasurement('speed', 12.345, 0.987, 'm/s') s.setParameter(m) s.setParameter('speed2', 12.345, 0.987, 'm/s') s.setParameter('speed3', 12.345, 0.987, cp.PyUnit('m/s'))
def testIsDefined(self): print 'Testing PySource: isDefined method' s = cp.PySource() m = cp.PyMeasurement('speed', 12.345, 0.987, 'm/s') s.setParameter(m) self.assertEqual(s.parameterDefined('speed'), True) self.assertEqual(s.parameterDefined('bla'), False)
def testAsString(self): print 'Testing PyMeasurement: asstring method' m = cp.PyMeasurement('speed', 12.345, 0.987, 'm/s') self.assertEqual(m.asString(mode=cp.measurement_default), '12.345 ± 0.987 m s⁻¹') self.assertEqual(m.asString(mode=cp.measurement_compact), '12.345 m s⁻¹') self.assertEqual(m.asString(mode=cp.measurement_full), 'speed = 12.345 ± 0.987 m s⁻¹') self.assertEqual(m.asString(mode=cp.measurement_unit), 'm s⁻¹') self.assertEqual(m.asString(decimals=1), '12.3 ± 1.0 m s⁻¹')
def testPropertiesUnit(self): print 'Testing PyMeasurement: "unit" property getter/setter' m = cp.PyMeasurement('speed', 12.345, 0.987, 'm/s') self.assertIsInstance(m.unit, cp.PyUnit) self.assertEqual(m.unit.asString(), 'm s^-1') m.unit = cp.unit_kpc self.assertIsInstance(m.unit, cp.PyUnit) self.assertEqual(m.unit.asString(), 'm') self.assertEqual(m.asString(), '3.80927e+20 ± 3.04556e+19 m')
def testUpdateParametersTypeSafety(self): print 'Testing PySource: updating parameters dictionary type safety' s = cp.PySource() with self.assertRaises(TypeError): s.updateParameters(1) with self.assertRaises(AssertionError): s.updateParameters({ 0: cp.PyMeasurement('speed', 12.345, 0.987, 'm/s'), 1: 1 })
def testtestAsStringTypeSafety(self): print 'Testing PyMeasurement: asstring method type safety' m = cp.PyMeasurement('speed', 12.345, 0.987, 'm/s') with self.assertRaises(TypeError): m.asString(mode=1000) with self.assertRaises(TypeError): m.asString(scientific='') with self.assertRaises(TypeError): m.asString(scientific=1) with self.assertRaises(TypeError): m.asString(decimals='')
def testUpdateParameters(self): print 'Testing PySource: updating parameters dictionary' s = cp.PySource() s.setParameter('speed1', 12.345, 0.987, 'm/s') s.updateParameters({ 'speed2': cp.PyMeasurement('speed2', 12.345, 0.987, 'm/s') }) self.assertIsInstance(s.getParameters(), dict) self.assertEqual(len(s.getParameters()), 2) self.assertListEqual(s.getParameters().keys(), ['speed1', 'speed2']) self.assertIsInstance(s.getParameters().values()[0], cp.PyMeasurement) s.updateParameters({}) self.assertIsInstance(s.getParameters(), dict) self.assertEqual(len(s.getParameters()), 2) self.assertListEqual(s.getParameters().keys(), ['speed1', 'speed2']) self.assertIsInstance(s.getParameters().values()[0], cp.PyMeasurement)
def addGauss(sName, sID, cube, mask, amp, x0, y0, z0, xw, yw, zw): """adds a fake source (3D gauss) and initial mask (few pixels large) since cube/mask are ndarrays, it's 'call-by-reference' returns a PySource with just the right parameters""" def gaussian1D(dist, sigma): return np.exp(- dist**2 / 2.0 / sigma**2) # first need xyz indices z, y, x = np.indices(cube.shape) cube += amp * gaussian1D(x-x0, xw) * gaussian1D(y-y0, yw) * gaussian1D(z-z0, zw) mask[ z0 - 3*zw: z0 + 3*zw, y0 - 3*yw: y0 + 3*yw, x0 - 3*xw: x0 + 3*xw, ] = sID s = cp.PySource() s.name = sName s.ID = sID pDict = { 'X': cp.PyMeasurement('X', x0, 0.0, ''), 'Y': cp.PyMeasurement('Y', y0, 0.0, ''), 'Z': cp.PyMeasurement('Z', z0, 0.0, ''), 'BBOX_X_MIN': cp.PyMeasurement('BBOX_X_MIN', x0 - 3*xw, 0.0, ''), 'BBOX_X_MAX': cp.PyMeasurement('BBOX_X_MAX', x0 + 3*xw, 0.0, ''), 'BBOX_Y_MIN': cp.PyMeasurement('BBOX_Y_MIN', y0 - 3*yw, 0.0, ''), 'BBOX_Y_MAX': cp.PyMeasurement('BBOX_Y_MAX', y0 + 3*yw, 0.0, ''), 'BBOX_Z_MIN': cp.PyMeasurement('BBOX_Z_MIN', z0 - 3*zw, 0.0, ''), 'BBOX_Z_MAX': cp.PyMeasurement('BBOX_Z_MAX', z0 + 3*zw, 0.0, ''), } s.setParameters(pDict) return s
def testPropertiesName(self): print 'Testing PyMeasurement: "name" property getter/setter' m = cp.PyMeasurement('speed', 12.345, 0.987, 'm/s') self.assertEqual(m.name, 'speed') m.name = 'dist' self.assertEqual(m.name, 'dist')
def testConvertTypeSafety(self): print 'Testing PyMeasurement: convert method type safety' with self.assertRaises(TypeError): m = cp.PyMeasurement('distance', 1.0, 0.1, cp.unit_kpc) m.convert(1000)
def testPropertiesUncertainty(self): print 'Testing PyMeasurement: "uncertainty" property getter/setter' m = cp.PyMeasurement('speed', 12.345, 0.987, 'm/s') self.assertEqual(m.uncertainty, 0.987) m.uncertainty = 1.0 self.assertEqual(m.uncertainty, 1.0)
def testPropertiesValue(self): print 'Testing PyMeasurement: "value" property getter/setter' m = cp.PyMeasurement('speed', 12.345, 0.987, 'm/s') self.assertEqual(m.value, 12.345) m.value = 1.0 self.assertEqual(m.value, 1.0)
def testCompOpsIncompatibleUnits(self): print 'Testing PyMeasurement: comparison operations raise exception when units incompatible' with self.assertRaises(TypeError): m1 = cp.PyMeasurement('speed', 12.345, 0.987, 'm/s') m3 = cp.PyMeasurement('distance', 0.55, 0.10, 'cm') m1 == m3
def testCompOps(self): print 'Testing PyMeasurement: comparison operations' m1 = cp.PyMeasurement('speed', 12.345, 0.987, 'm/s') m2 = cp.PyMeasurement('speed', 12.345, 0.987, 'cm/s') m3 = cp.PyMeasurement('distance', 0.55, 0.10, 'cm') self.assertEqual(m1 < m2, False) self.assertEqual(m1 <= m2, False) self.assertEqual(m1 > m2, True) self.assertEqual(m1 >= m2, True) self.assertEqual(m1 == m2, False) self.assertEqual(m1 != m2, True) m1 = cp.PyMeasurement('distance', 1000., 1000., cp.unit_kpc) m2 = cp.PyMeasurement('distance', 1.0, 1.0, cp.unit_mpc) self.assertEqual(m1 == m2, True) m1 = cp.PyMeasurement('distance1', 1000., 1000., cp.unit_kpc) m2 = cp.PyMeasurement('distance2', 1.0, 1.0, cp.unit_mpc) self.assertEqual(m1 == m2, True) # shouldn't this be False? m1 = cp.PyMeasurement('distance1', 100., 1000., cp.unit_kpc) m2 = cp.PyMeasurement('distance2', 1.0, 1.0, cp.unit_mpc) self.assertEqual(m1 == m2, False) m1 = cp.PyMeasurement('distance1', 1000., 100., cp.unit_kpc) m2 = cp.PyMeasurement('distance2', 1.0, 1.0, cp.unit_mpc) self.assertEqual(m1 == m2, True) # shouldn't this be False?
def testSetterTypeSafety(self): print 'Testing PyMeasurement: setter type safety' with self.assertRaises(TypeError): m = cp.PyMeasurement() m.setM('speed', 'bla', 0.987, 'm/s')
def testConvert(self): print 'Testing PyMeasurement: convert method' m = cp.PyMeasurement('distance', 1.0, 0.1, cp.unit_kpc) self.assertEqual(m.convert(cp.unit_mpc), (0.001, 0.0001))
def testConstructor(self): print 'Testing PyMeasurement: constructor' m1 = cp.PyMeasurement() m2 = cp.PyMeasurement(m1) m3 = cp.PyMeasurement('speed', 12.345, 0.987, 'm/s')
def testInvert(self): print 'Testing PyMeasurement: invert method' m = cp.PyMeasurement('distance', 10., 0.1, 'm') m.invert() self.assertEqual(m.asString(), '0.1 ± 0.001 m⁻¹')
def testInvertZeroDivision(self): print 'Testing PyMeasurement: invert method, ZeroDivision exception' with self.assertRaises(ZeroDivisionError): m = cp.PyMeasurement('distance', 0.0, 0.1, 'm') m.invert()
def testConstructorTypeSafety(self): print 'Testing PyMeasurement: type safety' with self.assertRaises(TypeError): m = cp.PyMeasurement(1)
def testMathOps(self): print 'Testing PyMeasurement: mathematical operations' m1 = cp.PyMeasurement('speed', 12.345, 0.987, 'm/s') m2 = cp.PyMeasurement('distance', 0.55, 0.10, 'cm') self.assertEqual((m1*m2).asString(), '6.78975 ± 1.34858 × 10⁻² m² s⁻¹') self.assertEqual((-m1).asString(), '-12.345 ± 0.987 m s⁻¹')
def parametrise(cube, mask, objects, cathead, catformt, catparunits, Parameters, dunits): cathead = np.array(cathead) objects = np.array(objects) initcatalog = cp.PySourceCatalog() for obj in objects: # Check flags source_flag = create_source_flags( cube, mask, cathead, obj[cathead == "id"], obj[cathead == "x_min"], obj[cathead == "x_max"], obj[cathead == "y_min"], obj[cathead == "y_max"], obj[cathead == "z_min"], obj[cathead == "z_max"]) newSource = cp.PySource() newSource.ID = obj[cathead == "id"] newParamsDict = { "flag": cp.PyMeasurement("flag", source_flag, 0.0, ""), "x": cp.PyMeasurement("x", obj[cathead == "x_geo"], 0.0, ""), "y": cp.PyMeasurement("y", obj[cathead == "y_geo"], 0.0, ""), "z": cp.PyMeasurement("z", obj[cathead == "z_geo"], 0.0, ""), "x_min": cp.PyMeasurement("x_min", obj[cathead == "x_min"], 0.0, ""), "x_max": cp.PyMeasurement("x_max", obj[cathead == "x_max"], 0.0, ""), "y_min": cp.PyMeasurement("y_min", obj[cathead == "y_min"], 0.0, ""), "y_max": cp.PyMeasurement("y_max", obj[cathead == "y_max"], 0.0, ""), "z_min": cp.PyMeasurement("z_min", obj[cathead == "z_min"], 0.0, ""), "z_max": cp.PyMeasurement("z_max", obj[cathead == "z_max"], 0.0, "") } newSource.setParameters(newParamsDict) initcatalog.insert(newSource) moduleParametrizer = cp.PyModuleParametrisation() moduleParametrizer.setFlags(Parameters["parameters"]["optimiseMask"], Parameters["parameters"]["fitBusyFunction"]) cube = cube.astype("<f4", copy=False) mask = mask.astype("<i2", copy=False) moduleParametrizer.run(cube, mask, initcatalog) results = moduleParametrizer.getCatalog() # Append the results to the objects array or reset replParam = [ "x_min", "x_max", "y_min", "y_max", "z_min", "z_max", "id", "x", "y", "z", "n_pix" ] origParam = [ "x_min", "x_max", "y_min", "y_max", "z_min", "z_max", "id", "x", "y", "z", "n_pix" ] d = results.getSources() # Select data set with maximum number of parameters parsListLen = [ len(d[list(d.keys())[i]].getParameters()) for i in range(0, len(d)) ] index = parsListLen.index(max(parsListLen)) # Add parameter names from parameterisation pars = d[list(d.keys())[index]].getParameters() cathead = list(cathead) newunits = { "id": "-", "flag": "-", "x": "pix", "y": "pix", "z": "pix", "err_x": "pix", "err_y": "pix", "err_z": "pix", "x_min": "pix", "x_max": "pix", "y_min": "pix", "y_max": "pix", "z_min": "chan", "z_max": "chan", "w50": "chan", "w20": "chan", "err_w50": "chan", "err_w20": "chan", "wm50": "chan", "f_wm50": dunits, "ell_maj": "pix", "ell_min": "pix", "ell_pa": "deg", "ell3s_maj": "pix", "ell3s_min": "pix", "ell3s_pa": "deg", "kin_pa": "deg", "f_int": dunits, "bf_flag": "-", "bf_chi2": "-", "bf_z": "chan", "bf_a": dunits, "bf_b1": "chan**(-1)", "bf_b2": "chan**(-1)", "bf_c": "chan**(-2)", "bf_xe": "chan", "bf_xp": "chan", "bf_w": "chan", "bf_w50": "chan", "bf_w20": "chan", "bf_f_peak": dunits, "bf_f_int": dunits, "rms": dunits, "f_peak": dunits, "snr_int": "-" } catformt = list(catformt) catparunits = list(catparunits) for i in sorted(pars): if i not in replParam: cathead.append(i) catformt.append("%18.6e") catparunits.append(newunits[i]) # Extend the parameter array tmpObjects = np.empty((objects.shape[0], len(cathead))) tmpObjects[:, :] = np.nan tmpObjects[:, 0:objects.shape[1]] = objects objects = tmpObjects for i in d: source_dict = d[i].getParameters() # Check source index ID = int(source_dict["id"].getValue()) IDind = cathead.index("id") ind = np.where(objects[:, IDind] == ID)[0][0] for j in sorted(source_dict): if j in replParam: objects[ind][cathead.index(origParam[replParam.index( j)])] = source_dict[j].getValue() else: objects[ind][cathead.index(j)] = source_dict[j].getValue() objects = np.array(objects) cathead = np.array(cathead) catparunits = np.array(catparunits) catformt = np.array(catformt) # if mask optimization is enabled, some parameters from the linker have to be updated if Parameters["parameters"]["optimiseMask"]: for i in range(objects.shape[0]): # bounding box coordinates coord = [] for c in ["x_min", "x_max", "y_min", "y_max", "z_min", "z_max"]: coord.append(int(objects[i, cathead == c])) # cut out object submask submask = mask[coord[4]:coord[5] + 1, coord[2]:coord[3] + 1, coord[0]:coord[1] + 1] objID = objects[i, cathead == "id"] submask[submask != objID] = 0 # Update n_pix, x_geo and n_chan n_pix = submask.sum() / objID ind = np.vstack(np.where(submask == objID)) cgeo = (ind.sum(axis=1)).astype(float) / float(n_pix) x_geo, y_geo, z_geo = cgeo[2] + coord[0], cgeo[1] + coord[2], cgeo[ 0] + coord[4] zmin, zmax = min(ind[0]), max(ind[0]) + 1 n_chan = zmax - zmin # Update n_los submaskSumA0 = submask.sum(axis=0) submaskSumA0[submaskSumA0 > 1] = 1 n_los = submaskSumA0.sum() objects[i, cathead == "n_pix"] = n_pix objects[i, cathead == "n_chan"] = n_chan objects[i, cathead == "n_los"] = n_los objects[i, cathead == "x_geo"] = x_geo objects[i, cathead == "y_geo"] = y_geo objects[i, cathead == "z_geo"] = z_geo del submask err.message("Parameterisation complete.") return cube, mask, objects, cathead, catformt, catparunits
def testSetter(self): print 'Testing PyMeasurement: setter' m = cp.PyMeasurement() m.setM('speed', 12.345, 0.987, 'm/s') m.setM('speed', 12.345, 0.987, cp.PyUnit('m/s')) m.setM(u'speed', 12.345, 0.987, u'm/s')