def test_change_distance(self): def validate_distance(before, after, moved): dist = np.linalg.norm(after.coords - before.coords) return abs(dist - moved) threshold = 10**(-8) mol = Geometry(TestGeometry.benz_NO2_Cl) a1 = mol.atoms[0] # C1 a3 = mol.atoms[5] # attached to C1 a2 = mol.atoms[11] # N12 a4 = mol.atoms[12] # attached to N12 # set distance and move fragments a3_before = copy(a3) a4_before = copy(a4) dist_before = np.linalg.norm(a1.coords - a2.coords) mol.change_distance(a1, a2, dist=2.00) dist = np.linalg.norm(a1.coords - a2.coords) self.assertTrue(is_close(dist, 2.00, threshold)) self.assertTrue(validate_distance(a3_before, a3, dist - dist_before)) self.assertTrue(validate_distance(a4_before, a4, dist - dist_before)) # adjust_distance and move fragments a3_before = copy(a3) a4_before = copy(a4) dist_before = np.linalg.norm(a1.coords - a2.coords) mol.change_distance(a1, a2, dist=-0.5, adjust=True) self.assertTrue(is_close(a1.dist(a2), 1.5, threshold)) self.assertTrue(validate_distance(a3_before, a3, -0.5)) self.assertTrue(validate_distance(a4_before, a4, -0.5)) # set and fix atom 1 a1_before = copy(a1) mol.change_distance(a1, a2, dist=2.00, fix=1) self.assertTrue(is_close(a1.dist(a2), 2.00, threshold)) self.assertTrue(a1_before.dist(a1) < threshold) # adjust and fix atom 2 a2_before = copy(a2) mol.change_distance(a1, a2, dist=-0.5, adjust=True, fix=2) self.assertTrue(is_close(a1.dist(a2), 1.5, threshold)) self.assertTrue(a2_before.dist(a2) < threshold) # set and don't move fragments a3_before = copy(a3) a4_before = copy(a4) dist_before = np.linalg.norm(a1.coords - a2.coords) mol.change_distance(a1, a2, dist=2.00, as_group=False) dist = np.linalg.norm(a1.coords - a2.coords) self.assertTrue(is_close(a1.dist(a2), 2.00, threshold)) self.assertTrue(validate_distance(a3_before, a3, dist - dist_before)) self.assertTrue(validate_distance(a4_before, a4, dist - dist_before))
def test_compare_connectivity(self): geom = Geometry(TestGeometry.cat) ref = Geometry(TestGeometry.cat) # no formed/broken broken, formed = geom.compare_connectivity(ref) self.assertTrue(len(broken) == 0) self.assertTrue(len(formed) == 0) # broken geom.change_distance("10", "15", dist=1, adjust=True) geom.refresh_connected() broken, formed = geom.compare_connectivity(ref) self.assertTrue(len(broken) == 1) self.assertTrue(len(formed) == 0) self.assertSetEqual(broken, set([("10", "15")])) # formed ref.change_distance("10", "15", dist=1, adjust=True) ref.refresh_connected() geom.change_distance("10", "15", dist=-1, adjust=True) geom.refresh_connected() broken, formed = geom.compare_connectivity(ref) self.assertTrue(len(broken) == 0) self.assertTrue(len(formed) == 1) self.assertSetEqual(formed, set([("10", "15")])) # broken and formed geom.change_distance("20", "29", dist=1, adjust=True) geom.refresh_connected() broken, formed = geom.compare_connectivity(ref) self.assertTrue(len(broken) == 1) self.assertTrue(len(formed) == 1) self.assertSetEqual(broken, set([("20", "29")])) self.assertSetEqual(formed, set([("10", "15")]))
def test_examine_constraints(self): cat = Geometry(TestGeometry.cat) rv = cat.examine_constraints() self.assertSequenceEqual(rv, []) cat.change_distance(cat.atoms[0], cat.atoms[1], dist=0.5, adjust=True) rv = cat.examine_constraints() self.assertSequenceEqual(rv, [(0, 1, -1)]) cat.change_distance(cat.atoms[0], cat.atoms[1], dist=-1.0, adjust=True) rv = cat.examine_constraints() self.assertSequenceEqual(rv, [(0, 1, 1)]) cat.change_distance(cat.atoms[1], cat.atoms[2], dist=0.5, adjust=True) rv = cat.examine_constraints() self.assertSequenceEqual(rv, [(0, 1, 1), (1, 2, -1)])
else: infile = FileReader(f) else: if args.input_format is not None: infile = FileReader(("from stdin", args.input_format, f)) else: infile = FileReader(("from stdin", "xyz", f)) geom = Geometry(infile) #set bond to specified value for bond in args.set_ang: vals = two_atoms_and_a_float(bond) a1 = geom.find(str(vals[0]))[0] a2 = geom.find(str(vals[1]))[0] geom.change_distance(a1, a2, dist=vals[2], adjust=False) #change bond by specified amount for bond in args.change: vals = two_atoms_and_a_float(bond) a1 = geom.find(str(vals[0]))[0] a2 = geom.find(str(vals[1]))[0] geom.change_distance(a1, a2, dist=vals[2], adjust=True) #print specified bonds out = "" for bond in args.measure: a1 = geom.find(str(bond[0]))[0] a2 = geom.find(str(bond[1]))[0] val = a1.dist(a2) out += "%f\n" % val