From 527af9ece7eacc85ca04135cc46c82ba4adcbfd1 Mon Sep 17 00:00:00 2001 From: Brent Westbrook <36778786+ntBre@users.noreply.github.com> Date: Sat, 15 Jun 2024 01:55:23 -0400 Subject: [PATCH] Add another torsion multiplicity torsion drive supplement (#356) --- .../README.md | 70 +++ .../dataset.json.bz2 | 3 + .../dataset.pdf | Bin 0 -> 37212 bytes .../dataset.smi | 69 +++ .../ff.offxml | 488 ++++++++++++++++++ .../full-environment.yaml | 301 +++++++++++ .../generate-dataset.ipynb | 356 +++++++++++++ .../input-environment.yaml | 13 + .../output.smi | 59 +++ .../test.toml | 56 ++ 10 files changed, 1415 insertions(+) create mode 100644 submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/README.md create mode 100644 submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/dataset.json.bz2 create mode 100644 submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/dataset.pdf create mode 100644 submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/dataset.smi create mode 100644 submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/ff.offxml create mode 100644 submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/full-environment.yaml create mode 100644 submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/generate-dataset.ipynb create mode 100644 submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/input-environment.yaml create mode 100644 submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/output.smi create mode 100644 submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/test.toml diff --git a/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/README.md b/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/README.md new file mode 100644 index 00000000..dfcf37c3 --- /dev/null +++ b/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/README.md @@ -0,0 +1,70 @@ +# OpenFF Torsion Multiplicity Torsion Drive Coverage Supplement v1.0 + +## Description +A torsion drive data set created to improve the coverage of both existing Sage +2.2.0 proper torsion parameters and new parameters added through the torsion +multiplicity project. The molecules in this data set were partly selected from +the ChEMBL 33 database and partly generated manually to match parameters not +covered by ChEMBL. + +## General Information + +* Date: 2024-06-14 +* Class: OpenFF TorsionDrive Dataset +* Purpose: Improver proper torsion coverage in Sage +* Name: OpenFF Torsion Multiplicity Torsion Drive Coverage Supplement v1.0 +* Number of unique molecules: 58 +* Number of filtered molecules: 0 +* Number of conformers: 59 +* Number of conformers per molecule (min, mean, max): 1, 3.08, 10 +* Mean molecular weight: 174.43 +* Max molecular weight: 401.33 +* Charges: [0.0, 1.0, 2.0] +* Dataset submitter: Brent Westbrook +* Dataset generator: Brent Westbrook + +## QCSubmit Generation Pipeline + +* `generate-dataset.ipynb`: This notebook shows how the dataset was prepared + from the input files: `dataset.smi`, `ff.offxml`, and `test.toml`. +* The list of proper torsion parameter ID and SMILES pairs in `dataset.smi` were + collected by searching the ChEMBL database for all of the molecules matching + the parameters of interest. The code used for these steps can be found + [here][frag]. Some of these (those for parameters `t146j`, `t144j`, `t117k`, + `t116i`, and `t142j`) were then truncated manually to remove large functional + groups far from the target dihedral. Finally, the last 20 molecules in + `dataset.smi` were designed by hand to match their corresponding parameter + because these parameters were not matched by any molecules in ChEMBL. + +## QCSubmit Manifest + +### Input Files +* `generate-dataset.ipynb`: Notebook describing dataset generation and submission +* `dataset.smi`: Sequence of parameter ID, mapped SMILES, dihedral index tuples processed by the notebook +* `ff.offxml`: Draft force field with Sage 2.2.0 proper torsions split to ensure single multiplicities +* `test.toml`: Experimental input file for defining variables used throughout the QCA submission process +* `input-environment.yaml`: Environment file used to create Python environment for the notebook +* `full-environment.yaml`: Fully-resolved environment used to execute the notebook + +### Output Files +* `dataset.json.bz2`: Compressed dataset ready for submission +* `dataset.pdf`: Visualization of dataset molecules +* `output.smi`: Smiles strings for dataset molecules + +## Metadata +* Elements: {N, Br, H, P, Cl, O, C, S} +* Spec: default + * basis: DZVP + * implicit_solvent: None + * keywords: {} + * maxiter: 200 + * method: B3LYP-D3BJ + * program: psi4 + * SCF properties: + * dipole + * quadrupole + * wiberg_lowdin_indices + * mayer_indices + + +[frag]: https://github.com/ntBre/valence-fitting/tree/c1e98fb20e7a4c9622ff031d8b23fb0b1846be7d/02_curate-data/frag diff --git a/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/dataset.json.bz2 b/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/dataset.json.bz2 new file mode 100644 index 00000000..b2a4c457 --- /dev/null +++ b/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/dataset.json.bz2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50d9976185c346dc306511bada9660a9e20ff1a515dda3ed45c9872b1463f0e5 +size 73517 diff --git a/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/dataset.pdf b/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/dataset.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dc7c1c255201de04e6a5f41ff458e09a450fcd96 GIT binary patch literal 37212 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 + + The Open Force Field Initiative + 2023-05-02 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/full-environment.yaml b/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/full-environment.yaml new file mode 100644 index 00000000..168744fd --- /dev/null +++ b/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/full-environment.yaml @@ -0,0 +1,301 @@ +name: qcarchive-user-submit +channels: + - openeye + - conda-forge +dependencies: + - _libgcc_mutex=0.1=conda_forge + - _openmp_mutex=4.5=2_gnu + - ambertools=23.3=py311h9fea076_6 + - annotated-types=0.6.0=pyhd8ed1ab_0 + - anyio=4.2.0=pyhd8ed1ab_0 + - argcomplete=3.2.2=pyhd8ed1ab_0 + - argon2-cffi=23.1.0=pyhd8ed1ab_0 + - argon2-cffi-bindings=21.2.0=py311h459d7ec_4 + - arpack=3.8.0=nompi_h0baa96a_101 + - arrow=1.3.0=pyhd8ed1ab_0 + - asttokens=2.4.1=pyhd8ed1ab_0 + - astunparse=1.6.3=pyhd8ed1ab_0 + - async-lru=2.0.4=pyhd8ed1ab_0 + - attrs=23.2.0=pyh71513ae_0 + - babel=2.14.0=pyhd8ed1ab_0 + - basis_set_exchange=0.9.1=pyhd8ed1ab_0 + - beautifulsoup4=4.12.3=pyha770c72_0 + - bleach=6.1.0=pyhd8ed1ab_0 + - blosc=1.21.5=h0f2a231_0 + - brotli=1.1.0=hd590300_1 + - brotli-bin=1.1.0=hd590300_1 + - brotli-python=1.1.0=py311hb755f60_1 + - bson=0.5.9=py_0 + - bzip2=1.0.8=hd590300_5 + - c-ares=1.26.0=hd590300_0 + - c-blosc2=2.13.1=hb4ffafa_0 + - ca-certificates=2023.11.17=hbcca054_0 + - cached-property=1.5.2=hd8ed1ab_1 + - cached_property=1.5.2=pyha770c72_1 + - cachetools=5.3.2=pyhd8ed1ab_0 + - cairo=1.18.0=h3faef2a_0 + - certifi=2023.11.17=pyhd8ed1ab_0 + - cffi=1.16.0=py311hb3a22ac_0 + - chardet=5.2.0=py311h38be061_1 + - charset-normalizer=3.3.2=pyhd8ed1ab_0 + - colorama=0.4.6=pyhd8ed1ab_0 + - comm=0.2.1=pyhd8ed1ab_0 + - contourpy=1.2.0=py311h9547e67_0 + - cudatoolkit=11.8.0=h4ba93d1_12 + - cycler=0.12.1=pyhd8ed1ab_0 + - debugpy=1.8.0=py311hb755f60_1 + - decorator=5.1.1=pyhd8ed1ab_0 + - defusedxml=0.7.1=pyhd8ed1ab_0 + - entrypoints=0.4=pyhd8ed1ab_0 + - exceptiongroup=1.2.0=pyhd8ed1ab_2 + - executing=2.0.1=pyhd8ed1ab_0 + - expat=2.5.0=hcb278e6_1 + - fftw=3.3.10=nompi_hc118613_108 + - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 + - font-ttf-inconsolata=3.000=h77eed37_0 + - font-ttf-source-code-pro=2.038=h77eed37_0 + - font-ttf-ubuntu=0.83=h77eed37_1 + - fontconfig=2.14.2=h14ed4e7_0 + - fonts-conda-ecosystem=1=0 + - fonts-conda-forge=1=0 + - fonttools=4.47.2=py311h459d7ec_0 + - fqdn=1.5.1=pyhd8ed1ab_0 + - freetype=2.12.1=h267a509_2 + - freetype-py=2.3.0=pyhd8ed1ab_0 + - gettext=0.21.1=h27087fc_0 + - greenlet=3.0.3=py311hb755f60_0 + - hdf4=4.2.15=h2a13503_7 + - hdf5=1.14.3=nompi_h4f84152_100 + - icu=73.2=h59595ed_0 + - idna=3.6=pyhd8ed1ab_0 + - importlib-metadata=7.0.1=pyha770c72_0 + - importlib_metadata=7.0.1=hd8ed1ab_0 + - importlib_resources=6.1.1=pyhd8ed1ab_0 + - iniconfig=2.0.0=pyhd8ed1ab_0 + - ipykernel=6.29.0=pyhd33586a_0 + - ipython=8.20.0=pyh707e725_0 + - ipywidgets=8.1.1=pyhd8ed1ab_0 + - isoduration=20.11.0=pyhd8ed1ab_0 + - jedi=0.19.1=pyhd8ed1ab_0 + - jinja2=3.1.3=pyhd8ed1ab_0 + - joblib=1.3.2=pyhd8ed1ab_0 + - json5=0.9.14=pyhd8ed1ab_0 + - jsonpointer=2.4=py311h38be061_3 + - jsonschema=4.21.1=pyhd8ed1ab_0 + - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 + - jsonschema-with-format-nongpl=4.21.1=pyhd8ed1ab_0 + - jupyter-lsp=2.2.2=pyhd8ed1ab_0 + - jupyter_client=8.6.0=pyhd8ed1ab_0 + - jupyter_core=5.7.1=py311h38be061_0 + - jupyter_events=0.9.0=pyhd8ed1ab_0 + - jupyter_server=2.12.5=pyhd8ed1ab_0 + - jupyter_server_terminals=0.5.2=pyhd8ed1ab_0 + - jupyterlab=4.0.12=pyhd8ed1ab_0 + - jupyterlab_pygments=0.3.0=pyhd8ed1ab_0 + - jupyterlab_server=2.25.2=pyhd8ed1ab_0 + - jupyterlab_widgets=3.0.9=pyhd8ed1ab_0 + - keyutils=1.6.1=h166bdaf_0 + - kiwisolver=1.4.5=py311h9547e67_1 + - krb5=1.21.2=h659d440_0 + - lcms2=2.16=hb7c19ff_0 + - ld_impl_linux-64=2.40=h41732ed_0 + - lerc=4.0.0=h27087fc_0 + - libaec=1.1.2=h59595ed_1 + - libblas=3.9.0=21_linux64_openblas + - libboost=1.82.0=h6fcfa73_6 + - libboost-python=1.82.0=py311h92ebd52_6 + - libbrotlicommon=1.1.0=hd590300_1 + - libbrotlidec=1.1.0=hd590300_1 + - libbrotlienc=1.1.0=hd590300_1 + - libcblas=3.9.0=21_linux64_openblas + - libcurl=8.5.0=hca28451_0 + - libdeflate=1.19=hd590300_0 + - libedit=3.1.20191231=he28a2e2_2 + - libev=4.33=hd590300_2 + - libexpat=2.5.0=hcb278e6_1 + - libffi=3.4.2=h7f98852_5 + - libgcc-ng=13.2.0=h807b86a_4 + - libgfortran-ng=13.2.0=h69a702a_4 + - libgfortran5=13.2.0=ha4646dd_4 + - libglib=2.78.3=h783c2da_0 + - libgomp=13.2.0=h807b86a_4 + - libiconv=1.17=hd590300_2 + - libjpeg-turbo=3.0.0=hd590300_1 + - liblapack=3.9.0=21_linux64_openblas + - libnetcdf=4.9.2=nompi_h9612171_113 + - libnghttp2=1.58.0=h47da74e_1 + - libnsl=2.0.1=hd590300_0 + - libopenblas=0.3.26=pthreads_h413a1c8_0 + - libpng=1.6.39=h753d276_0 + - libsodium=1.0.18=h36c2ea0_1 + - libsqlite=3.44.2=h2797004_0 + - libssh2=1.11.0=h0841786_0 + - libstdcxx-ng=13.2.0=h7e041cc_4 + - libtiff=4.6.0=ha9c0a0a_2 + - libuuid=2.38.1=h0b41bf4_0 + - libwebp-base=1.3.2=hd590300_0 + - libxcb=1.15=h0b41bf4_0 + - libxcrypt=4.4.36=hd590300_1 + - libxml2=2.12.4=h232c23b_1 + - libzip=1.10.1=h2629f0a_3 + - libzlib=1.2.13=hd590300_5 + - lz4-c=1.9.4=hcb278e6_0 + - lzo=2.10=h516909a_1000 + - markupsafe=2.1.4=py311h459d7ec_0 + - matplotlib-base=3.8.2=py311h54ef318_0 + - matplotlib-inline=0.1.6=pyhd8ed1ab_0 + - mda-xdrlib=0.2.0=pyhd8ed1ab_0 + - mdtraj=1.9.9=py311h90fe790_1 + - mistune=3.0.2=pyhd8ed1ab_0 + - msgpack-python=1.0.7=py311h9547e67_0 + - munkres=1.1.4=pyh9f0ad1d_0 + - nbclient=0.8.0=pyhd8ed1ab_0 + - nbconvert-core=7.14.2=pyhd8ed1ab_0 + - nbformat=5.9.2=pyhd8ed1ab_0 + - ncurses=6.4=h59595ed_2 + - nest-asyncio=1.6.0=pyhd8ed1ab_0 + - netcdf-fortran=4.6.1=nompi_hacb5139_103 + - networkx=3.2.1=pyhd8ed1ab_0 + - nomkl=1.0=h5ca1d4c_0 + - notebook=7.0.7=pyhd8ed1ab_0 + - notebook-shim=0.2.3=pyhd8ed1ab_0 + - numexpr=2.8.8=py311h039bad6_100 + - numpy=1.26.3=py311h64a7726_0 + - ocl-icd=2.3.1=h7f98852_0 + - ocl-icd-system=1.0.0=1 + - openeye-toolkits=2023.1.1=py311_0 + - openff-amber-ff-ports=0.0.4=pyhca7485f_0 + - openff-forcefields=2024.01.0=pyhca7485f_0 + - openff-interchange=0.3.18=pyhd8ed1ab_0 + - openff-interchange-base=0.3.18=pyhd8ed1ab_0 + - openff-models=0.1.1=pyhca7485f_0 + - openff-qcsubmit=0.50.2=pyhd8ed1ab_0 + - openff-toolkit=0.15.1=pyhd8ed1ab_0 + - openff-toolkit-base=0.15.1=pyhd8ed1ab_0 + - openff-units=0.2.1=pyh1a96a4e_0 + - openff-utilities=0.1.12=pyhd8ed1ab_0 + - openjpeg=2.5.0=h488ebb8_3 + - openmm=8.1.1=py311h9766050_0 + - openssl=3.2.1=hd590300_0 + - overrides=7.7.0=pyhd8ed1ab_0 + - packaging=23.2=pyhd8ed1ab_0 + - packmol=20.010=h86c2bf4_0 + - pandas=2.2.0=py311h320fe9a_0 + - pandocfilters=1.5.0=pyhd8ed1ab_0 + - panedr=0.8.0=pyhd8ed1ab_0 + - parmed=4.2.2=py311hb755f60_1 + - parso=0.8.3=pyhd8ed1ab_0 + - pcre2=10.42=hcad00b1_0 + - perl=5.32.1=7_hd590300_perl5 + - pexpect=4.9.0=pyhd8ed1ab_0 + - pickleshare=0.7.5=py_1003 + - pillow=10.2.0=py311ha6c5da5_0 + - pint=0.21=pyhd8ed1ab_0 + - pip=23.3.2=pyhd8ed1ab_0 + - pixman=0.43.2=h59595ed_0 + - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 + - platformdirs=4.2.0=pyhd8ed1ab_0 + - pluggy=1.4.0=pyhd8ed1ab_0 + - prometheus_client=0.19.0=pyhd8ed1ab_0 + - prompt-toolkit=3.0.42=pyha770c72_0 + - psutil=5.9.8=py311h459d7ec_0 + - pthread-stubs=0.4=h36c2ea0_1001 + - ptyprocess=0.7.0=pyhd3deb0d_0 + - pure_eval=0.2.2=pyhd8ed1ab_0 + - py-cpuinfo=9.0.0=pyhd8ed1ab_0 + - pycairo=1.25.1=py311h8feb60e_0 + - pycparser=2.21=pyhd8ed1ab_0 + - pydantic=2.6.0=pyhd8ed1ab_0 + - pydantic-core=2.16.1=py311h46250e7_0 + - pyedr=0.8.0=pyhd8ed1ab_0 + - pygments=2.17.2=pyhd8ed1ab_0 + - pyjwt=2.8.0=pyhd8ed1ab_0 + - pyparsing=3.1.1=pyhd8ed1ab_0 + - pysocks=1.7.1=pyha2e5f31_6 + - pytables=3.9.2=py311h10c7f7f_1 + - pytest=8.0.0=pyhd8ed1ab_0 + - python=3.11.7=hab00c5b_1_cpython + - python-constraint=1.4.0=py_0 + - python-dateutil=2.8.2=pyhd8ed1ab_0 + - python-fastjsonschema=2.19.1=pyhd8ed1ab_0 + - python-json-logger=2.0.7=pyhd8ed1ab_0 + - python-tzdata=2023.4=pyhd8ed1ab_0 + - python_abi=3.11=4_cp311 + - pytz=2023.4=pyhd8ed1ab_0 + - pyyaml=6.0.1=py311h459d7ec_1 + - pyzmq=25.1.2=py311h34ded2d_0 + - qcelemental=0.27.1=pyhd8ed1ab_0 + - qcportal=0.53=pyhd8ed1ab_0 + - rdkit=2023.09.4=py311h4c2f14b_0 + - readline=8.2=h8228510_1 + - referencing=0.33.0=pyhd8ed1ab_0 + - regex=2023.12.25=py311h459d7ec_0 + - reportlab=4.0.9=py311h459d7ec_0 + - requests=2.31.0=pyhd8ed1ab_0 + - rfc3339-validator=0.1.4=pyhd8ed1ab_0 + - rfc3986-validator=0.1.1=pyh9f0ad1d_0 + - rlpycairo=0.2.0=pyhd8ed1ab_0 + - rpds-py=0.17.1=py311h46250e7_0 + - scipy=1.12.0=py311h64a7726_2 + - send2trash=1.8.2=pyh41d4057_0 + - setuptools=69.0.3=pyhd8ed1ab_0 + - six=1.16.0=pyh6c4a22f_0 + - smirnoff99frosst=1.1.0=pyh44b312d_0 + - snappy=1.1.10=h9fff704_0 + - sniffio=1.3.0=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - sqlalchemy=2.0.25=py311h459d7ec_0 + - stack_data=0.6.2=pyhd8ed1ab_0 + - tabulate=0.9.0=pyhd8ed1ab_1 + - terminado=0.18.0=pyh0d859eb_0 + - tinycss2=1.2.1=pyhd8ed1ab_0 + - tk=8.6.13=noxft_h4845f30_101 + - tomli=2.0.1=pyhd8ed1ab_0 + - tornado=6.3.3=py311h459d7ec_1 + - tqdm=4.66.1=pyhd8ed1ab_0 + - traitlets=5.14.1=pyhd8ed1ab_0 + - types-python-dateutil=2.8.19.20240106=pyhd8ed1ab_0 + - typing-extensions=4.9.0=hd8ed1ab_0 + - typing_extensions=4.9.0=pyha770c72_0 + - typing_utils=0.1.0=pyhd8ed1ab_0 + - tzdata=2023d=h0c530f3_0 + - unidecode=1.3.8=pyhd8ed1ab_0 + - uri-template=1.3.0=pyhd8ed1ab_0 + - urllib3=2.2.0=pyhd8ed1ab_0 + - wcwidth=0.2.13=pyhd8ed1ab_0 + - webcolors=1.13=pyhd8ed1ab_0 + - webencodings=0.5.1=pyhd8ed1ab_2 + - websocket-client=1.7.0=pyhd8ed1ab_0 + - wheel=0.42.0=pyhd8ed1ab_0 + - widgetsnbextension=4.0.9=pyhd8ed1ab_0 + - xmltodict=0.13.0=pyhd8ed1ab_0 + - xorg-kbproto=1.0.7=h7f98852_1002 + - xorg-libice=1.1.1=hd590300_0 + - xorg-libsm=1.2.4=h7391055_0 + - xorg-libx11=1.8.7=h8ee46fc_0 + - xorg-libxau=1.0.11=hd590300_0 + - xorg-libxdmcp=1.1.3=h7f98852_0 + - xorg-libxext=1.3.4=h0b41bf4_2 + - xorg-libxrender=0.9.11=hd590300_0 + - xorg-libxt=1.3.0=hd590300_1 + - xorg-renderproto=0.11.1=h7f98852_1002 + - xorg-xextproto=7.3.0=h0b41bf4_1003 + - xorg-xproto=7.0.31=h7f98852_1007 + - xz=5.2.6=h166bdaf_0 + - yaml=0.2.5=h7f98852_2 + - zeromq=4.3.5=h59595ed_0 + - zipp=3.17.0=pyhd8ed1ab_0 + - zlib=1.2.13=hd590300_5 + - zlib-ng=2.0.7=h0b41bf4_0 + - zstandard=0.22.0=py311haa97af0_0 + - zstd=1.5.5=hfc55251_0 + - pip: + - amberutils==21.0 + - edgembar==0.2 + - mmpbsa-py==16.0 + - packmol-memgen==2023.2.24 + - pdb4amber==22.0 + - pymsmt==22.0 + - pytraj==2.0.6 + - sander==22.0 +prefix: /home/brent/mambaforge/envs/qcarchive-user-submit diff --git a/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/generate-dataset.ipynb b/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/generate-dataset.ipynb new file mode 100644 index 00000000..8cadf641 --- /dev/null +++ b/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/generate-dataset.ipynb @@ -0,0 +1,356 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "c00d7b5c-8796-45ea-95c6-0d74dfeb849e", + "metadata": {}, + "outputs": [], + "source": [ + "import re\n", + "import tomllib\n", + "from pathlib import Path\n", + "\n", + "import qcportal # avoid zstd disaster\n", + "\n", + "import numpy as np\n", + "from openff.qcsubmit import workflow_components\n", + "from openff.qcsubmit.factories import TorsiondriveDatasetFactory\n", + "from openff.qcsubmit.workflow_components import TorsionIndexer\n", + "from openff.toolkit import Molecule, ForceField\n", + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7c541942-1258-4c8b-b8a9-b733eb54cd3f", + "metadata": {}, + "outputs": [], + "source": [ + "ff = ForceField(\"ff.offxml\")\n", + "with open(\"test.toml\", \"rb\") as f:\n", + " config = tomllib.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2bab66c3-7248-4c86-b74a-53813793181b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Tagging torsions: 69it [00:02, 34.49it/s]\n" + ] + } + ], + "source": [ + "junk = re.compile(\"[(,)]\")\n", + "\n", + "molecules = dict()\n", + "# not sure what this does, just increment to avoid overlap. without different sym_groups,\n", + "# I only get 58 dihedrals, but with it I get 59. 9 duplicate SMILES are still filtered out\n", + "# for sharing the central bond in the torsion, and there is 1 comment line in the input file.\n", + "# 69it from tqdm = 9 duplicates + 1 comment + 59 final records\n", + "sym_group = 0\n", + "with open(\"dataset.smi\") as inp:\n", + " for line in tqdm(inp, desc=\"Tagging torsions\"):\n", + " if line.startswith(\"#\"):\n", + " continue\n", + " pid, cmiles, *rest = line.split()\n", + " tors = tuple([int(junk.sub(\"\", x)) for x in rest])\n", + " mol = Molecule.from_mapped_smiles(cmiles, allow_undefined_stereo=True)\n", + " labels = ff.label_molecules(mol.to_topology())[0][\"ProperTorsions\"]\n", + " assert labels[tors].id == pid\n", + " inchikey = mol.to_inchikey()\n", + " if inchikey not in molecules:\n", + " molecules[inchikey] = mol\n", + " if not molecules[inchikey].properties.get(\"dihedrals\"):\n", + " molecules[inchikey].properties[\"dihedrals\"] = TorsionIndexer()\n", + " molecules[inchikey].properties[\"dihedrals\"].add_torsion(tors, (-sym_group, sym_group), (-165, 180))\n", + " sym_group += 1" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "4e37cfbb-b9a7-429f-aa29-e751339b784d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Deduplication : 100%|█████████| 58/58 [00:00<00:00, 2352.68it/s]\n", + "StandardConformerGenerator : 0%| | 0/58 [00:00=0.49 + - openff-qcsubmit + - openff-toolkit + - openeye-toolkits diff --git a/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/output.smi b/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/output.smi new file mode 100644 index 00000000..03239059 --- /dev/null +++ b/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/output.smi @@ -0,0 +1,59 @@ +CC[N+]1(CC1)CCO +CCS(=NS(=O)(=O)c1ccc(cc1)C)C +CCCN/S(=N\CCC)/C +Cc1ccc(cc1)S(=NS(=O)(=O)c2ccccc2)NC +C=S(C1=C2C(=C(S1)Cl)CCCC2=O)NC(=O)Nc3ccc(cc3)Cl +CC(N)P(O)O +C[N+](C)(C=C)NCCC(=O)[O-] +c1ccc(cc1)N2CCOS2=O +c1cc(ccc1COS(=O)N(CCCl)CCCl)[N+](=O)[O-] +c1ccc(cc1)C[N+]2(CC[C@H](O2)O)Cc3ccccc3 +CC1=C[S+](C=C1)C2=COC=C(C2=O)Cl +CC1=C[S+](C=C1)C2=COC=C(C2=O)Cl +c1ccc(cc1)P(CCCN)c2ccccc2 +CP(C)C +c1ccc(cc1)P(c2ccccn2)c3ccccn3 +C[N+](C)(C)/N=C\c1ccc(c(c1)O)O +COc1ccccc1CC[S+](C)OC[C@@H]2[C@H]([C@H](CO2)O)O +C[S+](CCc1ccccc1)OC[C@@H]2[C@H]([C@H](CO2)O)O +Cc1ccc(cc1)C(=O)N/S(=N/C(=O)C)/C(Cl)(Cl)Cl +NS(=O)O +c1ccc2c(c1)C(=CO2)CC3=NOS(=O)N3 +c1cc2c(cc1Br)C(=CO2)CC3=NOS(=O)N3 +c1ccc(cc1)S(=N)c2ccccc2 +CN\1CC(=O)N/C1=N\P(=O)(O)O +CNC(=O)c1ccccc1[S+]2c3ccccc3C(=O)N2C +c1ccc2c(c1)[n+](c(n[n+]2[O-])NC3CC3)[O-] +c1ccc2c(c1)C(=NS2(=O)=O)SCC(=O)O +C1[C@H]([C@@H]([C@H]([S+]1C[C@H]([C@H](CO)OS(=O)(=O)[O-])O)CO)O)O +C1C(=O)NN(C1=O)C(=O)[S+]2C=CC=C2 +C[S+](C)CC[C@@H](C(=O)O)N +CN(CCO)/[N+](=N/O)/[O-] +C1=C(ON=[N+]1CC[N+]2=NOC(=C2)[O-])[O-] +C1[C@H]2[C@@H]1C3=C(C2)C(=NN3)C(=O)O +C1CCCC2=NNC(=O)C2CC1 +C1CC2C(=C1)CC(=O)O2 +c1ccc2c(c1)CC3C2O3 +C1C2N1C(=O)NC2=N +C1C2N(C1=O)C(=CS2)C(=O)O +C1C2C(=O)NC(=O)N2CS1 +C1=CN2C(=CC=N2)N=C1 +C1C2C(O2)CO1 +C1=CC2C(O2)C=C1 +CN1C=CC=C2C1=CC=N2 +C[S+](C)S +CS(=O)N=C +C[NH+](C)S(=O)C +C[NH+](C)S(=O)C=C +C[NH2+]S=O +C[NH2+]S(C)(C)C +C[NH2+]NC +C[NH2+]S(=O)=O +C[NH2+]S(=O)C +C[NH2+][NH2+]C +C[NH2+]S(=O)(=O)C=C +C[SH+][SH+]C +C[NH2+]C1CC1 +C[NH2+]S(=O)C=C +C=NNS=O +C[NH2+]S(=O)(=O)C diff --git a/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/test.toml b/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/test.toml new file mode 100644 index 00000000..58255ece --- /dev/null +++ b/submissions/2024-06-14-OpenFF-Torsion-Multiplicity-Torsion-Drive-Coverage-Supplement-v1.0/test.toml @@ -0,0 +1,56 @@ +name = "OpenFF Torsion Multiplicity Torsion Drive Coverage Supplement v1.0" +description = """ + +A torsion drive data set created to improve the coverage of both existing Sage +2.2.0 proper torsion parameters and new parameters added through the torsion +multiplicity project. The molecules in this data set were partly selected from +the ChEMBL 33 database and partly generated manually to match parameters not +covered by ChEMBL. + +""" +short_description = "Additional torsion drive training data for Sage 2.2.0 proper torsions and new parameters from the torsion multiplicity work" +class = "torsiondrive" +purpose = "Improver proper torsion coverage in Sage" +submitter = "Brent Westbrook" + +[[pipeline]] +filename = "generate-dataset.ipynb" +description = "This notebook shows how the dataset was prepared from the input files: `all.smiles` and `tm.v2.offxml`." + +[[pipeline]] +description = """ +The list of proper torsion parameter ID and SMILES pairs in all.smiles were +collected by searching the ChEMBL database for all of the molecules matching the +parameters of interest, fragmenting these molecules with the RECAP algorithm as +implemented in RDKit, clustering them based on their 1024-bit Morgan +fingerprints using the DBSCAN algorithm, and taking the two smallest molecules +from these cluster centroids. The code used for all of these steps can be found +here. +""" + +# this would be nicer as an inline table (manifest = [ {filename = , desc = }, +# ... ]) but the python lib seems unable to parse this if it contains newlines. +# putting it all on one line is probably more annoying than this +[[manifest]] +filename = "dataset.json.bz2" +description = "Compressed dataset ready for submission" + +[[manifest]] +filename = "dataset.pdf" +description = "Visualization of dataset molecules" + +[[manifest]] +filename = "dataset.smi" +description = "Smiles strings for dataset molecules" + +[[manifest]] +filename = "generate-dataset.ipynb" +description = "Notebook describing dataset generation and submission" + +[[manifest]] +filename = "input-environment.yaml" +description = "Environment file used to create Python environment for the notebook" + +[[manifest]] +filename = "full-environment.yaml" +description = "Fully-resolved environment used to execute the notebook" \ No newline at end of file