Chemically equivalent atoms with delocalized formal charge are assigned different torsions
chapincavender opened this issue ยท 5 comments
Describe the bug
Chemically equivalent atoms in which a nonzero charge is delocalized (represented by resonance structures with the formal charge on different atoms) are assigned different torsions by OpenFF 2.0.0. Examples include carboxylate and guanidinium groups.
To Reproduce
MWE for the amino acids aspartate (carboxylate) and arginine (guanidinium).
from openff.toolkit.topology import Molecule
from openff.toolkit.typing.engines.smirnoff import ForceField
ff = ForceField('openff-2.0.0.offxml')
aspartate = Molecule.from_smiles('CC(=O)N[C@@H](CC(=O)[O-])C(=O)NC')
labels = ff.label_molecules(aspartate.to_topology())[0]
torsion_label = labels['ProperTorsions']
print(f'SMILES {aspartate.to_smiles(mapped=True)}')
chi2_smirks = '[#7X3]-[#6X4:1](-[#6X3]=[#8])-[#6X4:2]-[#6X3:3]~[!#1:4]'
for match in aspartate.chemical_environment_matches(chi2_smirks):
if match in torsion_label:
parameter = torsion_label[match]
else:
parameter = torsion_label[match[::-1]]
print(
f'{match[0]+1:2d} {match[1]+1:2d} {match[2]+1:2d} {match[3]+1:2d} '
f'{parameter.id:4s} {parameter.smirks}'
)
symmetric_arg = Molecule.from_smiles('CC(=O)N[C@@H](CCC[NH+]=C(N)N)C(=O)NC')
labels = ff.label_molecules(symmetric_arg.to_topology())[0]
torsion_label = labels['ProperTorsions']
print(f'SMILES {symmetric_arg.to_smiles(mapped=True)}')
chi5_smirks = '[#7X3]-[#6X4](-[#6X3]=[#8])-[#6X4]-[#6X4]-[#6X4:1]-[#7:2]~[#6:3]~[#7:4]'
for match in symmetric_arg.chemical_environment_matches(chi5_smirks):
if match in torsion_label:
parameter = torsion_label[match]
else:
parameter = torsion_label[match[::-1]]
print(
f'{match[0]+1:2d} {match[1]+1:2d} {match[2]+1:2d} {match[3]+1:2d} '
f'{parameter.id:4s} {parameter.smirks}'
)
asymmetric_arg = Molecule.from_smiles('CC(=O)N[C@@H](CCC[NH]C(=[N+])N)C(=O)NC')
labels = ff.label_molecules(asymmetric_arg.to_topology())[0]
torsion_label = labels['ProperTorsions']
print(f'SMILES {asymmetric_arg.to_smiles(mapped=True)}')
for match in asymmetric_arg.chemical_environment_matches(chi5_smirks):
if match in torsion_label:
parameter = torsion_label[match]
else:
parameter = torsion_label[match[::-1]]
print(
f'{match[0]+1:2d} {match[1]+1:2d} {match[2]+1:2d} {match[3]+1:2d} '
f'{parameter.id:4s} {parameter.smirks}'
)
Output
The code above produces
SMILES [H:6][C@@:5]([C:11](=[O:12])[N:13]([H:21])[C:14]([H:22])([H:23])[H:24])([C:7]([H:19])([H:20])[C:8](=[O:9])[O-:10])[N:4]([H:18])[C:2](=[O:3])[C:1]([H:15])([H:16])[H:17]
5 7 8 9 t18 [*:1]-[#6X4:2]-[#6X3:3]=[*:4]
5 7 8 10 t17 [*:1]~[#6X3:2]-[#6X4:3]-[*:4]
SMILES [H:6][C@@:5]([C:14](=[O:15])[N:16]([H:33])[C:17]([H:34])([H:35])[H:36])([C:7]([H:22])([H:23])[C:8]([H:24])([H:25])[C:9]([H:26])([H:27])[N+:10](=[C:11]([N:12]([H:29])[H:30])[N:13]([H:31])[H:32])[H:28])[N:4]([H:21])[C:2](=[O:3])[C:1]([H:18])([H:19])[H:20]
9 10 11 12 t87 [*:1]-[#7X3+1:2]=,:[#6X3:3]-,:[*:4]
9 10 11 13 t87 [*:1]-[#7X3+1:2]=,:[#6X3:3]-,:[*:4]
SMILES [H:6][C@@:5]([C:14](=[O:15])[N:16]([H:31])[C:17]([H:32])([H:33])[H:34])([C:7]([H:22])([H:23])[C:8]([H:24])([H:25])[C:9]([H:26])([H:27])[N:10]([H:28])[C:11](=[N+:12])[N:13]([H:29])[H:30])[N:4]([H:21])[C:2](=[O:3])[C:1]([H:18])([H:19])[H:20]
9 10 11 12 t79 [*:1]-[#7X3:2]-!@[#6X3:3](=[#8,#16,#7:4])-[#7X3]
9 10 11 13 t75 [*:1]-[#7X3:2]-[#6X3$(*=[#8,#16,#7]):3]~[*:4]
For aspartate, the C-C-C=O torsion gets t18, but C-C-C-[O-] gets t17.
For symmetric arginine, where the formal charge is on the epsilon nitrogen, both C-[N+]=C-N torsions get t87.
For asymmetric arginine, where the formal charge is on one of the zeta nitrogens, the C-N-C=[N+] torsion gets t79, but C-N-C-N gets t75.
Computing environment (please complete the following information):
OS is Ubuntu 20.04.5.
openff-toolkit
is 0.10.6.
openff-forcefields
is 2.0.0.
Output of conda list
is
# Name Version Build Channel
_libgcc_mutex 0.1 conda_forge conda-forge
_openmp_mutex 4.5 2_gnu conda-forge
abseil-cpp 20210324.2 h9c3ff4c_0 conda-forge
amberlite 22.0 pypi_0 pypi
ambertools 22.0 py39hcb9d944_3 conda-forge
amberutils 21.0 pypi_0 pypi
amqp 5.1.1 pyhd8ed1ab_0 conda-forge
anyio 3.6.1 pyhd8ed1ab_1 conda-forge
argcomplete 2.0.0 pyhd8ed1ab_0 conda-forge
arpack 3.7.0 hdefa2d7_2 conda-forge
arrow-cpp 6.0.1 py39h2c67c1e_5_cpu conda-forge
asttokens 2.0.8 pyhd8ed1ab_0 conda-forge
astunparse 1.6.3 pyhd8ed1ab_0 conda-forge
async-timeout 4.0.2 pyhd8ed1ab_0 conda-forge
attrs 22.1.0 pyh71513ae_1 conda-forge
aws-c-auth 0.6.8 hadad3cd_1 conda-forge
aws-c-cal 0.5.12 h70efedd_7 conda-forge
aws-c-common 0.6.17 h7f98852_0 conda-forge
aws-c-compression 0.2.14 h7c7754b_7 conda-forge
aws-c-event-stream 0.2.7 hd2be095_32 conda-forge
aws-c-http 0.6.10 h416565a_3 conda-forge
aws-c-io 0.10.14 he836878_0 conda-forge
aws-c-mqtt 0.7.10 h885097b_0 conda-forge
aws-c-s3 0.1.29 h8d70ed6_0 conda-forge
aws-c-sdkutils 0.1.1 h7c7754b_4 conda-forge
aws-checksums 0.1.12 h7c7754b_6 conda-forge
aws-crt-cpp 0.17.10 h6ab17b9_5 conda-forge
aws-sdk-cpp 1.9.160 h36ff4c5_0 conda-forge
backcall 0.2.0 pyh9f0ad1d_0 conda-forge
backports 1.0 py_2 conda-forge
backports.functools_lru_cache 1.6.4 pyhd8ed1ab_0 conda-forge
basis_set_exchange 0.9 pyhd8ed1ab_0 conda-forge
billiard 3.6.4.0 py39hb9d737c_2 conda-forge
blosc 1.21.1 h83bc5f7_3 conda-forge
boost 1.74.0 py39h5472131_5 conda-forge
boost-cpp 1.74.0 h75c5d50_8 conda-forge
brotli 1.0.9 h166bdaf_7 conda-forge
brotli-bin 1.0.9 h166bdaf_7 conda-forge
brotlipy 0.7.0 py39hb9d737c_1004 conda-forge
bzip2 1.0.8 h7f98852_4 conda-forge
c-ares 1.18.1 h7f98852_0 conda-forge
ca-certificates 2022.9.14 ha878542_0 conda-forge
cached-property 1.5.2 hd8ed1ab_1 conda-forge
cached_property 1.5.2 pyha770c72_1 conda-forge
cachetools 5.2.0 pyhd8ed1ab_0 conda-forge
cairo 1.16.0 ha61ee94_1013 conda-forge
celery 5.2.7 pyhd8ed1ab_0 conda-forge
certifi 2022.9.14 pyhd8ed1ab_0 conda-forge
cffi 1.15.1 py39he91dace_0 conda-forge
charset-normalizer 2.1.1 pyhd8ed1ab_0 conda-forge
chemper 1.0.1 pyhd8ed1ab_0 conda-forge
click 8.1.3 py39hf3d152e_0 conda-forge
click-didyoumean 0.3.0 pyhd8ed1ab_0 conda-forge
click-option-group 0.5.3 pyhd8ed1ab_1 conda-forge
click-plugins 1.1.1 py_0 conda-forge
click-repl 0.2.0 pyhd8ed1ab_0 conda-forge
cmiles 0.1.6 ha770c72_2 conda-forge
cmiles-base 0.1.6 pyhd8ed1ab_2 conda-forge
colorama 0.4.5 pyhd8ed1ab_0 conda-forge
commonmark 0.9.1 py_0 conda-forge
conda-pack 0.7.0 pyh6c4a22f_0 conda-forge
contourpy 1.0.5 py39hf939315_0 conda-forge
cryptography 37.0.4 py39hd97740a_0 conda-forge
cudatoolkit 11.7.0 hd8887f6_10 conda-forge
curl 7.83.1 h7bff187_0 conda-forge
cycler 0.11.0 pyhd8ed1ab_0 conda-forge
cython 0.29.32 py39h5a03fae_0 conda-forge
dataclasses 0.8 pyhc8e2a94_3 conda-forge
debugpy 1.6.3 py39h5a03fae_0 conda-forge
decorator 5.1.1 pyhd8ed1ab_0 conda-forge
deprecated 1.2.13 pyh6c4a22f_0 conda-forge
dill 0.3.5.1 pyhd8ed1ab_0 conda-forge
entrypoints 0.4 pyhd8ed1ab_0 conda-forge
executing 1.0.0 pyhd8ed1ab_0 conda-forge
expat 2.4.8 h27087fc_0 conda-forge
fastapi 0.85.0 pyhd8ed1ab_0 conda-forge
fftw 3.3.10 nompi_hf0379b8_105 conda-forge
font-ttf-dejavu-sans-mono 2.37 hab24e00_0 conda-forge
font-ttf-inconsolata 3.000 h77eed37_0 conda-forge
font-ttf-source-code-pro 2.038 h77eed37_0 conda-forge
font-ttf-ubuntu 0.83 hab24e00_0 conda-forge
fontconfig 2.14.0 hc2a2eb6_1 conda-forge
fonts-conda-ecosystem 1 0 conda-forge
fonts-conda-forge 1 0 conda-forge
fonttools 4.37.2 py39hb9d737c_0 conda-forge
forcebalance 1.9.3 py39hac2352c_1 conda-forge
freetype 2.12.1 hca18f0e_0 conda-forge
future 0.18.2 py39hf3d152e_5 conda-forge
geometric 0.9.7.2 py_0 conda-forge
gettext 0.19.8.1 h73d1719_1008 conda-forge
gflags 2.2.2 he1b5a44_1004 conda-forge
glog 0.5.0 h48cff8f_0 conda-forge
greenlet 1.1.3 py39h5a03fae_0 conda-forge
grpc-cpp 1.42.0 ha1441d3_1 conda-forge
h11 0.12.0 pyhd8ed1ab_0 conda-forge
h2 4.1.0 py39hf3d152e_0 conda-forge
h5py 3.7.0 nompi_py39hd51670d_101 conda-forge
hdf4 4.2.15 h9772cbc_4 conda-forge
hdf5 1.12.2 nompi_h2386368_100 conda-forge
hpack 4.0.0 pyh9f0ad1d_0 conda-forge
httpcore 0.15.0 pyhd8ed1ab_0 conda-forge
httpx 0.23.0 py39hf3d152e_1 conda-forge
hyperframe 6.0.1 pyhd8ed1ab_0 conda-forge
icu 70.1 h27087fc_0 conda-forge
idna 3.3 pyhd8ed1ab_0 conda-forge
importlib-metadata 4.11.4 py39hf3d152e_0 conda-forge
importlib_metadata 4.11.4 hd8ed1ab_0 conda-forge
importlib_resources 5.9.0 pyhd8ed1ab_0 conda-forge
iniconfig 1.1.1 pyh9f0ad1d_0 conda-forge
ipykernel 6.15.3 pyh210e3f2_0 conda-forge
ipython 8.5.0 pyh41d4057_1 conda-forge
ipywidgets 8.0.2 pyhd8ed1ab_1 conda-forge
jedi 0.18.1 pyhd8ed1ab_2 conda-forge
jinja2 3.1.2 pyhd8ed1ab_1 conda-forge
jpeg 9e h166bdaf_2 conda-forge
jsonschema 4.16.0 pyhd8ed1ab_0 conda-forge
jupyter_client 7.3.5 pyhd8ed1ab_0 conda-forge
jupyter_core 4.11.1 py39hf3d152e_0 conda-forge
jupyterlab_widgets 3.0.3 pyhd8ed1ab_0 conda-forge
keyutils 1.6.1 h166bdaf_0 conda-forge
kiwisolver 1.4.4 py39hf939315_0 conda-forge
kombu 5.2.4 py39hf3d152e_1 conda-forge
krb5 1.19.3 h3790be6_0 conda-forge
lcms2 2.12 hddcbb42_0 conda-forge
ld_impl_linux-64 2.36.1 hea4e1c9_2 conda-forge
lerc 4.0.0 h27087fc_0 conda-forge
libblas 3.9.0 16_linux64_openblas conda-forge
libbrotlicommon 1.0.9 h166bdaf_7 conda-forge
libbrotlidec 1.0.9 h166bdaf_7 conda-forge
libbrotlienc 1.0.9 h166bdaf_7 conda-forge
libcblas 3.9.0 16_linux64_openblas conda-forge
libcurl 7.83.1 h7bff187_0 conda-forge
libdeflate 1.14 h166bdaf_0 conda-forge
libedit 3.1.20191231 he28a2e2_2 conda-forge
libev 4.33 h516909a_1 conda-forge
libevent 2.1.10 h9b69904_4 conda-forge
libffi 3.4.2 h7f98852_5 conda-forge
libgcc-ng 12.1.0 h8d9b700_16 conda-forge
libgfortran-ng 12.1.0 h69a702a_16 conda-forge
libgfortran5 12.1.0 hdcd56e2_16 conda-forge
libglib 2.72.1 h2d90d5f_0 conda-forge
libgomp 12.1.0 h8d9b700_16 conda-forge
libiconv 1.16 h516909a_0 conda-forge
liblapack 3.9.0 16_linux64_openblas conda-forge
libnetcdf 4.8.1 nompi_h21705cb_104 conda-forge
libnghttp2 1.47.0 hdcd2b5c_1 conda-forge
libnsl 2.0.0 h7f98852_0 conda-forge
libopenblas 0.3.21 pthreads_h78a6416_3 conda-forge
libpng 1.6.38 h753d276_0 conda-forge
libprotobuf 3.19.4 h780b84a_0 conda-forge
libsodium 1.0.18 h36c2ea0_1 conda-forge
libsqlite 3.39.3 h753d276_0 conda-forge
libssh2 1.10.0 haa6b8db_3 conda-forge
libstdcxx-ng 12.1.0 ha89aaad_16 conda-forge
libthrift 0.15.0 he6d91bd_1 conda-forge
libtiff 4.4.0 h55922b4_4 conda-forge
libutf8proc 2.7.0 h7f98852_0 conda-forge
libuuid 2.32.1 h7f98852_1000 conda-forge
libwebp-base 1.2.4 h166bdaf_0 conda-forge
libxcb 1.13 h7f98852_1004 conda-forge
libxml2 2.9.14 h22db469_4 conda-forge
libxslt 1.1.35 h8affb1d_0 conda-forge
libzip 1.9.2 hc869a4a_1 conda-forge
libzlib 1.2.12 h166bdaf_3 conda-forge
lxml 4.9.1 py39hb9d737c_0 conda-forge
lz4-c 1.9.3 h9c3ff4c_1 conda-forge
lzo 2.10 h516909a_1000 conda-forge
markupsafe 2.1.1 py39hb9d737c_1 conda-forge
matplotlib-base 3.6.0 py39hf9fd14e_0 conda-forge
matplotlib-inline 0.1.6 pyhd8ed1ab_0 conda-forge
mdtraj 1.9.7 py39hc79b4f4_2 conda-forge
mmpbsa-py 16.0 pypi_0 pypi
msgpack-python 1.0.4 py39hf939315_0 conda-forge
munkres 1.1.4 pyh9f0ad1d_0 conda-forge
nbformat 5.5.0 pyhd8ed1ab_0 conda-forge
ncurses 6.3 h27087fc_1 conda-forge
ndcctools 7.4.14 py39hbe13330_0 conda-forge
nest-asyncio 1.5.5 pyhd8ed1ab_0 conda-forge
netcdf-fortran 4.6.0 nompi_hc402ea5_100 conda-forge
networkx 2.8.6 pyhd8ed1ab_0 conda-forge
nglview 3.0.3 pyh8a188c0_0 conda-forge
nomkl 1.0 h5ca1d4c_0 conda-forge
numexpr 2.8.3 py39h194a79d_100 conda-forge
numpy 1.23.3 py39hba7629e_0 conda-forge
ocl-icd 2.3.1 h7f98852_0 conda-forge
ocl-icd-system 1.0.0 1 conda-forge
openeye-toolkits 2021.1.1 py39_0 openeye
openff-bespokefit 0.1.1 pyhd8ed1ab_0 conda-forge
openff-forcefields 2.0.0 pyh6c4a22f_0 conda-forge
openff-fragmenter-base 0.1.2 pyhd8ed1ab_1 conda-forge
openff-qcsubmit 0.3.1+11.gd1ae421 pypi_0 pypi
openff-toolkit 0.10.6 pyhd8ed1ab_0 conda-forge
openff-toolkit-base 0.10.6 pyhd8ed1ab_0 conda-forge
openff-utilities 0.1.5 pyh6c4a22f_0 conda-forge
openjpeg 2.5.0 h7d73246_1 conda-forge
openmm 7.7.0 py39h15fbce5_1 conda-forge
openmmforcefields 0.11.1 pyhd8ed1ab_1 conda-forge
openssl 1.1.1q h166bdaf_0 conda-forge
orc 1.7.1 h1be678f_1 conda-forge
packaging 21.3 pyhd8ed1ab_0 conda-forge
packmol 20.010 h86c2bf4_0 conda-forge
packmol-memgen 1.2.3rc0 pypi_0 pypi
pandas 1.4.4 py39h1832856_0 conda-forge
parmed 3.4.3 py39h5a03fae_2 conda-forge
parquet-cpp 1.5.1 2 conda-forge
parso 0.8.3 pyhd8ed1ab_0 conda-forge
pcre 8.45 h9c3ff4c_0 conda-forge
pdb4amber 22.0 pypi_0 pypi
perl 5.32.1 2_h7f98852_perl5 conda-forge
pexpect 4.8.0 pyh9f0ad1d_2 conda-forge
pickleshare 0.7.5 py_1003 conda-forge
pillow 9.2.0 py39hd5dbb17_2 conda-forge
pint 0.19.2 pyhd8ed1ab_0 conda-forge
pip 22.2.2 pyhd8ed1ab_0 conda-forge
pixman 0.40.0 h36c2ea0_0 conda-forge
pkgutil-resolve-name 1.3.10 pyhd8ed1ab_0 conda-forge
plotly 5.10.0 pyhd8ed1ab_0 conda-forge
pluggy 1.0.0 py39hf3d152e_3 conda-forge
prompt-toolkit 3.0.31 pyha770c72_0 conda-forge
prompt_toolkit 3.0.31 hd8ed1ab_0 conda-forge
psutil 5.9.2 py39hb9d737c_0 conda-forge
pthread-stubs 0.4 h36c2ea0_1001 conda-forge
ptyprocess 0.7.0 pyhd3deb0d_0 conda-forge
pure_eval 0.2.2 pyhd8ed1ab_0 conda-forge
py 1.11.0 pyh6c4a22f_0 conda-forge
py-cpuinfo 8.0.0 pyhd8ed1ab_0 conda-forge
pyarrow 6.0.1 py39hff6fa39_5_cpu conda-forge
pycairo 1.21.0 py39h0934665_1 conda-forge
pycparser 2.21 pyhd8ed1ab_0 conda-forge
pydantic 1.10.2 py39hb9d737c_0 conda-forge
pygments 2.13.0 pyhd8ed1ab_0 conda-forge
pymbar 3.1.0 py39hd257fcd_0 conda-forge
pyopenssl 22.0.0 pyhd8ed1ab_0 conda-forge
pyparsing 3.0.9 pyhd8ed1ab_0 conda-forge
pyrsistent 0.18.1 py39hb9d737c_1 conda-forge
pysocks 1.7.1 pyha2e5f31_6 conda-forge
pytables 3.7.0 py39hee6f8ba_2 conda-forge
pytest 7.1.3 py39hf3d152e_0 conda-forge
python 3.9.13 h9a8a25e_0_cpython conda-forge
python-constraint 1.4.0 py_0 conda-forge
python-dateutil 2.8.2 pyhd8ed1ab_0 conda-forge
python-fastjsonschema 2.16.1 pyhd8ed1ab_0 conda-forge
python_abi 3.9 2_cp39 conda-forge
pytraj 2.0.6 pypi_0 pypi
pytz 2022.2.1 pyhd8ed1ab_0 conda-forge
pyyaml 6.0 py39hb9d737c_4 conda-forge
pyzmq 24.0.0 py39headdf64_0 conda-forge
qcelemental 0.25.0 pyhd8ed1ab_0 conda-forge
qcengine 0.24.1 pyhd8ed1ab_0 conda-forge
qcportal 0.15.8 pyhd8ed1ab_0 conda-forge
rdkit 2022.03.5 py39h89e00b9_0 conda-forge
re2 2021.11.01 h9c3ff4c_0 conda-forge
readline 8.1.2 h0f457ee_0 conda-forge
redis-py 4.3.4 pyhd8ed1ab_0 conda-forge
redis-server 7.0.0 h8d01263_0 conda-forge
regex 2022.9.13 py39hb9d737c_0 conda-forge
reportlab 3.5.68 py39he59360d_1 conda-forge
requests 2.28.1 pyhd8ed1ab_1 conda-forge
rfc3986 1.5.0 pyhd8ed1ab_0 conda-forge
rich 12.5.1 pyhd8ed1ab_0 conda-forge
s2n 1.3.0 h9b69904_0 conda-forge
sander 22.0 pypi_0 pypi
scipy 1.9.1 py39h8ba3f38_0 conda-forge
setuptools 65.3.0 pyhd8ed1ab_1 conda-forge
six 1.16.0 pyh6c4a22f_0 conda-forge
smirnoff99frosst 1.1.0 pyh44b312d_0 conda-forge
snappy 1.1.9 hbd366e4_1 conda-forge
sniffio 1.3.0 pyhd8ed1ab_0 conda-forge
sqlalchemy 1.4.41 py39hb9d737c_0 conda-forge
sqlite 3.39.3 h4ff8645_0 conda-forge
stack_data 0.5.0 pyhd8ed1ab_0 conda-forge
starlette 0.20.4 pyhd8ed1ab_0 conda-forge
tenacity 8.0.1 pyhd8ed1ab_0 conda-forge
tinydb 4.7.0 pyhd8ed1ab_0 conda-forge
tk 8.6.12 h27826a3_0 conda-forge
tomli 2.0.1 pyhd8ed1ab_0 conda-forge
tornado 6.2 py39hb9d737c_0 conda-forge
torsiondrive 1.1.0 pyhd8ed1ab_0 conda-forge
tqdm 4.64.1 pyhd8ed1ab_0 conda-forge
traitlets 5.4.0 pyhd8ed1ab_0 conda-forge
typing-extensions 4.3.0 hd8ed1ab_0 conda-forge
typing_extensions 4.3.0 pyha770c72_0 conda-forge
tzdata 2022c h191b570_0 conda-forge
unicodedata2 14.0.0 py39hb9d737c_1 conda-forge
urllib3 1.26.11 pyhd8ed1ab_0 conda-forge
uvicorn 0.18.3 py39hf3d152e_0 conda-forge
validators 0.18.2 pyhd3deb0d_0 conda-forge
vine 5.0.0 pyhd8ed1ab_1 conda-forge
wcwidth 0.2.5 pyh9f0ad1d_2 conda-forge
wheel 0.37.1 pyhd8ed1ab_0 conda-forge
widgetsnbextension 4.0.3 pyhd8ed1ab_0 conda-forge
wrapt 1.14.1 py39hb9d737c_0 conda-forge
xmltodict 0.13.0 pyhd8ed1ab_0 conda-forge
xorg-kbproto 1.0.7 h7f98852_1002 conda-forge
xorg-libice 1.0.10 h7f98852_0 conda-forge
xorg-libsm 1.2.3 hd9c2040_1000 conda-forge
xorg-libx11 1.7.2 h7f98852_0 conda-forge
xorg-libxau 1.0.9 h7f98852_0 conda-forge
xorg-libxdmcp 1.1.3 h7f98852_0 conda-forge
xorg-libxext 1.3.4 h7f98852_1 conda-forge
xorg-libxrender 0.9.10 h7f98852_1003 conda-forge
xorg-libxt 1.2.1 h7f98852_2 conda-forge
xorg-renderproto 0.11.1 h7f98852_1002 conda-forge
xorg-xextproto 7.3.0 h7f98852_1002 conda-forge
xorg-xproto 7.0.31 h7f98852_1007 conda-forge
xz 5.2.6 h166bdaf_0 conda-forge
yaml 0.2.5 h7f98852_2 conda-forge
zeromq 4.3.4 h9c3ff4c_1 conda-forge
zipp 3.8.1 pyhd8ed1ab_0 conda-forge
zlib 1.2.12 h166bdaf_3 conda-forge
zstd 1.5.2 h6239696_4 conda-forge
To add to the list, similar issue with Nitro groups, C1=CC=C(C=C1)[N+](=O)[O-]
, t81 and t83 get assigned to the two oxygens.
SMILES [H:10][c:1]1[c:2]([c:3]([c:4]([c:5]([c:6]1[H:14])[H:13])[N+:7](=[O:8])[O-:9])[H:12])[H:11]
3 4 7 8 t83 [*:1]=[#7X2,#7X3+1:2]-[#6X3:3]=,:[*:4]
5 4 7 8 t83 [*:1]=[#7X2,#7X3+1:2]-[#6X3:3]=,:[*:4]
3 4 7 9 t81 [#8X1:1]~[#7X3:2]~[#6X3:3]~[*:4]
5 4 7 9 t81 [#8X1:1]~[#7X3:2]~[#6X3:3]~[*:4]
Whatever's going on, I can verify it's not due to recent changes in the toolkit. The reproduction behaves the same back to 0.9.0 and modifying it to the openforcefield
imports allows going as far back as Sage can be loaded. All versions assign t17
and t18
to the carboxylate like above.
@mattwthompson Yeah, it's not toolkit related, it's from the smarts definition of applied parameters distinguishing single and double bonds.
Copying from slack discussion: introducing new parameters t18a, t83a, t87a, which would explicitly match these cases can be a potential workaround.
<Proper smirks="[*:1]-[#6X4:2]-[#6X3:3](~[#8X1])~[#8X1:4]" periodicity1="2" phase1="0.0 * degree" id="t18a" k1="-0.3703352413219 * mole**-1 * kilocalorie" idivf1="1.0"></Proper>
<Proper smirks="[#8X1:1]~[#7X3:2](~[#8X1])-[#6:3]~[*:4]" periodicity1="2" phase1="180.0 * degree" id="t83a" k1="1.550515418264 * mole**-1 * kilocalorie" idivf1="1.0"></Proper>
<Proper smirks="[*:1]-[#7X3:2]~[#6X3:3](~[#7])~[#7:4]" periodicity1="2" phase1="180.0 * degree" id="t87a" k1="3.337310191161 * mole**-1 * kilocalorie" idivf1="1.0"></Proper>
Following up on some suggestions from Chris Bayly, it looks like phosphate esters and sulfate esters are assigned correctly because there is only one torsion SMIRKS that matches them. The nitrogen torsions in the amidinium cation are assigned incorrectly.
from openff.toolkit.topology import Molecule
from openff.toolkit.typing.engines.smirnoff import ForceField
ff = ForceField('openff-2.0.0.offxml')
offmol = Molecule.from_smiles('CCCC(=[NH2+])N')
labels = ff.label_molecules(offmol.to_topology())[0]
torsion_label = labels['ProperTorsions']
print(f'SMILES {offmol.to_smiles(mapped=True)}')
torsion_smirks = '[#6:1]-[#6:2]-[#6:3]~[#7:4]'
for match in offmol.chemical_environment_matches(torsion_smirks):
if match in torsion_label:
parameter = torsion_label[match]
else:
parameter = torsion_label[match[::-1]]
print(
f'{match[0]+1:2d} {match[1]+1:2d} {match[2]+1:2d} {match[3]+1:2d} '
f'{parameter.id:4s} {parameter.smirks}'
)
produces
SMILES [H:7][C:1]([H:8])([H:9])[C:2]([H:10])([H:11])[C:3]([H:12])([H:13])[C:4](=[N+:5]([H:14])[H:15])[N:6]([H:16])[H:17]
2 3 4 5 t18 [*:1]-[#6X4:2]-[#6X3:3]=[*:4]
2 3 4 6 t23 [#6X4:1]-[#6X4:2]-[#6X3:3]-[#7X3:4]