Skip to content

Commit 0551fd1

Browse files
eprettipre-commit-ci[bot]jthortonj-wags
authored
SMIRNOFF: multiple force field files, virtual sites, and constraints (#423)
* Support virtual sites and multiple SMIRNOFF force fields * Put test files where tests can actually find them * Clean up some changes in template_generators.py * Clean up virtual site permutation handling in test cases * Unfinished draft * Allow specifying multiple force fields * Support constraints and virtual sites * Add more tests for constraints * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Run tests on OpenMM 8.5.0 beta since we need ForceField changes * Need openmm_dev channel * Use correct channel names (openmm_rc for beta) * Minor improvement to torsion handling, fix incorrect comment * Default to unconstrained variant of force field when given name * Test molecule is unstable due to vsite/H overlap * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update vsite tests with more varieties of molecules * Autoformatter * Update openmmforcefields/generators/template_generators.py Co-authored-by: Josh Horton <[email protected]> * 1-4 exception check (not vsites) now uses non-zero scalings * Use preset list of known force field names, update documentation * Reduce test set size after Interchange cache behavior change * Update openmmforcefields/tests/test_template_generators.py Co-authored-by: Jeff Wagner <[email protected]> * Water constraints test also checks TIP3P inside openff_unconstrained * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix error message if preset force field file can't be located --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Josh Horton <[email protected]> Co-authored-by: Jeff Wagner <[email protected]>
1 parent fb8ed0e commit 0551fd1

File tree

16 files changed

+1768
-390
lines changed

16 files changed

+1768
-390
lines changed

.github/workflows/ci.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
os: [ubuntu-latest, macos-latest]
3131
python-version: ["3.11", "3.12", "3.13"]
3232
amber-conversion: [false]
33-
openmm-version: ["8.3.1", "8.4.0"]
33+
openmm-version: ["8.5.0beta"]
3434

3535
steps:
3636
- uses: actions/checkout@v6

README.md

Lines changed: 48 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -189,12 +189,10 @@ Create a SMIRNOFF template generator for a single molecule (benzene, created fro
189189
from openff.toolkit import Molecule
190190

191191
molecule = Molecule.from_smiles("c1ccccc1")
192-
# Create the SMIRNOFF template generator with the default installed force field (openff-2.2.1)
193-
from openmmforcefields.generators import (
194-
SMIRNOFFTemplateGenerator,
195-
)
192+
# Create the SMIRNOFF template generator with the openff-2.3.0 force field
193+
from openmmforcefields.generators import SMIRNOFFTemplateGenerator
196194

197-
smirnoff = SMIRNOFFTemplateGenerator(molecules=molecule)
195+
smirnoff = SMIRNOFFTemplateGenerator(molecules=molecule, forcefield="openff-2.3.0")
198196
# Create an OpenMM ForceField object with AMBER ff14SB and TIP3P with compatible ions
199197
from openmm.app import ForceField
200198

@@ -208,54 +206,81 @@ forcefield.registerTemplateGenerator(smirnoff.generator)
208206

209207
# create a System with the non-bonded settings of mainline OpenFF force fields
210208
# (9 Angstrom cut-off, switching distance applied at 8 Angstrom)
209+
import openmm.unit
211210
system = forcefield.createSystem(
212211
topology=molecule.to_topology().to_openmm(),
213212
nonbondedCutoff=0.9 * openmm.unit.nanometer,
214213
switchDistance=0.8 * openmm.unit.nanometer,
215214
)
216215
```
217216

218-
The latest official Open Force Field Initiative release ([`openff-2.2.1`](https://github.com/openforcefield/openff-forcefields) of the ["Sage" small molecule force field](https://openforcefield.org/force-fields/force-fields/)) is used if none is specified.
219-
You can check which SMIRNOFF force field is in use with
217+
You can create a template generator capable of recognizing multiple molecules,
218+
*e.g.*, read from an SDF file:
220219

221-
```pycon
222-
>>> smirnoff.smirnoff_filename
223-
'/Users/mattthompson/mambaforge/envs/openmmforcefields/lib/python3.11/site-packages/openforcefields/offxml/openff-2.2.1.offxml'
220+
```python
221+
molecules = Molecule.from_file("molecules.sdf")
222+
smirnoff = SMIRNOFFTemplateGenerator(molecules=molecules, forcefield="openff-2.3.0")
224223
```
225224

226-
Create a template generator for a specific SMIRNOFF force field for multiple molecules read from an SDF file:
225+
You can also add molecules to the generator later, even after the generator has been registered:
227226

228227
```python
229-
molecules = Molecule.from_file("molecules.sdf")
230-
# Create a SMIRNOFF residue template generator from the official openff-2.2.1 release,
231-
# which is installed automatically
232-
smirnoff = SMIRNOFFTemplateGenerator(molecules=molecules, forcefield="openff-2.2.1")
228+
smirnoff.add_molecules(molecule)
229+
smirnoff.add_molecules([molecule1, molecule2])
230+
```
231+
232+
You must specify the desired SMIRNOFF force field with the `forcefield` keyword
233+
argument when you create a `SMIRNOFFTemplateGenerator` by providing at least one
234+
force field name, path to an OFFXML force field file, file object, or XML in a
235+
string. An iterable can be provided to the `forcefield` argument to load from
236+
multiple sources if desired. For exapmle:
237+
238+
```
233239
# Create a SMIRNOFF residue template generator from an older Sage or Parsley version
234240
smirnoff = SMIRNOFFTemplateGenerator(molecules=molecules, forcefield="openff-1.3.0")
241+
# Request a specific SMIRNOFF force field installed with OpenFF by its full name
242+
smirnoff = SMIRNOFFTemplateGenerator(molecules=molecules, forcefield="openff_unconstrained-1.3.0.offxml")
235243
# Use a local .offxml file instead
236244
smirnoff = SMIRNOFFTemplateGenerator(molecules=molecules, forcefield="local-file.offxml")
245+
# Load from multiple sources at once
246+
smirnoff = SMIRNOFFTemplateGenerator(molecules=molecule, forcefield=['openff-2.3.0', 'tip5p.offxml'])
237247
```
238248

239-
You can also add molecules to the generator later, even after the generator has been registered:
249+
You can check the full paths of the force field files that have been loaded:
240250

241-
```python
242-
smirnoff.add_molecules(molecule)
243-
smirnoff.add_molecules([molecule1, molecule2])
251+
```pycon
252+
>>> smirnoff.smirnoff_filenames
253+
['/.../offxml/openff_unconstrained-2.3.0.offxml', '/.../offxml/tip5p.offxml']
244254
```
245255

246-
To check which SMIRNOFF force fields are automatically installed, examine the `INSTALLED_FORCEFIELDS` attribute:
256+
Any force field installed with the OpenFF Toolkit can be requested by its
257+
filename, *e.g.*, `openff_unconstrained-2.3.0.offxml`. To see which force
258+
fields can be requested by an abbreviated name, examine `INSTALLED_FORCEFIELDS`:
247259

248260
```pycon
249-
>>> print(SMIRNOFFTemplateGenerator.INSTALLED_FORCEFIELDS)
250-
['ff14sb_off_impropers_0.0.2', 'ff14sb_off_impropers_0.0.4', 'ff14sb_off_impropers_0.0.1', 'ff14sb_off_impropers_0.0.3', 'tip3p_fb-1.1.0', 'tip3p_fb-1.0.0', 'openff-2.2.1-rc1', 'openff-1.0.1', 'openff-1.1.1', 'spce-1.0.0', 'openff_no_water-3.0.0-alpha0', 'openff-1.0.0-RC1', 'opc3', 'opc3-1.0.0', 'openff-2.1.0-rc.1', 'openff-2.3.0-rc2', 'openff-1.2.0', 'openff-1.3.0', 'tip3p-1.0.0', 'opc-1.0.2', 'openff-2.2.1', 'openff-2.0.0-rc.2', 'opc-1.0.0', 'openff-2.1.0', 'openff-2.0.0', 'tip4p_fb-1.0.1', 'tip3p', 'tip4p_ew', 'opc3-1.0.1', 'opc', 'openff-2.3.0-rc1', 'tip3p_fb-1.1.1', 'openff-1.1.0', 'openff-1.0.0', 'openff-1.0.0-RC2', 'openff-2.2.0-rc1', 'tip3p-1.0.1', 'openff-1.3.1', 'openff-1.2.1', 'tip4p_ew-1.0.0', 'openff-1.3.1-alpha.1', 'tip4p_fb', 'tip3p_fb', 'openff-2.2.0', 'spce', 'tip5p', 'tip4p_fb-1.0.0', 'openff-2.1.1', 'openff-2.0.0-rc.1', 'tip5p-1.0.0', 'opc-1.0.1']
261+
>>> SMIRNOFFTemplateGenerator.INSTALLED_FORCEFIELDS
262+
['openff-1.0.0', 'openff-1.0.1', 'openff-1.1.0', 'openff-1.1.1', ...]
251263
```
252264

265+
The names in this list are of the form `openff-x.y.z` and will resolve to the
266+
"unconstrained" variants of standard OpenFF force fields, which can also be
267+
loaded with filenames of the form `openff_unconstrained-x.y.z.offxml`. To
268+
obtain the "constrained" variants, use filenames `openff-x.y.z.offxml`. When
269+
the constrained variants are used, bonds to hydrogen atoms in molecules
270+
parameterized by the template generator will be constrained unconditionally,
271+
regardless of the constraint options given in `ForceField.createSystem()`. The
272+
unconstrained variants, which are the defaults selected if one of the predefined
273+
names in `INSTALLED_FORCEFIELDS` is used, do not force these constraints to be
274+
present, and the option of which degrees of freedom should be constrained are
275+
left up to the user by passing any desired `constraint` setting to
276+
[`ForceField.createSystem()`](https://docs.openmm.org/latest/api-python/generated/openmm.app.forcefield.ForceField.html#openmm.app.forcefield.ForceField.createSystem).
277+
253278
You can optionally specify a file that contains a cache of pre-parameterized molecules:
254279

255280
```python
256281
smirnoff = SMIRNOFFTemplateGenerator(
257282
cache="smirnoff-molecules.json",
258-
forcefield="openff-2.2.1",
283+
forcefield="openff-2.3.0",
259284
)
260285
```
261286

devtools/conda-envs/test_charmm_env.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
name: openmmforcefields-test-charmm
22
channels:
3-
- conda-forge/label/openmm_dev
43
- conda-forge
54
dependencies:
65
- numpy <2.3

devtools/conda-envs/test_env.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
name: openmmforcefields-test
22
channels:
3+
- conda-forge/label/openmm_rc
34
- conda-forge
45
dependencies:
56
- ambertools >=24
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
3+
<!--
4+
MIT License
5+
6+
Copyright (c) 2020 Open Force Field Initiative
7+
8+
Permission is hereby granted, free of charge, to any person obtaining a copy
9+
of this software and associated documentation files (the "Software"), to deal
10+
in the Software without restriction, including without limitation the rights
11+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
copies of the Software, and to permit persons to whom the Software is
13+
furnished to do so, subject to the following conditions:
14+
15+
The above copyright notice and this permission notice shall be included in all
16+
copies or substantial portions of the Software.
17+
18+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24+
SOFTWARE.
25+
-->
26+
27+
<SMIRNOFF version="0.3" aromaticity_model="OEAroModel_MDL">
28+
<VirtualSites version="0.3" exclusion_policy="parents">
29+
<!-- A chlorine bound to (any) carbon, for fixing sigma holes -->
30+
<VirtualSite
31+
smirks="[#6:2]-[#17X1:1]"
32+
epsilon="0.5 * kilojoules_per_mole ** 1"
33+
type="BondCharge"
34+
match="all_permutations"
35+
distance="0.13 * angstrom ** 1"
36+
outOfPlaneAngle="None"
37+
inPlaneAngle="None"
38+
charge_increment1="-0.063 * elementary_charge ** 1"
39+
charge_increment2="0.1 * elementary_charge ** 1"
40+
sigma="2.0 * angstrom ** 1"
41+
name="sigma_hole">
42+
</VirtualSite>
43+
<!-- An oxygen in a carbonyl group, flip outOfPlaneAngle to 41 -->
44+
<VirtualSite
45+
smirks="[#8:1]=[#6X3+0:2]-[#6:3]"
46+
epsilon="0.1 * kilocalories_per_mole ** 1"
47+
type="MonovalentLonePair"
48+
match="all_permutations"
49+
distance="0.15 * angstrom ** 1"
50+
outOfPlaneAngle="0 * degree ** 1"
51+
inPlaneAngle="110 * degree ** 1"
52+
charge_increment1="0.1 * elementary_charge ** 1"
53+
charge_increment2="-0.2 * elementary_charge ** 1"
54+
charge_increment3="0.3 * elementary_charge ** 1"
55+
sigma="0.05 * angstrom ** 1"
56+
name="planar_carbonyl">
57+
</VirtualSite>
58+
<!-- A conventional five-site water model -->
59+
<VirtualSite
60+
smirks="[#1:2]-[#8X2H2+0:1]-[#1:3]"
61+
epsilon="0.0 * kilocalorie_per_mole ** 1"
62+
type="DivalentLonePair"
63+
match="all_permutations"
64+
distance="0.07 * nanometer ** 1"
65+
outOfPlaneAngle="54.735 * degree ** 1"
66+
inPlaneAngle="None"
67+
charge_increment1="0.0 * elementary_charge ** 1"
68+
charge_increment2="0.1205 * elementary_charge ** 1"
69+
charge_increment3="0.1205 * elementary_charge ** 1"
70+
sigma="10.0 * angstrom ** 1"
71+
name="5_site_water"
72+
></VirtualSite>
73+
<!-- On order to avoid applying two water models at the same time, this file -->
74+
<!-- only includes five-site water parameters. To see a conventional -->
75+
<!-- four-site water model, load ForceField("tip4p.offxml") -->
76+
<!-- -->
77+
<!-- A trivalent nitrogen, occupying the location of the lone pair -->
78+
<!-- 5 nm distance looks comically large - can we do 0.5 or 1 A? -->
79+
<VirtualSite
80+
smirks="[*:2][#7:1]([*:3])[*:4]"
81+
epsilon="0.5 * kilojoules_per_mole ** 1"
82+
type="TrivalentLonePair"
83+
match="once"
84+
distance="0.17 * angstrom ** 1"
85+
outOfPlaneAngle="None"
86+
inPlaneAngle="None"
87+
charge_increment1="0.2 * elementary_charge ** 1"
88+
charge_increment2="0.05 * elementary_charge ** 1"
89+
charge_increment3="-0.1 * elementary_charge ** 1"
90+
charge_increment4="-0.15 * elementary_charge ** 1"
91+
sigma="1.0 * angstrom ** 1"
92+
name="trivalent_nitrogen">
93+
</VirtualSite>
94+
</VirtualSites>
95+
</SMIRNOFF>
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
2+
RDKit 3D
3+
4+
29 31 0 0 0 0 0 0 0 0999 V2000
5+
0.1436 -0.4509 -1.8528 O 0 0 0 0 0 0 0 0 0 0 0 0
6+
-0.4966 -0.1842 -0.7964 C 0 0 0 0 0 0 0 0 0 0 0 0
7+
-1.9644 -0.1585 -0.6158 C 0 0 0 0 0 0 0 0 0 0 0 0
8+
-3.0110 -0.4020 -1.4882 C 0 0 0 0 0 0 0 0 0 0 0 0
9+
-4.3215 -0.2970 -1.0129 C 0 0 0 0 0 0 0 0 0 0 0 0
10+
-4.5791 0.0421 0.2985 C 0 0 0 0 0 0 0 0 0 0 0 0
11+
-6.2349 0.1786 0.9137 Cl 0 0 0 0 0 0 0 0 0 0 0 0
12+
-3.5263 0.2899 1.1873 C 0 0 0 0 0 0 0 0 0 0 0 0
13+
-2.2274 0.1808 0.6969 C 0 0 0 0 0 0 0 0 0 0 0 0
14+
-0.9669 0.3890 1.4224 C 0 0 0 0 0 0 0 0 0 0 0 0
15+
-0.8448 0.7068 2.6314 O 0 0 0 0 0 0 0 0 0 0 0 0
16+
0.0872 0.1543 0.4654 N 0 0 0 0 0 0 0 0 0 0 0 0
17+
1.5156 0.2595 0.7876 C 0 0 1 0 0 0 0 0 0 0 0 0
18+
2.2003 -1.0327 0.5336 C 0 0 0 0 0 0 0 0 0 0 0 0
19+
3.6561 -0.8959 0.1604 C 0 0 0 0 0 0 0 0 0 0 0 0
20+
3.8704 0.0658 -0.9502 C 0 0 0 0 0 0 0 0 0 0 0 0
21+
4.7492 -0.0765 -1.8340 O 0 0 0 0 0 0 0 0 0 0 0 0
22+
3.0366 1.2145 -1.0226 N 0 0 0 0 0 0 0 0 0 0 0 0
23+
2.0948 1.3978 0.0236 C 0 0 0 0 0 0 0 0 0 0 0 0
24+
1.7009 2.5528 0.3574 O 0 0 0 0 0 0 0 0 0 0 0 0
25+
-2.7935 -0.6670 -2.5140 H 0 0 0 0 0 0 0 0 0 0 0 0
26+
-5.1559 -0.4824 -1.6753 H 0 0 0 0 0 0 0 0 0 0 0 0
27+
-3.7307 0.5575 2.2222 H 0 0 0 0 0 0 0 0 0 0 0 0
28+
1.6517 0.5408 1.8558 H 0 0 0 0 0 0 0 0 0 0 0 0
29+
1.6762 -1.6146 -0.2500 H 0 0 0 0 0 0 0 0 0 0 0 0
30+
2.1626 -1.6690 1.4423 H 0 0 0 0 0 0 0 0 0 0 0 0
31+
3.9824 -1.8914 -0.2318 H 0 0 0 0 0 0 0 0 0 0 0 0
32+
4.2466 -0.6270 1.0364 H 0 0 0 0 0 0 0 0 0 0 0 0
33+
3.0787 1.9191 -1.7909 H 0 0 0 0 0 0 0 0 0 0 0 0
34+
1 2 2 0
35+
2 3 1 0
36+
3 4 2 0
37+
4 5 1 0
38+
5 6 2 0
39+
6 7 1 0
40+
6 8 1 0
41+
8 9 2 0
42+
9 10 1 0
43+
10 11 2 0
44+
10 12 1 0
45+
12 13 1 0
46+
13 14 1 0
47+
14 15 1 0
48+
15 16 1 0
49+
16 17 2 0
50+
16 18 1 0
51+
18 19 1 0
52+
19 20 2 0
53+
12 2 1 0
54+
9 3 1 0
55+
19 13 1 0
56+
4 21 1 0
57+
5 22 1 0
58+
8 23 1 0
59+
13 24 1 1
60+
14 25 1 0
61+
14 26 1 0
62+
15 27 1 0
63+
15 28 1 0
64+
18 29 1 0
65+
M END
66+
> <atom.dprop.PartialCharge> (1)
67+
-0.56515204431167965 0.74306053398498173 -0.13963260771385555 -0.050116802469409742 -0.11601972104660396 0.03780772639759656 -0.080641309634364888 -0.053396160617984571
68+
-0.12579522551647548 0.74183500288375492 -0.56509708882919674 -0.53693997384659176 0.06700046090730305 -0.089005465522922322 -0.15062590958229427 0.71034175632842655 -0.59908800841919307
69+
-0.60823964597336178 0.69618905065902348 -0.59525155545822506 0.16555642066844578 0.15883733807452793 0.17739490149863835 0.10420614956267948 0.077082541867576793 0.077082541867576793
70+
0.087043036803089335 0.087043036803089335 0.34452102063544865
71+
72+
$$$$
73+
74+
RDKit 3D
75+
76+
29 31 0 0 0 0 0 0 0 0999 V2000
77+
6.2240 6.5440 7.7630 H 0 0 0 0 0 0 0 0 0 0 0 0
78+
8.9240 3.6310 8.0160 H 0 0 0 0 0 0 0 0 0 0 0 0
79+
9.6470 4.4060 6.5480 H 0 0 0 0 0 0 0 0 0 0 0 0
80+
8.2680 2.3880 6.1130 H 0 0 0 0 0 0 0 0 0 0 0 0
81+
7.8700 3.8230 5.1710 H 0 0 0 0 0 0 0 0 0 0 0 0
82+
6.3110 2.4150 7.3330 H 0 0 0 0 0 0 0 0 0 0 0 0
83+
2.6290 0.5190 3.8750 H 0 0 0 0 0 0 0 0 0 0 0 0
84+
2.3560 3.4410 0.7630 H 0 0 0 0 0 0 0 0 0 0 0 0
85+
4.0910 4.8540 1.9060 H 0 0 0 0 0 0 0 0 0 0 0 0
86+
4.8520 4.3210 8.0670 O 0 0 0 0 0 0 0 0 0 0 0 0
87+
5.9600 4.4510 7.4700 C 0 0 0 0 0 0 0 0 0 0 0 0
88+
6.7220 5.6450 7.5820 N 0 0 0 0 0 0 0 0 0 0 0 0
89+
8.8220 6.5650 7.5990 O 0 0 0 0 0 0 0 0 0 0 0 0
90+
8.1300 5.5300 7.4400 C 0 0 0 0 0 0 0 0 0 0 0 0
91+
8.7030 4.2000 7.1120 C 0 0 0 0 0 0 0 0 0 0 0 0
92+
7.8150 3.3980 6.1930 C 0 0 0 0 0 0 0 0 0 0 0 0
93+
6.4070 3.2910 6.6530 C 0 0 2 0 0 0 0 0 0 0 0 0
94+
5.5040 3.1480 5.5030 N 0 0 0 0 0 0 0 0 0 0 0 0
95+
4.4960 1.0170 6.0620 O 0 0 0 0 0 0 0 0 0 0 0 0
96+
4.6270 2.0180 5.3140 C 0 0 0 0 0 0 0 0 0 0 0 0
97+
3.9070 2.2690 4.0580 C 0 0 0 0 0 0 0 0 0 0 0 0
98+
2.9480 1.4670 3.4450 C 0 0 0 0 0 0 0 0 0 0 0 0
99+
1.1750 0.9050 1.4540 Cl 0 0 0 0 0 0 0 0 0 0 0 0
100+
2.3970 1.9190 2.2400 C 0 0 0 0 0 0 0 0 0 0 0 0
101+
2.8010 3.1190 1.6940 C 0 0 0 0 0 0 0 0 0 0 0 0
102+
3.7650 3.9110 2.3230 C 0 0 0 0 0 0 0 0 0 0 0 0
103+
4.3160 3.4710 3.5140 C 0 0 0 0 0 0 0 0 0 0 0 0
104+
5.3330 4.0570 4.4130 C 0 0 0 0 0 0 0 0 0 0 0 0
105+
5.9500 5.1510 4.2670 O 0 0 0 0 0 0 0 0 0 0 0 0
106+
1 12 1 0
107+
2 15 1 0
108+
3 15 1 0
109+
4 16 1 0
110+
5 16 1 0
111+
17 6 1 1
112+
7 22 1 0
113+
8 25 1 0
114+
9 26 1 0
115+
10 11 2 0
116+
11 12 1 0
117+
11 17 1 0
118+
12 14 1 0
119+
13 14 2 0
120+
14 15 1 0
121+
15 16 1 0
122+
16 17 1 0
123+
17 18 1 0
124+
18 20 1 0
125+
18 28 1 0
126+
19 20 2 0
127+
20 21 1 0
128+
21 22 1 0
129+
21 27 2 0
130+
22 24 2 0
131+
23 24 1 0
132+
24 25 1 0
133+
25 26 2 0
134+
26 27 1 0
135+
27 28 1 0
136+
28 29 2 0
137+
M END
138+
> <atom.dprop.PartialCharge> (1)
139+
0.34452102063544865 0.087043036803089335 0.087043036803089335 0.077082541867576793 0.077082541867576793 0.10420614956267948 0.17739490149863835 0.15883733807452793 0.16555642066844578
140+
-0.59525155545822506 0.69618905065902348 -0.60823964597336178 -0.59908800841919307 0.71034175632842655 -0.15062590958229427 -0.089005465522922322 0.06700046090730305 -0.53693997384659176
141+
-0.56509708882919674 0.74183500288375492 -0.12579522551647548 -0.053396160617984571 -0.080641309634364888 0.03780772639759656 -0.11601972104660396 -0.050116802469409742
142+
-0.13963260771385555 0.74306053398498173 -0.56515204431167965
143+
144+
$$$$

0 commit comments

Comments
 (0)