Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Molecule.enumerate_protomers() does not preserve SD tags for the OpenEye toolkit backend #1776

Closed
jchodera opened this issue Nov 26, 2023 · 2 comments

Comments

@jchodera
Copy link
Member

jchodera commented Nov 26, 2023

Describe the bug
The .enumerate_protomers() method of Molecule does not preserve SD tags for the OpenEye toolkit backend.
(I did not test the RDKit backend.)

To Reproduce

>>> from openff.toolkit.topology import Molecule
>>> offmol = Molecule.from_smiles('COOH')
>>> offmol.properties['annotation'] = 'acetic acid'
>>> offmol.properties
{'annotation': 'acetic acid'}
>>> microstates = offmol.enumerate_protomers()
>>> [ print(microstate.properties) for microstate in microstates ]
{}
[None]

Output
See above.

Computing environment (please complete the following information):

  • Operating system: Linux version 3.10.0-1160.45.1.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Wed Oct 13 17:20:51 UTC 2021
  • Output of running conda list
# packages in environment at /lila/home/chodera/miniconda/envs/openff: # # Name Version Build Channel _libgcc_mutex 0.1 conda_forge conda-forge _openmp_mutex 4.5 2_gnu conda-forge ambertools 23.3 py311h9fea076_6 conda-forge amberutils 21.0 pypi_0 pypi annotated-types 0.6.0 pyhd8ed1ab_0 conda-forge anyio 4.1.0 pyhd8ed1ab_0 conda-forge argon2-cffi 23.1.0 pyhd8ed1ab_0 conda-forge argon2-cffi-bindings 21.2.0 pypi_0 pypi arpack 3.8.0 nompi_h0baa96a_101 conda-forge arrow 1.3.0 pyhd8ed1ab_0 conda-forge asttokens 2.4.1 pyhd8ed1ab_0 conda-forge astunparse 1.6.3 pyhd8ed1ab_0 conda-forge async-lru 2.0.4 pyhd8ed1ab_0 conda-forge attrs 23.1.0 pyh71513ae_1 conda-forge babel 2.13.1 pyhd8ed1ab_0 conda-forge backcall 0.2.0 pyh9f0ad1d_0 conda-forge backports 1.1 pyhd3eb1b0_0 backports.functools_lru_cache 1.6.5 pyhd8ed1ab_0 conda-forge beautifulsoup4 4.12.2 pyha770c72_0 conda-forge blas 1.1 openblas conda-forge bleach 6.1.0 pyhd8ed1ab_0 conda-forge blosc 1.21.5 h0f2a231_0 conda-forge boost 1.82.0 h781c19f_6 conda-forge boost-cpp 1.82.0 h44aadfe_6 conda-forge brotli 1.1.0 pypi_0 pypi brotli-bin 1.1.0 hd590300_1 conda-forge brotli-python 1.1.0 py311hb755f60_1 conda-forge bson 0.5.9 py_0 conda-forge bzip2 1.0.8 hd590300_5 conda-forge c-ares 1.22.1 hd590300_0 conda-forge c-blosc2 2.11.2 hb4ffafa_0 conda-forge ca-certificates 2023.11.17 hbcca054_0 conda-forge cached-property 1.5.2 hd8ed1ab_1 conda-forge cached_property 1.5.2 pyha770c72_1 conda-forge cachetools 5.3.2 pyhd8ed1ab_0 conda-forge cairo 1.18.0 h3faef2a_0 conda-forge certifi 2023.11.17 pyhd8ed1ab_0 conda-forge cffi 1.16.0 pypi_0 pypi charset-normalizer 3.3.2 pyhd8ed1ab_0 conda-forge click 8.1.7 unix_pyh707e725_0 conda-forge colorama 0.4.6 pyhd8ed1ab_0 conda-forge comm 0.1.4 pyhd8ed1ab_0 conda-forge contourpy 1.2.0 pypi_0 pypi cudatoolkit 11.8.0 h4ba93d1_12 conda-forge curl 8.4.0 hca28451_0 conda-forge cycler 0.12.1 pyhd8ed1ab_0 conda-forge cython 3.0.5 pypi_0 pypi debugpy 1.8.0 pypi_0 pypi decorator 5.1.1 pyhd8ed1ab_0 conda-forge defusedxml 0.7.1 pyhd8ed1ab_0 conda-forge edgembar 0.2 pypi_0 pypi entrypoints 0.4 pyhd8ed1ab_0 conda-forge exceptiongroup 1.2.0 pyhd8ed1ab_0 conda-forge executing 2.0.1 pyhd8ed1ab_0 conda-forge expat 2.5.0 hcb278e6_1 conda-forge fftw 3.3.10 nompi_hc118613_108 conda-forge flit-core 3.9.0 pyhd8ed1ab_0 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 h77eed37_1 conda-forge fontconfig 2.14.2 h14ed4e7_0 conda-forge fonts-conda-ecosystem 1 0 conda-forge fonts-conda-forge 1 0 conda-forge fonttools 4.45.1 pypi_0 pypi fqdn 1.5.1 pyhd8ed1ab_0 conda-forge freetype 2.12.1 h267a509_2 conda-forge freetype-py 2.3.0 pyhd8ed1ab_0 conda-forge gdbm 1.18 h0a1914f_2 conda-forge gettext 0.21.1 h27087fc_0 conda-forge gmp 6.3.0 h59595ed_0 conda-forge greenlet 3.0.1 pypi_0 pypi hdf4 4.2.15 h2a13503_7 conda-forge hdf5 1.14.2 nompi_h4f84152_100 conda-forge icu 73.2 h59595ed_0 conda-forge idna 3.5 pyhd8ed1ab_0 conda-forge importlib-metadata 6.8.0 pyha770c72_0 conda-forge importlib_metadata 6.8.0 hd8ed1ab_0 conda-forge importlib_resources 6.1.1 pyhd8ed1ab_0 conda-forge iniconfig 2.0.0 pyhd8ed1ab_0 conda-forge ipykernel 6.26.0 pyhf8b6a83_0 conda-forge ipython 8.18.0 pyh0d859eb_0 conda-forge ipython_genutils 0.2.0 py_1 conda-forge ipywidgets 8.1.1 pyhd8ed1ab_0 conda-forge isoduration 20.11.0 pyhd8ed1ab_0 conda-forge jedi 0.19.1 pyhd8ed1ab_0 conda-forge jinja2 3.1.2 pyhd8ed1ab_1 conda-forge joblib 1.3.2 pyhd8ed1ab_0 conda-forge json5 0.9.14 pyhd8ed1ab_0 conda-forge jsonpointer 2.4 pypi_0 pypi jsonschema 4.20.0 pyhd8ed1ab_0 conda-forge jsonschema-specifications 2023.11.1 pyhd8ed1ab_0 conda-forge jsonschema-with-format-nongpl 4.20.0 pyhd8ed1ab_0 conda-forge jupyter-core 5.5.0 pypi_0 pypi jupyter-lsp 2.2.0 pyhd8ed1ab_0 conda-forge jupyter_client 8.6.0 pyhd8ed1ab_0 conda-forge jupyter_core 5.5.0 py311h38be061_0 conda-forge jupyter_events 0.9.0 pyhd8ed1ab_0 conda-forge jupyter_server 2.10.1 pyhd8ed1ab_0 conda-forge jupyter_server_terminals 0.4.4 pyhd8ed1ab_1 conda-forge jupyterlab 4.0.9 pyhd8ed1ab_0 conda-forge jupyterlab_pygments 0.3.0 pyhd8ed1ab_0 conda-forge jupyterlab_server 2.25.2 pyhd8ed1ab_0 conda-forge jupyterlab_widgets 3.0.9 pyhd8ed1ab_0 conda-forge keyutils 1.6.1 h166bdaf_0 conda-forge kiwisolver 1.4.5 pypi_0 pypi krb5 1.21.2 h659d440_0 conda-forge lcms2 2.15 hb7c19ff_3 conda-forge ld_impl_linux-64 2.40 h41732ed_0 conda-forge lerc 4.0.0 h27087fc_0 conda-forge libaec 1.1.2 h59595ed_1 conda-forge libblas 3.9.0 20_linux64_openblas conda-forge libboost 1.82.0 h6fcfa73_6 conda-forge libboost-devel 1.82.0 h00ab1b0_6 conda-forge libboost-headers 1.82.0 ha770c72_6 conda-forge libboost-python 1.82.0 py311h92ebd52_6 conda-forge libboost-python-devel 1.82.0 py311h781c19f_6 conda-forge libbrotlicommon 1.1.0 hd590300_1 conda-forge libbrotlidec 1.1.0 hd590300_1 conda-forge libbrotlienc 1.1.0 hd590300_1 conda-forge libcblas 3.9.0 20_linux64_openblas conda-forge libcurl 8.4.0 hca28451_0 conda-forge libdeflate 1.19 hd590300_0 conda-forge libedit 3.1.20221030 h5eee18b_0 libev 4.33 h516909a_1 conda-forge libexpat 2.5.0 hcb278e6_1 conda-forge libffi 3.4.4 h6a678d5_0 libgcc-ng 13.2.0 h807b86a_3 conda-forge libgfortran-ng 13.2.0 h69a702a_3 conda-forge libgfortran5 13.2.0 ha4646dd_3 conda-forge libglib 2.78.1 h783c2da_1 conda-forge libgomp 13.2.0 h807b86a_3 conda-forge libiconv 1.17 h166bdaf_0 conda-forge libjpeg-turbo 3.0.0 hd590300_1 conda-forge liblapack 3.9.0 20_linux64_openblas conda-forge libnetcdf 4.9.2 nompi_h80fb2b6_112 conda-forge libnghttp2 1.58.0 h47da74e_0 conda-forge libnsl 2.0.1 hd590300_0 conda-forge libopenblas 0.3.25 pthreads_h413a1c8_0 conda-forge libpng 1.6.39 h753d276_0 conda-forge libsodium 1.0.18 h516909a_1 conda-forge libsqlite 3.44.2 h2797004_0 conda-forge libssh2 1.11.0 h0841786_0 conda-forge libstdcxx-ng 13.2.0 h7e041cc_3 conda-forge libtiff 4.6.0 ha9c0a0a_2 conda-forge libuuid 2.38.1 h0b41bf4_0 conda-forge libwebp-base 1.3.2 hd590300_0 conda-forge libxcb 1.15 h0b41bf4_0 conda-forge libxml2 2.11.6 h232c23b_0 conda-forge libzip 1.10.1 h2629f0a_3 conda-forge libzlib 1.2.13 hd590300_5 conda-forge lz4-c 1.9.4 hcb278e6_0 conda-forge lzo 2.10 h516909a_1000 conda-forge markdown-it-py 3.0.0 pyhd8ed1ab_0 conda-forge markupsafe 2.1.3 pypi_0 pypi matplotlib 3.8.2 pypi_0 pypi matplotlib-base 3.8.2 py311h54ef318_0 conda-forge matplotlib-inline 0.1.6 pyhd8ed1ab_0 conda-forge mda-xdrlib 0.2.0 pyhd8ed1ab_0 conda-forge mdtraj 1.9.9 pypi_0 pypi mdurl 0.1.0 pyhd8ed1ab_0 conda-forge mistune 3.0.2 pyhd8ed1ab_0 conda-forge mmpbsa-py 16.0 pypi_0 pypi munkres 1.1.4 pyh9f0ad1d_0 conda-forge nbclassic 1.0.0 pyhb4ecaf3_1 conda-forge nbclient 0.8.0 pyhd8ed1ab_0 conda-forge nbconvert 7.11.0 pyhd8ed1ab_0 conda-forge nbconvert-core 7.11.0 pyhd8ed1ab_0 conda-forge nbconvert-pandoc 7.11.0 pyhd8ed1ab_0 conda-forge nbformat 5.9.2 pyhd8ed1ab_0 conda-forge ncurses 6.4 h59595ed_2 conda-forge ndfes 1.8 pypi_0 pypi nest-asyncio 1.5.8 pyhd8ed1ab_0 conda-forge netcdf-fortran 4.6.1 nompi_hacb5139_103 conda-forge networkx 3.2.1 pyhd8ed1ab_0 conda-forge nomkl 3.0 0 notebook 7.0.6 pyhd8ed1ab_0 conda-forge notebook-shim 0.2.3 pyhd8ed1ab_0 conda-forge numexpr 2.8.7 pypi_0 pypi numpy 1.26.2 pypi_0 pypi ocl-icd 2.3.1 h7f98852_0 conda-forge ocl-icd-system 1.0.0 1 conda-forge openblas 0.3.25 pthreads_h7a3da1a_0 conda-forge openeye-toolkits 2023.1.1 py311_0 openeye openeye-toolkits-python3-linux-x64 2023.1.1 pypi_0 pypi openff-amber-ff-ports 0.0.4 pyhca7485f_0 conda-forge openff-forcefields 2023.11.0 pyhca7485f_0 conda-forge openff-interchange 0.3.18 pyhd8ed1ab_0 conda-forge openff-interchange-base 0.3.18 pyhd8ed1ab_0 conda-forge openff-models 0.1.1 pyhca7485f_0 conda-forge openff-toolkit 0.14.5 pyhd8ed1ab_1 conda-forge openff-toolkit-base 0.14.5 pyhd8ed1ab_1 conda-forge openff-units 0.2.1 pyh1a96a4e_0 conda-forge openff-utilities 0.1.11 pyhd8ed1ab_0 conda-forge openjpeg 2.5.0 h488ebb8_3 conda-forge openmm 8.0.0 pypi_0 pypi openssl 3.2.0 hd590300_0 conda-forge overrides 7.4.0 pyhd8ed1ab_0 conda-forge packaging 23.2 pyhd8ed1ab_0 conda-forge packmol 20.010 h86c2bf4_0 conda-forge packmol-memgen 2023.2.24 pypi_0 pypi pandas 2.1.3 pypi_0 pypi pandoc 3.1.3 h32600fe_0 conda-forge pandocfilters 1.5.0 pyhd8ed1ab_0 conda-forge panedr 0.7.2 pyhd8ed1ab_0 conda-forge parmed 4.2.2 pypi_0 pypi parso 0.8.3 pyhd8ed1ab_0 conda-forge pbr 6.0.0 pyhd8ed1ab_0 conda-forge pcre2 10.42 hcad00b1_0 conda-forge pdb4amber 22.0 pypi_0 pypi perl 5.34.0 h5eee18b_2 pexpect 4.8.0 pyh9f0ad1d_2 conda-forge pickleshare 0.7.5 py_1003 conda-forge pillow 10.1.0 pypi_0 pypi pint 0.21 pyhd8ed1ab_0 conda-forge pip 23.3.1 pyhd8ed1ab_0 conda-forge pixman 0.42.2 h59595ed_0 conda-forge pkgutil-resolve-name 1.3.10 pyhd8ed1ab_1 conda-forge platformdirs 4.0.0 pyhd8ed1ab_0 conda-forge pluggy 1.3.0 pyhd8ed1ab_0 conda-forge pooch 1.8.0 pyhd8ed1ab_0 conda-forge prometheus_client 0.19.0 pyhd8ed1ab_0 conda-forge prompt-toolkit 3.0.41 pyha770c72_0 conda-forge prompt_toolkit 3.0.41 hd8ed1ab_0 conda-forge psutil 5.9.5 pypi_0 pypi 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-cpuinfo 9.0.0 pyhd8ed1ab_0 conda-forge pycairo 1.25.1 pypi_0 pypi pycparser 2.21 pyhd8ed1ab_0 conda-forge pydantic 2.5.2 pyhd8ed1ab_0 conda-forge pydantic-core 2.14.5 pypi_0 pypi pyedr 0.7.2 pyhd8ed1ab_0 conda-forge pygments 2.17.2 pyhd8ed1ab_0 conda-forge pymsmt 22.0 pypi_0 pypi pyparsing 3.1.1 pyhd8ed1ab_0 conda-forge pyrsistent 0.20.0 pypi_0 pypi pysocks 1.7.1 pyha2e5f31_6 conda-forge pytables 3.9.1 py311h10c7f7f_0 conda-forge pytest 7.4.3 pyhd8ed1ab_0 conda-forge python 3.11.4 hab00c5b_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.19.0 pyhd8ed1ab_0 conda-forge python-json-logger 2.0.7 pyhd8ed1ab_0 conda-forge python-tzdata 2023.3 pyhd8ed1ab_0 conda-forge python_abi 3.11 4_cp311 conda-forge pytraj 2.0.6 pypi_0 pypi pytz 2023.3.post1 pyhd8ed1ab_0 conda-forge pyyaml 6.0.1 pypi_0 pypi pyzmq 25.1.1 pypi_0 pypi rdkit 2023.09.2 py311h4c2f14b_0 conda-forge readline 8.2 h8228510_1 conda-forge referencing 0.31.0 pyhd8ed1ab_0 conda-forge reportlab 4.0.7 pypi_0 pypi requests 2.31.0 pyhd8ed1ab_0 conda-forge rfc3339-validator 0.1.4 pyhd8ed1ab_0 conda-forge rfc3986-validator 0.1.1 pyh9f0ad1d_0 conda-forge rich 13.7.0 pyhd8ed1ab_0 conda-forge rlpycairo 0.2.0 pyhd8ed1ab_0 conda-forge rpds-py 0.13.1 pypi_0 pypi sander 22.0 pypi_0 pypi scipy 1.11.4 pypi_0 pypi send2trash 1.8.2 pyh41d4057_0 conda-forge setuptools 68.2.2 pyhd8ed1ab_0 conda-forge six 1.16.0 pyh6c4a22f_0 conda-forge smirnoff99frosst 1.1.0 pyh44b312d_0 conda-forge snappy 1.1.10 h9fff704_0 conda-forge sniffio 1.3.0 pyhd8ed1ab_0 conda-forge soupsieve 2.5 pyhd8ed1ab_1 conda-forge sqlalchemy 2.0.23 pypi_0 pypi stack_data 0.6.2 pyhd8ed1ab_0 conda-forge tables 3.9.1 pypi_0 pypi terminado 0.18.0 pyh0d859eb_0 conda-forge tinycss2 1.2.1 pyhd8ed1ab_0 conda-forge tk 8.6.13 noxft_h4845f30_101 conda-forge tomli 2.0.1 pyhd8ed1ab_0 conda-forge tornado 6.3.3 pypi_0 pypi tqdm 4.66.1 pyhd8ed1ab_0 conda-forge traitlets 5.13.0 pyhd8ed1ab_0 conda-forge types-python-dateutil 2.8.19.14 pyhd8ed1ab_0 conda-forge typing-extensions 4.8.0 hd8ed1ab_0 conda-forge typing_extensions 4.8.0 pyha770c72_0 conda-forge typing_utils 0.1.0 pyhd8ed1ab_0 conda-forge tzdata 2023c h71feb2d_0 conda-forge uri-template 1.3.0 pyhd8ed1ab_0 conda-forge urllib3 2.1.0 pyhd8ed1ab_0 conda-forge wcwidth 0.2.12 pyhd8ed1ab_0 conda-forge webcolors 1.13 pyhd8ed1ab_0 conda-forge webencodings 0.5.1 pyhd8ed1ab_2 conda-forge websocket-client 1.6.4 pyhd8ed1ab_0 conda-forge wheel 0.41.3 pyhd8ed1ab_0 conda-forge widgetsnbextension 4.0.9 pyhd8ed1ab_0 conda-forge xmltodict 0.13.0 pyhd8ed1ab_0 conda-forge xorg-kbproto 1.0.7 h14c3975_1002 conda-forge xorg-libice 1.1.1 hd590300_0 conda-forge xorg-libsm 1.2.4 h7391055_0 conda-forge xorg-libx11 1.8.7 h8ee46fc_0 conda-forge xorg-libxau 1.0.11 hd590300_0 conda-forge xorg-libxdmcp 1.1.3 h516909a_0 conda-forge xorg-libxext 1.3.4 h0b41bf4_2 conda-forge xorg-libxrender 0.9.11 hd590300_0 conda-forge xorg-libxt 1.3.0 hd590300_1 conda-forge xorg-renderproto 0.11.1 h14c3975_1002 conda-forge xorg-xextproto 7.3.0 h0b41bf4_1003 conda-forge xorg-xproto 7.0.31 h14c3975_1007 conda-forge xz 5.4.2 h5eee18b_0 yaml 0.2.5 h7f98852_2 conda-forge zeromq 4.3.5 h59595ed_0 conda-forge zipp 3.17.0 pyhd8ed1ab_0 conda-forge zlib 1.2.13 hd590300_5 conda-forge zlib-ng 2.0.7 h0b41bf4_0 conda-forge zstd 1.5.5 hfc55251_0 conda-forge

Additional context
I believe this may be due to #1711.

@mattwthompson
Copy link
Member

I agree #1771 is likely the cause:

In [1]: from openff.toolkit import Molecule

In [2]: offmol = Molecule.from_smiles('COOH')

In [3]: offmol.properties['annotation'] = 'acetic acid'

In [4]: offmol.enumerate_protomers()
> /Users/mattthompson/software/openff-toolkit/openff/toolkit/utils/openeye_wrapper.py(844)enumerate_protomers()
    843             import ipdb; ipdb.set_trace()
--> 844             mol = self.from_openeye(
    845                 protomer, allow_undefined_stereo=True, _cls=molecule.__class__

ipdb> type(protomer)
<class 'openeye.oechem.OEMolBase'>

let's see if we can that behavior and then re-visit this

@mattwthompson
Copy link
Member

This is resolved by #1778 (whichever release follows 0.14.5)

In [1]: from openff.toolkit import __version__

In [2]: __version__
Out[2]: '0.14.5+4.g9b23790e.dirty'

In [3]: from openff.toolkit.topology import Molecule

In [4]: offmol = Molecule.from_smiles('COOH')

In [5]: offmol.properties['annotation'] = 'acetic acid'
   ...:

In [6]: offmol.properties
Out[6]: {'annotation': 'acetic acid'}

In [7]: [print(microstate.properties) for microstate in offmol.enumerate_proto
   ...: mers()]
{'annotation': 'acetic acid'}
Out[7]: [None]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants