|
22 | 22 | from arc.common import ARC_PATH, almost_equal_coords, almost_equal_coords_lists, almost_equal_lists |
23 | 23 | from arc.exceptions import ConverterError |
24 | 24 | from arc.species.species import ARCSpecies |
25 | | -from arc.species.vectors import calculate_dihedral_angle |
| 25 | +from arc.species.vectors import calculate_dihedral_angle, calculate_param |
26 | 26 | from arc.species.zmat import _compare_zmats, xyz_to_zmat |
27 | 27 |
|
28 | 28 |
|
@@ -5058,6 +5058,113 @@ def test_cluster_confs_by_rmsd(self): |
5058 | 5058 | xyzs3 = [nco_1, nco_2, nco_6, nco_7, nco_8, nco_9] |
5059 | 5059 | self.assertEqual(len(converter.cluster_confs_by_rmsd(xyzs3)), 4) |
5060 | 5060 |
|
| 5061 | + def test_add_atom_to_xyz_using_internal_coords(self): |
| 5062 | + """Test the add_atom_to_xyz_using_internal_coords() function.""" |
| 5063 | + xyz_1 = """ C -3.63243985 -0.48299420 -0.05541310 |
| 5064 | + H -3.27244945 -1.49054926 -0.06723326 |
| 5065 | + H -3.24128971 0.04543562 -0.89960709 |
| 5066 | + H -4.70149255 -0.48565830 -0.10034895 |
| 5067 | + C -3.17488405 0.21042224 1.24128129 |
| 5068 | + H -3.53487445 1.21797729 1.25310144 |
| 5069 | + H -3.56603419 -0.31800758 2.08547528 |
| 5070 | + C -1.63624745 0.21425655 1.30595531 |
| 5071 | + H -1.24509731 0.74268637 0.46176133 |
| 5072 | + H -1.31833530 0.69604590 2.20690531""" |
| 5073 | + new_xyz_1 = converter.add_atom_to_xyz_using_internal_coords(xyz=xyz_1, |
| 5074 | + element='Cl', |
| 5075 | + r_index=7, |
| 5076 | + a_indices=(4, 7), |
| 5077 | + d_indices=(0, 4, 7), |
| 5078 | + r_value=1.77, |
| 5079 | + a_value=109.5, |
| 5080 | + d_value=-60.0, |
| 5081 | + ) |
| 5082 | + expected_xyz_1 = {'symbols': ('C', 'H', 'H', 'H', 'C', 'H', 'H', 'C', 'H', 'H', 'Cl'), |
| 5083 | + 'isotopes': (12, 1, 1, 1, 12, 1, 1, 12, 1, 1, 35), |
| 5084 | + 'coords': ((-3.63243985, -0.4829942, -0.0554131), (-3.27244945, -1.49054926, -0.06723326), |
| 5085 | + (-3.24128971, 0.04543562, -0.89960709), (-4.70149255, -0.4856583, -0.10034895), |
| 5086 | + (-3.17488405, 0.21042224, 1.24128129), (-3.53487445, 1.21797729, 1.25310144), |
| 5087 | + (-3.56603419, -0.31800758, 2.08547528), (-1.63624745, 0.21425655, 1.30595531), |
| 5088 | + (-1.24509731, 0.74268637, 0.46176133), (-1.3183353, 0.6960459, 2.20690531), |
| 5089 | + (-1.0399130826377951, -1.4521481683234707, 1.2864453881141027))} |
| 5090 | + self.assertEqual(new_xyz_1, expected_xyz_1) |
| 5091 | + self.assertAlmostEqual(calculate_param(coords=new_xyz_1['coords'], atoms=[7, 10]), 1.77, places=2) |
| 5092 | + self.assertAlmostEqual(calculate_param(coords=new_xyz_1['coords'], atoms=[4, 7, 10]), 109.5, places=1) |
| 5093 | + self.assertAlmostEqual(calculate_param(coords=new_xyz_1['coords'], atoms=[0, 4, 7, 10]), 300, places=1) |
| 5094 | + |
| 5095 | + new_xyz_2 = converter.add_atom_to_xyz_using_internal_coords(xyz=xyz_1, |
| 5096 | + element='Cl', |
| 5097 | + r_index=4, |
| 5098 | + a_indices=(4, 0), |
| 5099 | + d_indices=(0, 4, 7), |
| 5100 | + r_value=2.70, |
| 5101 | + a_value=61.46, |
| 5102 | + d_value=-60.0, |
| 5103 | + opt_method='BFGS', |
| 5104 | + ) |
| 5105 | + self.assertEqual(new_xyz_2['coords'][-1], (-1.0966631688164716, -1.5123640474266677, 1.296181153302943)) |
| 5106 | + self.assertAlmostEqual(calculate_param(coords=new_xyz_1['coords'], atoms=[4, 10]), 2.70, places=1) |
| 5107 | + self.assertAlmostEqual(calculate_param(coords=new_xyz_1['coords'], atoms=[4, 0, 10]), 61.46, places=0) |
| 5108 | + self.assertAlmostEqual(calculate_param(coords=new_xyz_1['coords'], atoms=[0, 4, 7, 10]), 300, places=1) |
| 5109 | + |
| 5110 | + xyz_3 = """C -1.01765390 -0.08355112 0.05206009 |
| 5111 | + O 0.22303684 -0.79051481 0.05294172 |
| 5112 | + C 0.35773087 -1.66017412 -0.97863090 |
| 5113 | + O -0.45608483 -1.87500387 -1.86208833 |
| 5114 | + H -1.82486467 -0.81522856 0.14629516 |
| 5115 | + H -1.06962462 0.60119223 0.90442455 |
| 5116 | + H -1.14968688 0.45844916 -0.88969505 |
| 5117 | + H 1.33643417 -2.15859899 -0.90083808""" |
| 5118 | + new_xyz_3 = converter.add_atom_to_xyz_using_internal_coords(xyz=xyz_3, |
| 5119 | + element='O', |
| 5120 | + r_index=2, |
| 5121 | + a_indices=(1, 2), |
| 5122 | + d_indices=(3, 7, 2), |
| 5123 | + r_value=1.85, |
| 5124 | + a_value=77.4, |
| 5125 | + d_value=140, |
| 5126 | + ) |
| 5127 | + expected_xyz = {'symbols': ('C', 'O', 'C', 'O', 'H', 'H', 'H', 'H', 'O'), |
| 5128 | + 'isotopes': (12, 16, 12, 16, 1, 1, 1, 1, 16), |
| 5129 | + 'coords': ((-1.0176539, -0.08355112, 0.05206009), (0.22303684, -0.79051481, 0.05294172), |
| 5130 | + (0.35773087, -1.66017412, -0.9786309), (-0.45608483, -1.87500387, -1.86208833), |
| 5131 | + (-1.82486467, -0.81522856, 0.14629516), (-1.06962462, 0.60119223, 0.90442455), |
| 5132 | + (-1.14968688, 0.45844916, -0.88969505), (1.33643417, -2.15859899, -0.90083808), |
| 5133 | + (1.4828269120297688, -2.3770289575185632, 0.3030781302151979))} |
| 5134 | + self.assertEqual(new_xyz_3, expected_xyz) |
| 5135 | + self.assertAlmostEqual(calculate_param(coords=new_xyz_3['coords'], atoms=[2, 8]), 1.85, places=2) |
| 5136 | + self.assertAlmostEqual(calculate_param(coords=new_xyz_3['coords'], atoms=[1, 2, 8]), 77.4, places=1) |
| 5137 | + self.assertAlmostEqual(calculate_param(coords=new_xyz_3['coords'], atoms=[3, 7, 2, 8]), 140, places=1) |
| 5138 | + |
| 5139 | + xyz_4 = """C 2.44505336 0.33426556 -0.05839486 |
| 5140 | + C 1.22268719 -0.52813666 0.01896600 |
| 5141 | + O 1.23293886 -1.74943142 -0.03929182 |
| 5142 | + O 0.11391589 0.24824549 0.16222715 |
| 5143 | + C -1.11109125 -0.48993657 0.24566449 |
| 5144 | + C -2.25017001 0.49859954 0.40179846 |
| 5145 | + H 2.37692031 0.99705687 -0.92466676 |
| 5146 | + H 3.32902965 -0.29956749 -0.17330464 |
| 5147 | + H 2.54916374 0.91324784 0.86263828 |
| 5148 | + H -1.08105124 -1.15952384 1.11255293 |
| 5149 | + H -1.25277743 -1.07595826 -0.66934869 |
| 5150 | + H -2.28059310 1.18899674 -0.44763085 |
| 5151 | + H -3.21043340 -0.02017141 0.47000585 |
| 5152 | + H -2.11200849 1.10694712 1.30175876""" |
| 5153 | + new_xyz_4 = converter.add_atom_to_xyz_using_internal_coords(xyz=xyz_4, |
| 5154 | + element='O', |
| 5155 | + r_index=1, |
| 5156 | + a_indices=(3, 1), |
| 5157 | + d_indices=(2, 0, 1), |
| 5158 | + r_value=1.85, |
| 5159 | + a_value=77.4, |
| 5160 | + d_value=140, |
| 5161 | + ) |
| 5162 | + self.assertEqual(new_xyz_4['coords'][-1], (1.89932405279869, 0.9989208520839763, 0.8144268165647406)) |
| 5163 | + self.assertAlmostEqual(calculate_param(coords=new_xyz_4['coords'], atoms=[1, 14]), 1.85, places=2) |
| 5164 | + self.assertAlmostEqual(calculate_param(coords=new_xyz_4['coords'], atoms=[3, 1, 14]), 77.4, places=1) |
| 5165 | + self.assertAlmostEqual(calculate_param(coords=new_xyz_4['coords'], atoms=[2, 0, 1, 14]), 140, places=1) |
| 5166 | + |
| 5167 | + |
5061 | 5168 | @classmethod |
5062 | 5169 | def tearDownClass(cls): |
5063 | 5170 | """ |
|
0 commit comments