From 567d59e7a0afbf7004e019fc48dcb7a82aa97246 Mon Sep 17 00:00:00 2001 From: Irfan Alibay Date: Sun, 22 Sep 2024 14:23:40 +0100 Subject: [PATCH] Merge `develop` branch into `main` (#1) * Alpha pontibus code - including first iteration of the ASFEProtocol --- .github/workflows/black.yml | 12 + .github/workflows/ci.yaml | 86 + AUTHORS.md | 18 + README.md | 2 + .../molecule0_fsolv_chemicalsystem.gz | Bin 0 -> 1139 bytes .../molecule0_mnsol_chemicalsystem.gz | Bin 0 -> 1892 bytes .../molecule10_fsolv_chemicalsystem.gz | Bin 0 -> 1353 bytes .../molecule10_mnsol_chemicalsystem.gz | Bin 0 -> 2158 bytes .../molecule11_fsolv_chemicalsystem.gz | Bin 0 -> 1276 bytes .../molecule11_mnsol_chemicalsystem.gz | Bin 0 -> 2671 bytes .../molecule12_fsolv_chemicalsystem.gz | Bin 0 -> 1469 bytes .../molecule12_mnsol_chemicalsystem.gz | Bin 0 -> 1802 bytes .../molecule13_fsolv_chemicalsystem.gz | Bin 0 -> 1265 bytes .../molecule13_mnsol_chemicalsystem.gz | Bin 0 -> 1882 bytes .../molecule14_fsolv_chemicalsystem.gz | Bin 0 -> 1559 bytes .../molecule14_mnsol_chemicalsystem.gz | Bin 0 -> 1641 bytes .../molecule15_fsolv_chemicalsystem.gz | Bin 0 -> 1556 bytes .../molecule15_mnsol_chemicalsystem.gz | Bin 0 -> 1442 bytes .../molecule16_fsolv_chemicalsystem.gz | Bin 0 -> 1281 bytes .../molecule16_mnsol_chemicalsystem.gz | Bin 0 -> 1496 bytes .../molecule17_fsolv_chemicalsystem.gz | Bin 0 -> 1287 bytes .../molecule17_mnsol_chemicalsystem.gz | Bin 0 -> 1416 bytes .../molecule18_fsolv_chemicalsystem.gz | Bin 0 -> 1355 bytes .../molecule18_mnsol_chemicalsystem.gz | Bin 0 -> 1627 bytes .../molecule19_fsolv_chemicalsystem.gz | Bin 0 -> 1292 bytes .../molecule19_mnsol_chemicalsystem.gz | Bin 0 -> 1850 bytes .../molecule1_fsolv_chemicalsystem.gz | Bin 0 -> 1826 bytes .../molecule1_mnsol_chemicalsystem.gz | Bin 0 -> 2339 bytes .../molecule2_fsolv_chemicalsystem.gz | Bin 0 -> 1496 bytes .../molecule2_mnsol_chemicalsystem.gz | Bin 0 -> 1338 bytes .../molecule3_fsolv_chemicalsystem.gz | Bin 0 -> 859 bytes .../molecule3_mnsol_chemicalsystem.gz | Bin 0 -> 1772 bytes .../molecule4_fsolv_chemicalsystem.gz | Bin 0 -> 1532 bytes .../molecule4_mnsol_chemicalsystem.gz | Bin 0 -> 1499 bytes .../molecule5_fsolv_chemicalsystem.gz | Bin 0 -> 1168 bytes .../molecule5_mnsol_chemicalsystem.gz | Bin 0 -> 1826 bytes .../molecule6_fsolv_chemicalsystem.gz | Bin 0 -> 1369 bytes .../molecule6_mnsol_chemicalsystem.gz | Bin 0 -> 1785 bytes .../molecule7_fsolv_chemicalsystem.gz | Bin 0 -> 1412 bytes .../molecule7_mnsol_chemicalsystem.gz | Bin 0 -> 1815 bytes .../molecule8_fsolv_chemicalsystem.gz | Bin 0 -> 751 bytes .../molecule8_mnsol_chemicalsystem.gz | Bin 0 -> 1208 bytes .../molecule9_fsolv_chemicalsystem.gz | Bin 0 -> 1412 bytes .../molecule9_mnsol_chemicalsystem.gz | Bin 0 -> 2454 bytes benchmarks/subsampled/gen_systems.py | 79 + .../gen_transforms_2.0.0_single_repeat.py | 102 + benchmarks/subsampled/sub_sampled_fsolv.sdf | 986 +++++++ benchmarks/subsampled/sub_sampled_mnsol.sdf | 992 +++++++ devtools/ASFEProtocol_json_results.gz | Bin 0 -> 47299 bytes devtools/gen_serialized_results.py | 105 + environment.yml | 39 + news/TEMPLATE.rst | 23 + pyproject.toml | 41 + rever.xsh | 7 + src/pontibus/__init__.py | 3 + src/pontibus/components/__init__.py | 5 + .../components/extended_solvent_component.py | 199 ++ src/pontibus/protocols/__init__.py | 0 src/pontibus/protocols/solvation/__init__.py | 21 + .../protocols/solvation/asfe_protocol.py | 465 +++ src/pontibus/protocols/solvation/base.py | 362 +++ src/pontibus/protocols/solvation/settings.py | 156 + src/pontibus/tests/__init__.py | 0 src/pontibus/tests/components/__init__.py | 0 .../tests/components/test_extendedsolvent.py | 89 + src/pontibus/tests/conftest.py | 140 + src/pontibus/tests/data/181l_only.pdb | 2614 +++++++++++++++++ src/pontibus/tests/data/CN.sdf | 19 + src/pontibus/tests/data/__init__.py | 0 .../tests/data/benzene_modifications.sdf | 240 ++ .../ASFEProtocol_json_results.gz | Bin 0 -> 47299 bytes .../tests/data/solvation_protocol/__init__.py | 0 src/pontibus/tests/protocols/__init__.py | 0 .../tests/protocols/solvation/__init__.py | 0 .../tests/protocols/solvation/conftest.py | 18 + .../tests/protocols/solvation/test_dry_run.py | 202 ++ .../tests/protocols/solvation/test_results.py | 145 + .../protocols/solvation/test_tokenization.py | 107 + src/pontibus/tests/utils/__init__.py | 0 .../tests/utils/test_interchange_packmol.py | 713 +++++ src/pontibus/utils/__init__.py | 0 src/pontibus/utils/molecules.py | 62 + src/pontibus/utils/system_creation.py | 332 +++ 83 files changed, 8384 insertions(+) create mode 100644 .github/workflows/black.yml create mode 100644 .github/workflows/ci.yaml create mode 100644 AUTHORS.md create mode 100644 benchmarks/subsampled/chemicalsystems/molecule0_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule0_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule10_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule10_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule11_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule11_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule12_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule12_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule13_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule13_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule14_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule14_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule15_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule15_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule16_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule16_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule17_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule17_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule18_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule18_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule19_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule19_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule1_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule1_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule2_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule2_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule3_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule3_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule4_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule4_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule5_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule5_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule6_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule6_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule7_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule7_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule8_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule8_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule9_fsolv_chemicalsystem.gz create mode 100644 benchmarks/subsampled/chemicalsystems/molecule9_mnsol_chemicalsystem.gz create mode 100644 benchmarks/subsampled/gen_systems.py create mode 100644 benchmarks/subsampled/gen_transforms_2.0.0_single_repeat.py create mode 100644 benchmarks/subsampled/sub_sampled_fsolv.sdf create mode 100644 benchmarks/subsampled/sub_sampled_mnsol.sdf create mode 100644 devtools/ASFEProtocol_json_results.gz create mode 100644 devtools/gen_serialized_results.py create mode 100644 environment.yml create mode 100644 news/TEMPLATE.rst create mode 100644 pyproject.toml create mode 100644 rever.xsh create mode 100644 src/pontibus/__init__.py create mode 100644 src/pontibus/components/__init__.py create mode 100644 src/pontibus/components/extended_solvent_component.py create mode 100644 src/pontibus/protocols/__init__.py create mode 100644 src/pontibus/protocols/solvation/__init__.py create mode 100644 src/pontibus/protocols/solvation/asfe_protocol.py create mode 100644 src/pontibus/protocols/solvation/base.py create mode 100644 src/pontibus/protocols/solvation/settings.py create mode 100644 src/pontibus/tests/__init__.py create mode 100644 src/pontibus/tests/components/__init__.py create mode 100644 src/pontibus/tests/components/test_extendedsolvent.py create mode 100644 src/pontibus/tests/conftest.py create mode 100644 src/pontibus/tests/data/181l_only.pdb create mode 100644 src/pontibus/tests/data/CN.sdf create mode 100644 src/pontibus/tests/data/__init__.py create mode 100644 src/pontibus/tests/data/benzene_modifications.sdf create mode 100644 src/pontibus/tests/data/solvation_protocol/ASFEProtocol_json_results.gz create mode 100644 src/pontibus/tests/data/solvation_protocol/__init__.py create mode 100644 src/pontibus/tests/protocols/__init__.py create mode 100644 src/pontibus/tests/protocols/solvation/__init__.py create mode 100644 src/pontibus/tests/protocols/solvation/conftest.py create mode 100644 src/pontibus/tests/protocols/solvation/test_dry_run.py create mode 100644 src/pontibus/tests/protocols/solvation/test_results.py create mode 100644 src/pontibus/tests/protocols/solvation/test_tokenization.py create mode 100644 src/pontibus/tests/utils/__init__.py create mode 100644 src/pontibus/tests/utils/test_interchange_packmol.py create mode 100644 src/pontibus/utils/__init__.py create mode 100644 src/pontibus/utils/molecules.py create mode 100644 src/pontibus/utils/system_creation.py diff --git a/.github/workflows/black.yml b/.github/workflows/black.yml new file mode 100644 index 0000000..31d1825 --- /dev/null +++ b/.github/workflows/black.yml @@ -0,0 +1,12 @@ +name: Lint + +on: [push, pull_request] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: psf/black@stable + with: + src: "./src" diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..6fb772e --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,86 @@ +name: "CI" +on: + pull_request: + branches: + - main + - develop + paths-ignore: + - "docs/*" + push: + branches: + - main + - develop + schedule: + # At 07:00 UTC on Monday and Thursday + - cron: "0 7 * * *" + workflow_dispatch: + + +concurrency: + group: "${{ github.workflow }}-${{ github.ref }}" + cancel-in-progress: true + +defaults: + run: + shell: bash -l {0} + +jobs: + tests: + runs-on: ${{ matrix.os }} + name: "${{ matrix.os }} - ${{ matrix.python-version }}" + strategy: + fail-fast: false + matrix: + os: ["ubuntu-latest"] + python-version: + - "3.10" + - "3.11" + - "3.12" + include: + - os: "macos-latest" + python-version: "3.12" + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: "Setup Micromamba" + uses: mamba-org/setup-micromamba@v1 + with: + environment-file: environment.yml + environment-name: pontibus + create-args: >- + python=${{ matrix.python-version }} + init-shell: bash + + - name: "Install" + run: python -m pip install --no-deps -e . + + - name: "Test imports" + run: | + # if we add more to this, consider changing to for + env vars + python -Ic "import pontibus; print(pontibus.__version__)" + + - name: "Environment Information" + run: | + micromamba info + micromamba list + pip list + + - name: "Run tests" + env: + PONTIBUS_SLOW_TESTS: ${{ fromJSON('{"false":"false","true":"true"}')[github.event_name != 'pull_request'] }} + DUECREDIT_ENABLE: 'yes' + run: | + pytest -n logical -v --cov=pontibus --cov-report=xml --durations=10 + + - name: codecov-pr + if: ${{ github.repository == 'OpenFreeEnergy/pontibus' + && github.event_name == 'pull_request' }} + uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} + file: coverage.xml + fail_ci_if_error: False + verbose: True + flags: fast-tests diff --git a/AUTHORS.md b/AUTHORS.md new file mode 100644 index 0000000..3b4ffb8 --- /dev/null +++ b/AUTHORS.md @@ -0,0 +1,18 @@ +# Authors + +All contributing authors are listed in the file below. +The repository history and CHANGELOG show individual code contributions. + + + +**2024** +- Irfan Alibay <@IAlibay> +- Matt Thompson <@mattwthompson> diff --git a/README.md b/README.md index 8c144c2..252324d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ # pontibus Experimental OpenFE Protocols for Force Field Evaluation + +!!WARNING!! This code is experimental and subject to change !!WARNING!! diff --git a/benchmarks/subsampled/chemicalsystems/molecule0_fsolv_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule0_fsolv_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..037a210811909e4213aed17ee746222215e310d2 GIT binary patch literal 1139 zcmV-(1dRJ1iwFo_ZtrFS|7~wRUt?%xZE0g+Y;$>YbY*P-#8z!@ z+cpsXE1odS>FOAyNJ*qIKpTv8UzRRtwgE$2Xf#PB-XzPFAY>dN6d;Ct5)%LR?P%~^1(b6h(9ov@G5Tx;A!o!WAjA)Sgh&Jm@Ua@u z7$F`a`|~MBnDX#5d2qA?IPeKJ{D@HB_(Fp(%@29N3_rvKae`3v>3pNWn-@#v?vvqR z_*(@#!a?l{F9 zgq(R89nxe}y#?j+6`Uv8IBlJyf>>D8;?5BT2*X{oa2)7z@B@I@1tcM4MPI@>VR!rB z{1t2OkVJcFc3cgXG>bb&!r`uBN2R|5H;mta1b`Uqu%K1Y+*|+qHU<}!q8pcxZ`{M# zfi3OKfG`F`^7c$*^M-g$>G1L*Tb0GiHBY@+CF&>J1cEUOB2#w&(q##Ck&%$0_J?hm z5t(c#zNypQv2>??=S>!M!E@*!|-1f0d0@Q7!7ljZO?`RlOE3t=v*yi7q_NPAzO! ziFu`@(N>y$w`VHwz!(#yBd*O>w)kM9YF_b!xPIK!da1O!aCPdD$P8XD=Ig2(oo?94 zuFO3Wp$)N9pCKVANiEasacp|6^M&bn7yneX&L2v2BUIf9?c4kp009600{}C9DNE80 F007`~HuC@g literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule0_mnsol_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule0_mnsol_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..385aa058c0d08c394e85a5628f67c7310b7d9cd8 GIT binary patch literal 1892 zcmV-q2b=gGiwFo_ZtrFS|7~wYbY*P-0=4e5*s?FAcMqTE3ijpM=x- zD9rjN;q=(ZY?B=#IAMekhq;t{lwG{o>Rd*iQjbXA_oc@?;ZQ*@r9jKOl4|pW3FdfG zy8!ZHa|eXaT~{mMR7ju8uVVg-&cM*Jp8fpdID4!%aPqZ9`Kcir&oUKyytFubcukI>E zzj~__51z{u{lF^}QL!#76u;sRB~=ow_()mBN$ONdZpCq0jfIw7H#v;+Nt#c`YHIS> z9V`g(okxE@eDb$>Bosc$8GfDj5;cpbz1>dlRw{d2ot_q*Ps7PDpC-!C?_ni-vy<>t z>Gx|?C&szH)w$?=?!Uq0+*p^+&EL&;$OjYiozh@1HxD!dr`5~r<~xQr#e;VoxT8DI z4$VX21t1jz)kh7mz#f7~EX`+>f-(uFs0W7Q`=Bxe85h)0P@~Wm14|UvV*)xIt1E`* z)VnqqfHovDBwDsG0ZKR+jDZ1`QUwM`@I3hm^rnwNM}kHIkW2+IxnMuUm^k`s)khFr z2+ssOQUZg!1}{Fc!V5tz2rlw4=Wo};BGJ7c7w`a~_@T9;)qFtR@aDh5I-#FY3gw8X zRi$Dq;4KK;4JP2XgiJ7Yx!u^k>kH*;mNry@c=Zw?S&v zst79#!ijJBQ*i+6m_6N2h0qOf5N&ZQl=1)@;;{2Gb{mA5ra<;7q$rJcPfHfu;Ex{U z8)BDO6nIvcFCT@O?R1g;ioslf>6NtJgqNtdUR2`j!Iq+s=uqvWg?E_$k_IR$ae+iB zhXO?jGCY6*A-S{-S2QgN$^pmmiwBqwl)D3(rA<^AFFW5BAtv(p?kGofg;Lu#m<;S$ zANLT$YQ!{X=-pUc$3C#(Ns0>k@DgQqS0o~sonV=On7j{4C8a)Y`@d|TM8al2Eq2LM zAcfeX??Y^^V#nVD<*v;O;X@oe>vMsq?IJ+447pc0Fwk(3)t;Ry5(l4n2BgsLc$`hk zdf>bx;jp&1mmlNi5u)=yg98oWhVEsCgv zCN*e>xJ`_88rQJ`k}oN3vC<*u%je-z@(Vz_&mGf5uHckWpRmiKUgqmUo6(@N>obX{S8ncr%N*C$ zP2+Ora83#TDh^yS1H`m9cc?3b<6Ro^XuGg!xTnX3pzimlfH4!qV7Y5OdW@X4n9pZo+?5oEU5BV6nSO$}p#)A_SIw z-`+(u*;erBr}hBeSV4q~2ndvFSAB$FSy@_48hni%z^KIAYfyv15QUA5t}5X;*k0Vp%aKhsKol4p#(zJ9T(>ORgvtk-e_Uc?uONjpyIfMJFFkHXOZ2So$ z!$GuHkIg@YdDq|y_3I!&Ev{%{tepRAk7Ji3uAfH%@~#s*m!N%tKkG2|-@>n_`D`>F zovEQF8dZ9s!pKTkmejDloU#zuF^*XNU@H*O9I7PvQUdl%AOjN}IyAszg zZ{})}sN?_vb4z5JJ|9JkSvfjYNDr5IyCp&sV(F#;5<-UKi5BhFIMzQ=<53)D2XAL{ eHEv3D!8H5Gv}*Go00030{{sL`B*{R-9{>PSmZi4< literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule10_fsolv_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule10_fsolv_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..f1df8d2856b1c7a3c9866830a6d53f113704c8a7 GIT binary patch literal 1353 zcmV-P1-AMhiwFo_ZtrFS|7~wcW^-?Bc3)#?Wo>C=VQh1Gb97~G0PI%_ zZ`(Ey{ws#i)d`w-q@HBZA}frx1GXkv(*hgfL7^lvai)hS*+JSg`|Ts|Mm}{pH-=qp-{)cY zk2vtv1E8Bb5Ja45c^YVG&!wLKzk>gW0VaQ@!9;Ob3sGMI?lJTwLI$Alm#3gG0B$k?)TM_UPhsNQ zV7LSY8CZjmlxLL*7s5+IyP$wI^IPrKZi1_zPeo`46^53JcvtX9o^1VbTSLkr5fW)p zp#lM=``eQVSV2zM4HayG6@e<=!2But^MeSsEc5R zd&Yr<^L3;0fK`%Rpg~XqMuqz?F+oI#8xQ9E0oW!r0*C&kuUBCLVTQuu^!>Y`RgF8G zsBad)>$c7&n2DIr-&we5^z;~rASN)C#s2dHL>QzgqO2r>1ZFYq1UUn19zx#03I;_0 zwG?D12edO`oxp@ah!s1w*(ic87>M6KWCcq>g#R{~TMt@m8n5%#S0j;q##BHXH=tKy z&L-Uhg&M3UxNiyY@X+oWQJ-)F>`BKR+R3VUfrlN~yU3Xzcwpj=$FiZfIqE=)(y*#w1lZF?VYM`D;TQSjh8h(F-u%fWj zUNcTn<+Hk)VJ9rFW^wk$bY(6b(TEa{FaPvK2g|ZHmybINDDlmWB=WQsp`jMxB-Fdj zBQIdCw_HaVGICv4_jzFuxnAhgFfuxuVwy{1-5JyI;dp#V9Yd}1OWmIv@}ZfVzI>D! zM@P3C2dCeG6Ys9Jl-}8E-p%;@$y^A0nVbzG!gmE7D|rnx74UHaz!hbcIEaiW!+4xa!-rV zo0a{&UcSdm$y*;{5BQLXm=0GT8p3@yWbA?cr^nsEHO0h_G+zE=rN7j=lGWDrUuf^V z$98vZdq>E9ZrbhQ@wLjvtZJt7>7|S{(Wp8Q&kSEF&qS9z z&UX!2&tiR~Qmw7l>$s+C<3Jk|H3}~DQa=4;qH2$LFRoWtb6I9GJH|S-CNfQ*Pm@K{ zjZU`G@v_XViO_`Dsm}liC9yK1&K;hO&t);yH|+7pW-g2SkZzfpznE5y{s{m8|NjF3 LiUZiZ4-)_YFhHAz literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule10_mnsol_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule10_mnsol_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..29d963c0c6b18328033d006a59d2a691d4c258da GIT binary patch literal 2158 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 literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule11_mnsol_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule11_mnsol_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..f7d1e687db768ea7fa24e306dc94300c29bda159 GIT binary patch literal 2671 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 literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule12_mnsol_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule12_mnsol_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..e0de0b85c953b72135631d6911f210fb302fd8c6 GIT binary patch literal 1802 zcmV+l2leC=VQh1Gb97~G0PGlv zZre8WR}7U@(K9X3q1hZ-q7rwqmHNoirs=njd`}+bNLK7_K+$1F zLP?MBKB)I}(T?-cX+AdN*|fdax@b@HY(6t^t7rMh0pGpjJ1qi#sm`Wm@o>?8p(nGU z&Uz<$a_neGhbY3NQp)}Zgply^x1H8z=A=1k=>32zo(LgCDII!}W;{0Dx z;F}vj*H<7CN?LjvS?VyLA^V@fe}sYM&>rOD1Z&a~QuuQm7TkknhR>6BDKw4xCWs-UtZ&J}S!PV>pgOq@H~hjT(y`0UNo7r(k& zLSZFmc)8e0%ru^C?X|Y$3H= zzr(Q;p2R1pL+&mT^LL&UAnN`RFpL139D>(Ph#0rv zfq7$;0R{<31C!FwGt&W>H{gCF1=NHU+`ZfZ?gGD5pd4h#Jr)Vi;WD_f{pBi$SV1BT zjQ0xF=uq0deRv2`5EG)2M%y4oBa2sX0f$jwA;AM?@Dh+I_%{)txJl*1$3BXMeDSj= zdoaP6DL_%GX-z{wHDniHV3dY6#rPXc5X~|0Ada;_HkqK~P`~)mvYUWdBC$St{c6jz z#t0A6n{&Vo3S|eFiI~s(-d$AOIshP$X-s9^z55J34Ad08oEmfzh{d$i?Gra;h>C{=$BY0F7%16iUwi{BGOAJ2cdh$aY+Zk3U#NKAkZKgCYioS*iS$F3_2NJnuh?F#{bW-@_yv<$g>MK6BTy_0knFNmU! zZ3H=GDhMg#jElwofbDcSOzwdSqMmo!$=9!7-ndvQtrZ!-X^27oW?|7b?jvuNzQ%5%{=;AWn z-kF(9hxvHVlF`ehFkdY0`wPmioXBi&XhbP<Zd*Dwi>#6aklFLwftl44wE$Sk);dbW`~exh4ji-Q+N~kOAx-jD36**<@EU-V$sLdT7Y)T(;7P`nsg4uT} z7aPmB5wrBdsv%_{qD{@W;dXUnU%T$K6C_$|1mifpT%F2->R1+3=dz$Wm<7v|*;V${ zL5x%eF;W@Cg0CIKqVIPQBjoCeJy;U{0vA~tB`TiQZER+*VVIRh;ARc6CpGIBqsfPLOoqNM z4%Z0}D|NoBQK1W#!8+bKM|ZD->f7mJOk0ggd}q84S8UA7J$5sGT7+O-{8)Zig?e=J zN3d(q#H*-GQOupQrkb-W?9-_HL1R^ZU@`ArUrEL15125e#L+iiRTvb@*sQMj;3te` zx5;2?C$4ex`SSToV==gMs&o*g-8zM5`2EFyO<5g=-(kvEtJCkv9h}Yft6Td!p0}yf zr1iiLtTL!Wz!C2)e$H9xI{3<=V;rvcSJXWD)1P+gnneEM(*tMIRj8(vZN)$ubyuOj z#P4NFHcg#PBVAoHU+vH%QQLRdHq)%8MUGTm<6GCwvTBnUDOn4|iLM5<(k0e)es$ek zZHIPsocmUj+-W`?&W2~EZ-I{0GkwS5jm@zxgL~Po1KX#*ZK7h!ZDRLv&zje=!t?|Q z=XNU_esWe7oomIehvzdhPE2xuqho_*7Csve=F_rurl9UGCeH>7or$H185}}`{%CAz s+clc?PRwW+>+Im;bY@1YJY677|3+FC`WFBI0RR630Qg@cma7~90PdlKUjP6A literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule13_fsolv_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule13_fsolv_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..d2ddd61a7e177b9427a125e0195e6aa0baff09b4 GIT binary patch literal 1265 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 literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule14_fsolv_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule14_fsolv_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..71b48446d433afe3e5d45930153a7ea7a038a174 GIT binary patch literal 1559 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 literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule15_fsolv_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule15_fsolv_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..4f7709b93524ea0639f0cc5024c31211d8a827ce GIT binary patch literal 1556 zcmV+v2J87BiwFo_ZtrFS|7~wC=VQh1Gb97~G0PGkI zbK5lZuLLtLEo(E$l5MGMmqK8`j(wJKaLdTaw$ufjILk-bmUX`!={;w1>ZDEC9gKrq z&a$4~_gD0?46<@GDaU#|p9M#)WiTs?#azRynwKL7eD*9pXc71tRm}8ivkV@o>3pb) z-U~H7bu@>hL#2o!DWxEi@i;kue$d*PoOGguNG@f<2p5ct5Xi;u(j&&A*h(iMjVVpS zYl(N-M?{3gej<^uFk<|=42WO}xAY-lJPKpVJ`x6W=Ma#X@x%o%l7uo6MgKN>PPq$V zD2cSbpyB`Y|8;uHAV|w`j?K){QTRFrE9N15>kzh%W4F8ki5if29b#XS21GOXLE$>c>BE{J-UMCH+^HQmK}i!-SKj$GE61jsj`Y;|Hs~*i?fVa&-hcFqdnFW} zynclL1dBcd?gF@LATc09Nfe7r?!zYO z-q?Ew5;EW_fA>_WDZO6=Sf9xsVWE{P0PE9xOTb{aet^Tci?Id?g7>Fjfxl8L)tfk1=4i%|97U{hIe*aJpjoCYuGFvbND3Jj+K-zahlQ1EK1 zY7x#beDDMnh4=p-YL9m2!J+S?-l|aH6kTGn1uD`$LqmY;FP>7 z4hR#aalHoW>6?LG!q7hsF%vW+7a{vZp%&$@;s(VYBkH~RHr z-R1-x33a2hTTpQ%Jidw9RV%sN7n{J~<=uKxL-d5mp8GDBkv=*pyy?kk?9;^XE><{5 z$D~TV9IRFWM&|XR09gv-F21V@sTLq}2ZQ|-7IYQXKh~M*-td+or6lisn=o;$_-TmI ztt@g+$Tda1Ur;X--Gd%4V&PLjr?6G^7)9JNYrmD3^Bbh$4Hj3TC5W zp`Fa2*W0`EaKE?L+qd6d;Lgh8%+Ad2@S)qgS-F!tB|8_dq(O5kZce&1-Y~w>WaCV_ zY03-ZYe6@RS#%??Ki-CV;hIh5M+gM%8&DUo(&)pn8bN$)b`2sLoLlf<@N%IFcQ6>Z zqmz*;iu+}uvqhnMtA9!Yz#Nsi1tQ+*!sw3wC#5rUbfbzctJ58w>FI1(j*l!EJzvYD z-wbZwC*lyUx{)K|@41ctA_bF5$=I#pC- z1tHs>css%$y6ss0Dv*mSP@yv_y$hC3b`XpA!uPHHN__koRy*TYcW}8Yeky8LakGP! zIG=6%mAIlIuh)m|ZjHQUn_(B5$3N9JCgp56AD-!f1v*v_)J=ys)~Bit?iGg)Y(Mq(S4gw>Nb5rX1ONd4{{sLqP=_fE G7XSchb?<@z literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule15_mnsol_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule15_mnsol_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..8c6e58db0790bae34dd86a5461e8a556974592a2 GIT binary patch literal 1442 zcmV;T1zq|diwFo_ZtrFS|7~wC=VQh1Gb97~G0OVK; zZ`(Ey{wtmaEG?FJBqd5@&^FoJt;2>swxS!>xKQ+se4P z7eP9E6O^xw%n_NoLfBkNPYO=BzHVO~PR`sN<+V6>J%RTY&7$CHD5i8wf% z9B9#H8RULZ#>&vY!$=RRH^GI{?|1YDu7c~F?Z#eF$7v5 z%ow>p0!_%TVTv>igcLA?(Kx`(fr9cBS+8NjyL${-VDJ`#F@6Gk5sa}JW8q&ueRuK} zrsWrO9wNsdsOo39fnQXCC9tQ$pCAYu^u_#YQ#_$)N5belIR$w;0Os)I+68*};MX%u z1=>3M<^iYyYq4xRjTxv*Kwib@07OOP=kONP8sJ8ogej1h>K=OAOl*YFjW13b);MT9 z(JsuhChbaqV-ZTC-;nMYC<>O2U`jCcGJF9yT(7Xb4w%BmF8ULAXz2SXXhDxSa#{6p zu(Be(D2ofMf9mSOj~|(0!knq}grkcO5LH>iAr-bONb{rS@C0eJ7GhH>2$O^pVtd?k z*VAipMjhtaOh`%`;n$zzpsMS%=o^Ud!7Yp z`nX6{v`W=%{oS#EGb>_EM84OnL`|FT(zG&iSuGc}<&G~^SuKkESc}oyjl|uopZ&Gu z)<@0V{i{NxYco?bJeM-6qu%qYMwz7CY!;nwS2Dr({j536cFdYNF0);i68CR$V9yK? z?SOD?y}F*w_x-dv+O9b-%;ow7dDQvuDPYWj6fmxLzbD-PoBY3W33o$CZ3^okB)fx< z$RK)^=Ic~ufe9+Pk-d?%8#gSjm$pGj{v9*yoUMD!2s(? z;G{uR2ow`{NFl5UfoTb_D;do-f;j|k2-5~vFd!}Drp8sDBS2LREg}QHM)o^+GxaR zF&W$A*sDpTM1x*Dnp@+M!?6n8ALikh&4|48@sys9B@ZjCZ1uXs6{*An&~%1)300yX5REP!zO#_R&um@#o=bf0O!wR&cvrp|Y<9=m+{UBx zyoWg1gZ2^rY`3xhRR4NWREy=}Qu&$)e+UF$8ope;4%*~ddSuA@&DVf0(%MQrk8?V_ zi8dCLD7ey7>EhZ%RRio!T;EOIq@(LVtI0RR630BJ>*8RQlK0Q{=IjsO4v literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule16_fsolv_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule16_fsolv_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..82ffd7924535fbb8abddbefca1d61c90fa87fccc GIT binary patch literal 1281 zcmV+c1^)UUiwFo_ZtrFS|7~wC=VQh1Gb97~G0K`^% zZ`(Ey|0Gbh~$Dv_hVcVAqBtx`J{IQKjSe=Jim+>cZ=j0eliGUi0m|qgi{{@dvdV) zIOcKe*ojC4qha)KXn(Bpbj@Satlq2N863uh5JnS8!i0y%@^el=yR)CMm>$Va7?D1B zGNuvd^l0-R%fD;B;}0ffp)rdcn-fME3RnwgTO>CRw@7Zyw@7XsZIL3FZ;;$12BmF< z$tK0&#U{ncmYWo>inK`HFI5({ta4L%--6MC5E)+l@aEl*eo82edXHTjIoTPXP~(O2BDwG;JwT zDVoF4g+T$|7QhggqdhQ61>4Ao(h-VsF;gaBD}e}5KvGa)q9LmN9zJ+@0!DtZI-ZxW zDwshKiERREqDGm(gan}q=)%(95sL?G??J5=*I!}Wh8@u~<|p{D;S%=3XWxP`@dzTJ z49L{N29#aIzdDV=c(}UqW737&+xK*(ZtlGH7qbLFk0X=x|Ki z15zW!wD3uD9SGS?AH#=$vk9)y8G!3}Bc-Yjjh_OwO>P>oiZrPt37*c!xN#p(42_~- zLW(NI>jCWB=FlhhImowfL77I$1^PB@Znn{X4x?W%Gg{K)CUkg}4Cqr}0Vb%8hNqw5 zQDY3V_p9^xt`D{mygDG2G?&*W$^lW;@i17G(;zRiSyj%k;W2l!v3}(rU@8YOW75B% z_;Yn1woT=WEE`0Wa9?@TOs!es0gn=zMDE?Du43_Uy^lQZO%Ef<(=llHlHv$Kwx+H1iwdvERDP(=2;aW=1VCbH46p z13>1bc0|NoFRU3f{qCUleEEt`wfW9&O;u0J;>@wp`;Eg{uIJ-5=T@^U4s2LlY!eX? zPJBE#i-kC{-w7p)n7c28Cp6^zvD}@_(q=Qm{@WfTd~6HS!)F2OLDz_{haK)mH4m#6 z4?v%QKywJnBnPO)DymyA{C>RT+bzR>JXOtmeF%OcwmXgoyj*ovw!8Q~P~$f5hpR$6 zc^h`qwu{IARW@d2J)KW)&DasWsEhQe#}(!}ZIjQlQ%`oQvAa^rNvqsG?zwu|bIQ^R z85eFVn|}0Ot*-cvUoY?GrqD)TVx8LKnWN9AlSSS3&aAk{>oT{;L+@g%K0`ogJhq-S r=&C=VQh1Gb97~G0PI+8 zZ`(Ey{wtoocv};fq$G+;3MfO?7ocrcEL(vsULBdD5)XPwB|FQS<-d=-lP1}g96MRJ z51SECRp!ZJu3#F@^VAT}&iLMdz~8)BsCs^Dy$g%^ zEKH6s!{Wk-?2{4k9l?D4V~$URFPyty_69r1Glw(J$onpH^upUko{VhYMse!8LYsF% z+}qkb=MLvuoCr@aYP)}j^~VNJYneDq%8mB5!!{>`FzWfl_8faxdB-7OUHi`%r#p%h zMtqYzpHtUy=+5pxR({=mEpJWpEW%T)#k4ZYP(iJnt&sHGULonVvqI8qcZKA_e2Jtd z9E`RNddn2eFP14KfZnUlbI3r__Xa~PIxoU(k{6LO^cR@iVR;!|DZT!ZYGd|SdxN{dLx1Cp8|yMUJTcD* zT=HQIWdMs1Mt{>76JVW!uGoe#0)5Vnc_`qD6fnhS@SwPWZ3(K>GZ1WTAd{kv4&Mbj z8^`EwZ~#;WK}^l)#jjeL?PiYV2^-JNQ$ScW2GcQX*rfN`0|x(_b5Iet)QMl806zrk z178GzhAl%fM0XqvVU)qM#h?hx(H|In3EL=$+L0CY;z^l;uLLqcfs=v>2Y6ud z1dPr}Ri5WB3z$I?N!%nMt5f6%p`H?p=f202@)R%2QIk^@maxFQz!-z1idrWL z&nZ|FP`4PujDRyjifZwD&2=DT{rD&+0KVA66$S(B5nnn|#m6R2f!3y%jao^XqvR8; z&L`f4j}=3wD7X-!N%3j~`*BnBX?zI!Yyh;k} zN$>y_?uMqI4o2yCm z(tLm!)9{75jMP8<-iK{f6!3u&HW#G%QS%lK6IqMfBkFNa__po4oG{0!_iK4(Glw$Q zrb2L+30J@Otumb@%6MW)DrF`mwG1^+t~Dg9$+99FL^g_y@1xbvpVbAvoK95Hg;cu0 zkK4!CrEv{=tbdS+-|>;>{y6KRc8Qx5H5 zByaOX$wi`$Ylv$BXPQTvhkPyLX?RK4H1a)4%Wd3yVWeLt5M|ZA%fi=JCa-=)W$LBQ-fVd^8$(OjgC|I#VY>q z(t3Q2t;MEVp>528ko;PTGN}g#THH z9nfK0nrR&#EWFxH{9Ap*RbI~KvuiccM5F2?d}8=AbrH77$H~4S>(xX94XL#idLQ?6 z12xdb!U6>sdMlZIGEr5qZ7r_nH*=LmDmul+WkY0|KA%k&Wji`mNl)s&XG4T0#8$%w y388$FW?I(j@a*_fr8C_&pZ;FXRoa*7imCjIY1!zX00030{{sM41cXi37ytn9*6gkT literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule17_fsolv_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule17_fsolv_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..c5c758982a159e0589b219459687eacca2b18890 GIT binary patch literal 1287 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 N0{~{vQwjhQ001hZuxS7Q literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule18_mnsol_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule18_mnsol_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..4a9463daee137a4e67fc38490e5bf81f5faef73e GIT binary patch literal 1627 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 CTX^IE literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule19_mnsol_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule19_mnsol_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..3e6b7133d5cd8816fdc5f8c21165c3840a20e91d GIT binary patch literal 1850 zcmV-A2gUdwiwFo_ZtrFS|7~wC=VQh1Gb97~G0PI)` zbJI8w{wulAnUKYYZc#4!$V$K@K!>)6-m z5n&tfndcI!;TIq-`kQwc^Na$=71VMW`;xZbetxuf_)+F~T>Ee9_z{k6v1`gZ4&|1% zFKo&^YTJL^yjCy_voykssO7Xa8x^dSTR{9wv4DYE6_TDiHIkmY>vEdHYD{|0*O@d$ z)R^?#TW2yHq{d|k)}~vOu8VSHp*2ZrS7-(jnWb@-&sA<<8BWd#@$6?WpB}w7KM94A zT;St!H&P3k?;Z?x@5W+xf3T}XmwAv*vpiCU{v#gD?&35!Q+mEfH5m5I{lV4X&;CtP zV>}ke=Ampe1}^v+{s3;NLtr3g6tE(_7w`b@17XI^uTI^y?k{L+;;h!6IsflZ+y~l%Rn7_b~KdqC)^&i1Ai#HjLo}scdlyQ48Z&U^B2V zY=K5cbwDwagk45}1o41A04C;_cS(gm15K1ChzoIy3QrJKg}{6J)vdz_TMmO#i-3I* zR^AYa7A30yi!tGRD#I;`w?%t#;FDAbO7a2jkfMIK?wI>eaXQH%OaqJz2QQ9a`i%<& zj3|yFy9dirHKOVVXySiTxouLud5mu&d{NxPONrrzH<7oQ!!Sc@-y$Z@OGrJQV#N6D zF8cKgzFEF0-~8x9aS0W^ZGlPRd)O-8ZNuUdGn{A1S)QF?2CP1uO{1SoLSc!K%Nf_- zBOt0ghp)7-nIPpKHJ_s(k%f?BjdTtqh|9Ufh~qM6wZ4+KTus*Lf&SRrOlPWkeKDUU z%9tNMyD^qj%DwyfO}Y2{CjOv9!;>W!I!!lBV>&i}KsH(WC^GJk>IucLAs^q&u^SU- zt2v!&O7e))khy7-P5Ee3j@hDgk~V8?_NyUxYDmYL*bIhQtZt{l95BNrPpgY-5G0 zB4Rxpz{E1*TUZ}fipVXtkFc)TqVO$l#_tcj-wX3T9#(<(dtttX>jlEy*ESY4*d*A- z{{(^edtu&3;oI#|6yS)sJ6N@B=f`G6QP{N|za)=Iy}E4+NCEooq41 zo>%9WPLim4XAWCV3){aTD|>ED3J=TP3pO>Bz5PuVJ3FO78>=Au)iCa%RTcr==_@uZ zCGSMD0Lr>oY3+5|_QIXAfh0+DLuX5eq*feT9&0N1nE1!24Y@UKBu>)atp7t|v-kD( z%YW5)Im;HaA3Qn!cQc=Zos@R3SZGHHtcRXtr4CZ~-9Ho6b`$J8bZ5 oe5&R%86?NQFP3WFhIGNS_{_9!^bY_40RR630G?nDmt7zL08#sb?*IS* literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule1_fsolv_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule1_fsolv_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..947c195365e1ed758ba34eca8d0bc91292e1d5d7 GIT binary patch literal 1826 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 JC~y5J008h!lEeT2 literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule2_fsolv_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule2_fsolv_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..016c2a39063a158bfe578f6ec3e8d098c7c6d43f GIT binary patch literal 1496 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 literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule3_fsolv_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule3_fsolv_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..62b0c0cf3e94957ebca7cd1a0d83e351b22bc561 GIT binary patch literal 859 zcmV-h1El;PiwFo_ZtrFS|7~wRUt?%xZE0g+Y;$>YbY*P-#8qu? z(=ZVJD^VoW0$pXtNgG$7eyG^^z{aG(2ehKdNt`WO5|_MGV^#kD>kA!2P*t|? z?K$7c_hey5DxaxB7IkHhtc6{vtf?g)MXhpBUS1A*7QufavP!Omg?%o{Iu+UET9j81 zL;Bu;IUXT|b3%QG4wm10)}?=7_>qpMu1^VZC}AEOG6&=7;qkgdqA6h)xQSc3l8l+mfK#Y}3s>*|cJd)CtWZ9Pn zDqOTDsBvJ8LRg2%M`Ku?j*nk8SOJ>3n1(lFw27N(4Tppy61hUbL8Ff-Ni1<2!YW;X z`1~OwF?l0~0Ei#D=p6dSi+n=UU|Jl%LJ(uUza7>S`E_sOUyGfqY*wn7nLc?t z3*r-aij?*}qUR1(vV@1@=;j4K1$}rgd z7_#=Cj)1*6!gSkQ(rv>+c4#4|O5{-?a?GJi4jf`HwK@oXG$I2-5P<0-7g=_yG8r|Q zoUEwHM$cTuT50^Qnnd;=sHv5yGEUQ!%BOOMUkGio~or6{66W)6UaSeTs zxVk}vyUxJ(pT#?*&$#0``mGRmNSW)tG5EHD$;1Bwi}z~MoT9Xr3q}b zDNFC5s&>RT>iTe7%OaNXh2g0^m1%vQhE26zoou6n70vCb5K3I*XKV-y5{R_7Tx@bJ l^HhI$E`C29_Rc8009600|3grrn-F!005OSrQrYo literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule3_mnsol_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule3_mnsol_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..0b858dcdb820e96fba24e9280fbec9b78f5483ed GIT binary patch literal 1772 zcmVYbY*P->{xqq z(?$^gD#lD}9wEIuo$e7H&X59~P6(6?L)(P9dYlrsvK3@I1w#1jz1x+MEX$5XY5Pa( z$tb>k-*5L$yT0f~+2|}AoAGqg-RWF(Cs{h18u%Javymen9jUDjfxje3CuY95=spkf z=`cw5PJ{f!>D(dPK2eNot%cCO5YoSVz12Aq8|qti=~Je)l8gwCE-Fv+*?Qm9C-C9E z@VFv^wbf_Bx1noaDW7oe@s|2Tb1q!~o*-0EBHQ}cf=KIMDoVK!T(r@5;Zsjp?@SWU zr&1_TZ;?B$1-0>0Cb=LMKEE}7(pL^Z<}uDG!cRBOJs}o-8$b1=Edlq}(g5W?2l#CY z?G`-QR^QXam5^e#emtdlYkdL!iSVUTg0=O}8D&mg`C2l2iu|_zeVaE6Kj&K7vp{VD zSOeWK8^?H#t)8{U(7@a{1L7x&U3!*M6|!qyBiXfIBiXg6k?dM7TDKHc6H*vLEh@dJ z=RzWjBo`80Bo!f5NzT8wNOA%23dvy!TB?gLl-hZ zJnz5z5pxWdV&H}763UdyuMZ)9tbwp!W?h*Q`GjE|fKm9K_-Kpdr?7E~4nCBd4wDN| z;+V%LAVA+Ea{bDxCV@%VEn~#s1AYKB3Pq6cGX3bAB=4~R!UsT<{a?WzY%C^==|C8+ zfY~JI2)y!=np=KRshK3)IRoR6euafY&>!9*3H{^FH7xqw z)ewJ#g}{@7mCCMzQ;qR}1&O!O?&{d^jA5|_zaz4kz<`{957{p>R37>wIASo@0EX7L z%B;|M8$U{)|dlT=)qMOf-7oDM)i6%KAg0GB38Vt zy0|EiZt)uGj`J1a<|LW$FD z+i@$wrShrb9-Fi0>P!*O_5@5x$(gloUyI$zXqX!3zWeO{UPL4Nx$*2~M7xfcrRR1g za7^SN*^LC-u?u^<-hOl&nt!^~(c62Vu~Tnszngk$AsRd7ruMh7rETa_?YnE-)P3@% zma?f$Y-;_Q+PS6{&7qnl=FT`60gARN226D?EqO3_GYeA37z`Zia1^BJ(=0X7EH!)c zv8@Y|qb#;WlslOvX1g5gwkJ++ROm%jy`6KDPlnle$EwlGg|uJHzYpe`wVANRSm4>r zxx@%xNx@rB6`nih7JuOY7y3W1-ew>n)aeVweOu~^|F8d7^_K>!`WS>$3T+s&*q4~H z2u@jx*5%R&r`t3!*db)GIJ5Wf>%8izJ{^KUM;FBlfWhhZM%83D0Uuk zbcJZq*xV zuAX^X`kQB@zfm$)NCl(>G)OAl_o8U$7wpx^ZnGIfZuKf7<+4D8-Mhg7L-kjgDSs)z z3ncN@22TCQ^)9=~>fU)d+^)(M`bG?J)SCZdu{H@f-l#I-Xk{kuRzY58x)>#ew|;NC zd9VCsVU?{S!K8}*)$(c~1*_ycP=Lv!m8G$ZzaY#I{S}#1q#X1kiNN>Q0aJukV7}Wt zG+i-`)ca1_&`~M()OVo( literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule4_fsolv_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule4_fsolv_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..71020046d11721c01cfe8e0681579e80956efe2c GIT binary patch literal 1532 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 B@P_~Z literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule5_fsolv_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule5_fsolv_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..f8f82a54a4f4fcd2866dca4b5e7b5a20906687ea GIT binary patch literal 1168 zcmV;B1aJEviwFo_ZtrFS|7~wRUt?%xZE0g+Y;$>YbY*P-+*bc@ z<1`fiS4t$*ovw@QBu?yts8G4v53t?P1c=*Ck&`%UAzyk)I>vhAZ^wQwA^o;qk4Yey zIw$_T_j%v!JbPuuWxgm2RW!9V9;~do%$ALUSJ{-g0k5z9(SX1&m07L2$;!HvRWp~_ zbSA4?!yz{Hm`jBa0rmXAVSe!VZZx)k}G~ZOlasG1#T;{v3=IbIbB0T=TsDQR$MP-rTe$+$?KVzY@?rb9Z#oa-?9fa-J@i!4| zHrPS<4kFeN6Kq@-X<6l}G67pROG1Qu@x%G$&*qg-7|9(zR>MTqaWxzdhF_+9I2sH! zwW(wgmQ|t*{u*mGtY>ne^!$XH^j?exkAuJacT<3K-;C6O(VLh@3{VoAF$F=CN)Wgp za9=9W7Jy0ML>wRxaArmoecubvWR#jQfH9563y>fMw4^h6fF~PG!CZ`nz^gxb0kh<$ z0$YkeO(6(HFbIGMM5zL>8=tf!$OW{7{~3tX@;x{~^ArR88bpw^f-wd=0^*Azh%Lc_palw^Q`Uz>eOx|p52J!5j77giQVLcj zcuF}s1fEo%V@7Lbl7IXHv$(-%XFygde{}{0NyU1k;4)3XXBuEhCHk2p?{Me7#(i)P zF!E@^Z@-zBYrBQ}ST=|&W;rAu^FA;|AMmTdz|RnCT|ub0H*nXb513%Iy$yuIbU+&5 z*YGU{jtjGq1=cL_JzS(ozoryIBi@hjP^W!S+l3)r1Yi9GW(mrywnHc&x1F@=1?{aKLiDw#`%;JthY(W^~ETF#2sPA-Qq!8PooVv{6 zR9BBWKA5cYd8UkWYkD!Y3{Ylw`r2WTH)d|G8+Kwsw71U$YtO;H=d!^0z8k>a6Xlb@ z?Gu$A&%P=4p(fojRi}l_Aw9h`A@i(94Ts_TrOb>V42|e2msxgRW-4B0YTDh^EYQr$ zM1!bzyG)hc-{tJu@bZ=yuk*%ts;cK@G1fHtxUmqc?mg_7TNgoo{6#L{jCguC>4G^v z|I}NED;(ySP3;BL^}Oe@KX!c}o7abb-~e}@dwzEZIC*OP4!Qxhzo)gZBSO>RA5lHQ zMtF>t3XX7#9V&7A9(Gt?U?)CWzr8<*WA*W_5*=k9vJ~u4i#^oOcD@hY#dh|syC2(b z9{*O`Sd{g=nct~UgT~Z_d};Iwbt~85X?AL0Jqz_G6>DpimZMDf#({PwD<~9{{sN1X*)`e4*&pu);m)G literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule5_mnsol_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule5_mnsol_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..35005978ad8a242de98ab38fbd6d0eba0ce60eee GIT binary patch literal 1826 zcmV+-2i^D|iwFo_ZtrFS|7~wYbY*P-)LDCT z(?$^gDz2te7f9SY-AQ+s>ELwI()JH1LrOagW^7qHfs14X*$#m;eD>b$%1E{zQJ_Ow zPezZ`?r$Hr+S6_>oiIz!vZY?GSI*Jk(phE6X072eSZApvK7Z~X3<&(iL9)`@n@i_$ zkgpd(a`Gz3Us{<%GNPU@6(PhUlDN!g?$wKf!A$|UQp)4L%NddU#sI#O%m6Uv`Ys_% z008ZaKt_ZppV*(v6`@@D|B?m04WOROsF4?pyT%soeQ9}LdD6)Hlo7=U5uYz_0GxTY zj4+>!9ECp%umyMF?<2)rvt1r@%XcXpuB%e!!mAZs*llf?)(fKN<)pK7M=n z6)X@2lqdKUr7K2BBoR~(N2C-Hja~qF_yE?ET_9RzslXR0N;(=60Y%cPT38P9eDDJh zDLNE_%Mrf^>qIg8VErRm=1@p>!i=&SG-)}mEQx|#r6|h(09k+h1UP_5L67uGfFf_* zCku1Wkh*4qBmM%&*< znrPOsEY^q1AO%Ovf=pe?ohw71PTy>T#6Fo$?X%M~NRo$HqQgz1PqrUE4sfPfWQfT3 zaue%O`C&9#S-G^33#)QR=Q>|4vgMHxqgOkTzuaC=x00X!Rb}(RH(r~C5z6F+yy+(i z5sKTeNy!;A0d#K;V19OWJ!+G~_iqj$IV6Y>icultEm-imF=$+c{@+E!yaS%HNlsi> z3gQ3nJeKBNuhm+$+(#-#Ad|3KUtTzyKDn&IG*9hdjrnwyzDJP z+M*~R_khbQdrs^Dnpn%eM@QRcsgbpM#OAN)?YdbhsWg`H_59d;gsis}5$^-N#&-D{ zRL~tneE@&KHSA%g#-1s>hBeyn@LJsl&H!xH;(C6}158drkK0oCZ@`9iie($>tn9V0 zpNm+R0k}dE1_ugTLvh@>nAln35W{PGP0GwwE_9mOAGf)c6tH<0m?Y220SjTrT`K35 zK9-Qe8@vHU3L}Z*g1D(Z{8mB|-KAC&EDU~U{Lp3W`Vlqc zt)ZSwaE12=Lv009;5?)l05nuW92`VZ8K5>m^CGh9(4tN4kMKCe;aXFaUzHjg3-F)> z2)xSFrq!-r%aRhc*URrJ(I^?HaG2Mf2f=nj@Q+)(!eSG+`=jC}tQWKH{H%;*F$lC6=5|%aViQwX8M~{> z-EtDCb>|+2gVUml>o(`nmAFS0FDyofa4PRz9|qiR!=Swk-nrktbIr=H0sJD=qP;dd z#lInz$1Q1vGu6UZjyjv?sMicC_vbLeZyN7V(Kt0?O~WXmx_BFL>o(L|Lr+eYP1Hdv zakn+@BJOwb9mKtfLkDqB9IbBz?Qdv*=l6;Gqutw@>7He)#d>kBr-o>u9tHO--%`H} zs^pX8(2~vF)HIr*LCei^d}iDm7-d0@f*bQFS-iJi74wFgUq4-}^)k}YDGrf4JTvt5 zV!l~bz0-yCbUTCY@X)$gnVv&HylJ{LqE3ThC$Dt62!rJG-D<7Vwm=t5tB*{(I{yIx Q0RR630NiRtdUzlJ07$rqBLDyZ literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule6_fsolv_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule6_fsolv_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..a448c7d46e6522830e494d3323edcd008b8ea00c GIT binary patch literal 1369 zcmV-f1*ZBRiwFo_ZtrFS|7~wRUt?%xZE0g+Y;$>YbY*P-#8wM$ z+cpsXD~2|}$(k5^NhGsnPLpjdhUKxQ9kwQcOG#AXLY7?F&YA|I$GZ)Zaxg3lTZ~7+PU|)pmHA|B;nR%Efft^gsjU`)|IFkgJDuDHC#D+r zO@44?s!Pw=CY^|dp(cchkcV99yNj*XS+pXZbQIxQYORGNT82sjU9N6jM4@1WkWfWT z2sf^2pC~H0;|rw;%I@<}Qx`(Ysbos?a7{Xu z!o|&*7n%|&d9=291xJARM1+*xT{wOamqm(q!O@&DhWx2+2Exx0H|6sZHx=_NHx1`8 zP7=*a+*Ho9oJ7rIaC*2My|PNJm;Zv1ZjY|a(7O2s^4DG2ndY$C#aG9~w?3yMUmdKm$;XeStE-o9<5l1RXYoF-F}Q7C6AN z6aS-NUCRQrF%ZGJRbVFtN@CIUDXhS{0q0EIy*>siAZYad5Rd{*-24e31=uA09_S3$ zqFQzYX25k#n|;O^_@bY`0}^OR$vI>-;SGWiWc~woFaZW|;2$-{P_kYCG)*QAtK@)huq8qRzH+R4l z*6a}7Hxl_TJ5BVnu#1Na#^kZFHfDL$c%P87ChOB{iN?&k*RR@OVkXph7UBq!Ei>H7 zZj(bqSr`+%PkbMUX&+`0qRK{bePi_N=imcxvP-#Xu0YD4*+y%eu{Q()ZZtwcN-(A2 zuhYZ+2kP8=L|r$i>ufM6^I=sEvAMDzhrRTLe&qD#A?2O6Cv%?n@Bkw~?q&2SgGSZE%EUe*yTzVcN0z?7NY zF3bP|;qulKVQ}Zfz21k3$^AmF=a)_gCeIJc+$NLU9!%Tk0FZ++bwb2lPBPnR+Uw59 z^9D69ndR+V+iKJ=iycR!cXKJboqqSG%rEcFr3zj633Jul1yZfs7-<&z&=Mgj7vgK# z%et!B28GObRsTVM!oRjXY2gcnPwKMqH+)dLkE5X4!I-Kipc^x9$`dFnS1^m!GhOHp z9vU_FPb=doJQ`N7ipPgGUP=GPOwX4sufI=JzWMv%>fOS*<;!LFi^u;}HiqS>Kki@K zo)daiN9LKw75381iVyN_FLtw@yHbhMR=IUtb9K4pjF}3F6StK2KlxqNSA1b#KYtwC zBDLu$)~QE!=H%mkJQ>aI&erVSw9GxSL%+qD`V0YydYNYiOB_46vV*>RGEZ+tV>@^# b&^2iE88mP6UjP6A|NjF3?(nJCArSxomxG^F literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule6_mnsol_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule6_mnsol_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..2435fa9508b029cbdf2a4f39c316b939100807ae GIT binary patch literal 1785 zcmVbiwFo_ZtrFS|7~wYbY*P-6&2rac025W z1p#dy?|n!4JKZ!*F&Gs?JDg6M2aTKNr08EwEqqO;#lREK&eUFmz<-|fCw8{EX+BNH z(_Yf=yiUfiyv#mnNft$#5GEoXaiwoB_8Mn$LvhklgzH#qEn=eMNW~x?Z*E=4NH9W3 zq$CrIy!R1a0mjXp%rL^RZsI2m?}ab`XJC(QKDuAd|;!;Gpk81BfQ}7-_(tv>yN?=&%{A zDeBg6z=17)>OT~m>v#y-7?9xHDzKA*h_Pt;6i(ng0q2smeSHF=z(M8jkAYL5iFdyO zlLB6oeFx$U&tyq^0%pK?`2MVgX6T;d_~wC7(rTo-!|(b68bQ|JVl&to;mFRHzvi$EH7H zE4JtJXv(C4DTZ+aLyGnkT&5JbG?=9r4?Dtw>TiIkLOW-obOg-Vm-p{sw}oa)4Vu6P zlkdP%eCGgMVIe|vKZ#NPVJl=mkJ{K=u$sEHG-kOB-Wzfjsy@4xXe_yW{%i+K%%vK8 zA(c?65906y?gUCNVi1u}lu2CZq%UJyul zqLCG-1WOt{nl<|`sPm{sUAtL6XPbkfKN=S!1XuR$sGA-8U&)xZsC2(kr2KQwVK}wp zF#;hj6$yX-*d%>}(#_^{`ijBJv_PNw-mUF{2y5J^f9jwM@ah4SeUgD;I3 zIO0&YO5&>|@i)&V(U;FA0Zz}>MlZl}!`rJ2M*#(640#n7;0^>#bRK)<)vWVt2@JDM z`4fe}bUXbf-jp9F8=Gv(pP~QxCj6Ik$atv^h!(>@m&g`d*$ID&i*ryIWmb zLBzu)-nR9sAry^VNHb)OuZDk^8-Xg+U@!>4vus^SxpL!x zQ;yebi-=(`978I+xI}r#pQ)<;j`?}yMH(|W1>^^m`{+2?ksWiL*!Lk`r*9-1Zfi7mX zT~AYdsl#iNsBju&;f=z&m`#~<7$}LT^Amd<2X%aNVa-}Ej`3Z}`p6qN)jm2;>uehG zvWvI$s4jWiPH+lj!oeLUq*$P&rquV_d=im2hl3;xZofbLa}Ou?6i5{8=7j|Ec+PR7`r)-nH#I zqF41Kx$F6c_Ej=Z?)3LP+3mUx@ENCV?9TDbh1YP#k}(QixubsXy^pE{*eh}U_;zZC znaxgdV6KVG(WkxiYBC?4Ev37&dAlY;AL87b0!WDL4u(#&S>agcwH@?K(m#DSncBg+ bM3+pHk4%d;{{#R4|NjF33K8ffyBh!ihAC;N literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule7_fsolv_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule7_fsolv_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..293601acdf1f048d4fe626ab726d045e270c6db1 GIT binary patch literal 1412 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 F007tJi_-uA literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule8_fsolv_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule8_fsolv_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..3fdd1dae541603529105c5e0c7d2c2d03f9d7f6b GIT binary patch literal 751 zcmVRUt?%xZE0g+Y;$>YbY*P-+*NH) z+b|IRE1AEPi8gYampauXK2!{88Vs%4hY3*RCJsb$;w~>0Th;$Q-?<$HItcJ#(yGYz zo$tAq*({CeDg9T6L|&qiA&r%8Lsx8afo8T&PBFg%vp$bz2BEy%F^_ zfJW2}0vdX8%z5ZX+z-aUEwHTa-4>&;Q z=D>C|V4mtK*L5jtfRM|M(%3)yc6$CDj?}}IF737&WU@)?!NeJS$oXLC3=FibMV06} zlc4`-lO8lTVj+!u;13=D{m@xEul`+DqbY>sziytOks%^k+o4L$&XGb zxJVMrs}xF|Y9-T7$?28|2wIjpGfHcB-R07~BMP?xT)DxeyST|x)=iy*xZKo`?5kDU;@4EH^dwFwV!ibd-*@G{B2G56Vx;0aeqF>ar~%n{r$R! z3x8-H-Vj009600|0=nm3Qk2006edbF%;d literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule8_mnsol_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule8_mnsol_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..56b957ba059d4066aa41b6d6afd2ba6a51275c4d GIT binary patch literal 1208 zcmV;p1V{THiwFo_ZtrFS|7~wYbY*P-Bw%ubSka-}GWH+7-ps!-EyWpDwrtTPQnyt`GdCcDZp zX$@Vup_BV`=MSoB=XG_i$>`$~)7RVYWJ`Hac21}|I$b=bL*YjuWi%!XPIh>7*`O?@ zfeB?q{4i!b0D68x*<+sX8@Gqd3qwl6zeIr(JwUVqJoKm^MP6`X;UvD6YqFVzfzI!U z`u{x!jQQXK7OA-D}dBgQ66#{hlV`67J<_XG88?SZ{gkT%z^uz&711BhW=HU=ShzNo07+SO3>T3nh z7k@P(#!q< z@)N_{;kZKMz7e2zt{6h>^#8r>*lEDSesos#0G$(H&(P;^jQywP*G1jVm-7deXrN*B zR=hNLmAVuA;AwGYzRUt?%xZE0g+Y;$>YbY*P-#8-QB z+e8rmDjva%1EijNNp}|tE(FR9)7Oypj}n7>lI~J7vXx49rVzqs=WbUctGIKnWDDqm+R<-sg^TS zoW3>HMUZ(wMv8N$2w{n)EK!=>{B}GzPu3#KYPCn4jHr-__P<0iO*qr{k@m)^PN*P+ zBvgr5N-gdwPc)Gv*k^<%it6~j_GQB30H6AQB31mc?f3dm56m7Jam^D(2o+S5L~_MH zvOMKPdU+y**A(-6i+g=2)|0Gq>`~uV1L_xuOLdxMUETM%Tf3X z3f9V*r?3vmKl3e;e-~RM{~m9V{Cl!RO3+}J$2q7jQ>;SC-Ql?+R4Xp#{Q~+0surlC9xPT)E(>YRD>sdw+9~iO^kAVv$ zGy-#9+#N79k-AfWlg~hjeFqp!8>ZBKem6ve+TFO#K@O}bc&^0XAYoe<9AL;8WX+g2 z7#cSI2E0gL!3{VKS^!3kQFFt#I1~U&F(QE2>Mr_!AO^X*_+f^q5hFlRpe|?VI>=(d zrMOGRv+|ZC=5%ac{;~tZu`!gY!Po%)6ciJo!(9zbxF>+gHv10jYjlH6+`Hqp9btWA2A%jB8kI@_jp=OgRJ?9O zh6S3NPW^VuEeDM$zeT{gmbJ+d`>en0Q_-?g*+w<9J6;pnIJ0a)QPgGaudrsuyJ4rQ zjf@co1H%M0yDQ(!g*(kY%LOd5go@$ za1{$F*m@a7$cXVoCy7)t7FaPUHPt?V+EmJ6MlEp*@7l$^*>eSdsI#ZSUvDsB?I`{>FVrf85+3QtO?%<^8nn=JBc8#${R0ma{86^+Y%<%vXVL zVJ}RVd|EsRWdAnxTPpL~D!-0vzIzY6F;k)7$}bhOzk*lI7T@vf$M;LS$ZdXxeQJ+q zp1z!=tGer*ZKS8`Hn+#a;9{pgLqPP@1<9xf*y&q4pZTNp?9X~>=eGsAVXFUQ+O+vE S00030{{sNz&V0;Z6952%xw&2d literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/chemicalsystems/molecule9_mnsol_chemicalsystem.gz b/benchmarks/subsampled/chemicalsystems/molecule9_mnsol_chemicalsystem.gz new file mode 100644 index 0000000000000000000000000000000000000000..3ec7d0fffb66ab89c02d9d1ef99c727f7bde34f4 GIT binary patch literal 2454 zcmV;H32F8piwFo_ZtrFS|7~wYbY*P-)L9F2 z+r|<8D-4@dPA$oIINZzQMr@Th&gA99ja$|9P#|!SRD*;hL`R%>i1${@nL`5@F z%h5o zo-9^pNpX0ZEKZ!z9@!^~D^3WZge$3e6u*DHJ9s75GONW!kGvIUQWLGUQZ$OK26hv1 zYo10*XltI6NDxJsx~V)BN;&&l$3zpxZz|7d%&okTigLkqbW?c}QEBBRi-oXf@`my@ zVyayFC6`Q4ao6&<_5arSyKVh$(?4D9d&Bi3W2-?kAxOknrD012Hh|cs-W5Pd$(6XV zIFr;ZU#21@6&LYc%g0PG>ps`g)<8$ndAXRGg)8N7d_jn2-~IIM z^CNdkC>+Tp{=3@A%raf2Dw_fg3s4qvF|fxJuE71Gqq|862m0L;ndxxpy_= z>90N+ ziTM&~aFHO_zk^1CG-Yr@B|huZpv@A4g_>M`4~k8Y5*3dZKuyrO*aSV5VYS#%yS*#| zt`ysWJp@sTb&Ied2i|QJ{qPl-0RI%IPEC*(IHsAGNUJ)&#CjhT;}x8Ng@l~o(u_wB zeg};y`u7I8uvMq|n}^thU;>JmWjK{ESqIPrG{*&3ysT0|z{s&jn%4wrbID>F0Kv9VC!Qtw}GNlk`3I$5&7jOe2$XOM2u+BF$F~5eZ z#+a%Rc7|`66r$G3Pu*&8>5cBCVmu9QrcZ&Ny~Wl0aeYF!t^kcIAlJ0Kv%p=6wo_S%LEszS?C0qhbdo&GB@;LAontlqPRv$8l}l;;Ru zn78MX>`S+gVrrjD5!-h+AezMj-mVoBZgac-QTI-k6lo9E>)U`~ z8;%mSZ7*5tp0#x&+`7AN-Lkjh08u-2Jnz!bZmZR+hW}lWHa5pCJEpcxSQ~9TZ`myl zI%wM{Z1Kg_xy;SpJefgVZMRM$%7^bQeKPs^A}QRR$;91zF-wZ#+p;j}MPUxtsN4`Z zXJuxI$aiv)n|+Vk?Ju3&tddJZxyP4gu{+{K4vIhBy8z2@siiIl` ziKMM|9WvQMfz&ZHg^C&Ds*d?=qrm>$W`f&Jw5=g-u0X}YO#~@5qf)AS@Zh#NXsyEb zzyo2CaLd(pePkP2ivK%#E92w|qm=3R?&TGWTni~}XIRW6zXt{Qa8nV9rBxH(gMxd{ z!F_kZ|J*9t5&>=zSaFe1N{!r2+(T0z-={9Zp{l~DtxQPYw zCKkw>SfFS^fue>4R;1{T!9jL=a1f2xkGP*z2=?TNjx@Q}Fw|!VL8PR~Ho!f_QLrc9 zWH`R`TZWW&7)l7D6S%$01DLRd)o*PO9jrDWg!CP&9bdEsD~Bu|5Z|LP`XvjU4qB6TwqcN2a?vS4S@cxUwy*qEfr)Q>Ms~M}P?%^_iRo z01Y9duFOZcXRo8soogxey_`>5q8WKer-G#Nw)ybAS4m8tS%a7(qH~@3!;onjfU$UsJkchK~|yiil)emQTIK)&V^5 z3J}q$K-*5gzVag_>z*dR7);(lGPkNf-6PZVqn#4_`)C!-1?9c@M9AlB;ZNIS@U9d290VWen-cc^SdjaVBPC3PQftKOy$&8;C<4gqaa z2c5*tt#Kc*zKic6))0ptVoe;qZ&kXzquU2xC)T0e`@(e3%jMbX?9xmu(W&|_dFc4& z<|GNphsB;F+pCG)Xr@-%!rsSwHoSo~mMl>4!rm&*esxh*ctazuFW#=qJTut~1d)3p zv-H*3^kNxCXDaE*8iVeM(1jSF=a3LRna!=}u*I>%Q!_hDlj6m@<;u*u5?wJZKQL|D U{4W3i0RR630E~d`=oKpf0Baf1p#T5? literal 0 HcmV?d00001 diff --git a/benchmarks/subsampled/gen_systems.py b/benchmarks/subsampled/gen_systems.py new file mode 100644 index 0000000..5397617 --- /dev/null +++ b/benchmarks/subsampled/gen_systems.py @@ -0,0 +1,79 @@ +import gzip +import json +import pathlib + +from gufe import ChemicalSystem, SmallMoleculeComponent +from gufe.tokenization import JSON_HANDLER +from openff.toolkit import Molecule +from pontibus.components import ExtendedSolventComponent +from rdkit import Chem + + +def add_chemical_systems( + sdffile: str, + dataset_name: str, + solvents: dict[str, SmallMoleculeComponent], + systems: list[ChemicalSystem], +) -> None: + """ + Add Solute + Solvent ChemicalSystems to running list. + + Parameters + ---------- + sdffile : str + The SDF file to read entries from. + dataset_name : str + The name of the dataset. + solvents: dict[str, SmallMoleculeComponent] + Running dictionary of solvents to draw & store prepared solvent + molecules from/to. + systems: list[ChemicalSystem] + Runing list of ChemicalSystems we are appending to. + """ + for i, rdmol in enumerate(Chem.SDMolSupplier(sdffile, removeHs=False)): + offmol = Molecule.from_rdkit(rdmol) + offmol.assign_partial_charges(partial_charge_method="am1bccelf10") + solvent_smi = rdmol.GetProp("solvent") + if solvent_smi not in solvents.keys(): + solvent_offmol = Molecule.from_smiles(solvent_smi) + solvent_offmol.generate_conformers() + solvent_offmol.assign_partial_charges(partial_charge_method="am1bccelf10") + solvents[solvent_smi] = SmallMoleculeComponent.from_openff(solvent_offmol) + + systems.append( + ChemicalSystem( + { + "solute": SmallMoleculeComponent.from_openff(offmol), + "solvent": ExtendedSolventComponent( + solvent_molecule=solvents[solvent_smi] + ), + }, + name=f"molecule{i}_{dataset_name}", + ) + ) + + +def store_chemical_systems(systems: list[ChemicalSystem], outdir: pathlib.Path): + """ + Store ChemicalSystems to gzip file. + + Parameters + ---------- + systems: list[ChemicalSystem] + List of ChemicalSystems to store to file. + """ + for system in systems: + with gzip.open(outdir / f"{system.name}_chemicalsystem.gz", "wt") as zipfile: + json.dump(system.to_dict(), zipfile, cls=JSON_HANDLER.encoder) + + +if __name__ == "__main__": + solvents: dict[str, SmallMoleculeComponent] = {} + systems: list[ChemicalSystem] = [] + + add_chemical_systems("sub_sampled_fsolv.sdf", "fsolv", solvents, systems) + add_chemical_systems("sub_sampled_mnsol.sdf", "mnsol", solvents, systems) + + outdir = pathlib.Path("chemicalsystems") + outdir.mkdir(exist_ok=True) + store_chemical_systems(systems, outdir) diff --git a/benchmarks/subsampled/gen_transforms_2.0.0_single_repeat.py b/benchmarks/subsampled/gen_transforms_2.0.0_single_repeat.py new file mode 100644 index 0000000..41eb78f --- /dev/null +++ b/benchmarks/subsampled/gen_transforms_2.0.0_single_repeat.py @@ -0,0 +1,102 @@ +import gzip +import json +import pathlib + +from gufe import AlchemicalNetwork, ChemicalSystem, Transformation +from gufe.tokenization import JSON_HANDLER +from openff.toolkit import Molecule +from openff.units import unit +from pontibus.protocols.solvation import ASFEProtocol + + +def deserialize_system(file: pathlib.Path): + with gzip.open(file, "r") as f: + d = json.loads(f.read().decode(), cls=JSON_HANDLER.decoder) + return ChemicalSystem.from_dict(d) + + +def get_water_settings(): + settings = ASFEProtocol.default_settings() + settings.protocol_repeats = 1 + settings.solvent_forcefield_settings.forcefields = [ + "openff-2.0.0.offxml", + "tip3p.offxml", + ] + settings.vacuum_forcefield_settings.forcefields = [ + "openff-2.0.0.offxml", + ] + settings.solvent_simulation_settings.time_per_iteration = 5 * unit.picosecond + settings.vacuum_simulation_settings.time_per_iteration = 5 * unit.picosecond + settings.vacuum_engine_settings.compute_platform = "CPU" + settings.solvent_engine_settings.compute_platform = "CUDA" + settings.solvation_settings.box_shape = "dodecahedron" + return settings + + +def get_nonwater_settings(): + settings = ASFEProtocol.default_settings() + settings.protocol_repeats = 1 + settings.solvent_forcefield_settings.forcefields = [ + "openff-2.0.0.offxml", + "tip3p.offxml", + ] + settings.vacuum_forcefield_settings.forcefields = [ + "openff-2.0.0.offxml", + ] + settings.solvent_simulation_settings.time_per_iteration = 5 * unit.picosecond + settings.vacuum_simulation_settings.time_per_iteration = 5 * unit.picosecond + settings.vacuum_engine_settings.compute_platform = "CUDA" + settings.solvent_engine_settings.compute_platform = "CUDA" + settings.solvation_settings.box_shape = "dodecahedron" + settings.solvation_settings.assign_solvent_charges = True + return settings + + +def get_transformation(stateA): + solvent = stateA.components["solvent"] + + water = Molecule.from_smiles("O") + if water.is_isomorphic_with(solvent.solvent_molecule.to_openff()): + settings = get_water_settings() + else: + settings = get_nonwater_settings() + + stateB = ChemicalSystem({"solvent": solvent}) + protocol = ASFEProtocol(settings=settings) + return Transformation( + stateA=stateA, stateB=stateB, mapping=None, protocol=protocol, name=stateA.name + ) + + +def run(outdir: pathlib.Path): + systems: list[ChemicalSystem] = [] + + systems_dir = pathlib.Path("chemicalsystems") + system_files = systems_dir.glob("*.gz") + + for file in system_files: + systems.append(deserialize_system(file)) + + transformations = [] + for system in systems: + transformations.append(get_transformation(system)) + + alchemical_network = AlchemicalNetwork(transformations) + an_outfile = outdir / "alchemical_network.json" + json.dump( + alchemical_network.to_dict(), + an_outfile.open(mode="w"), + cls=JSON_HANDLER.encoder, + ) + + transforms_dir = outdir / "transformations" + transforms_dir.mkdir(exist_ok=True, parents=True) + + for transform in alchemical_network.edges: + transform.dump(transforms_dir / f"{transform.name}.json") + + +if __name__ == "__main__": + outdir = pathlib.Path("2.0.0_single_repeat_inputs") + outdir.mkdir(exist_ok=False) + run(outdir) diff --git a/benchmarks/subsampled/sub_sampled_fsolv.sdf b/benchmarks/subsampled/sub_sampled_fsolv.sdf new file mode 100644 index 0000000..96f0041 --- /dev/null +++ b/benchmarks/subsampled/sub_sampled_fsolv.sdf @@ -0,0 +1,986 @@ +mol_31 + RDKit 3D + + 9 9 0 0 0 0 0 0 0 0999 V2000 + 0.6562 -0.6437 -0.0452 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6566 -0.6542 0.0556 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3438 0.5877 0.0984 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0059 1.7785 -0.0138 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3516 0.5504 -0.1081 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2810 -1.5891 -0.0856 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2793 -1.5942 0.1109 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.3559 0.7787 0.1745 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3525 0.7860 -0.1867 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 2 0 + 3 4 1 0 + 4 5 1 0 + 5 1 2 0 + 1 6 1 0 + 2 7 1 0 + 3 8 1 0 + 5 9 1 0 +M END +> (1) +-5.8576 + +> (1) +0.8368000000000001 + +> (1) +-2.1595377311705013 + +> (1) +0.1989721612047581 + +> (1) +c1ccsc1 + +> (1) +O + +$$$$ +mol_77 + RDKit 3D + + 23 22 0 0 0 0 0 0 0 0999 V2000 + -3.0240 -1.0106 0.0945 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0399 0.0399 -0.3678 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0872 0.4195 0.7476 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1218 1.4570 0.2785 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7219 1.0224 -0.8752 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5131 -0.1035 -0.6115 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4737 -0.1901 0.3638 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2906 -1.4210 0.6013 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6762 0.8144 1.0928 O 0 0 0 0 0 0 0 0 0 0 0 0 + -3.8033 -0.5956 0.7709 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5455 -1.9071 0.5092 H 0 0 0 0 0 0 0 0 0 0 0 0 + -3.5915 -1.3299 -0.8276 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6171 0.9546 -0.6150 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.5412 -0.2989 -1.2771 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7143 0.8654 1.5516 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.5047 -0.4505 1.1080 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5271 1.7297 1.1388 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6426 2.3943 -0.0263 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3471 1.9123 -1.1695 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0935 0.8155 -1.7667 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3039 -1.7013 1.6705 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9520 -2.2553 -0.0160 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3343 -1.1613 0.2845 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 3 4 1 0 + 4 5 1 0 + 5 6 1 0 + 6 7 1 0 + 7 8 1 0 + 7 9 2 0 + 1 10 1 0 + 1 11 1 0 + 1 12 1 0 + 2 13 1 0 + 2 14 1 0 + 3 15 1 0 + 3 16 1 0 + 4 17 1 0 + 4 18 1 0 + 5 19 1 0 + 5 20 1 0 + 8 21 1 0 + 8 22 1 0 + 8 23 1 0 +M END +> (2) +-10.50184 + +> (2) +2.5104 + +> (2) +-12.77556635130987 + +> (2) +0.2907125226322644 + +> (2) +CCCCCOC(C)=O + +> (2) +O + +$$$$ +mol_58 + RDKit 3D + + 17 17 0 0 0 0 0 0 0 0999 V2000 + 1.0651 0.7123 0.3337 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1905 1.3072 -0.3086 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3600 0.5311 0.3055 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3024 -0.7862 -0.3043 N 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0961 -1.4398 0.1581 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1568 -0.7068 -0.2407 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8440 0.6840 1.4280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9619 1.3004 0.1011 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2733 2.3804 -0.1600 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1142 1.0483 -1.3934 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.2954 1.0587 0.1332 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1352 0.3735 1.3905 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2387 -0.6624 -1.3497 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0885 -2.4738 -0.2128 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1121 -1.4647 1.2762 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0113 -1.2575 0.1782 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1671 -0.6049 -1.3350 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 3 4 1 0 + 4 5 1 0 + 5 6 1 0 + 6 1 1 0 + 1 7 1 0 + 1 8 1 0 + 2 9 1 0 + 2 10 1 0 + 3 11 1 0 + 3 12 1 0 + 4 13 1 0 + 5 14 1 0 + 5 15 1 0 + 6 16 1 0 + 6 17 1 0 +M END +> (3) +-21.38024 + +> (3) +2.5104 + +> (3) +-12.43768065706572 + +> (3) +0.24480934082652417 + +> (3) +C1CCNCC1 + +> (3) +O + +$$$$ +mol_20 + RDKit 3D + + 4 3 0 0 0 0 0 0 0 0999 V2000 + -0.0402 0.0009 0.0033 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1503 -0.1983 -0.0946 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7233 -0.8251 0.0513 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3868 1.0225 0.0400 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 + 1 3 1 0 + 1 4 1 0 +M END +> (4) +-11.506 + +> (4) +2.5104 + +> (4) + + +> (4) + + +> (4) +C=O + +> (4) +O + +$$$$ +mol_69 + RDKit 3D + + 15 15 0 0 0 0 0 0 0 0999 V2000 + -2.4780 -2.0744 -0.5138 O 0 0 0 0 0 0 0 0 0 0 0 0 + -2.3124 -0.8436 -0.3584 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0155 -0.2180 -0.1625 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8633 1.1422 0.0063 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3645 1.7414 0.1925 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5181 0.9882 0.2184 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3906 -0.3743 0.0518 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5465 -1.1610 0.0741 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1597 -0.9629 -0.1336 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.1816 -0.2080 -0.3702 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7486 1.7627 -0.0088 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4720 2.8094 0.3239 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4930 1.4605 0.3659 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6187 -2.0235 0.5818 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0362 -2.0387 -0.2673 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 + 2 3 1 0 + 3 4 2 0 + 4 5 1 0 + 5 6 2 0 + 6 7 1 0 + 7 8 1 0 + 7 9 2 0 + 9 3 1 0 + 2 10 1 0 + 4 11 1 0 + 5 12 1 0 + 6 13 1 0 + 8 14 1 0 + 9 15 1 0 +M END +> (5) +-39.83168 + +> (5) +7.9496 + +> (5) +-41.271787492646354 + +> (5) +0.30422957668869 + +> (5) +O=Cc1cccc(O)c1 + +> (5) +O + +$$$$ +mol_54 + RDKit 3D + + 10 9 0 0 0 0 0 0 0 0999 V2000 + -1.1789 0.2039 -0.1775 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0362 0.3581 0.5187 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1829 -0.2673 -0.0222 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0770 -0.6396 -0.9079 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0601 0.0189 0.4920 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3407 1.1103 -0.8171 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0030 0.4996 1.5239 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9668 0.5136 -0.1891 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5550 -1.1043 0.6005 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9127 -0.6930 -1.0213 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 1 4 1 0 + 1 5 1 0 + 1 6 1 0 + 2 7 1 0 + 3 8 1 0 + 3 9 1 0 + 3 10 1 0 +M END +> (6) +-17.949360000000002 + +> (6) +2.5104 + +> (6) +-10.90558571635162 + +> (6) +0.21813528101412602 + +> (6) +CNC + +> (6) +O + +$$$$ +mol_45 + RDKit 3D + + 12 12 0 0 0 0 0 0 0 0999 V2000 + -2.2365 1.4796 0.1050 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2016 0.7660 0.0540 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2689 -0.5698 -0.0558 N 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1495 -1.3399 -0.1108 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0893 -0.7401 -0.0527 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6925 -1.7832 -0.1266 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1361 0.6350 0.0602 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2630 1.1769 0.1127 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0089 1.3748 0.1125 N 0 0 0 0 0 0 0 0 0 0 0 0 + -2.2033 -1.0096 -0.0986 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1751 -2.4069 -0.1984 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0628 2.4171 0.1984 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 + 2 3 1 0 + 3 4 1 0 + 4 5 2 0 + 5 6 1 0 + 5 7 1 0 + 7 8 2 0 + 7 9 1 0 + 9 2 1 0 + 3 10 1 0 + 4 11 1 0 + 9 12 1 0 +M END +> (7) +-76.02328000000001 + +> (7) +2.3012 + +> (7) + + +> (7) + + +> (7) +O=c1[nH]cc(Br)c(=O)[nH]1 + +> (7) +O + +$$$$ +mol_79 + RDKit 3D + + 13 13 0 0 0 0 0 0 0 0999 V2000 + 2.0552 -0.3198 -0.1110 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5794 -0.1332 -0.0509 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0827 1.0396 0.4713 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2553 1.2645 0.5509 N 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1375 0.3439 0.1201 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.6187 -0.8253 -0.4001 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2967 -1.0584 -0.4837 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5005 0.4361 -0.8099 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5340 -0.1506 0.8806 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3372 -1.3352 -0.4221 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7922 1.7848 0.8199 H 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2132 0.5077 0.1765 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.3599 -1.5539 -0.7417 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 2 0 + 3 4 1 0 + 4 5 2 0 + 5 6 1 0 + 6 7 2 0 + 7 2 1 0 + 1 8 1 0 + 1 9 1 0 + 1 10 1 0 + 3 11 1 0 + 5 12 1 0 + 6 13 1 0 +M END +> (8) +-23.05384 + +> (8) +2.5104 + +> (8) +-27.498757770760392 + +> (8) +0.2687563890548739 + +> (8) +Cc1cnccn1 + +> (8) +O + +$$$$ +mol_16 + RDKit 3D + + 3 2 0 0 0 0 0 0 0 0999 V2000 + -0.0008 0.5269 -0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1529 -0.2638 -0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1537 -0.2631 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 3 1 0 +M END +> (9) +-2.9288 + +> (9) +2.5104 + +> (9) + + +> (9) + + +> (9) +S + +> (9) +O + +$$$$ +mol_49 + RDKit 3D + + 14 14 0 0 0 0 0 0 0 0999 V2000 + 2.3283 -0.1762 0.0370 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9042 -0.0679 0.0165 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0807 -1.1777 -0.0262 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2951 -1.0963 -0.0466 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9054 0.1432 -0.0241 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1196 1.2757 0.0186 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2708 1.1586 0.0383 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8700 -0.3339 0.9071 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8724 -0.0944 -0.8652 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5815 -2.1467 -0.0434 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9089 -1.9909 -0.0802 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.9860 0.2059 -0.0402 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.5957 2.2509 0.0363 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9029 2.0498 0.0720 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 2 0 + 3 4 1 0 + 4 5 2 0 + 5 6 1 0 + 6 7 2 0 + 7 2 1 0 + 1 8 1 0 + 1 9 1 0 + 3 10 1 0 + 4 11 1 0 + 5 12 1 0 + 6 13 1 0 + 7 14 1 0 +M END +> (10) +-22.970160000000003 + +> (10) +2.5104 + +> (10) +-25.97955843854742 + +> (10) +0.23696678754377842 + +> (10) +Nc1ccccc1 + +> (10) +O + +$$$$ +mol_60 + RDKit 3D + + 14 14 0 0 0 0 0 0 0 0999 V2000 + 1.2511 0.2855 0.1680 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7382 -1.0411 -0.1836 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.5980 -1.2292 -0.2630 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3989 -0.2577 0.2685 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8175 1.0825 -0.2053 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3340 1.2250 0.5686 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8405 0.7544 -0.6758 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0132 0.2081 0.9998 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1533 -1.8193 0.5240 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1858 -1.3430 -1.1781 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.4346 -0.3735 -0.0430 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2951 -0.3201 1.3909 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4478 0.9276 -1.2606 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.5242 1.9009 -0.1106 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 3 4 1 0 + 4 5 1 0 + 5 6 1 0 + 6 1 1 0 + 1 7 1 0 + 1 8 1 0 + 2 9 1 0 + 2 10 1 0 + 4 11 1 0 + 4 12 1 0 + 5 13 1 0 + 5 14 1 0 +M END +> (11) +-21.171039999999998 + +> (11) +2.5104 + +> (11) +-16.179060039735823 + +> (11) +0.22290065723641678 + +> (11) +C1COCCO1 + +> (11) +O + +$$$$ +mol_8 + RDKit 3D + + 12 11 0 0 0 0 0 0 0 0999 V2000 + 1.8675 0.3108 -0.3618 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7454 0.6125 0.2259 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2522 -0.4506 0.4672 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.5662 -0.1661 -0.2205 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0693 -0.6963 -0.6688 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6021 1.0741 -0.5437 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5459 1.6257 0.5331 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4996 -0.5262 1.5670 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1534 -1.4285 0.1408 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1861 -1.0776 -0.1251 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0406 0.6939 0.2900 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4389 0.0284 -1.3039 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 + 2 3 1 0 + 3 4 1 0 + 1 5 1 0 + 1 6 1 0 + 2 7 1 0 + 3 8 1 0 + 3 9 1 0 + 4 10 1 0 + 4 11 1 0 + 4 12 1 0 +M END +> (12) +5.7739199999999995 + +> (12) +2.5104 + +> (12) +10.114800769822025 + +> (12) +0.19292785467572368 + +> (12) +C=CCC + +> (12) +O + +$$$$ +mol_57 + RDKit 3D + + 17 16 0 0 0 0 0 0 0 0999 V2000 + 1.4833 -1.8432 -0.1343 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2835 -0.7209 -0.8938 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1957 0.0079 -0.7000 P 0 0 0 0 0 5 0 0 0 0 0 0 + -0.8496 0.1070 -2.0801 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0920 1.5831 -0.0883 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2071 2.0808 -0.2758 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2495 -0.8510 0.2846 O 0 0 0 0 0 0 0 0 0 0 0 0 + -2.4740 -0.2125 0.2968 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5909 -2.0457 -0.1321 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1748 -1.7351 0.9133 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0270 -2.7652 -0.5636 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5180 1.7153 -1.2872 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9083 1.5825 0.4386 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2483 3.1712 -0.1803 H 0 0 0 0 0 0 0 0 0 0 0 0 + -3.3173 -0.9317 0.1047 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6881 0.3021 1.2621 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5752 0.5553 -0.5085 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 3 4 2 0 + 3 5 1 0 + 5 6 1 0 + 3 7 1 0 + 7 8 1 0 + 1 9 1 0 + 1 10 1 0 + 1 11 1 0 + 6 12 1 0 + 6 13 1 0 + 6 14 1 0 + 8 15 1 0 + 8 16 1 0 + 8 17 1 0 +M END +> (13) +-36.4008 + +> (13) +0.41840000000000005 + +> (13) +-44.62903123785817 + +> (13) +0.3013254142887786 + +> (13) +COP(=O)(OC)OC + +> (13) +O + +$$$$ +mol_65 + RDKit 3D + + 12 11 0 0 0 0 0 0 0 0999 V2000 + 1.3117 0.1081 0.3379 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0473 0.3096 -0.3081 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.9652 -0.7987 0.1133 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.5624 1.5742 -0.0546 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9522 -0.5167 -0.3379 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2370 -0.4453 1.3041 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8060 1.0796 0.4466 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1239 0.2685 -1.4201 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4986 -1.3819 0.9371 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9435 -0.4627 0.4821 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1620 -1.4767 -0.7445 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2519 1.7418 -0.7559 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 2 4 1 0 + 1 5 1 0 + 1 6 1 0 + 1 7 1 0 + 2 8 1 0 + 3 9 1 0 + 3 10 1 0 + 3 11 1 0 + 4 12 1 0 +M END +> (14) +-19.832160000000002 + +> (14) +2.5104 + +> (14) +-15.68235057857258 + +> (14) +0.25715084371727553 + +> (14) +CC(C)O + +> (14) +O + +$$$$ +mol_44 + RDKit 3D + + 16 16 0 0 0 0 0 0 0 0999 V2000 + -1.5643 -1.3436 0.6687 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.5077 -0.4903 0.0675 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2664 -0.5297 -1.2924 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7333 0.2833 -1.8315 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4706 1.1152 -1.0163 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2374 1.1615 0.3412 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2399 0.3485 0.8696 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0278 0.3609 2.2150 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.5686 -2.3351 0.1524 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5836 -0.8756 0.5595 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3986 -1.5152 1.7492 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8185 -1.1638 -1.9612 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9311 0.2596 -2.9013 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2521 1.7507 -1.4381 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7971 1.8030 1.0123 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0741 1.1707 2.8052 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 2 0 + 3 4 1 0 + 4 5 2 0 + 5 6 1 0 + 6 7 2 0 + 7 8 1 0 + 7 2 1 0 + 1 9 1 0 + 1 10 1 0 + 1 11 1 0 + 3 12 1 0 + 4 13 1 0 + 5 14 1 0 + 6 15 1 0 + 8 16 1 0 +M END +> (15) +-24.6856 + +> (15) +0.8368000000000001 + +> (15) +-23.79053673527656 + +> (15) +0.2639727479464305 + +> (15) +Cc1ccccc1O + +> (15) +O + +$$$$ +mol_51 + RDKit 3D + + 19 18 0 0 0 0 0 0 0 0999 V2000 + 2.1196 -0.6887 -0.0478 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0972 0.3824 -0.2905 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5110 1.4565 -0.7319 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3243 0.1742 -0.0202 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0913 1.4348 -0.3659 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.5692 -0.1043 1.4508 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.9340 -0.9474 -0.8141 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1147 -1.0380 0.9963 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1268 -0.3539 -0.2863 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8831 -1.5258 -0.7623 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6990 2.2789 0.2307 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1706 1.3030 -0.2736 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8124 1.6674 -1.4364 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4630 0.8699 1.9877 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.6146 -0.4468 1.6148 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1923 -0.7745 1.8495 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2415 -1.7977 -0.9670 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.8717 -1.2939 -0.3114 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2532 -0.5962 -1.8225 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 2 0 + 2 4 1 0 + 4 5 1 0 + 4 6 1 0 + 4 7 1 0 + 1 8 1 0 + 1 9 1 0 + 1 10 1 0 + 5 11 1 0 + 5 12 1 0 + 5 13 1 0 + 6 14 1 0 + 6 15 1 0 + 6 16 1 0 + 7 17 1 0 + 7 18 1 0 + 7 19 1 0 +M END +> (16) +-13.01224 + +> (16) +2.5104 + +> (16) +-12.530367303837247 + +> (16) +0.24508393149590552 + +> (16) +CC(=O)C(C)(C)C + +> (16) +O + +$$$$ +mol_30 + RDKit 3D + + 11 11 0 0 0 0 0 0 0 0999 V2000 + 0.0558 1.0375 -0.4830 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0773 0.2664 -0.6171 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1492 -0.9805 -0.0388 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0759 -1.4146 0.6587 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0192 -0.6847 0.7958 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1417 0.5736 0.2347 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1202 2.0234 -0.9369 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9277 0.6261 -1.1774 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0512 -1.6043 -0.1406 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9020 -1.0230 1.3603 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0422 1.1801 0.3443 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 + 2 3 1 0 + 3 4 2 0 + 4 5 1 0 + 5 6 2 0 + 6 1 1 0 + 1 7 1 0 + 2 8 1 0 + 3 9 1 0 + 5 10 1 0 + 6 11 1 0 +M END +> (17) +-19.622960000000003 + +> (17) +2.5104 + +> (17) +-16.457175279109943 + +> (17) +0.23594583721667264 + +> (17) +c1ccncc1 + +> (17) +O + +$$$$ +mol_72 + RDKit 3D + + 12 11 0 0 0 0 0 0 0 0999 V2000 + 1.3769 0.1671 0.1454 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0477 0.0886 0.0317 N 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7140 -1.0944 -0.4605 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8107 1.2025 0.4136 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0586 1.1484 0.3196 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8919 -0.6882 -0.3451 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8107 1.0915 -0.2623 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6567 0.1218 1.2129 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7668 -1.1221 -0.0875 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2232 -2.0335 -0.1756 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8003 -0.9623 -1.5712 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3148 2.0806 0.7789 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 2 4 1 0 + 4 5 2 0 + 1 6 1 0 + 1 7 1 0 + 1 8 1 0 + 3 9 1 0 + 3 10 1 0 + 3 11 1 0 + 4 12 1 0 +M END +> (18) +-32.67704 + +> (18) +2.5104 + +> (18) +-26.343918437273015 + +> (18) +0.2531891337139314 + +> (18) +CN(C)C=O + +> (18) +O + +$$$$ +mol_56 + RDKit 3D + + 13 12 0 0 0 0 0 0 0 0999 V2000 + 1.8709 -0.6144 0.0298 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6314 -0.3392 0.5921 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1194 0.3575 -0.3531 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4986 0.7003 0.1838 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1939 -0.4693 0.5181 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7273 -1.2374 -0.8942 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3037 0.3686 -0.2782 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5237 -1.1894 0.6958 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3627 1.3158 -0.6527 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1689 -0.2660 -1.2505 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0615 1.2650 -0.5869 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4362 1.3193 1.1000 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9410 -1.2108 -0.0866 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 3 4 1 0 + 4 5 1 0 + 1 6 1 0 + 1 7 1 0 + 1 8 1 0 + 3 9 1 0 + 3 10 1 0 + 4 11 1 0 + 4 12 1 0 + 5 13 1 0 +M END +> (19) +-27.69808 + +> (19) +1.6736000000000002 + +> (19) +-20.156913842708335 + +> (19) +0.2639954801481205 + +> (19) +COCCO + +> (19) +O + +$$$$ +mol_47 + RDKit 3D + + 12 12 0 0 0 0 0 0 0 0999 V2000 + 3.1487 0.1541 0.1290 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4153 0.0378 0.0574 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6651 1.1973 0.0485 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7206 1.1562 -0.0078 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3983 -0.0486 -0.0569 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.1578 -0.1081 -0.1285 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6546 -1.2111 -0.0483 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7255 -1.1536 0.0080 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1775 2.1487 0.0864 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3360 2.0483 -0.0162 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1900 -2.1567 -0.0870 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3251 -2.0643 0.0155 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 2 0 + 3 4 1 0 + 4 5 2 0 + 5 6 1 0 + 5 7 1 0 + 7 8 2 0 + 8 2 1 0 + 3 9 1 0 + 4 10 1 0 + 7 11 1 0 + 8 12 1 0 +M END +> (20) +-4.22584 + +> (20) +2.5104 + +> (20) +-2.33494659982538 + +> (20) +0.2358647281304262 + +> (20) +Clc1ccc(Cl)cc1 + +> (20) +O + +$$$$ diff --git a/benchmarks/subsampled/sub_sampled_mnsol.sdf b/benchmarks/subsampled/sub_sampled_mnsol.sdf new file mode 100644 index 0000000..f79d209 --- /dev/null +++ b/benchmarks/subsampled/sub_sampled_mnsol.sdf @@ -0,0 +1,992 @@ +mol_143 + RDKit 3D + + 17 17 0 0 0 0 0 0 0 0999 V2000 + 1.0651 0.7123 0.3337 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1905 1.3072 -0.3086 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3600 0.5311 0.3055 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3024 -0.7862 -0.3043 N 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0961 -1.4398 0.1581 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1568 -0.7068 -0.2407 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8440 0.6840 1.4280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9619 1.3004 0.1011 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2733 2.3804 -0.1600 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1142 1.0483 -1.3934 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.2954 1.0587 0.1332 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1352 0.3735 1.3905 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2387 -0.6624 -1.3497 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0885 -2.4738 -0.2128 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1121 -1.4647 1.2762 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0113 -1.2575 0.1782 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1671 -0.6049 -1.3350 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 3 4 1 0 + 4 5 1 0 + 5 6 1 0 + 6 1 1 0 + 1 7 1 0 + 1 8 1 0 + 2 9 1 0 + 2 10 1 0 + 3 11 1 0 + 3 12 1 0 + 4 13 1 0 + 5 14 1 0 + 5 15 1 0 + 6 16 1 0 + 6 17 1 0 +M END +> (1) +-20.166880000000003 + +> (1) +0.8368000000000001 + +> (1) +-22.77269796516721 + +> (1) +0.20713781565472358 + +> (1) +C1CCNCC1 + +> (1) +CCOCC + +$$$$ +mol_107 + RDKit 3D + + 16 16 0 0 0 0 0 0 0 0999 V2000 + -2.3216 -0.0474 0.6852 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2976 0.8138 -0.0008 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0550 0.2309 0.0183 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3684 -0.9792 0.6000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6498 -1.3857 0.5401 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6190 -0.6612 -0.0592 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3048 0.5518 -0.6422 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0343 0.9505 -0.5805 N 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5579 -0.9209 0.0495 H 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2484 0.5343 0.8632 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9914 -0.4094 1.6781 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3439 1.8311 0.4422 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.5927 0.9174 -1.0695 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4138 -1.5525 1.0774 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6435 -0.9948 -0.1025 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0925 1.1214 -1.1189 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 3 4 2 0 + 4 5 1 0 + 5 6 2 0 + 6 7 1 0 + 7 8 2 0 + 8 3 1 0 + 1 9 1 0 + 1 10 1 0 + 1 11 1 0 + 2 12 1 0 + 2 13 1 0 + 4 14 1 0 + 6 15 1 0 + 7 16 1 0 +M END +> (2) +-24.560080000000003 + +> (2) +0.8368000000000001 + +> (2) +-28.16600981429839 + +> (2) +0.3125114139027384 + +> (2) +CCc1cnccn1 + +> (2) +CCCCOCCCC + +$$$$ +mol_49 + RDKit 3D + + 4 3 0 0 0 0 0 0 0 0999 V2000 + -0.0402 0.0009 0.0033 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1503 -0.1983 -0.0946 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7233 -0.8251 0.0513 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3868 1.0225 0.0400 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 + 1 3 1 0 + 1 4 1 0 +M END +> (3) +-14.60216 + +> (3) +0.8368000000000001 + +> (3) + + +> (3) + + +> (3) +C=O + +> (3) +CCCCO + +$$$$ +mol_28 + RDKit 3D + + 15 15 0 0 0 0 0 0 0 0999 V2000 + -2.5393 -2.0397 -0.5706 O 0 0 0 0 0 0 0 0 0 0 0 0 + -2.3483 -0.8156 -0.3932 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0387 -0.2203 -0.1879 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8584 1.1332 0.0052 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3815 1.7038 0.2005 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5194 0.9268 0.2111 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3638 -0.4295 0.0200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4850 -1.2547 0.0227 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1210 -0.9895 -0.1742 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.2043 -0.1621 -0.3923 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7359 1.7633 0.0011 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5167 2.7662 0.3515 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5039 1.3764 0.3657 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8497 -1.6934 0.8678 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0159 -2.0650 -0.3271 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 + 2 3 1 0 + 3 4 2 0 + 4 5 1 0 + 5 6 2 0 + 6 7 1 0 + 7 8 1 0 + 7 9 2 0 + 9 3 1 0 + 2 10 1 0 + 4 11 1 0 + 5 12 1 0 + 6 13 1 0 + 8 14 1 0 + 9 15 1 0 +M END +> (4) +-38.86936 + +> (4) +0.8368000000000001 + +> (4) +-41.96686478518432 + +> (4) +0.28037152877429367 + +> (4) +O=Cc1cccc(O)c1 + +> (4) +c1ccccc1 + +$$$$ +mol_18 + RDKit 3D + + 12 11 0 0 0 0 0 0 0 0999 V2000 + 1.3117 0.1081 0.3379 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0473 0.3096 -0.3081 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.9652 -0.7987 0.1133 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.5624 1.5742 -0.0546 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9522 -0.5167 -0.3379 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2370 -0.4453 1.3041 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8060 1.0796 0.4466 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1239 0.2685 -1.4201 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4986 -1.3819 0.9371 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9435 -0.4627 0.4821 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1620 -1.4767 -0.7445 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2519 1.7418 -0.7559 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 2 4 1 0 + 1 5 1 0 + 1 6 1 0 + 1 7 1 0 + 2 8 1 0 + 3 9 1 0 + 3 10 1 0 + 3 11 1 0 + 4 12 1 0 +M END +> (5) +-14.56032 + +> (5) +0.8368000000000001 + +> (5) +-15.695564153444423 + +> (5) +0.23407497581667894 + +> (5) +CC(C)O + +> (5) +c1ccccc1 + +$$$$ +mol_214 + RDKit 3D + + 9 9 0 0 0 0 0 0 0 0999 V2000 + 0.6562 -0.6437 -0.0452 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6566 -0.6542 0.0556 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3438 0.5877 0.0984 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0059 1.7785 -0.0138 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3516 0.5504 -0.1081 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2810 -1.5891 -0.0856 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2793 -1.5942 0.1109 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.3559 0.7787 0.1745 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3525 0.7860 -0.1867 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 2 0 + 3 4 1 0 + 4 5 1 0 + 5 1 2 0 + 1 6 1 0 + 2 7 1 0 + 3 8 1 0 + 5 9 1 0 +M END +> (6) +-17.11256 + +> (6) +0.8368000000000001 + +> (6) +-14.417120909241673 + +> (6) +0.3629792024438474 + +> (6) +c1ccsc1 + +> (6) +CCCCCCC + +$$$$ +mol_149 + RDKit 3D + + 12 12 0 0 0 0 0 0 0 0999 V2000 + -2.2365 1.4796 0.1050 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2016 0.7660 0.0540 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2689 -0.5698 -0.0558 N 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1495 -1.3399 -0.1108 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0893 -0.7401 -0.0527 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6925 -1.7832 -0.1266 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1361 0.6350 0.0602 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2630 1.1769 0.1127 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0089 1.3748 0.1125 N 0 0 0 0 0 0 0 0 0 0 0 0 + -2.2033 -1.0096 -0.0986 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1751 -2.4069 -0.1984 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0628 2.4171 0.1984 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 + 2 3 1 0 + 3 4 1 0 + 4 5 2 0 + 5 6 1 0 + 5 7 1 0 + 7 8 2 0 + 7 9 1 0 + 9 2 1 0 + 3 10 1 0 + 4 11 1 0 + 9 12 1 0 +M END +> (7) +-71.16984000000001 + +> (7) +0.8368000000000001 + +> (7) + + +> (7) + + +> (7) +O=c1[nH]cc(Br)c(=O)[nH]1 + +> (7) +CCOCC + +$$$$ +mol_35 + RDKit 3D + + 18 17 0 0 0 0 0 0 0 0999 V2000 + -1.4730 2.0256 -0.0650 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7024 1.4286 0.9612 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2608 -0.1063 0.3451 P 0 0 0 0 0 5 0 0 0 0 0 0 + 0.3098 -0.9238 1.4531 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7204 -0.8381 -0.1493 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.6123 -2.2247 -0.0582 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7888 0.1450 -0.9477 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1523 0.0687 -0.9193 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9058 0.4915 0.0784 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1956 1.2129 1.5031 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6467 0.3524 0.0268 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1716 1.6442 -1.0648 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3537 3.1114 -0.0701 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5555 1.8013 0.1367 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8227 -2.5424 0.6587 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3796 -2.6374 -1.0627 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5914 -2.6351 0.3015 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6445 -0.3738 -1.7855 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 3 4 2 0 + 3 5 1 0 + 5 6 1 0 + 3 7 1 0 + 7 8 1 0 + 8 9 2 3 + 9 10 1 0 + 9 11 1 0 + 1 12 1 0 + 1 13 1 0 + 1 14 1 0 + 6 15 1 0 + 6 16 1 0 + 6 17 1 0 + 8 18 1 0 +M END +> (8) +-38.03256 + +> (8) +0.8368000000000001 + +> (8) +-49.97037247967158 + +> (8) +0.3238280061404145 + +> (8) +COP(=O)(OC)OC=C(Cl)Cl + +> (8) +c1ccccc1 + +$$$$ +mol_142 + RDKit 3D + + 3 2 0 0 0 0 0 0 0 0999 V2000 + -0.0008 0.5269 -0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1529 -0.2638 -0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1537 -0.2631 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 3 1 0 +M END +> (9) +-2.5104 + +> (9) +0.8368000000000001 + +> (9) + + +> (9) + + +> (9) +S + +> (9) +CCOCC + +$$$$ +mol_215 + RDKit 3D + + 22 23 0 0 0 0 0 0 0 0999 V2000 + -0.3518 -2.5653 0.8313 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3146 -1.2782 0.1327 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6422 -1.5294 -0.1910 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.3676 -0.5274 -0.7433 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.7827 0.7158 -0.9729 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4672 0.9487 -0.6460 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7144 -0.0525 -0.0859 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6912 0.1281 0.2946 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1802 -0.2383 1.5212 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5251 -0.0489 1.8486 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3737 0.5127 0.9294 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8983 0.8913 -0.3198 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5635 0.6913 -0.6128 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9360 1.1646 -2.1996 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -3.0108 -2.5176 0.0216 H 0 0 0 0 0 0 0 0 0 0 0 0 + -4.4103 -0.7018 -1.0017 H 0 0 0 0 0 0 0 0 0 0 0 0 + -3.3650 1.5161 -1.4117 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0483 1.9100 -0.8282 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5124 -0.6726 2.2376 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8506 -0.3575 2.8282 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4206 0.6773 1.1451 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5235 1.3336 -1.0776 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 2 0 + 3 4 1 0 + 4 5 2 0 + 5 6 1 0 + 6 7 2 0 + 7 8 1 0 + 8 9 2 0 + 9 10 1 0 + 10 11 2 0 + 11 12 1 0 + 12 13 2 0 + 13 14 1 0 + 7 2 1 0 + 13 8 1 0 + 3 15 1 0 + 4 16 1 0 + 5 17 1 0 + 6 18 1 0 + 9 19 1 0 + 10 20 1 0 + 11 21 1 0 + 12 22 1 0 +M END +> (10) +-38.57648 + +> (10) +0.8368000000000001 + +> (10) +-40.35678944639045 + +> (10) +0.36792036918526305 + +> (10) +Clc1ccccc1-c1ccccc1Cl + +> (10) +CCCCCCC + +$$$$ +mol_219 + RDKit 3D + + 16 16 0 0 0 0 0 0 0 0999 V2000 + 2.1599 0.1937 0.1875 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7279 0.1833 -0.0331 N 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0079 -0.9698 -0.5344 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3284 -0.8307 0.1950 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.5998 0.6672 -0.0021 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2325 1.2072 0.1673 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0499 2.3923 0.4467 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5570 1.2197 0.1785 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6376 -0.4584 -0.5841 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4034 -0.2381 1.1868 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2434 -0.8329 -1.6211 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4972 -1.9153 -0.3304 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1991 -1.0069 1.2783 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1274 -1.4303 -0.2568 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.3070 1.0309 0.7563 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9872 0.7880 -1.0342 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 3 4 1 0 + 4 5 1 0 + 5 6 1 0 + 6 7 2 0 + 6 2 1 0 + 1 8 1 0 + 1 9 1 0 + 1 10 1 0 + 3 11 1 0 + 3 12 1 0 + 4 13 1 0 + 4 14 1 0 + 5 15 1 0 + 5 16 1 0 +M END +> (11) +-24.2672 + +> (11) +0.8368000000000001 + +> (11) +-22.560588351383558 + +> (11) +0.3142232130132967 + +> (11) +CN1CCCC1=O + +> (11) +CCCCCCC + +$$$$ +mol_44 + RDKit 3D + + 23 22 0 0 0 0 0 0 0 0999 V2000 + -3.0240 -1.0106 0.0945 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0399 0.0399 -0.3678 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0872 0.4195 0.7476 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1218 1.4570 0.2785 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7219 1.0224 -0.8752 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5131 -0.1035 -0.6115 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4737 -0.1901 0.3638 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2906 -1.4210 0.6013 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6762 0.8144 1.0928 O 0 0 0 0 0 0 0 0 0 0 0 0 + -3.8033 -0.5956 0.7709 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5455 -1.9071 0.5092 H 0 0 0 0 0 0 0 0 0 0 0 0 + -3.5915 -1.3299 -0.8276 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6171 0.9546 -0.6150 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.5412 -0.2989 -1.2771 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7143 0.8654 1.5516 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.5047 -0.4505 1.1080 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5271 1.7297 1.1388 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6426 2.3943 -0.0263 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3471 1.9123 -1.1695 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0935 0.8155 -1.7667 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3039 -1.7013 1.6705 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9520 -2.2553 -0.0160 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3343 -1.1613 0.2845 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 3 4 1 0 + 4 5 1 0 + 5 6 1 0 + 6 7 1 0 + 7 8 1 0 + 7 9 2 0 + 1 10 1 0 + 1 11 1 0 + 1 12 1 0 + 2 13 1 0 + 2 14 1 0 + 3 15 1 0 + 3 16 1 0 + 4 17 1 0 + 4 18 1 0 + 5 19 1 0 + 5 20 1 0 + 8 21 1 0 + 8 22 1 0 + 8 23 1 0 +M END +> (12) +-24.30904 + +> (12) +0.8368000000000001 + +> (12) +-27.213103047337498 + +> (12) +0.8021323690796826 + +> (12) +CCCCCOC(C)=O + +> (12) +CCCCCCCCBr + +$$$$ +mol_3 + RDKit 3D + + 14 14 0 0 0 0 0 0 0 0999 V2000 + 1.2511 0.2855 0.1680 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7382 -1.0411 -0.1836 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.5980 -1.2292 -0.2630 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3989 -0.2577 0.2685 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8175 1.0825 -0.2053 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3340 1.2250 0.5686 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8405 0.7544 -0.6758 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0132 0.2081 0.9998 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1533 -1.8193 0.5240 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1858 -1.3430 -1.1781 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.4346 -0.3735 -0.0430 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2951 -0.3201 1.3909 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4478 0.9276 -1.2606 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.5242 1.9009 -0.1106 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 3 4 1 0 + 4 5 1 0 + 5 6 1 0 + 6 1 1 0 + 1 7 1 0 + 1 8 1 0 + 2 9 1 0 + 2 10 1 0 + 4 11 1 0 + 4 12 1 0 + 5 13 1 0 + 5 14 1 0 +M END +> (13) +-20.96184 + +> (13) +0.8368000000000001 + +> (13) +-25.499614923146467 + +> (13) +0.28389934363374475 + +> (13) +C1COCCO1 + +> (13) +Cc1ccccn1 + +$$$$ +mol_34 + RDKit 3D + + 18 18 0 0 0 0 0 0 0 0999 V2000 + 3.5231 0.4298 0.2882 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0996 0.6196 0.2660 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2341 -0.4168 -0.0471 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7627 -1.5273 -0.3093 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2221 -0.2354 -0.0731 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7817 0.9898 0.2173 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1674 1.1667 0.1937 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.0174 0.1251 -0.1200 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.4567 -1.0997 -0.4103 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0790 -1.2650 -0.3840 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8787 0.3470 -0.7650 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9745 1.3096 0.7971 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8011 -0.4527 0.8784 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1278 1.8093 0.4633 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6041 2.1230 0.4204 H 0 0 0 0 0 0 0 0 0 0 0 0 + -4.0930 0.2314 -0.1464 H 0 0 0 0 0 0 0 0 0 0 0 0 + -3.1086 -1.9266 -0.6581 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6159 -2.2277 -0.6111 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 3 4 2 0 + 3 5 1 0 + 5 6 2 0 + 6 7 1 0 + 7 8 2 0 + 8 9 1 0 + 9 10 2 0 + 10 5 1 0 + 1 11 1 0 + 1 12 1 0 + 1 13 1 0 + 6 14 1 0 + 7 15 1 0 + 8 16 1 0 + 9 17 1 0 + 10 18 1 0 +M END +> (14) +-26.23368 + +> (14) +0.8368000000000001 + +> (14) +-37.319593976035314 + +> (14) +0.30656084757908403 + +> (14) +COC(=O)c1ccccc1 + +> (14) +c1ccccc1 + +$$$$ +mol_136 + RDKit 3D + + 10 9 0 0 0 0 0 0 0 0999 V2000 + 1.6088 0.2249 -0.1248 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4734 0.0818 0.5037 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7511 -0.3328 -0.2084 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7187 0.6437 -0.0778 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5164 0.5339 0.4119 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6648 0.0362 -1.2013 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4106 0.2648 1.5583 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0637 -1.3146 0.2044 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.5609 -0.4631 -1.3113 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5795 0.3252 0.2454 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 + 2 3 1 0 + 3 4 1 0 + 1 5 1 0 + 1 6 1 0 + 2 7 1 0 + 3 8 1 0 + 3 9 1 0 + 4 10 1 0 +M END +> (15) +-20.37608 + +> (15) +0.8368000000000001 + +> (15) +-16.565692515536682 + +> (15) +0.23205126510710314 + +> (15) +C=CCO + +> (15) +CCOCC + +$$$$ +mol_147 + RDKit 3D + + 6 5 0 0 0 0 0 0 0 0999 V2000 + -0.7293 -0.0635 -0.0343 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6811 0.0074 -0.0070 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2075 1.0645 0.4278 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2723 0.2918 -0.8168 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2023 -0.4925 0.7741 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3154 -0.8077 -0.3437 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 2 0 + 1 4 1 0 + 1 5 1 0 + 2 6 1 0 +M END +> (16) +-24.97848 + +> (16) +0.8368000000000001 + +> (16) +-22.18029050037576 + +> (16) +0.21427328910484342 + +> (16) +NC=O + +> (16) +CCOCC + +$$$$ +mol_26 + RDKit 3D + + 11 11 0 0 0 0 0 0 0 0999 V2000 + 0.0558 1.0375 -0.4830 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0773 0.2664 -0.6171 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1492 -0.9805 -0.0388 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0759 -1.4146 0.6587 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0192 -0.6847 0.7958 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1417 0.5736 0.2347 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1202 2.0234 -0.9369 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9277 0.6261 -1.1774 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0512 -1.6043 -0.1406 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9020 -1.0230 1.3603 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0422 1.1801 0.3443 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 + 2 3 1 0 + 3 4 2 0 + 4 5 1 0 + 5 6 2 0 + 6 1 1 0 + 1 7 1 0 + 2 8 1 0 + 3 9 1 0 + 5 10 1 0 + 6 11 1 0 +M END +> (17) +-22.091520000000003 + +> (17) +0.8368000000000001 + +> (17) +-23.176789339560244 + +> (17) +0.23241253188652858 + +> (17) +c1ccncc1 + +> (17) +c1ccccc1 + +$$$$ +mol_24 + RDKit 3D + + 10 9 0 0 0 0 0 0 0 0999 V2000 + -1.1789 0.2039 -0.1775 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0362 0.3581 0.5187 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1829 -0.2673 -0.0222 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0770 -0.6396 -0.9079 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0601 0.0189 0.4920 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3407 1.1103 -0.8171 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0030 0.4996 1.5239 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9668 0.5136 -0.1891 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5550 -1.1043 0.6005 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9127 -0.6930 -1.0213 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 1 4 1 0 + 1 5 1 0 + 1 6 1 0 + 2 7 1 0 + 3 8 1 0 + 3 9 1 0 + 3 10 1 0 +M END +> (18) +-12.59384 + +> (18) +0.8368000000000001 + +> (18) +-10.439463313276654 + +> (18) +0.2278557341230086 + +> (18) +CNC + +> (18) +c1ccccc1 + +$$$$ +mol_51 + RDKit 3D + + 10 9 0 0 0 0 0 0 0 0999 V2000 + 0.9822 -0.1832 -0.1484 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2592 0.6624 0.0121 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3824 -0.2555 0.2027 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7862 -1.1363 -0.6840 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3645 -0.3465 0.8873 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7617 0.3828 -0.6843 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.5017 1.2515 -0.8946 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1427 1.3677 0.8385 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2983 -0.8059 1.0784 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3104 -0.9369 -0.6078 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 2 3 1 0 + 1 4 1 0 + 1 5 1 0 + 1 6 1 0 + 2 7 1 0 + 2 8 1 0 + 3 9 1 0 + 3 10 1 0 +M END +> (19) +-18.828 + +> (19) +0.8368000000000001 + +> (19) +-13.681695286342519 + +> (19) +0.3602076216127339 + +> (19) +CCN + +> (19) +CCCCO + +$$$$ +mol_90 + RDKit 3D + + 14 14 0 0 0 0 0 0 0 0999 V2000 + 3.7835 -0.3228 1.3332 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6830 -0.2349 0.9514 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3280 -0.1327 0.4762 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8378 1.0442 -0.0503 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4798 1.1159 -0.5037 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1822 2.7403 -1.2389 Br 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3277 0.0292 -0.4431 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.6526 0.0921 -0.8962 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8157 -1.1364 0.0870 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.9700 -2.6469 0.1792 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4971 -1.2317 0.5462 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4679 1.9113 -0.1139 H 0 0 0 0 0 0 0 0 0 0 0 0 + -3.0578 0.9137 -1.2844 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8885 -2.1414 0.9573 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 3 0 + 2 3 1 0 + 3 4 2 0 + 4 5 1 0 + 5 6 1 0 + 5 7 2 0 + 7 8 1 0 + 7 9 1 0 + 9 10 1 0 + 9 11 2 0 + 11 3 1 0 + 4 12 1 0 + 8 13 1 0 + 11 14 1 0 +M END +> (20) +-28.57672 + +> (20) +0.8368000000000001 + +> (20) +-42.909805772604564 + +> (20) +0.2504579164936676 + +> (20) +N#Cc1cc(Br)c(O)c(Br)c1 + +> (20) +C1CCCCC1 + +$$$$ diff --git a/devtools/ASFEProtocol_json_results.gz b/devtools/ASFEProtocol_json_results.gz new file mode 100644 index 0000000000000000000000000000000000000000..ed222e21db4e4e235ef837cf55b201b7095cbccf GIT binary patch literal 47299 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.0 + - openff-toolkit >0.16.0 + - openff-interchange >0.3.28 + - openff-nagl-base >=0.3.3 + # OpenFE stack deps + - duecredit<0.10 + - kartograf>=1.0.0 + - lomap2>=3.0.0 + - numpy + - networkx + - rdkit + - packaging + - pip + - pydantic >=1.10.17 + - pyyaml + - coverage + - cinnabar ~=0.4.0 + - click + - typing-extensions + - openmm >=8.0.0,!=8.1.0 + - openmmtools + - openmmforcefields + - plugcli + - tqdm + # Testing deps + - pytest + - pytest-cov + - pytest-xdist + - mypy + - nbval + # docs + - pip: + - git+https://github.com/OpenFreeEnergy/openfe@main + - git+https://github.com/OpenFreeEnergy/ofe-sphinx-theme@a45f3edd5bc3e973c1a01b577c71efa1b62a65d6 diff --git a/news/TEMPLATE.rst b/news/TEMPLATE.rst new file mode 100644 index 0000000..790d30b --- /dev/null +++ b/news/TEMPLATE.rst @@ -0,0 +1,23 @@ +**Added:** + +* + +**Changed:** + +* + +**Deprecated:** + +* + +**Removed:** + +* + +**Fixed:** + +* + +**Security:** + +* diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..352df20 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,41 @@ +[build-system] +requires=[ + "setuptools>=61.0", + "versioningit", +] +build-backend = "setuptools.build_meta" + +[project] +name = "pontibus" +dynamic = ["version"] +authors=[ + {name="Irfan Alibay", email="irfan.alibay@omsf.io"}, +] +dependencies = [ + 'numpy', + 'networkx', +] +description="A package of experimental OpenFreeEnergy Protocols aimed at OpenForceField development" +readme="README.md" +requires-python = ">=3.10" +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", +] + +[project.urls] +"Homepage" = "https://github.com/OpenFreeEnergy/pontibus" + +[tool.versioningit] +default-version = "1+unknown" + +[tool.versioningit.format] +distance = "{base_version}+{distance}.{vcs}{rev}" +dirty = "{base_version}+{distance}.{vcs}{rev}.dirty" +distance-dirty = "{base_version}+{distance}.{vcs}{rev}.dirty" + +[tool.versioningit.vcs] +method = "git" +match = ["*"] +default-tag = "0.0.0" diff --git a/rever.xsh b/rever.xsh new file mode 100644 index 0000000..deb87d0 --- /dev/null +++ b/rever.xsh @@ -0,0 +1,7 @@ +$PROJECT = $GITHUB_REPO = 'pontibus' +$GITHUB_ORG = 'OpenFreeEnergy' + +$ACTIVITIES = ['changelog'] + +$CHANGELOG_FILENAME = 'docs/CHANGELOG.rst' +$CHANGELOG_TEMPLATE = 'TEMPLATE.rst' diff --git a/src/pontibus/__init__.py b/src/pontibus/__init__.py new file mode 100644 index 0000000..f239663 --- /dev/null +++ b/src/pontibus/__init__.py @@ -0,0 +1,3 @@ +from importlib.metadata import version + +__version__ = version("pontibus") diff --git a/src/pontibus/components/__init__.py b/src/pontibus/components/__init__.py new file mode 100644 index 0000000..a9becec --- /dev/null +++ b/src/pontibus/components/__init__.py @@ -0,0 +1,5 @@ +from .extended_solvent_component import ExtendedSolventComponent + +__all__ = [ + "ExtendedSolventComponent", +] diff --git a/src/pontibus/components/extended_solvent_component.py b/src/pontibus/components/extended_solvent_component.py new file mode 100644 index 0000000..0e316a1 --- /dev/null +++ b/src/pontibus/components/extended_solvent_component.py @@ -0,0 +1,199 @@ +# This code is part of OpenFE and is licensed under the MIT license. +# For details, see https://github.com/OpenFreeEnergy/openfe + +from typing import Union + +from gufe import SmallMoleculeComponent, SolventComponent +from gufe.tokenization import ( + TOKENIZABLE_CLASS_REGISTRY, + TOKENIZABLE_REGISTRY, + GufeKey, + GufeTokenizable, + _from_dict, + is_gufe_key_dict, + modify_dependencies, +) +from openff.units import unit +from openfe.utils import without_oechem_backend + +from pontibus.utils.molecules import WATER + + +class ExtendedSolventComponent(SolventComponent): + _solvent_molecule: SmallMoleculeComponent + + def __init__( + self, + *, # force kwarg usage + solvent_molecule: SmallMoleculeComponent = WATER, + positive_ion: str = "Na+", + negative_ion: str = "Cl-", + neutralize: bool = False, + ion_concentration: unit.Quantity = 0.0 * unit.molar, + ): + """ + Parameters + ---------- + solvent_molecule : SmallMoleculeComponent, optional + SmallMoleculeComponent defining the solvent, default + is a water molecule. + positive_ion, negative_ion : str + the pair of ions which is used to neutralize (if neutralize=True) and + bring the solvent to the required ionic concentration. Must be a + positive and negative monoatomic ions, defaults "Na+", "Cl-" + neutralize : bool, optional + if the net charge on the chemical state is neutralized by the ions in + this solvent component. Default `True` + ion_concentration : openff-units.unit.Quantity, optional + ionic concentration required, default 0.15 * unit.molar + this must be supplied with units, e.g. "1.5 * unit.molar" + + Examples + -------- + To create a sodium chloride solution at 0.2 molar concentration:: + + >>> s = SolventComponent(position_ion='Na', negative_ion='Cl', + ... ion_concentration=0.2 * unit.molar) + + To create a methane solvent:: + + >>> METHANE = SmallMoleculeComponent.from_openff( + ... Molecule.from_smiles('C') + ... ) + >>> s = SolventComponent(solvent_molecule=METHANE) + + """ + self._solvent_molecule = solvent_molecule + # RDKit and OpenEye make for different smiles + with without_oechem_backend(): + smiles = solvent_molecule.to_openff().to_smiles() + super().__init__( + smiles=smiles, + positive_ion=positive_ion, + negative_ion=negative_ion, + neutralize=neutralize, + ion_concentration=ion_concentration, + ) + + @property + def solvent_molecule(self) -> Union[str, SmallMoleculeComponent]: + """SmallMoleculeComponent representation of the solvent molecules""" + return self._solvent_molecule + + @classmethod + def _from_dict(cls, d): + """Deserialize from dict representation""" + ion_conc = d["ion_concentration"] + d["ion_concentration"] = unit.parse_expression(ion_conc) + + return cls(**d) + + def _to_dict(self): + """For serialization""" + ion_conc = str(self.ion_concentration) + + if isinstance(self.solvent_molecule, SmallMoleculeComponent): + solvent = self.solvent_molecule.to_dict() + else: + solvent = self.solvent_molecule + + return { + "solvent_molecule": solvent, + "positive_ion": self.positive_ion, + "negative_ion": self.negative_ion, + "ion_concentration": ion_conc, + "neutralize": self._neutralize, + } + + @classmethod + def from_keyed_dict(cls, dct: dict): + """Generate an instance from keyed dict representation. + + Parameters + ---------- + dct : Dict + A dictionary produced by `to_keyed_dict` to instantiate from. + If an identical instance already exists in memory, it will be + returned. Otherwise, a new instance will be returned. + + Returns + ------- + obj : ExtendedSolventComponent + An object instance constructed from the input keyed dictionary. + + Notes + ----- + This method is re-implemented in the ExtendedSolventComponent subclass + due to gufe tokenization not working as intended with GufeTokenizables + containing other GufeTokenizables. + + """ + registry = TOKENIZABLE_CLASS_REGISTRY + dct = modify_dependencies( + dct, + lambda d: registry[GufeKey(d[":gufe-key:"])], + is_gufe_key_dict, + mode="decode", + top=True, + ) + + return from_dict_depth_one(dct) + + @classmethod + def from_shallow_dict(cls, dct: dict): + """Generate an instance from shallow dict representation. + + Parameters + ---------- + dct : Dict + A dictionary produced by `to_shallow_dict` to instantiate from. + If an identical instance already exists in memory, it will be + returned. Otherwise, a new instance will be returned. + + Returns + ------- + obj : ExtendedSolventComponent + An object instance constructed from the input shallow dictionary. + + Notes + ----- + This method is re-implemented in the ExtendedSolventComponent subclass + due to gufe tokenization not working as intended with GufeTokenizables + containing other GufeTokenizables. + + """ + return from_dict_depth_one(dct) + + +def from_dict_depth_one(dct: dict) -> GufeTokenizable: + obj = _from_dict_depth_one(dct) + # When __new__ is called to create ``obj``, it should be added to the + # TOKENIZABLE_REGISTRY. However, there seems to be some case (race + # condition?) where this doesn't happen, leading to a KeyError inside + # the dictionary if we use []. (When you drop into PDB and run the same + # line that gave the error, you get the object back.) With ``get``, + # ``thing`` becomes None, which is also what it would be if the weakref + # was to a deleted object. + thing = TOKENIZABLE_REGISTRY.get(obj.key) + + if thing is None: # -no-cov- + return obj + else: + return thing + + +def _from_dict_depth_one(dct: dict) -> GufeTokenizable: + """ + Helper method to enable a from_dict that also + deserializes attributes that are GufeTokenizables. + """ + + new_dct = {} + + for entry in dct: + if isinstance(dct[entry], dict) and "__qualname__" in dct[entry]: + new_dct[entry] = _from_dict(dct[entry]) + else: + new_dct[entry] = dct[entry] + + return _from_dict(new_dct) diff --git a/src/pontibus/protocols/__init__.py b/src/pontibus/protocols/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/pontibus/protocols/solvation/__init__.py b/src/pontibus/protocols/solvation/__init__.py new file mode 100644 index 0000000..05e093d --- /dev/null +++ b/src/pontibus/protocols/solvation/__init__.py @@ -0,0 +1,21 @@ +# This code is part of OpenFE and is licensed under the MIT license. +# For details, see https://github.com/OpenFreeEnergy/openfe +""" +Run absolute solvation free energy calculations using OpenMM and OpenMMTools. + +""" +from .asfe_protocol import ( + ASFEProtocol, + ASFEProtocolResult, + ASFESettings, + ASFESolventUnit, + ASFEVacuumUnit, +) + +__all__ = [ + "ASFEProtocol", + "ASFESettings", + "ASFEProtocolResult", + "ASFEVacuumUnit", + "ASFESolventUnit", +] diff --git a/src/pontibus/protocols/solvation/asfe_protocol.py b/src/pontibus/protocols/solvation/asfe_protocol.py new file mode 100644 index 0000000..b64a8ff --- /dev/null +++ b/src/pontibus/protocols/solvation/asfe_protocol.py @@ -0,0 +1,465 @@ +# This code is part of OpenFE and is licensed under the MIT license. +# For details, see https://github.com/OpenFreeEnergy/openfe + +import uuid +from typing import Optional, Union + +import gufe +import numpy as np +from gufe import ChemicalSystem, SolventComponent +from openfe.protocols.openmm_afe import ( + AbsoluteSolvationProtocol, + AbsoluteSolvationProtocolResult, +) +from openfe.protocols.openmm_utils import settings_validation, system_validation +from openff.units import unit + +from pontibus.protocols.solvation.base import BaseASFEUnit +from pontibus.protocols.solvation.settings import ( + ASFESettings, + ExperimentalAlchemicalSettings, + IntegratorSettings, + InterchangeFFSettings, + LambdaSettings, + MDOutputSettings, + MDSimulationSettings, + MultiStateOutputSettings, + MultiStateSimulationSettings, + OpenFFPartialChargeSettings, + OpenMMEngineSettings, + PackmolSolvationSettings, + ThermoSettings, +) + + +class ASFEProtocolResult(AbsoluteSolvationProtocolResult): + """ + Results class for the ASFEProtocol. + + Notes + ----- + * Derives from OpenFE's AbsoluteSolvationProtocolResult with the intent + of extending further if necessary in the future. + """ + + +class ASFEProtocol(AbsoluteSolvationProtocol): + result_cls = ASFEProtocolResult + _settings: ASFESettings + + @classmethod + def _default_settings(cls): + """A dictionary of initial settings for this creating this Protocol + + These settings are intended as a suitable starting point for creating + an instance of this protocol. It is recommended, however that care is + taken to inspect and customize these before performing a Protocol. + + Returns + ------- + Settings + a set of default settings + """ + return ASFESettings( + protocol_repeats=3, + solvent_forcefield_settings=InterchangeFFSettings( + nonbonded_method="pme", + ), + vacuum_forcefield_settings=InterchangeFFSettings( + nonbonded_method="nocutoff", + ), + thermo_settings=ThermoSettings( + temperature=298.15 * unit.kelvin, + pressure=1 * unit.bar, + ), + alchemical_settings=ExperimentalAlchemicalSettings(), + lambda_settings=LambdaSettings( + lambda_elec=[ + 0.0, + 0.25, + 0.5, + 0.75, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + ], + lambda_vdw=[ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.12, + 0.24, + 0.36, + 0.48, + 0.6, + 0.7, + 0.77, + 0.85, + 1.0, + ], + lambda_restraints=[ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + ], + ), + partial_charge_settings=OpenFFPartialChargeSettings(), + solvation_settings=PackmolSolvationSettings(), + vacuum_engine_settings=OpenMMEngineSettings(), + solvent_engine_settings=OpenMMEngineSettings(), + integrator_settings=IntegratorSettings(), + solvent_equil_simulation_settings=MDSimulationSettings( + equilibration_length_nvt=0.1 * unit.nanosecond, + equilibration_length=0.2 * unit.nanosecond, + production_length=0.5 * unit.nanosecond, + ), + solvent_equil_output_settings=MDOutputSettings( + equil_nvt_structure="equil_nvt_structure.pdb", + equil_npt_structure="equil_npt_structure.pdb", + production_trajectory_filename="production_equil.xtc", + log_output="equil_simulation.log", + ), + solvent_simulation_settings=MultiStateSimulationSettings( + n_replicas=14, + equilibration_length=1.0 * unit.nanosecond, + production_length=10.0 * unit.nanosecond, + ), + solvent_output_settings=MultiStateOutputSettings( + output_filename="solvent.nc", + checkpoint_storage_filename="solvent_checkpoint.nc", + ), + vacuum_equil_simulation_settings=MDSimulationSettings( + equilibration_length_nvt=None, + equilibration_length=0.2 * unit.nanosecond, + production_length=0.5 * unit.nanosecond, + ), + vacuum_equil_output_settings=MDOutputSettings( + equil_nvt_structure=None, + equil_npt_structure="equil_structure.pdb", + production_trajectory_filename="production_equil.xtc", + log_output="equil_simulation.log", + ), + vacuum_simulation_settings=MultiStateSimulationSettings( + n_replicas=14, + equilibration_length=0.5 * unit.nanosecond, + production_length=2.0 * unit.nanosecond, + ), + vacuum_output_settings=MultiStateOutputSettings( + output_filename="vacuum.nc", + checkpoint_storage_filename="vacuum_checkpoint.nc", + ), + ) + + @staticmethod + def _validate_solvent(state: ChemicalSystem, nonbonded_method: str): + """ + Checks that the ChemicalSystem component has the right solvent + composition for an input nonbonded_methtod. + + Parameters + ---------- + state : ChemicalSystem + The chemical system to inspect. + nonbonded_method : str + The nonbonded method to be applied for the simulation. + + Raises + ------ + ValueError + * If there are multiple SolventComponents in the ChemicalSystem. + * If there is a SolventComponent and the `nonbonded_method` is + `nocutoff`. + """ + solv = [comp for comp in state.values() if isinstance(comp, SolventComponent)] + + if len(solv) > 0 and nonbonded_method.lower() == "nocutoff": + errmsg = "nocutoff cannot be used for solvent transformations" + raise ValueError(errmsg) + + if len(solv) == 0 and nonbonded_method.lower() == "pme": + errmsg = "PME cannot be used for vacuum transform" + raise ValueError(errmsg) + + if len(solv) > 1: + errmsg = "Multiple SolventComponent found, only one is supported" + raise ValueError(errmsg) + + def _create( + self, + stateA: ChemicalSystem, + stateB: ChemicalSystem, + mapping: Optional[ + Union[gufe.ComponentMapping, list[gufe.ComponentMapping]] + ] = None, + extends: Optional[gufe.ProtocolDAGResult] = None, + ) -> list[gufe.ProtocolUnit]: + # TODO: extensions + if extends: # pragma: no-cover + raise NotImplementedError("Can't extend simulations yet") + + # Validate components and get alchemical components + self._validate_solvent_endstates(stateA, stateB) + alchem_comps = system_validation.get_alchemical_components( + stateA, + stateB, + ) + self._validate_alchemical_components(alchem_comps) + + # Validate the lambda schedule + self._validate_lambda_schedule( + self.settings.lambda_settings, self.settings.solvent_simulation_settings + ) + self._validate_lambda_schedule( + self.settings.lambda_settings, self.settings.vacuum_simulation_settings + ) + + # Check nonbond & solvent compatibility + solv_nonbonded_method = ( + self.settings.solvent_forcefield_settings.nonbonded_method + ) + vac_nonbonded_method = self.settings.vacuum_forcefield_settings.nonbonded_method + # Use the more complete system validation solvent checks + self._validate_solvent(stateA, solv_nonbonded_method) + # Gas phase is always gas phase + if vac_nonbonded_method.lower() != "nocutoff": + errmsg = ( + "Only the nocutoff nonbonded_method is supported for " + f"vacuum calculations, {vac_nonbonded_method} was " + "passed" + ) + raise ValueError(errmsg) + + # Check vacuum equilibration MD settings is 0 ns + nvt_time = ( + self.settings.vacuum_equil_simulation_settings.equilibration_length_nvt + ) + if nvt_time is not None: + if not np.allclose(nvt_time, 0 * unit.nanosecond): + errmsg = "NVT equilibration cannot be run in vacuum simulation" + raise ValueError(errmsg) + + # Get the name of the alchemical species + alchname = alchem_comps["stateA"][0].name + + # Create list units for vacuum and solvent transforms + solvent_units = [ + ASFESolventUnit( + protocol=self, + stateA=stateA, + stateB=stateB, + alchemical_components=alchem_comps, + generation=0, + repeat_id=int(uuid.uuid4()), + name=( + f"Absolute Solvation, {alchname} solvent leg: " + f"repeat {i} generation 0" + ), + ) + for i in range(self.settings.protocol_repeats) + ] + + vacuum_units = [ + ASFEVacuumUnit( + protocol=self, + stateA=stateA, + stateB=stateB, + alchemical_components=alchem_comps, + generation=0, + repeat_id=int(uuid.uuid4()), + name=( + f"Absolute Solvation, {alchname} vacuum leg: " + f"repeat {i} generation 0" + ), + ) + for i in range(self.settings.protocol_repeats) + ] + + return solvent_units + vacuum_units + + +class ASFEVacuumUnit(BaseASFEUnit): + """ + Protocol Unit for the vacuum phase of an absolute solvation free energy + """ + + _simtype: str = "vacuum" + + def _get_components(self): + """ + Get the relevant components for a vacuum transformation. + + Returns + ------- + alchem_comps : dict[str, list[Component]] + A list of alchemical components + solv_comp : None + For the gas phase transformation, None will always be returned + for the solvent component of the chemical system. + prot_comp : Optional[ProteinComponent] + The protein component of the system, if it exists. + small_mols : dict[Component, OpenFF Molecule] + The openff Molecules to add to the system. This + is equivalent to the alchemical components in stateA (since + we only allow for disappearing ligands). + """ + stateA = self._inputs["stateA"] + alchem_comps = self._inputs["alchemical_components"] + + off_comps = {m: m.to_openff() for m in alchem_comps["stateA"]} + + _, prot_comp, _ = system_validation.get_components(stateA) + + # Notes: + # 1. Our input state will contain a solvent, we ``None`` that out + # since this is the gas phase unit. + # 2. Our small molecules will always just be the alchemical components + # (of stateA since we enforce only one disappearing ligand) + return alchem_comps, None, prot_comp, off_comps + + def _handle_settings(self) -> dict[str, gufe.settings.SettingsBaseModel]: + """ + Extract the relevant settings for a vacuum transformation. + + Returns + ------- + settings : dict[str, SettingsBaseModel] + A dictionary with the following entries: + * forcefield_settings : InterchangeFFSettings + * thermo_settings : ThermoSettings + * charge_settings : OpenFFPartialChargeSettings + * solvation_settings : PackmolSolvationSettings + * alchemical_settings : ExperimentalAlchemicalSettings + * lambda_settings : LambdaSettings + * engine_settings : OpenMMEngineSettings + * integrator_settings : IntegratorSettings + * equil_simulation_settings : MDSimulationSettings + * equil_output_settings : MDOutputSettings + * simulation_settings : SimulationSettings + * output_settings: MultiStateOutputSettings + """ + prot_settings = self._inputs["protocol"].settings + + settings = {} + settings["forcefield_settings"] = prot_settings.vacuum_forcefield_settings + settings["thermo_settings"] = prot_settings.thermo_settings + settings["charge_settings"] = prot_settings.partial_charge_settings + settings["solvation_settings"] = prot_settings.solvation_settings + settings["alchemical_settings"] = prot_settings.alchemical_settings + settings["lambda_settings"] = prot_settings.lambda_settings + settings["engine_settings"] = prot_settings.vacuum_engine_settings + settings["integrator_settings"] = prot_settings.integrator_settings + settings["equil_simulation_settings"] = ( + prot_settings.vacuum_equil_simulation_settings + ) + settings["equil_output_settings"] = prot_settings.vacuum_equil_output_settings + settings["simulation_settings"] = prot_settings.vacuum_simulation_settings + settings["output_settings"] = prot_settings.vacuum_output_settings + + settings_validation.validate_timestep( + settings["forcefield_settings"].hydrogen_mass, + settings["integrator_settings"].timestep, + ) + + return settings + + +class ASFESolventUnit(BaseASFEUnit): + """ + Protocol Unit for the solvent phase of an absolute solvation free energy + """ + + _simtype: str = "solvent" + + def _get_components(self): + """ + Get the relevant components for a solvent transformation. + + Returns + ------- + alchem_comps : dict[str, Component] + A list of alchemical components + solv_comp : SolventComponent + The SolventComponent of the system + prot_comp : Optional[ProteinComponent] + The protein component of the system, if it exists. + small_mols : dict[SmallMoleculeComponent: OFFMolecule] + SmallMoleculeComponents to add to the system. + """ + stateA = self._inputs["stateA"] + alchem_comps = self._inputs["alchemical_components"] + + solv_comp, prot_comp, small_mols = system_validation.get_components(stateA) + off_comps = {m: m.to_openff() for m in small_mols} + + # We don't need to check that solv_comp is not None, otherwise + # an error will have been raised when calling `validate_solvent` + # in the Protocol's `_create`. + # Similarly we don't need to check prot_comp since that's also + # disallowed on create + return alchem_comps, solv_comp, prot_comp, off_comps + + def _handle_settings(self) -> dict[str, gufe.settings.SettingsBaseModel]: + """ + Extract the relevant settings for a vacuum transformation. + + Returns + ------- + settings : dict[str, SettingsBaseModel] + A dictionary with the following entries: + * forcefield_settings : InterchangeFFSettings + * thermo_settings : ThermoSettings + * charge_settings : OpenFFPartialChargeSettings + * solvation_settings : PackmolSolvationSettings + * alchemical_settings : ExperimentalAlchemicalSettings + * lambda_settings : LambdaSettings + * engine_settings : OpenMMEngineSettings + * integrator_settings : IntegratorSettings + * equil_simulation_settings : MDSimulationSettings + * equil_output_settings : MDOutputSettings + * simulation_settings : MultiStateSimulationSettings + * output_settings: MultiStateOutputSettings + """ + prot_settings = self._inputs["protocol"].settings + + settings = {} + settings["forcefield_settings"] = prot_settings.solvent_forcefield_settings + settings["thermo_settings"] = prot_settings.thermo_settings + settings["charge_settings"] = prot_settings.partial_charge_settings + settings["solvation_settings"] = prot_settings.solvation_settings + settings["alchemical_settings"] = prot_settings.alchemical_settings + settings["lambda_settings"] = prot_settings.lambda_settings + settings["engine_settings"] = prot_settings.solvent_engine_settings + settings["integrator_settings"] = prot_settings.integrator_settings + settings["equil_simulation_settings"] = ( + prot_settings.solvent_equil_simulation_settings + ) + settings["equil_output_settings"] = prot_settings.solvent_equil_output_settings + settings["simulation_settings"] = prot_settings.solvent_simulation_settings + settings["output_settings"] = prot_settings.solvent_output_settings + + settings_validation.validate_timestep( + settings["forcefield_settings"].hydrogen_mass, + settings["integrator_settings"].timestep, + ) + + return settings diff --git a/src/pontibus/protocols/solvation/base.py b/src/pontibus/protocols/solvation/base.py new file mode 100644 index 0000000..28fdabd --- /dev/null +++ b/src/pontibus/protocols/solvation/base.py @@ -0,0 +1,362 @@ +# This code is part of OpenFE and is licensed under the MIT license. +# For details, see https://github.com/OpenFreeEnergy/openfe + +import logging +from typing import Any, Optional, Union + +import gufe +import numpy.typing as npt +import openmm +import openmmtools +from gufe import ProteinComponent, SmallMoleculeComponent, SolventComponent +from gufe.settings import SettingsBaseModel +from openfe.protocols.openmm_afe.base import BaseAbsoluteUnit +from openfe.protocols.openmm_utils import charge_generation, settings_validation +from openfe.utils import log_system_probe, without_oechem_backend +from openff.interchange.interop.openmm import to_openmm_positions +from openff.toolkit import Molecule as OFFMolecule +from openff.units import unit +from openff.units.openmm import ensure_quantity, from_openmm, to_openmm +from openmm import app +from openmmtools import multistate +from openmmtools.alchemy import ( + AbsoluteAlchemicalFactory, + AlchemicalRegion, + AlchemicalState, +) +from openmmtools.states import ( + SamplerState, + ThermodynamicState, + create_thermodynamic_state_protocol, +) + +from pontibus.components import ExtendedSolventComponent +from pontibus.protocols.solvation.settings import ( + IntegratorSettings, + OpenFFPartialChargeSettings, + PackmolSolvationSettings, +) +from pontibus.utils.system_creation import interchange_packmol_creation + +logger = logging.getLogger(__name__) + + +class BaseASFEUnit(BaseAbsoluteUnit): + + _simtype: str + + @staticmethod + def _get_and_charge_solvent_offmol( + solvent_component: Union[SolventComponent, ExtendedSolventComponent], + solvation_settings: PackmolSolvationSettings, + partial_charge_settings: OpenFFPartialChargeSettings, + ) -> OFFMolecule: + """ + Helper method to fetch the solvent offmol either + from an existing solvent_smcs, or from smiles. + + Parameters + ---------- + solvent_component : SolventComponent + smiles for the solvent molecule + solvation_settings : PackmolSolvationSettings + Settings defining how the system will be solvated + partial_charge_settings : OpenFFPartialChargeSettigns + Settings defining how partial charges are applied + + Returns + ------- + offmol : openff.toolkit.Molecule + """ + # Get the solvent offmol + if isinstance(solvent_component, ExtendedSolventComponent): + solvent_offmol = solvent_component.solvent_molecule.to_openff() + else: + solvent_offmol = OFFMolecule.from_smiles(solvent_component.smiles) + + # Assign solvent offmol charges if necessary + if solvation_settings.assign_solvent_charges: + if solvent_offmol.n_conformers == 0: + n_conf = 1 + else: + n_conf = partial_charge_settings.number_of_conformers + + charge_generation.assign_offmol_partial_charges( + offmol=solvent_offmol, + overwrite=False, + method=partial_charge_settings.partial_charge_method, + toolkit_backend=partial_charge_settings.off_toolkit_backend, + generate_n_conformers=n_conf, + nagl_model=partial_charge_settings.nagl_model, + ) + + return solvent_offmol + + @staticmethod + def _validate_vsites( + system: openmm.System, integrator_settings: IntegratorSettings + ) -> None: + """ + Validate virtual site handling for alchemical system. + + Parameters + ---------- + System : openmm.System + System to validate. + integrator_settings : IntegratorSettings + Langevin integrator settings to verify against. + + Returns + ------- + None + + Notes + ----- + * Small placeholder for a larger thing. + """ + has_virtual_sites: bool = False + for ix in range(system.getNumParticles()): + if system.isVirtualSite(ix): + has_virtual_sites = True + + if has_virtual_sites: + if not integrator_settings.reassign_velocities: + errmsg = ( + "Simulations with virtual sites without velocity " + "reassignments are unstable" + ) + raise ValueError(errmsg) + + def _get_omm_objects( + self, + settings: dict[str, SettingsBaseModel], + protein_component: Optional[ProteinComponent], + solvent_component: Optional[SolventComponent], + smc_components: dict[SmallMoleculeComponent, OFFMolecule], + ) -> tuple[ + app.Topology, openmm.System, openmm.unit.Quantity, dict[str, npt.NDArray] + ]: + """ + Get the OpenMM Topology, Positions and System of the + parameterised system. + + Parameters + ---------- + settings : dict[str, SettingsBaseModel] + Protocol settings + protein_component : Optional[ProteinComponent] + Protein component for the system. + solvent_component : Optional[SolventComponent] + Solvent component for the system. + smc_components : dict[str, OFFMolecule] + SmallMoleculeComponents defining ligands to be added to the system + + Returns + ------- + topology : app.Topology + OpenMM Topology object describing the parameterized system. + system : openmm.System + An non-alchemical OpenMM System of the simulated system. + positions : openmm.unit.Quantity + Positions of the system. + comp_resids : dict[str, npt.NDArray] + A dictionary of residues for each component in the System. + + Notes + ----- + * For now this method solely calls interchange system creation for + solvation. + """ + if self.verbose: + self.logger.info("Parameterizing system") + + # Set partial charges for all smcs + self._assign_partial_charges(settings["charge_settings"], smc_components) + + # Get solvent offmol if necessary + if solvent_component is not None: + solvent_offmol = self._get_and_charge_solvent_offmol( + solvent_component, + settings["solvation_settings"], + settings["charge_settings"], + ) + else: + solvent_offmol = None + + # Create your interchange object + with without_oechem_backend(): + interchange, comp_resids = interchange_packmol_creation( + ffsettings=settings["forcefield_settings"], + solvation_settings=settings["solvation_settings"], + smc_components=smc_components, + protein_component=protein_component, + solvent_component=solvent_component, + solvent_offmol=solvent_offmol, + ) + + # Get omm objects back + omm_topology = interchange.to_openmm_topology() + omm_system = interchange.to_openmm_system( + hydrogen_mass=settings["forcefield_settings"].hydrogen_mass + ) + positions = to_openmm_positions(interchange, include_virtual_sites=True) + + # Post creation system validation + self._validate_vsites(omm_system, settings["integrator_settings"]) + + return omm_topology, omm_system, positions, comp_resids + + def run( + self, + dry=False, + verbose=True, + scratch_basepath=None, + shared_basepath=None, + ) -> dict[str, Any]: + """Run the absolute free energy calculation. + + Parameters + ---------- + dry : bool + Do a dry run of the calculation, creating all necessary alchemical + system components (topology, system, sampler, etc...) but without + running the simulation, default False + verbose : bool + Verbose output of the simulation progress. Output is provided via + INFO level logging, default True + scratch_basepath : pathlib.Path + Path to the scratch (temporary) directory space. + shared_basepath : pathlib.Path + Path to the shared (persistent) directory space. + + Returns + ------- + dict + Outputs created in the basepath directory or the debug objects + (i.e. sampler) if ``dry==True``. + """ + + # 0. Generaly preparation tasks + self._prepare(verbose, scratch_basepath, shared_basepath) + + # 1. Get components + alchem_comps, solv_comp, prot_comp, smc_comps = self._get_components() + + # 2. Get settings + settings = self._handle_settings() + + # 3. Get OpenMM topology, positions and system + omm_topology, omm_system, positions, comp_resids = self._get_omm_objects( + settings, + prot_comp, + solv_comp, + smc_comps, + ) + + # 4. Pre-equilbrate System (Test + Avoid NaNs + get stable system) + positions = self._pre_equilibrate( + omm_system, omm_topology, positions, settings, dry + ) + + # 5. Get lambdas + lambdas = self._get_lambda_schedule(settings) + + # 6. Get alchemical system + if settings["alchemical_settings"].experimental: + errmsg = "experimental factory code is not yet implemented" + raise ValueError(errmsg) + else: + alchem_factory, alchem_system, alchem_indices = self._get_alchemical_system( + omm_topology, omm_system, comp_resids, alchem_comps + ) + + # 7. Get compound and sampler states + sampler_states, cmp_states = self._get_states( + alchem_system, positions, settings, lambdas, solv_comp + ) + + # 8. Create the multistate reporter & create PDB + reporter = self._get_reporter( + omm_topology, + positions, + settings["simulation_settings"], + settings["output_settings"], + ) + + # TODO: delete all this once this changes upstream soon + # Wrap in try/finally to avoid memory leak issues + try: + # 12. Get context caches + energy_ctx_cache, sampler_ctx_cache = self._get_ctx_caches( + settings["engine_settings"] + ) + + # 13. Get integrator + integrator = self._get_integrator( + settings["integrator_settings"], + settings["simulation_settings"], + ) + + # 14. Get sampler + sampler = self._get_sampler( + integrator, + reporter, + settings["simulation_settings"], + settings["thermo_settings"], + cmp_states, + sampler_states, + energy_ctx_cache, + sampler_ctx_cache, + ) + + # 15. Run simulation + unit_result_dict = self._run_simulation(sampler, reporter, settings, dry) + + finally: + # close reporter when you're done to prevent file handle clashes + reporter.close() + + # clear GPU context + # Note: use cache.empty() when openmmtools #690 is resolved + for context in list(energy_ctx_cache._lru._data.keys()): + del energy_ctx_cache._lru._data[context] + for context in list(sampler_ctx_cache._lru._data.keys()): + del sampler_ctx_cache._lru._data[context] + # cautiously clear out the global context cache too + for context in list( + openmmtools.cache.global_context_cache._lru._data.keys() + ): + del openmmtools.cache.global_context_cache._lru._data[context] + + del sampler_ctx_cache, energy_ctx_cache + + # Keep these around in a dry run so we can inspect things + if not dry: + del integrator, sampler + + if not dry: + nc = self.shared_basepath / settings["output_settings"].output_filename + chk = settings["output_settings"].checkpoint_storage_filename + return { + "nc": nc, + "last_checkpoint": chk, + **unit_result_dict, + } + else: + return {"debug": {"sampler": sampler}} + + def _execute( + self, + ctx: gufe.Context, + **kwargs, + ) -> dict[str, Any]: + log_system_probe(logging.INFO, paths=[ctx.scratch]) + + outputs = self.run(scratch_basepath=ctx.scratch, shared_basepath=ctx.shared) + + return { + "repeat_id": self._inputs["repeat_id"], + "generation": self._inputs["generation"], + "simtype": self._simtype, + **outputs, + } diff --git a/src/pontibus/protocols/solvation/settings.py b/src/pontibus/protocols/solvation/settings.py new file mode 100644 index 0000000..e8d0b58 --- /dev/null +++ b/src/pontibus/protocols/solvation/settings.py @@ -0,0 +1,156 @@ +# This code is part of OpenFE and is licensed under the MIT license. +# For details, see https://github.com/OpenFreeEnergy/openfe + +"""Settings class for equilibrium AFE Protocols using OpenMM + OpenMMTools + +This module implements the necessary settings necessary to run absolute free +energies using OpenMM. + +See Also +-------- +openfe.protocols.openmm_afe.AbsoluteSolvationProtocol +""" +from typing import Literal, Optional + +from gufe.settings import BaseForceFieldSettings, ThermoSettings +from openfe.protocols.openmm_afe.equil_afe_settings import ( + AbsoluteSolvationSettings, + AlchemicalSettings, + LambdaSettings, +) +from openfe.protocols.openmm_utils.omm_settings import ( + BaseSolvationSettings, + IntegratorSettings, + MDOutputSettings, + MDSimulationSettings, + MultiStateOutputSettings, + MultiStateSimulationSettings, + OpenFFPartialChargeSettings, + OpenMMEngineSettings, +) +from openff.models.types import FloatQuantity +from openff.units import unit +from pydantic.v1 import validator + + +class ExperimentalAlchemicalSettings(AlchemicalSettings): + experimental: bool = False + """ + Turn on experimental alchemy settings + """ + + +class InterchangeFFSettings(BaseForceFieldSettings): + """ + Parameters to set up the force field using Interchange and the + OpenFF toolkit. + """ + + hydrogen_mass: float = 3.023841 + """Mass to be repartitioned to hydrogens from neighbouring + heavy atoms (in amu), default 3.0""" + + # TODO; work out if we could swap these out with str of ffxml contents + # if necessary + forcefields: list[str] = [ + "openff-2.0.0.offxml", + "tip3p.offxml", + ] + """List of force field ffxmls to apply""" + + nonbonded_method: Literal["pme", "nocutoff"] = "pme" + """ + Method for treating nonbonded interactions, currently only PME and + NoCutoff are allowed. Default PME. + """ + + nonbonded_cutoff: FloatQuantity["nanometer"] = 0.9 * unit.nanometer + """ + Cutoff value for short range nonbonded interactions. + Default 1.0 * unit.nanometer. + """ + + switch_width: FloatQuantity["nanometer"] = 0.1 * unit.nanometer + + @validator("nonbonded_method") + def allowed_nonbonded(cls, v): + # TODO: switch to literal? + if v.lower() not in ["pme", "nocutoff"]: + errmsg = "Only PME and NoCutoff are allowed nonbonded_methods" + raise ValueError(errmsg) + return v + + @validator("nonbonded_cutoff", "switch_width") + def is_positive_distance(cls, v): + # these are time units, not simulation steps + if not v.is_compatible_with(unit.nanometer): + raise ValueError( + "nonbonded_cutoff must be in distance units " "(i.e. nanometers)" + ) + if v < 0: + errmsg = "nonbonded_cutoff must be a positive value" + raise ValueError(errmsg) + return v + + +class PackmolSolvationSettings(BaseSolvationSettings): + """ + Settings defining how to solvate the system using Packmol. + + Notes + ----- + * This is currently limited to the options allowed by + Interchange's ``solvate_topology_nonwater``. + """ + + solvent_padding: Optional[FloatQuantity["nanometer"]] = 1.2 * unit.nanometer + """ + Minimum distance from any solute bounding sphere to the edge of the box. + + """ + + box_shape: Optional[Literal["cube", "dodecahedron"]] = "cube" + """ + The shape of the periodic box to create. + """ + + assign_solvent_charges: bool = False + """ + If ``True``, assign solvent charges based on the input solvent + molecule. If ``False``, rely on library charges. + + Notes + ----- + * If no partial charges are set in the input molecule, the molecule + will be charged using the approach defined in ``partial_charge_settings``. + * If not using ``ExtendedSolventComponent``, the input molecule will + be created using ``SolventComponent.smiles`` and partial charges will + be set using the approach defined in ``partial_charge_settings``. + """ + + packing_tolerance: FloatQuantity["angstrom"] = 0.75 * unit.angstrom + """ + Packmol setting; minimum spacing between molecules in units of distance. + 2.0 A is recommended when packing proteins, but can go as low as 0.5 A + to help with convergence. + """ + + +class ASFESettings(AbsoluteSolvationSettings): + """ + Configuration object for ``ASFEProtocol``. + + See Also + -------- + pontibus.protocols.solvation.ASFEProtocol + """ + + # Inherited things + solvent_forcefield_settings: InterchangeFFSettings + """Parameters to set up in the solvent force field""" + + vacuum_forcefield_settings: InterchangeFFSettings + """Parameters to set up the vacuum force field""" + + solvation_settings: PackmolSolvationSettings + """Settings for solvating the system.""" diff --git a/src/pontibus/tests/__init__.py b/src/pontibus/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/pontibus/tests/components/__init__.py b/src/pontibus/tests/components/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/pontibus/tests/components/test_extendedsolvent.py b/src/pontibus/tests/components/test_extendedsolvent.py new file mode 100644 index 0000000..96aca5c --- /dev/null +++ b/src/pontibus/tests/components/test_extendedsolvent.py @@ -0,0 +1,89 @@ +# This code is part of OpenFE and is licensed under the MIT license. +# For details, see https://github.com/OpenFreeEnergy/openfe + +import pytest +from gufe import SmallMoleculeComponent +from gufe.tests.test_tokenization import GufeTokenizableTestsMixin +from openff.toolkit import Molecule +from openff.units import unit + +from pontibus.components.extended_solvent_component import ExtendedSolventComponent +from pontibus.utils.molecules import WATER + + +def test_defaults(): + s = ExtendedSolventComponent() + + assert s.smiles == "[H][O][H]" + assert s.positive_ion == "Na+" + assert s.negative_ion == "Cl-" + assert s.ion_concentration == 0.0 * unit.molar + assert s.neutralize == False + assert s.solvent_molecule == WATER + + +def test_neq_different_smc(): + water_off = WATER.to_openff() + # Create a water with partial charges + water_off.assign_partial_charges(partial_charge_method="gasteiger") + WATER2 = SmallMoleculeComponent.from_openff(water_off) + s1 = ExtendedSolventComponent(solvent_molecule=WATER) + s2 = ExtendedSolventComponent(solvent_molecule=WATER2) + + assert s1 != s2 + assert s1.smiles == "[H][O][H]" == s2.smiles + + +def test_neq_different_solvent(): + meth_off = Molecule.from_smiles("C") + meth_off.generate_conformers() + METH = SmallMoleculeComponent.from_openff(meth_off) + s1 = ExtendedSolventComponent() + s2 = ExtendedSolventComponent(solvent_molecule=METH) + + assert s1 != s2 + assert s1.smiles == "[H][O][H]" + assert s2.smiles == "[H][C]([H])([H])[H]" + assert s1.smiles != s2.smiles + + +def test_dict_roundtrip_eq(): + s1 = ExtendedSolventComponent() + s2 = ExtendedSolventComponent.from_dict(s1.to_dict()) + assert s1 == s2 + assert s1.solvent_molecule == s2.solvent_molecule + # Smiles isn't a dict entry, so make sure it got preserved + assert s1.smiles == s2.smiles + + +def test_keyed_dict_roundtrip_eq(): + s1 = ExtendedSolventComponent() + s2 = ExtendedSolventComponent.from_keyed_dict(s1.to_keyed_dict()) + assert s1 == s2 + # Smiles isn't a dict entry, so make sure it got preserved + assert s1.smiles == s2.smiles + # Check the smcs + assert s1.solvent_molecule == s2.solvent_molecule + assert isinstance(s1.solvent_molecule, SmallMoleculeComponent) + + +def test_shallow_dict_roundtrip_eq(): + s1 = ExtendedSolventComponent() + s2 = ExtendedSolventComponent.from_shallow_dict(s1.to_shallow_dict()) + assert s1 == s2 + # Smiles isn't a dict entry, so make sure it got preserved + assert s1.smiles == s2.smiles + # Check the smcs + assert s1.solvent_molecule == s2.solvent_molecule + assert isinstance(s1.solvent_molecule, SmallMoleculeComponent) + + +class TestSolventComponent(GufeTokenizableTestsMixin): + + cls = ExtendedSolventComponent + key = "ExtendedSolventComponent-f297bd89a615557b2b94d241eff240ce" + repr = "ExtendedSolventComponent(name=[H][O][H], Na+, Cl-)" + + @pytest.fixture + def instance(self): + return ExtendedSolventComponent(solvent_molecule=WATER) diff --git a/src/pontibus/tests/conftest.py b/src/pontibus/tests/conftest.py new file mode 100644 index 0000000..92afbe4 --- /dev/null +++ b/src/pontibus/tests/conftest.py @@ -0,0 +1,140 @@ +# This code is part of OpenFE and is licensed under the MIT license. +# For details, see https://github.com/OpenFreeEnergy/openfe + +import importlib +import os +from importlib import resources + +import gufe +import pytest +from gufe import SmallMoleculeComponent +from rdkit import Chem + + +class SlowTests: + """Plugin for handling fixtures that skips slow tests + + Fixtures + -------- + + Currently two fixture types are handled: + * `gpu`: + GPU tests that are meant to be run to truly put the code + through a real run. + + * `slow`: + Unit tests that just take too long to be running regularly. + + + How to use the fixtures + ----------------------- + + To add these fixtures simply add `@pytest.mark.gpu` or + `@pytest.mark.slow` decorator to the relevant function or class. + + + How to run tests marked by these fixtures + ----------------------------------------- + + To run the `gpu` tests, either use the `--gpu` flag + when invoking pytest, or set the environment variable + `PONTIBUS_GPU_TESTS` to `true`. Note: triggering `gpu` will + automatically also trigger tests marked as `slow`. + + To run the `slow` tests, either use the `--runslow` flag when invoking + pytest, or set the environment variable `PONTIBUS_SLOW_TESTS` to `true` + """ + + def __init__(self, config): + self.config = config + + @staticmethod + def _modify_slow(items, config): + msg = ( + "need --runslow pytest cli option or the environment variable " + "`PONTIBUS_SLOW_TESTS` set to `True` to run" + ) + skip_slow = pytest.mark.skip(reason=msg) + for item in items: + if "slow" in item.keywords: + item.add_marker(skip_slow) + + @staticmethod + def _modify_integration(items, config): + msg = ( + "need --gpu pytest cli option or the environment " + "variable `PONTIBUS_GPU_TESTS` set to `True` to run" + ) + skip_int = pytest.mark.skip(reason=msg) + for item in items: + if "gpu" in item.keywords: + item.add_marker(skip_int) + + def pytest_collection_modifyitems(self, items, config): + if ( + config.getoption("--gpu") + or os.getenv("PONTIBUS_GPU_TESTS", default="false").lower() == "true" + ): + return + elif ( + config.getoption("--runslow") + or os.getenv("PONTIBUS_SLOW_TESTS", default="false").lower() == "true" + ): + self._modify_integration(items, config) + else: + self._modify_integration(items, config) + self._modify_slow(items, config) + + +# allow for optional slow tests +# See: https://docs.pytest.org/en/latest/example/simple.html +def pytest_addoption(parser): + parser.addoption( + "--runslow", action="store_true", default=False, help="run slow tests" + ) + parser.addoption( + "--gpu", + action="store_true", + default=False, + help="run gpu tests", + ) + + +def pytest_configure(config): + config.pluginmanager.register(SlowTests(config), "slow") + config.addinivalue_line("markers", "slow: mark test as slow") + config.addinivalue_line("markers", "gpu: mark test as long integration test") + + +@pytest.fixture(scope="session") +def benzene_modifications(): + files = {} + with importlib.resources.files("openfe.tests.data") as d: + fn = str(d / "benzene_modifications.sdf") + supp = Chem.SDMolSupplier(str(fn), removeHs=False) + for rdmol in supp: + files[rdmol.GetProp("_Name")] = SmallMoleculeComponent(rdmol) + return files + + +@pytest.fixture() +def CN_molecule(): + """ + A basic CH3NH2 molecule for quick testing. + """ + with resources.files("openfe.tests.data") as d: + fn = str(d / "CN.sdf") + supp = Chem.SDMolSupplier(str(fn), removeHs=False) + + smc = [SmallMoleculeComponent(i) for i in supp][0] + + return smc + + +@pytest.fixture(scope="session") +def T4_protein_component(): + with resources.files("openfe.tests.data") as d: + fn = str(d / "181l_only.pdb") + comp = gufe.ProteinComponent.from_pdb_file(fn, name="T4_protein") + + return comp diff --git a/src/pontibus/tests/data/181l_only.pdb b/src/pontibus/tests/data/181l_only.pdb new file mode 100644 index 0000000..d59591f --- /dev/null +++ b/src/pontibus/tests/data/181l_only.pdb @@ -0,0 +1,2614 @@ +ATOM 1 C ACE A 0 44.004 -3.922 10.269 1.00 0.00 C +ATOM 2 O ACE A 0 43.553 -3.405 11.300 1.00 0.00 O +ATOM 3 CH3 ACE A 0 44.579 -5.322 10.286 1.00 0.00 C +ATOM 4 1HH3 ACE A 0 43.825 -6.028 10.604 1.00 0.00 H +ATOM 5 2HH3 ACE A 0 44.917 -5.595 9.297 1.00 0.00 H +ATOM 6 3HH3 ACE A 0 45.415 -5.370 10.968 1.00 0.00 H +ATOM 7 N MET A 1 43.982 -3.258 9.163 1.00 0.00 N +ATOM 8 CA MET A 1 43.434 -1.917 9.134 1.00 0.00 C +ATOM 9 C MET A 1 42.006 -1.966 9.640 1.00 0.00 C +ATOM 10 O MET A 1 41.334 -2.969 9.468 1.00 0.00 O +ATOM 11 CB MET A 1 43.582 -1.397 7.675 1.00 0.00 C +ATOM 12 CG MET A 1 42.903 -0.084 7.444 1.00 0.00 C +ATOM 13 SD MET A 1 44.006 1.250 7.952 1.00 0.00 S +ATOM 14 CE MET A 1 45.481 0.757 7.112 1.00 0.00 C +ATOM 15 H MET A 1 44.347 -3.673 8.318 1.00 0.00 H +ATOM 16 HA MET A 1 43.973 -1.334 9.742 1.00 0.00 H +ATOM 17 HB2 MET A 1 43.185 -2.073 7.055 1.00 0.00 H +ATOM 18 HB3 MET A 1 44.556 -1.291 7.473 1.00 0.00 H +ATOM 19 HG2 MET A 1 42.060 -0.044 7.981 1.00 0.00 H +ATOM 20 HG3 MET A 1 42.685 0.014 6.473 1.00 0.00 H +ATOM 21 HE1 MET A 1 46.208 1.417 7.300 1.00 0.00 H +ATOM 22 HE2 MET A 1 45.761 -0.148 7.433 1.00 0.00 H +ATOM 23 HE3 MET A 1 45.308 0.723 6.128 1.00 0.00 H +ATOM 24 N ASN A 2 41.577 -0.917 10.331 1.00 0.00 N +ATOM 25 CA ASN A 2 40.227 -0.852 10.835 1.00 0.00 C +ATOM 26 C ASN A 2 39.857 0.627 10.904 1.00 0.00 C +ATOM 27 O ASN A 2 40.756 1.443 10.662 1.00 0.00 O +ATOM 28 CB ASN A 2 40.133 -1.529 12.224 1.00 0.00 C +ATOM 29 CG ASN A 2 41.084 -0.909 13.215 1.00 0.00 C +ATOM 30 ND2 ASN A 2 42.001 -1.711 13.752 1.00 0.00 N +ATOM 31 OD1 ASN A 2 41.041 0.309 13.479 1.00 0.00 O +ATOM 32 H ASN A 2 42.202 -0.156 10.506 1.00 0.00 H +ATOM 33 HA ASN A 2 39.613 -1.317 10.198 1.00 0.00 H +ATOM 34 HB2 ASN A 2 40.354 -2.499 12.127 1.00 0.00 H +ATOM 35 HB3 ASN A 2 39.199 -1.433 12.568 1.00 0.00 H +ATOM 36 HD21 ASN A 2 42.011 -2.684 13.522 1.00 0.00 H +ATOM 37 HD22 ASN A 2 42.680 -1.340 14.386 1.00 0.00 H +ATOM 38 N ILE A 3 38.598 0.950 11.230 1.00 0.00 N +ATOM 39 CA ILE A 3 38.095 2.316 11.285 1.00 0.00 C +ATOM 40 C ILE A 3 38.983 3.288 12.114 1.00 0.00 C +ATOM 41 O ILE A 3 39.269 4.440 11.729 1.00 0.00 O +ATOM 42 CB ILE A 3 36.596 2.331 11.634 1.00 0.00 C +ATOM 43 CG1 ILE A 3 36.015 3.749 11.576 1.00 0.00 C +ATOM 44 CG2 ILE A 3 36.352 1.659 12.987 1.00 0.00 C +ATOM 45 CD1 ILE A 3 36.262 4.484 10.218 1.00 0.00 C +ATOM 46 H ILE A 3 37.965 0.208 11.449 1.00 0.00 H +ATOM 47 HA ILE A 3 38.148 2.652 10.345 1.00 0.00 H +ATOM 48 HB ILE A 3 36.123 1.787 10.941 1.00 0.00 H +ATOM 49 HG12 ILE A 3 36.432 4.290 12.306 1.00 0.00 H +ATOM 50 HG13 ILE A 3 35.028 3.691 11.727 1.00 0.00 H +ATOM 51 HG21 ILE A 3 35.375 1.678 13.197 1.00 0.00 H +ATOM 52 HG22 ILE A 3 36.667 0.711 12.950 1.00 0.00 H +ATOM 53 HG23 ILE A 3 36.855 2.149 13.698 1.00 0.00 H +ATOM 54 HD11 ILE A 3 35.857 5.398 10.255 1.00 0.00 H +ATOM 55 HD12 ILE A 3 37.246 4.562 10.055 1.00 0.00 H +ATOM 56 HD13 ILE A 3 35.841 3.963 9.475 1.00 0.00 H +ATOM 57 N PHE A 4 39.471 2.813 13.251 1.00 0.00 N +ATOM 58 CA PHE A 4 40.288 3.621 14.120 1.00 0.00 C +ATOM 59 C PHE A 4 41.595 4.009 13.514 1.00 0.00 C +ATOM 60 O PHE A 4 42.017 5.171 13.544 1.00 0.00 O +ATOM 61 CB PHE A 4 40.534 2.948 15.448 1.00 0.00 C +ATOM 62 CG PHE A 4 39.261 2.896 16.253 1.00 0.00 C +ATOM 63 CD1 PHE A 4 38.915 3.949 17.091 1.00 0.00 C +ATOM 64 CD2 PHE A 4 38.438 1.771 16.220 1.00 0.00 C +ATOM 65 CE1 PHE A 4 37.756 3.891 17.868 1.00 0.00 C +ATOM 66 CE2 PHE A 4 37.266 1.706 16.970 1.00 0.00 C +ATOM 67 CZ PHE A 4 36.931 2.766 17.809 1.00 0.00 C +ATOM 68 H PHE A 4 39.267 1.870 13.512 1.00 0.00 H +ATOM 69 HA PHE A 4 39.783 4.465 14.303 1.00 0.00 H +ATOM 70 HB2 PHE A 4 41.224 3.463 15.956 1.00 0.00 H +ATOM 71 HB3 PHE A 4 40.862 2.017 15.290 1.00 0.00 H +ATOM 72 HD1 PHE A 4 39.502 4.757 17.138 1.00 0.00 H +ATOM 73 HD2 PHE A 4 38.695 0.994 15.645 1.00 0.00 H +ATOM 74 HE1 PHE A 4 37.517 4.655 18.467 1.00 0.00 H +ATOM 75 HE2 PHE A 4 36.670 0.905 16.907 1.00 0.00 H +ATOM 76 HZ PHE A 4 36.102 2.722 18.367 1.00 0.00 H +ATOM 77 N GLU A 5 42.284 3.029 12.984 1.00 0.00 N +ATOM 78 CA GLU A 5 43.538 3.324 12.350 1.00 0.00 C +ATOM 79 C GLU A 5 43.301 4.168 11.123 1.00 0.00 C +ATOM 80 O GLU A 5 44.143 4.951 10.782 1.00 0.00 O +ATOM 81 CB GLU A 5 44.301 2.059 11.905 1.00 0.00 C +ATOM 82 CG GLU A 5 44.570 1.071 13.057 1.00 0.00 C +ATOM 83 CD GLU A 5 45.307 -0.199 12.662 1.00 0.00 C +ATOM 84 OE1 GLU A 5 45.539 -0.541 11.509 1.00 0.00 O +ATOM 85 OE2 GLU A 5 45.835 -0.819 13.703 1.00 0.00 O1- +ATOM 86 H GLU A 5 41.942 2.090 13.020 1.00 0.00 H +ATOM 87 HA GLU A 5 44.110 3.838 12.989 1.00 0.00 H +ATOM 88 HB2 GLU A 5 45.179 2.338 11.515 1.00 0.00 H +ATOM 89 HB3 GLU A 5 43.760 1.592 11.206 1.00 0.00 H +ATOM 90 HG2 GLU A 5 43.689 0.808 13.451 1.00 0.00 H +ATOM 91 HG3 GLU A 5 45.116 1.543 13.748 1.00 0.00 H +ATOM 92 N MET A 6 42.196 3.948 10.448 1.00 0.00 N +ATOM 93 CA MET A 6 41.906 4.713 9.248 1.00 0.00 C +ATOM 94 C MET A 6 41.733 6.191 9.577 1.00 0.00 C +ATOM 95 O MET A 6 42.305 7.096 8.943 1.00 0.00 O +ATOM 96 CB MET A 6 40.583 4.198 8.656 1.00 0.00 C +ATOM 97 CG MET A 6 40.268 4.791 7.289 1.00 0.00 C +ATOM 98 SD MET A 6 38.516 4.549 6.882 1.00 0.00 S +ATOM 99 CE MET A 6 38.491 4.603 5.061 1.00 0.00 C +ATOM 100 H MET A 6 41.552 3.251 10.762 1.00 0.00 H +ATOM 101 HA MET A 6 42.644 4.596 8.584 1.00 0.00 H +ATOM 102 HB2 MET A 6 39.841 4.433 9.283 1.00 0.00 H +ATOM 103 HB3 MET A 6 40.641 3.204 8.566 1.00 0.00 H +ATOM 104 HG2 MET A 6 40.832 4.341 6.597 1.00 0.00 H +ATOM 105 HG3 MET A 6 40.471 5.770 7.300 1.00 0.00 H +ATOM 106 HE1 MET A 6 37.554 4.477 4.737 1.00 0.00 H +ATOM 107 HE2 MET A 6 38.835 5.488 4.749 1.00 0.00 H +ATOM 108 HE3 MET A 6 39.070 3.873 4.698 1.00 0.00 H +ATOM 109 N LEU A 7 40.898 6.458 10.569 1.00 0.00 N +ATOM 110 CA LEU A 7 40.633 7.840 10.929 1.00 0.00 C +ATOM 111 C LEU A 7 41.868 8.518 11.566 1.00 0.00 C +ATOM 112 O LEU A 7 42.104 9.741 11.449 1.00 0.00 O +ATOM 113 CB LEU A 7 39.392 7.942 11.817 1.00 0.00 C +ATOM 114 CG LEU A 7 38.095 7.927 11.038 1.00 0.00 C +ATOM 115 CD1 LEU A 7 36.964 7.641 12.005 1.00 0.00 C +ATOM 116 CD2 LEU A 7 37.911 9.284 10.346 1.00 0.00 C +ATOM 117 H LEU A 7 40.453 5.714 11.067 1.00 0.00 H +ATOM 118 HA LEU A 7 40.431 8.332 10.082 1.00 0.00 H +ATOM 119 HB2 LEU A 7 39.441 8.796 12.334 1.00 0.00 H +ATOM 120 HB3 LEU A 7 39.391 7.168 12.450 1.00 0.00 H +ATOM 121 HG LEU A 7 38.131 7.205 10.347 1.00 0.00 H +ATOM 122 HD11 LEU A 7 36.096 7.627 11.508 1.00 0.00 H +ATOM 123 HD12 LEU A 7 37.114 6.753 12.440 1.00 0.00 H +ATOM 124 HD13 LEU A 7 36.936 8.354 12.705 1.00 0.00 H +ATOM 125 HD21 LEU A 7 37.055 9.281 9.829 1.00 0.00 H +ATOM 126 HD22 LEU A 7 37.882 10.008 11.035 1.00 0.00 H +ATOM 127 HD23 LEU A 7 38.676 9.447 9.723 1.00 0.00 H +ATOM 128 N ARG A 8 42.674 7.714 12.256 1.00 0.00 N +ATOM 129 CA ARG A 8 43.879 8.232 12.881 1.00 0.00 C +ATOM 130 C ARG A 8 44.822 8.756 11.814 1.00 0.00 C +ATOM 131 O ARG A 8 45.490 9.750 12.027 1.00 0.00 O +ATOM 132 CB ARG A 8 44.530 7.358 13.934 1.00 0.00 C +ATOM 133 CG ARG A 8 45.959 7.753 14.297 1.00 0.00 C +ATOM 134 CD ARG A 8 46.112 8.681 15.527 1.00 0.00 C +ATOM 135 NE ARG A 8 47.474 9.235 15.686 1.00 0.00 N +ATOM 136 CZ ARG A 8 48.157 9.911 14.739 1.00 0.00 C +ATOM 137 NH1 ARG A 8 47.674 10.152 13.525 1.00 0.00 N1+ +ATOM 138 NH2 ARG A 8 49.384 10.348 15.035 1.00 0.00 N +ATOM 139 H ARG A 8 42.448 6.744 12.345 1.00 0.00 H +ATOM 140 HA ARG A 8 43.578 9.047 13.377 1.00 0.00 H +ATOM 141 HB2 ARG A 8 44.544 6.418 13.593 1.00 0.00 H +ATOM 142 HB3 ARG A 8 43.974 7.404 14.764 1.00 0.00 H +ATOM 143 HG2 ARG A 8 46.357 8.221 13.508 1.00 0.00 H +ATOM 144 HG3 ARG A 8 46.472 6.914 14.480 1.00 0.00 H +ATOM 145 HD2 ARG A 8 45.886 8.157 16.348 1.00 0.00 H +ATOM 146 HD3 ARG A 8 45.471 9.442 15.430 1.00 0.00 H +ATOM 147 HE ARG A 8 47.926 9.097 16.568 1.00 0.00 H +ATOM 148 HH11 ARG A 8 48.223 10.659 12.860 1.00 0.00 H +ATOM 149 HH12 ARG A 8 46.762 9.827 13.276 1.00 0.00 H +ATOM 150 HH21 ARG A 8 49.913 10.852 14.353 1.00 0.00 H +ATOM 151 HH22 ARG A 8 49.773 10.171 15.939 1.00 0.00 H +ATOM 152 N ILE A 9 44.811 8.131 10.651 1.00 0.00 N +ATOM 153 CA ILE A 9 45.596 8.555 9.524 1.00 0.00 C +ATOM 154 C ILE A 9 44.969 9.770 8.851 1.00 0.00 C +ATOM 155 O ILE A 9 45.647 10.700 8.457 1.00 0.00 O +ATOM 156 CB ILE A 9 45.769 7.426 8.495 1.00 0.00 C +ATOM 157 CG1 ILE A 9 46.849 6.457 8.921 1.00 0.00 C +ATOM 158 CG2 ILE A 9 46.155 7.969 7.105 1.00 0.00 C +ATOM 159 CD1 ILE A 9 46.552 5.045 8.403 1.00 0.00 C +ATOM 160 H ILE A 9 44.229 7.324 10.549 1.00 0.00 H +ATOM 161 HA ILE A 9 46.503 8.816 9.856 1.00 0.00 H +ATOM 162 HB ILE A 9 44.905 6.929 8.416 1.00 0.00 H +ATOM 163 HG12 ILE A 9 46.895 6.436 9.920 1.00 0.00 H +ATOM 164 HG13 ILE A 9 47.727 6.763 8.553 1.00 0.00 H +ATOM 165 HG21 ILE A 9 46.258 7.207 6.466 1.00 0.00 H +ATOM 166 HG22 ILE A 9 45.438 8.585 6.777 1.00 0.00 H +ATOM 167 HG23 ILE A 9 47.019 8.468 7.170 1.00 0.00 H +ATOM 168 HD11 ILE A 9 47.278 4.423 8.696 1.00 0.00 H +ATOM 169 HD12 ILE A 9 45.676 4.732 8.771 1.00 0.00 H +ATOM 170 HD13 ILE A 9 46.508 5.059 7.404 1.00 0.00 H +ATOM 171 N ASP A 10 43.683 9.808 8.711 1.00 0.00 N +ATOM 172 CA ASP A 10 43.099 10.964 8.067 1.00 0.00 C +ATOM 173 C ASP A 10 43.051 12.245 8.910 1.00 0.00 C +ATOM 174 O ASP A 10 43.086 13.347 8.392 1.00 0.00 O +ATOM 175 CB ASP A 10 41.680 10.604 7.626 1.00 0.00 C +ATOM 176 CG ASP A 10 41.719 9.818 6.391 1.00 0.00 C +ATOM 177 OD1 ASP A 10 42.628 9.900 5.589 1.00 0.00 O +ATOM 178 OD2 ASP A 10 40.724 9.014 6.273 1.00 0.00 O1- +ATOM 179 H ASP A 10 43.108 9.058 9.039 1.00 0.00 H +ATOM 180 HA ASP A 10 43.634 11.159 7.245 1.00 0.00 H +ATOM 181 HB2 ASP A 10 41.160 11.443 7.467 1.00 0.00 H +ATOM 182 HB3 ASP A 10 41.237 10.068 8.345 1.00 0.00 H +ATOM 183 N GLU A 11 42.927 12.117 10.224 1.00 0.00 N +ATOM 184 CA GLU A 11 42.763 13.267 11.074 1.00 0.00 C +ATOM 185 C GLU A 11 44.017 13.713 11.821 1.00 0.00 C +ATOM 186 O GLU A 11 44.090 14.848 12.255 1.00 0.00 O +ATOM 187 CB GLU A 11 41.669 12.995 12.129 1.00 0.00 C +ATOM 188 CG GLU A 11 40.343 12.685 11.476 1.00 0.00 C +ATOM 189 CD GLU A 11 39.674 13.930 10.943 1.00 0.00 C +ATOM 190 OE1 GLU A 11 40.305 15.027 11.265 1.00 0.00 O +ATOM 191 OE2 GLU A 11 38.674 13.918 10.294 1.00 0.00 O1- +ATOM 192 H GLU A 11 42.948 11.204 10.632 1.00 0.00 H +ATOM 193 HA GLU A 11 42.457 14.030 10.504 1.00 0.00 H +ATOM 194 HB2 GLU A 11 41.566 13.804 12.708 1.00 0.00 H +ATOM 195 HB3 GLU A 11 41.945 12.216 12.692 1.00 0.00 H +ATOM 196 HG2 GLU A 11 39.742 12.259 12.152 1.00 0.00 H +ATOM 197 HG3 GLU A 11 40.496 12.050 10.718 1.00 0.00 H +ATOM 198 N GLY A 12 44.990 12.816 12.013 1.00 0.00 N +ATOM 199 CA GLY A 12 46.160 13.121 12.812 1.00 0.00 C +ATOM 200 C GLY A 12 45.801 13.144 14.307 1.00 0.00 C +ATOM 201 O GLY A 12 44.708 12.830 14.714 1.00 0.00 O +ATOM 202 H GLY A 12 44.908 11.911 11.594 1.00 0.00 H +ATOM 203 HA2 GLY A 12 46.516 14.017 12.545 1.00 0.00 H +ATOM 204 HA3 GLY A 12 46.859 12.423 12.652 1.00 0.00 H +ATOM 205 N LEU A 13 46.748 13.506 15.150 1.00 0.00 N +ATOM 206 CA LEU A 13 46.517 13.633 16.582 1.00 0.00 C +ATOM 207 C LEU A 13 47.177 14.923 17.047 1.00 0.00 C +ATOM 208 O LEU A 13 48.351 15.138 16.799 1.00 0.00 O +ATOM 209 CB LEU A 13 47.090 12.436 17.363 1.00 0.00 C +ATOM 210 CG LEU A 13 47.425 12.766 18.822 1.00 0.00 C +ATOM 211 CD1 LEU A 13 46.161 12.825 19.675 1.00 0.00 C +ATOM 212 CD2 LEU A 13 48.364 11.714 19.390 1.00 0.00 C +ATOM 213 H LEU A 13 47.661 13.701 14.792 1.00 0.00 H +ATOM 214 HA LEU A 13 45.533 13.691 16.750 1.00 0.00 H +ATOM 215 HB2 LEU A 13 47.926 12.131 16.907 1.00 0.00 H +ATOM 216 HB3 LEU A 13 46.415 11.698 17.352 1.00 0.00 H +ATOM 217 HG LEU A 13 47.879 13.656 18.856 1.00 0.00 H +ATOM 218 HD11 LEU A 13 46.406 13.041 20.620 1.00 0.00 H +ATOM 219 HD12 LEU A 13 45.551 13.533 19.319 1.00 0.00 H +ATOM 220 HD13 LEU A 13 45.697 11.940 19.645 1.00 0.00 H +ATOM 221 HD21 LEU A 13 48.577 11.936 20.341 1.00 0.00 H +ATOM 222 HD22 LEU A 13 47.924 10.817 19.348 1.00 0.00 H +ATOM 223 HD23 LEU A 13 49.208 11.697 18.854 1.00 0.00 H +ATOM 224 N ARG A 14 46.440 15.813 17.680 1.00 0.00 N +ATOM 225 CA ARG A 14 46.999 17.069 18.151 1.00 0.00 C +ATOM 226 C ARG A 14 46.550 17.274 19.536 1.00 0.00 C +ATOM 227 O ARG A 14 45.379 17.130 19.832 1.00 0.00 O +ATOM 228 CB ARG A 14 46.695 18.247 17.258 1.00 0.00 C +ATOM 229 CG ARG A 14 47.547 18.072 16.002 1.00 0.00 C +ATOM 230 CD ARG A 14 47.386 19.150 14.974 1.00 0.00 C +ATOM 231 NE ARG A 14 48.088 20.362 15.360 1.00 0.00 N +ATOM 232 CZ ARG A 14 47.987 21.518 14.710 1.00 0.00 C +ATOM 233 NH1 ARG A 14 47.226 21.645 13.621 1.00 0.00 N1+ +ATOM 234 NH2 ARG A 14 48.682 22.561 15.145 1.00 0.00 N +ATOM 235 H ARG A 14 45.472 15.619 17.840 1.00 0.00 H +ATOM 236 HA ARG A 14 47.993 16.962 18.174 1.00 0.00 H +ATOM 237 HB2 ARG A 14 46.933 19.101 17.720 1.00 0.00 H +ATOM 238 HB3 ARG A 14 45.724 18.257 17.018 1.00 0.00 H +ATOM 239 HG2 ARG A 14 47.301 17.200 15.579 1.00 0.00 H +ATOM 240 HG3 ARG A 14 48.508 18.048 16.279 1.00 0.00 H +ATOM 241 HD2 ARG A 14 46.413 19.357 14.870 1.00 0.00 H +ATOM 242 HD3 ARG A 14 47.753 18.825 14.102 1.00 0.00 H +ATOM 243 HE ARG A 14 48.683 20.325 16.163 1.00 0.00 H +ATOM 244 HH11 ARG A 14 47.168 22.526 13.151 1.00 0.00 H +ATOM 245 HH12 ARG A 14 46.714 20.859 13.275 1.00 0.00 H +ATOM 246 HH21 ARG A 14 48.618 23.438 14.669 1.00 0.00 H +ATOM 247 HH22 ARG A 14 49.269 22.470 15.949 1.00 0.00 H +ATOM 248 N LEU A 15 47.514 17.523 20.390 1.00 0.00 N +ATOM 249 CA LEU A 15 47.218 17.658 21.785 1.00 0.00 C +ATOM 250 C LEU A 15 46.959 19.076 22.264 1.00 0.00 C +ATOM 251 O LEU A 15 46.706 19.257 23.444 1.00 0.00 O +ATOM 252 CB LEU A 15 48.249 16.968 22.683 1.00 0.00 C +ATOM 253 CG LEU A 15 48.403 15.456 22.445 1.00 0.00 C +ATOM 254 CD1 LEU A 15 49.492 14.938 23.379 1.00 0.00 C +ATOM 255 CD2 LEU A 15 47.109 14.692 22.732 1.00 0.00 C +ATOM 256 H LEU A 15 48.456 17.619 20.067 1.00 0.00 H +ATOM 257 HA LEU A 15 46.361 17.164 21.928 1.00 0.00 H +ATOM 258 HB2 LEU A 15 47.975 17.107 23.635 1.00 0.00 H +ATOM 259 HB3 LEU A 15 49.137 17.400 22.525 1.00 0.00 H +ATOM 260 HG LEU A 15 48.678 15.297 21.497 1.00 0.00 H +ATOM 261 HD11 LEU A 15 49.609 13.955 23.241 1.00 0.00 H +ATOM 262 HD12 LEU A 15 50.352 15.407 23.181 1.00 0.00 H +ATOM 263 HD13 LEU A 15 49.228 15.112 24.328 1.00 0.00 H +ATOM 264 HD21 LEU A 15 47.254 13.717 22.565 1.00 0.00 H +ATOM 265 HD22 LEU A 15 46.844 14.831 23.686 1.00 0.00 H +ATOM 266 HD23 LEU A 15 46.383 15.029 22.132 1.00 0.00 H +ATOM 267 N LYS A 16 47.015 20.051 21.389 1.00 0.00 N +ATOM 268 CA LYS A 16 46.708 21.436 21.780 1.00 0.00 C +ATOM 269 C LYS A 16 45.647 21.964 20.836 1.00 0.00 C +ATOM 270 O LYS A 16 45.673 21.516 19.697 1.00 0.00 O +ATOM 271 CB LYS A 16 48.009 22.241 21.801 1.00 0.00 C +ATOM 272 CG LYS A 16 47.832 23.733 21.621 1.00 0.00 C +ATOM 273 CD LYS A 16 48.147 24.536 22.878 1.00 0.00 C +ATOM 274 CE LYS A 16 46.887 25.089 23.559 1.00 0.00 C +ATOM 275 NZ LYS A 16 47.181 26.099 24.609 1.00 0.00 N1+ +ATOM 276 H LYS A 16 47.270 19.851 20.443 1.00 0.00 H +ATOM 277 HA LYS A 16 46.329 21.425 22.705 1.00 0.00 H +ATOM 278 HB2 LYS A 16 48.595 21.906 21.063 1.00 0.00 H +ATOM 279 HB3 LYS A 16 48.458 22.084 22.681 1.00 0.00 H +ATOM 280 HG2 LYS A 16 46.883 23.911 21.361 1.00 0.00 H +ATOM 281 HG3 LYS A 16 48.441 24.038 20.889 1.00 0.00 H +ATOM 282 HD2 LYS A 16 48.738 25.303 22.628 1.00 0.00 H +ATOM 283 HD3 LYS A 16 48.626 23.943 23.525 1.00 0.00 H +ATOM 284 HE2 LYS A 16 46.394 24.328 23.980 1.00 0.00 H +ATOM 285 HE3 LYS A 16 46.310 25.515 22.862 1.00 0.00 H +ATOM 286 HZ1 LYS A 16 46.744 26.966 24.369 1.00 0.00 H +ATOM 287 HZ2 LYS A 16 46.827 25.779 25.488 1.00 0.00 H +ATOM 288 HZ3 LYS A 16 48.170 26.232 24.676 1.00 0.00 H +ATOM 289 N ILE A 17 44.685 22.822 21.285 1.00 0.00 N +ATOM 290 CA ILE A 17 43.607 23.297 20.400 1.00 0.00 C +ATOM 291 C ILE A 17 44.163 23.749 19.075 1.00 0.00 C +ATOM 292 O ILE A 17 45.220 24.375 19.087 1.00 0.00 O +ATOM 293 CB ILE A 17 42.789 24.435 21.027 1.00 0.00 C +ATOM 294 CG1 ILE A 17 42.046 23.902 22.247 1.00 0.00 C +ATOM 295 CG2 ILE A 17 41.792 25.056 20.026 1.00 0.00 C +ATOM 296 CD1 ILE A 17 41.103 24.937 22.842 1.00 0.00 C +ATOM 297 H ILE A 17 44.712 23.135 22.234 1.00 0.00 H +ATOM 298 HA ILE A 17 42.988 22.530 20.229 1.00 0.00 H +ATOM 299 HB ILE A 17 43.421 25.149 21.329 1.00 0.00 H +ATOM 300 HG12 ILE A 17 42.715 23.638 22.942 1.00 0.00 H +ATOM 301 HG13 ILE A 17 41.514 23.100 21.975 1.00 0.00 H +ATOM 302 HG21 ILE A 17 41.283 25.790 20.475 1.00 0.00 H +ATOM 303 HG22 ILE A 17 42.293 25.427 19.244 1.00 0.00 H +ATOM 304 HG23 ILE A 17 41.155 24.353 19.710 1.00 0.00 H +ATOM 305 HD11 ILE A 17 40.638 24.547 23.637 1.00 0.00 H +ATOM 306 HD12 ILE A 17 41.626 25.742 23.123 1.00 0.00 H +ATOM 307 HD13 ILE A 17 40.425 25.203 22.157 1.00 0.00 H +ATOM 308 N TYR A 18 43.535 23.422 17.955 1.00 0.00 N +ATOM 309 CA TYR A 18 44.045 23.872 16.666 1.00 0.00 C +ATOM 310 C TYR A 18 42.889 24.158 15.776 1.00 0.00 C +ATOM 311 O TYR A 18 41.730 23.848 16.121 1.00 0.00 O +ATOM 312 CB TYR A 18 45.041 22.891 15.991 1.00 0.00 C +ATOM 313 CG TYR A 18 44.361 21.618 15.572 1.00 0.00 C +ATOM 314 CD1 TYR A 18 44.131 20.630 16.525 1.00 0.00 C +ATOM 315 CD2 TYR A 18 43.928 21.420 14.259 1.00 0.00 C +ATOM 316 CE1 TYR A 18 43.477 19.449 16.165 1.00 0.00 C +ATOM 317 CE2 TYR A 18 43.295 20.241 13.873 1.00 0.00 C +ATOM 318 CZ TYR A 18 43.064 19.266 14.846 1.00 0.00 C +ATOM 319 OH TYR A 18 42.481 18.075 14.502 1.00 0.00 O +ATOM 320 H TYR A 18 42.707 22.863 17.994 1.00 0.00 H +ATOM 321 HA TYR A 18 44.528 24.734 16.818 1.00 0.00 H +ATOM 322 HB2 TYR A 18 45.771 22.672 16.639 1.00 0.00 H +ATOM 323 HB3 TYR A 18 45.433 23.331 15.183 1.00 0.00 H +ATOM 324 HD1 TYR A 18 44.434 20.766 17.468 1.00 0.00 H +ATOM 325 HD2 TYR A 18 44.076 22.140 13.581 1.00 0.00 H +ATOM 326 HE1 TYR A 18 43.306 18.740 16.849 1.00 0.00 H +ATOM 327 HE2 TYR A 18 43.013 20.096 12.924 1.00 0.00 H +ATOM 328 HH TYR A 18 42.177 17.920 13.562 1.00 0.00 H +ATOM 329 N LYS A 19 43.181 24.761 14.644 1.00 0.00 N +ATOM 330 CA LYS A 19 42.100 25.017 13.730 1.00 0.00 C +ATOM 331 C LYS A 19 42.106 23.969 12.668 1.00 0.00 C +ATOM 332 O LYS A 19 43.183 23.620 12.162 1.00 0.00 O +ATOM 333 CB LYS A 19 42.189 26.386 13.078 1.00 0.00 C +ATOM 334 CG LYS A 19 41.893 27.487 14.044 1.00 0.00 C +ATOM 335 CD LYS A 19 41.374 28.731 13.368 1.00 0.00 C +ATOM 336 CE LYS A 19 41.737 29.991 14.136 1.00 0.00 C +ATOM 337 NZ LYS A 19 41.380 31.273 13.461 1.00 0.00 N1+ +ATOM 338 H LYS A 19 44.119 25.031 14.427 1.00 0.00 H +ATOM 339 HA LYS A 19 41.237 24.958 14.232 1.00 0.00 H +ATOM 340 HB2 LYS A 19 41.530 26.429 12.327 1.00 0.00 H +ATOM 341 HB3 LYS A 19 43.113 26.512 12.718 1.00 0.00 H +ATOM 342 HG2 LYS A 19 42.734 27.717 14.535 1.00 0.00 H +ATOM 343 HG3 LYS A 19 41.205 27.166 14.694 1.00 0.00 H +ATOM 344 HD2 LYS A 19 40.378 28.670 13.300 1.00 0.00 H +ATOM 345 HD3 LYS A 19 41.768 28.788 12.450 1.00 0.00 H +ATOM 346 HE2 LYS A 19 42.725 29.986 14.288 1.00 0.00 H +ATOM 347 HE3 LYS A 19 41.264 29.963 15.017 1.00 0.00 H +ATOM 348 HZ1 LYS A 19 40.747 31.789 14.039 1.00 0.00 H +ATOM 349 HZ2 LYS A 19 42.209 31.812 13.310 1.00 0.00 H +ATOM 350 HZ3 LYS A 19 40.945 31.077 12.582 1.00 0.00 H +ATOM 351 N ASP A 20 40.913 23.515 12.339 1.00 0.00 N +ATOM 352 CA ASP A 20 40.772 22.504 11.330 1.00 0.00 C +ATOM 353 C ASP A 20 40.852 23.066 9.911 1.00 0.00 C +ATOM 354 O ASP A 20 41.129 24.248 9.713 1.00 0.00 O +ATOM 355 CB ASP A 20 39.586 21.575 11.611 1.00 0.00 C +ATOM 356 CG ASP A 20 38.238 22.054 11.192 1.00 0.00 C +ATOM 357 OD1 ASP A 20 38.244 23.261 10.763 1.00 0.00 O +ATOM 358 OD2 ASP A 20 37.238 21.365 11.231 1.00 0.00 O1- +ATOM 359 H ASP A 20 40.101 23.878 12.796 1.00 0.00 H +ATOM 360 HA ASP A 20 41.583 21.926 11.426 1.00 0.00 H +ATOM 361 HB2 ASP A 20 39.556 21.414 12.597 1.00 0.00 H +ATOM 362 HB3 ASP A 20 39.760 20.712 11.137 1.00 0.00 H +ATOM 363 N THR A 21 40.591 22.249 8.909 1.00 0.00 N +ATOM 364 CA THR A 21 40.721 22.757 7.555 1.00 0.00 C +ATOM 365 C THR A 21 39.731 23.806 7.224 1.00 0.00 C +ATOM 366 O THR A 21 39.948 24.545 6.255 1.00 0.00 O +ATOM 367 CB THR A 21 40.641 21.676 6.486 1.00 0.00 C +ATOM 368 CG2 THR A 21 41.479 20.479 6.931 1.00 0.00 C +ATOM 369 OG1 THR A 21 39.297 21.284 6.382 1.00 0.00 O +ATOM 370 H THR A 21 40.311 21.304 9.077 1.00 0.00 H +ATOM 371 HA THR A 21 41.627 23.175 7.483 1.00 0.00 H +ATOM 372 HB THR A 21 40.971 22.027 5.610 1.00 0.00 H +ATOM 373 HG1 THR A 21 38.706 22.057 6.611 1.00 0.00 H +ATOM 374 HG21 THR A 21 41.433 19.763 6.235 1.00 0.00 H +ATOM 375 HG22 THR A 21 42.430 20.765 7.053 1.00 0.00 H +ATOM 376 HG23 THR A 21 41.123 20.126 7.796 1.00 0.00 H +ATOM 377 N GLU A 22 38.658 23.848 8.002 1.00 0.00 N +ATOM 378 CA GLU A 22 37.607 24.826 7.752 1.00 0.00 C +ATOM 379 C GLU A 22 37.802 26.042 8.608 1.00 0.00 C +ATOM 380 O GLU A 22 37.086 27.000 8.472 1.00 0.00 O +ATOM 381 CB GLU A 22 36.229 24.245 8.029 1.00 0.00 C +ATOM 382 CG GLU A 22 35.803 23.119 7.062 1.00 0.00 C +ATOM 383 CD GLU A 22 35.537 23.554 5.641 1.00 0.00 C +ATOM 384 OE1 GLU A 22 34.990 24.737 5.534 1.00 0.00 O +ATOM 385 OE2 GLU A 22 35.788 22.854 4.684 1.00 0.00 O1- +ATOM 386 H GLU A 22 38.570 23.206 8.763 1.00 0.00 H +ATOM 387 HA GLU A 22 37.650 25.102 6.792 1.00 0.00 H +ATOM 388 HB2 GLU A 22 35.559 24.984 7.962 1.00 0.00 H +ATOM 389 HB3 GLU A 22 36.227 23.876 8.958 1.00 0.00 H +ATOM 390 HG2 GLU A 22 34.966 22.705 7.420 1.00 0.00 H +ATOM 391 HG3 GLU A 22 36.532 22.435 7.044 1.00 0.00 H +ATOM 392 N GLY A 23 38.802 25.975 9.498 1.00 0.00 N +ATOM 393 CA GLY A 23 39.125 27.029 10.418 1.00 0.00 C +ATOM 394 C GLY A 23 38.453 26.867 11.772 1.00 0.00 C +ATOM 395 O GLY A 23 38.416 27.826 12.506 1.00 0.00 O +ATOM 396 H GLY A 23 39.355 25.142 9.523 1.00 0.00 H +ATOM 397 HA2 GLY A 23 38.833 27.899 10.020 1.00 0.00 H +ATOM 398 HA3 GLY A 23 40.116 27.040 10.554 1.00 0.00 H +ATOM 399 N TYR A 24 37.953 25.681 12.130 1.00 0.00 N +ATOM 400 CA TYR A 24 37.311 25.534 13.435 1.00 0.00 C +ATOM 401 C TYR A 24 38.194 24.930 14.469 1.00 0.00 C +ATOM 402 O TYR A 24 39.019 24.051 14.196 1.00 0.00 O +ATOM 403 CB TYR A 24 36.048 24.689 13.435 1.00 0.00 C +ATOM 404 CG TYR A 24 35.055 25.172 12.447 1.00 0.00 C +ATOM 405 CD1 TYR A 24 34.659 26.507 12.443 1.00 0.00 C +ATOM 406 CD2 TYR A 24 34.486 24.293 11.532 1.00 0.00 C +ATOM 407 CE1 TYR A 24 33.697 26.962 11.544 1.00 0.00 C +ATOM 408 CE2 TYR A 24 33.549 24.738 10.605 1.00 0.00 C +ATOM 409 CZ TYR A 24 33.155 26.077 10.613 1.00 0.00 C +ATOM 410 OH TYR A 24 32.235 26.533 9.711 1.00 0.00 O +ATOM 411 H TYR A 24 38.017 24.899 11.510 1.00 0.00 H +ATOM 412 HA TYR A 24 37.060 26.449 13.751 1.00 0.00 H +ATOM 413 HB2 TYR A 24 35.638 24.722 14.347 1.00 0.00 H +ATOM 414 HB3 TYR A 24 36.292 23.745 13.212 1.00 0.00 H +ATOM 415 HD1 TYR A 24 35.070 27.146 13.093 1.00 0.00 H +ATOM 416 HD2 TYR A 24 34.754 23.329 11.540 1.00 0.00 H +ATOM 417 HE1 TYR A 24 33.398 27.916 11.566 1.00 0.00 H +ATOM 418 HE2 TYR A 24 33.160 24.103 9.937 1.00 0.00 H +ATOM 419 HH TYR A 24 31.840 25.906 9.039 1.00 0.00 H +ATOM 420 N TYR A 25 37.986 25.431 15.671 1.00 0.00 N +ATOM 421 CA TYR A 25 38.655 24.959 16.849 1.00 0.00 C +ATOM 422 C TYR A 25 38.376 23.476 17.054 1.00 0.00 C +ATOM 423 O TYR A 25 37.220 23.074 17.179 1.00 0.00 O +ATOM 424 CB TYR A 25 38.266 25.826 18.083 1.00 0.00 C +ATOM 425 CG TYR A 25 38.866 27.223 17.996 1.00 0.00 C +ATOM 426 CD1 TYR A 25 40.242 27.370 17.843 1.00 0.00 C +ATOM 427 CD2 TYR A 25 38.084 28.379 18.072 1.00 0.00 C +ATOM 428 CE1 TYR A 25 40.823 28.632 17.735 1.00 0.00 C +ATOM 429 CE2 TYR A 25 38.646 29.655 17.965 1.00 0.00 C +ATOM 430 CZ TYR A 25 40.021 29.774 17.828 1.00 0.00 C +ATOM 431 OH TYR A 25 40.604 31.010 17.739 1.00 0.00 O +ATOM 432 H TYR A 25 37.328 26.178 15.766 1.00 0.00 H +ATOM 433 HA TYR A 25 39.638 25.065 16.702 1.00 0.00 H +ATOM 434 HB2 TYR A 25 38.602 25.379 18.912 1.00 0.00 H +ATOM 435 HB3 TYR A 25 37.270 25.902 18.125 1.00 0.00 H +ATOM 436 HD1 TYR A 25 40.823 26.557 17.810 1.00 0.00 H +ATOM 437 HD2 TYR A 25 37.097 28.291 18.206 1.00 0.00 H +ATOM 438 HE1 TYR A 25 41.809 28.721 17.592 1.00 0.00 H +ATOM 439 HE2 TYR A 25 38.066 30.469 17.987 1.00 0.00 H +ATOM 440 HH TYR A 25 41.592 31.088 17.609 1.00 0.00 H +ATOM 441 N THR A 26 39.483 22.696 17.027 1.00 0.00 N +ATOM 442 CA THR A 26 39.472 21.238 17.137 1.00 0.00 C +ATOM 443 C THR A 26 40.582 20.830 18.109 1.00 0.00 C +ATOM 444 O THR A 26 41.452 21.633 18.378 1.00 0.00 O +ATOM 445 CB THR A 26 39.771 20.705 15.687 1.00 0.00 C +ATOM 446 CG2 THR A 26 39.882 19.191 15.535 1.00 0.00 C +ATOM 447 OG1 THR A 26 38.818 21.190 14.795 1.00 0.00 O +ATOM 448 H THR A 26 40.369 23.148 16.925 1.00 0.00 H +ATOM 449 HA THR A 26 38.582 20.913 17.458 1.00 0.00 H +ATOM 450 HB THR A 26 40.651 21.091 15.411 1.00 0.00 H +ATOM 451 HG1 THR A 26 38.164 21.766 15.286 1.00 0.00 H +ATOM 452 HG21 THR A 26 40.072 18.965 14.580 1.00 0.00 H +ATOM 453 HG22 THR A 26 40.625 18.852 16.112 1.00 0.00 H +ATOM 454 HG23 THR A 26 39.022 18.764 15.814 1.00 0.00 H +ATOM 455 N ILE A 27 40.590 19.602 18.636 1.00 0.00 N +ATOM 456 CA ILE A 27 41.647 19.066 19.488 1.00 0.00 C +ATOM 457 C ILE A 27 41.678 17.543 19.260 1.00 0.00 C +ATOM 458 O ILE A 27 40.697 16.964 18.751 1.00 0.00 O +ATOM 459 CB ILE A 27 41.436 19.422 20.971 1.00 0.00 C +ATOM 460 CG1 ILE A 27 42.691 19.176 21.819 1.00 0.00 C +ATOM 461 CG2 ILE A 27 40.252 18.616 21.503 1.00 0.00 C +ATOM 462 CD1 ILE A 27 43.034 20.298 22.758 1.00 0.00 C +ATOM 463 H ILE A 27 39.814 19.006 18.431 1.00 0.00 H +ATOM 464 HA ILE A 27 42.521 19.450 19.190 1.00 0.00 H +ATOM 465 HB ILE A 27 41.205 20.393 21.030 1.00 0.00 H +ATOM 466 HG12 ILE A 27 43.465 19.038 21.200 1.00 0.00 H +ATOM 467 HG13 ILE A 27 42.545 18.348 22.361 1.00 0.00 H +ATOM 468 HG21 ILE A 27 40.104 18.838 22.467 1.00 0.00 H +ATOM 469 HG22 ILE A 27 39.431 18.843 20.979 1.00 0.00 H +ATOM 470 HG23 ILE A 27 40.446 17.639 21.412 1.00 0.00 H +ATOM 471 HD11 ILE A 27 43.859 20.062 23.272 1.00 0.00 H +ATOM 472 HD12 ILE A 27 43.195 21.134 22.234 1.00 0.00 H +ATOM 473 HD13 ILE A 27 42.276 20.444 23.394 1.00 0.00 H +ATOM 474 N GLY A 28 42.767 16.884 19.618 1.00 0.00 N +ATOM 475 CA GLY A 28 42.837 15.417 19.536 1.00 0.00 C +ATOM 476 C GLY A 28 42.808 14.845 18.133 1.00 0.00 C +ATOM 477 O GLY A 28 43.586 15.262 17.289 1.00 0.00 O +ATOM 478 H GLY A 28 43.560 17.394 19.952 1.00 0.00 H +ATOM 479 HA2 GLY A 28 42.058 15.042 20.039 1.00 0.00 H +ATOM 480 HA3 GLY A 28 43.688 15.123 19.972 1.00 0.00 H +ATOM 481 N ILE A 29 41.957 13.840 17.922 1.00 0.00 N +ATOM 482 CA ILE A 29 41.831 13.198 16.635 1.00 0.00 C +ATOM 483 C ILE A 29 40.600 13.652 15.897 1.00 0.00 C +ATOM 484 O ILE A 29 39.627 12.922 15.734 1.00 0.00 O +ATOM 485 CB ILE A 29 41.887 11.675 16.745 1.00 0.00 C +ATOM 486 CG1 ILE A 29 43.189 11.241 17.409 1.00 0.00 C +ATOM 487 CG2 ILE A 29 41.884 11.099 15.340 1.00 0.00 C +ATOM 488 CD1 ILE A 29 43.079 9.984 18.253 1.00 0.00 C +ATOM 489 H ILE A 29 41.388 13.521 18.680 1.00 0.00 H +ATOM 490 HA ILE A 29 42.620 13.481 16.089 1.00 0.00 H +ATOM 491 HB ILE A 29 41.102 11.334 17.262 1.00 0.00 H +ATOM 492 HG12 ILE A 29 43.502 11.986 17.998 1.00 0.00 H +ATOM 493 HG13 ILE A 29 43.866 11.077 16.691 1.00 0.00 H +ATOM 494 HG21 ILE A 29 41.920 10.101 15.389 1.00 0.00 H +ATOM 495 HG22 ILE A 29 41.049 11.379 14.867 1.00 0.00 H +ATOM 496 HG23 ILE A 29 42.681 11.437 14.839 1.00 0.00 H +ATOM 497 HD11 ILE A 29 43.971 9.770 18.650 1.00 0.00 H +ATOM 498 HD12 ILE A 29 42.415 10.132 18.986 1.00 0.00 H +ATOM 499 HD13 ILE A 29 42.778 9.222 17.679 1.00 0.00 H +ATOM 500 N GLY A 30 40.643 14.898 15.455 1.00 0.00 N +ATOM 501 CA GLY A 30 39.510 15.413 14.721 1.00 0.00 C +ATOM 502 C GLY A 30 38.278 15.720 15.570 1.00 0.00 C +ATOM 503 O GLY A 30 37.159 15.738 15.072 1.00 0.00 O +ATOM 504 H GLY A 30 41.444 15.472 15.625 1.00 0.00 H +ATOM 505 HA2 GLY A 30 39.252 14.735 14.033 1.00 0.00 H +ATOM 506 HA3 GLY A 30 39.792 16.258 14.267 1.00 0.00 H +ATOM 507 N HIS A 31 38.456 16.020 16.845 1.00 0.00 N +ATOM 508 CA HIS A 31 37.278 16.327 17.647 1.00 0.00 C +ATOM 509 C HIS A 31 36.906 17.797 17.524 1.00 0.00 C +ATOM 510 O HIS A 31 37.581 18.662 18.150 1.00 0.00 O +ATOM 511 CB HIS A 31 37.519 15.962 19.138 1.00 0.00 C +ATOM 512 CG HIS A 31 36.299 16.200 19.977 1.00 0.00 C +ATOM 513 CD2 HIS A 31 35.982 17.242 20.831 1.00 0.00 C +ATOM 514 ND1 HIS A 31 35.223 15.326 19.973 1.00 0.00 N +ATOM 515 CE1 HIS A 31 34.288 15.829 20.776 1.00 0.00 C +ATOM 516 NE2 HIS A 31 34.720 16.984 21.307 1.00 0.00 N +ATOM 517 H HIS A 31 39.371 16.036 17.247 1.00 0.00 H +ATOM 518 HA HIS A 31 36.514 15.779 17.308 1.00 0.00 H +ATOM 519 HB2 HIS A 31 38.268 16.522 19.491 1.00 0.00 H +ATOM 520 HB3 HIS A 31 37.769 14.996 19.198 1.00 0.00 H +ATOM 521 HD1 HIS A 31 35.160 14.471 19.459 1.00 0.00 H +ATOM 522 HD2 HIS A 31 36.558 18.028 21.057 1.00 0.00 H +ATOM 523 HE1 HIS A 31 33.398 15.410 20.956 1.00 0.00 H +ATOM 524 HE2 HIS A 31 34.208 17.561 21.943 1.00 0.00 H +ATOM 525 N LEU A 32 35.868 18.122 16.745 1.00 0.00 N +ATOM 526 CA LEU A 32 35.424 19.499 16.602 1.00 0.00 C +ATOM 527 C LEU A 32 34.976 20.045 17.964 1.00 0.00 C +ATOM 528 O LEU A 32 34.216 19.449 18.719 1.00 0.00 O +ATOM 529 CB LEU A 32 34.287 19.581 15.577 1.00 0.00 C +ATOM 530 CG LEU A 32 33.682 20.976 15.459 1.00 0.00 C +ATOM 531 CD1 LEU A 32 34.747 21.958 15.002 1.00 0.00 C +ATOM 532 CD2 LEU A 32 32.569 20.989 14.439 1.00 0.00 C +ATOM 533 H LEU A 32 35.386 17.400 16.249 1.00 0.00 H +ATOM 534 HA LEU A 32 36.191 20.050 16.273 1.00 0.00 H +ATOM 535 HB2 LEU A 32 33.566 18.944 15.851 1.00 0.00 H +ATOM 536 HB3 LEU A 32 34.646 19.314 14.683 1.00 0.00 H +ATOM 537 HG LEU A 32 33.324 21.261 16.348 1.00 0.00 H +ATOM 538 HD11 LEU A 32 34.347 22.871 14.926 1.00 0.00 H +ATOM 539 HD12 LEU A 32 35.493 21.975 15.668 1.00 0.00 H +ATOM 540 HD13 LEU A 32 35.102 21.674 14.111 1.00 0.00 H +ATOM 541 HD21 LEU A 32 32.185 21.910 14.376 1.00 0.00 H +ATOM 542 HD22 LEU A 32 32.931 20.717 13.547 1.00 0.00 H +ATOM 543 HD23 LEU A 32 31.854 20.349 14.718 1.00 0.00 H +ATOM 544 N LEU A 33 35.461 21.180 18.344 1.00 0.00 N +ATOM 545 CA LEU A 33 35.025 21.681 19.619 1.00 0.00 C +ATOM 546 C LEU A 33 33.848 22.660 19.482 1.00 0.00 C +ATOM 547 O LEU A 33 32.879 22.609 20.244 1.00 0.00 O +ATOM 548 CB LEU A 33 36.199 22.393 20.317 1.00 0.00 C +ATOM 549 CG LEU A 33 37.242 21.463 20.913 1.00 0.00 C +ATOM 550 CD1 LEU A 33 38.384 22.324 21.390 1.00 0.00 C +ATOM 551 CD2 LEU A 33 36.667 20.723 22.113 1.00 0.00 C +ATOM 552 H LEU A 33 36.110 21.687 17.777 1.00 0.00 H +ATOM 553 HA LEU A 33 34.736 20.909 20.185 1.00 0.00 H +ATOM 554 HB2 LEU A 33 35.827 22.957 21.054 1.00 0.00 H +ATOM 555 HB3 LEU A 33 36.652 22.979 19.645 1.00 0.00 H +ATOM 556 HG LEU A 33 37.562 20.812 20.224 1.00 0.00 H +ATOM 557 HD11 LEU A 33 39.094 21.744 21.791 1.00 0.00 H +ATOM 558 HD12 LEU A 33 38.765 22.831 20.617 1.00 0.00 H +ATOM 559 HD13 LEU A 33 38.051 22.968 22.079 1.00 0.00 H +ATOM 560 HD21 LEU A 33 37.363 20.115 22.495 1.00 0.00 H +ATOM 561 HD22 LEU A 33 36.384 21.384 22.808 1.00 0.00 H +ATOM 562 HD23 LEU A 33 35.876 20.184 21.824 1.00 0.00 H +ATOM 563 N THR A 34 33.987 23.592 18.521 1.00 0.00 N +ATOM 564 CA THR A 34 32.986 24.642 18.256 1.00 0.00 C +ATOM 565 C THR A 34 33.221 25.336 16.932 1.00 0.00 C +ATOM 566 O THR A 34 34.380 25.468 16.510 1.00 0.00 O +ATOM 567 CB THR A 34 33.033 25.769 19.344 1.00 0.00 C +ATOM 568 CG2 THR A 34 34.398 26.431 19.470 1.00 0.00 C +ATOM 569 OG1 THR A 34 32.100 26.789 19.087 1.00 0.00 O +ATOM 570 H THR A 34 34.813 23.571 17.957 1.00 0.00 H +ATOM 571 HA THR A 34 32.075 24.230 18.252 1.00 0.00 H +ATOM 572 HB THR A 34 32.806 25.357 20.226 1.00 0.00 H +ATOM 573 HG1 THR A 34 31.801 27.193 19.952 1.00 0.00 H +ATOM 574 HG21 THR A 34 34.362 27.137 20.177 1.00 0.00 H +ATOM 575 HG22 THR A 34 35.080 25.744 19.720 1.00 0.00 H +ATOM 576 HG23 THR A 34 34.649 26.847 18.596 1.00 0.00 H +ATOM 577 N LYS A 35 32.148 25.842 16.314 1.00 0.00 N +ATOM 578 CA LYS A 35 32.293 26.619 15.096 1.00 0.00 C +ATOM 579 C LYS A 35 32.444 28.121 15.358 1.00 0.00 C +ATOM 580 O LYS A 35 32.611 28.885 14.434 1.00 0.00 O +ATOM 581 CB LYS A 35 31.229 26.378 14.104 1.00 0.00 C +ATOM 582 CG LYS A 35 31.191 24.899 13.772 1.00 0.00 C +ATOM 583 CD LYS A 35 30.131 24.557 12.782 1.00 0.00 C +ATOM 584 CE LYS A 35 30.071 23.077 12.513 1.00 0.00 C +ATOM 585 NZ LYS A 35 29.787 22.724 11.102 1.00 0.00 N1+ +ATOM 586 H LYS A 35 31.237 25.684 16.695 1.00 0.00 H +ATOM 587 HA LYS A 35 33.147 26.320 14.671 1.00 0.00 H +ATOM 588 HB2 LYS A 35 31.419 26.903 13.274 1.00 0.00 H +ATOM 589 HB3 LYS A 35 30.347 26.660 14.483 1.00 0.00 H +ATOM 590 HG2 LYS A 35 31.020 24.387 14.614 1.00 0.00 H +ATOM 591 HG3 LYS A 35 32.078 24.633 13.395 1.00 0.00 H +ATOM 592 HD2 LYS A 35 30.323 25.034 11.924 1.00 0.00 H +ATOM 593 HD3 LYS A 35 29.246 24.857 13.139 1.00 0.00 H +ATOM 594 HE2 LYS A 35 29.351 22.684 13.085 1.00 0.00 H +ATOM 595 HE3 LYS A 35 30.952 22.677 12.764 1.00 0.00 H +ATOM 596 HZ1 LYS A 35 29.764 21.729 11.006 1.00 0.00 H +ATOM 597 HZ2 LYS A 35 28.902 23.106 10.834 1.00 0.00 H +ATOM 598 HZ3 LYS A 35 30.503 23.099 10.514 1.00 0.00 H +ATOM 599 N SER A 36 32.383 28.507 16.622 1.00 0.00 N +ATOM 600 CA SER A 36 32.532 29.893 17.028 1.00 0.00 C +ATOM 601 C SER A 36 33.987 30.315 16.900 1.00 0.00 C +ATOM 602 O SER A 36 34.918 29.529 17.107 1.00 0.00 O +ATOM 603 CB SER A 36 32.048 30.129 18.454 1.00 0.00 C +ATOM 604 OG SER A 36 33.007 30.894 19.157 1.00 0.00 O +ATOM 605 H SER A 36 32.228 27.815 17.327 1.00 0.00 H +ATOM 606 HA SER A 36 31.985 30.461 16.413 1.00 0.00 H +ATOM 607 HB2 SER A 36 31.922 29.250 18.913 1.00 0.00 H +ATOM 608 HB3 SER A 36 31.178 30.622 18.433 1.00 0.00 H +ATOM 609 HG SER A 36 32.589 31.748 19.468 1.00 0.00 H +ATOM 610 N PRO A 37 34.200 31.589 16.582 1.00 0.00 N +ATOM 611 CA PRO A 37 35.528 32.147 16.378 1.00 0.00 C +ATOM 612 C PRO A 37 36.327 32.364 17.654 1.00 0.00 C +ATOM 613 O PRO A 37 37.517 32.682 17.626 1.00 0.00 O +ATOM 614 CB PRO A 37 35.285 33.473 15.664 1.00 0.00 C +ATOM 615 CG PRO A 37 33.907 33.383 15.040 1.00 0.00 C +ATOM 616 CD PRO A 37 33.162 32.324 15.811 1.00 0.00 C +ATOM 617 HA PRO A 37 36.044 31.542 15.771 1.00 0.00 H +ATOM 618 HB2 PRO A 37 35.319 34.228 16.318 1.00 0.00 H +ATOM 619 HB3 PRO A 37 35.976 33.615 14.955 1.00 0.00 H +ATOM 620 HG2 PRO A 37 33.435 34.262 15.114 1.00 0.00 H +ATOM 621 HG3 PRO A 37 33.979 33.124 14.077 1.00 0.00 H +ATOM 622 HD2 PRO A 37 32.499 32.744 16.430 1.00 0.00 H +ATOM 623 HD3 PRO A 37 32.688 31.705 15.185 1.00 0.00 H +ATOM 624 N SER A 38 35.658 32.152 18.774 1.00 0.00 N +ATOM 625 CA SER A 38 36.266 32.383 20.065 1.00 0.00 C +ATOM 626 C SER A 38 37.049 31.257 20.656 1.00 0.00 C +ATOM 627 O SER A 38 36.532 30.169 20.948 1.00 0.00 O +ATOM 628 CB SER A 38 35.236 32.920 21.057 1.00 0.00 C +ATOM 629 OG SER A 38 35.898 33.065 22.327 1.00 0.00 O +ATOM 630 H SER A 38 34.714 31.826 18.727 1.00 0.00 H +ATOM 631 HA SER A 38 36.922 33.125 19.927 1.00 0.00 H +ATOM 632 HB2 SER A 38 34.474 32.278 21.140 1.00 0.00 H +ATOM 633 HB3 SER A 38 34.893 33.807 20.747 1.00 0.00 H +ATOM 634 HG SER A 38 35.860 34.022 22.615 1.00 0.00 H +ATOM 635 N LEU A 39 38.306 31.581 20.913 1.00 0.00 N +ATOM 636 CA LEU A 39 39.160 30.610 21.507 1.00 0.00 C +ATOM 637 C LEU A 39 38.685 30.309 22.910 1.00 0.00 C +ATOM 638 O LEU A 39 38.960 29.279 23.522 1.00 0.00 O +ATOM 639 CB LEU A 39 40.647 30.982 21.418 1.00 0.00 C +ATOM 640 CG LEU A 39 41.487 29.947 22.142 1.00 0.00 C +ATOM 641 CD1 LEU A 39 41.447 28.628 21.386 1.00 0.00 C +ATOM 642 CD2 LEU A 39 42.907 30.451 22.271 1.00 0.00 C +ATOM 643 H LEU A 39 38.650 32.494 20.693 1.00 0.00 H +ATOM 644 HA LEU A 39 39.045 29.768 20.980 1.00 0.00 H +ATOM 645 HB2 LEU A 39 40.790 31.878 21.839 1.00 0.00 H +ATOM 646 HB3 LEU A 39 40.922 31.018 20.457 1.00 0.00 H +ATOM 647 HG LEU A 39 41.109 29.807 23.057 1.00 0.00 H +ATOM 648 HD11 LEU A 39 42.002 27.950 21.868 1.00 0.00 H +ATOM 649 HD12 LEU A 39 40.502 28.305 21.329 1.00 0.00 H +ATOM 650 HD13 LEU A 39 41.810 28.761 20.464 1.00 0.00 H +ATOM 651 HD21 LEU A 39 43.461 29.769 22.748 1.00 0.00 H +ATOM 652 HD22 LEU A 39 43.288 30.612 21.360 1.00 0.00 H +ATOM 653 HD23 LEU A 39 42.911 31.306 22.790 1.00 0.00 H +ATOM 654 N ASN A 40 37.941 31.227 23.459 1.00 0.00 N +ATOM 655 CA ASN A 40 37.459 30.952 24.792 1.00 0.00 C +ATOM 656 C ASN A 40 36.267 30.047 24.772 1.00 0.00 C +ATOM 657 O ASN A 40 36.145 29.189 25.623 1.00 0.00 O +ATOM 658 CB ASN A 40 37.213 32.214 25.617 1.00 0.00 C +ATOM 659 CG ASN A 40 38.424 33.116 25.635 1.00 0.00 C +ATOM 660 ND2 ASN A 40 38.397 34.140 24.783 1.00 0.00 N +ATOM 661 OD1 ASN A 40 39.371 32.893 26.415 1.00 0.00 O +ATOM 662 H ASN A 40 37.716 32.077 22.982 1.00 0.00 H +ATOM 663 HA ASN A 40 38.187 30.449 25.257 1.00 0.00 H +ATOM 664 HB2 ASN A 40 36.992 31.949 26.556 1.00 0.00 H +ATOM 665 HB3 ASN A 40 36.442 32.714 25.222 1.00 0.00 H +ATOM 666 HD21 ASN A 40 37.609 34.269 24.181 1.00 0.00 H +ATOM 667 HD22 ASN A 40 39.164 34.780 24.746 1.00 0.00 H +ATOM 668 N ALA A 41 35.381 30.254 23.789 1.00 0.00 N +ATOM 669 CA ALA A 41 34.251 29.364 23.692 1.00 0.00 C +ATOM 670 C ALA A 41 34.809 27.944 23.486 1.00 0.00 C +ATOM 671 O ALA A 41 34.354 26.993 24.106 1.00 0.00 O +ATOM 672 CB ALA A 41 33.267 29.799 22.625 1.00 0.00 C +ATOM 673 H ALA A 41 35.500 31.005 23.140 1.00 0.00 H +ATOM 674 HA ALA A 41 33.774 29.380 24.571 1.00 0.00 H +ATOM 675 HB1 ALA A 41 32.503 29.155 22.594 1.00 0.00 H +ATOM 676 HB2 ALA A 41 32.924 30.713 22.841 1.00 0.00 H +ATOM 677 HB3 ALA A 41 33.725 29.816 21.736 1.00 0.00 H +ATOM 678 N ALA A 42 35.885 27.843 22.679 1.00 0.00 N +ATOM 679 CA ALA A 42 36.550 26.572 22.425 1.00 0.00 C +ATOM 680 C ALA A 42 37.162 26.051 23.687 1.00 0.00 C +ATOM 681 O ALA A 42 37.089 24.846 23.988 1.00 0.00 O +ATOM 682 CB ALA A 42 37.676 26.701 21.398 1.00 0.00 C +ATOM 683 H ALA A 42 36.238 28.669 22.240 1.00 0.00 H +ATOM 684 HA ALA A 42 35.877 25.912 22.091 1.00 0.00 H +ATOM 685 HB1 ALA A 42 38.102 25.807 21.256 1.00 0.00 H +ATOM 686 HB2 ALA A 42 37.301 27.033 20.532 1.00 0.00 H +ATOM 687 HB3 ALA A 42 38.361 27.347 21.734 1.00 0.00 H +ATOM 688 N LYS A 43 37.782 26.924 24.440 1.00 0.00 N +ATOM 689 CA LYS A 43 38.361 26.453 25.685 1.00 0.00 C +ATOM 690 C LYS A 43 37.291 25.931 26.656 1.00 0.00 C +ATOM 691 O LYS A 43 37.471 24.939 27.350 1.00 0.00 O +ATOM 692 CB LYS A 43 39.283 27.458 26.348 1.00 0.00 C +ATOM 693 CG LYS A 43 40.757 27.326 25.966 1.00 0.00 C +ATOM 694 CD LYS A 43 41.630 28.498 26.431 1.00 0.00 C +ATOM 695 CE LYS A 43 43.094 28.399 26.031 1.00 0.00 C +ATOM 696 NZ LYS A 43 44.026 28.825 27.093 1.00 0.00 N1+ +ATOM 697 H LYS A 43 37.854 27.883 24.167 1.00 0.00 H +ATOM 698 HA LYS A 43 38.930 25.666 25.448 1.00 0.00 H +ATOM 699 HB2 LYS A 43 39.207 27.343 27.339 1.00 0.00 H +ATOM 700 HB3 LYS A 43 38.977 28.376 26.094 1.00 0.00 H +ATOM 701 HG2 LYS A 43 40.819 27.264 24.970 1.00 0.00 H +ATOM 702 HG3 LYS A 43 41.114 26.486 26.376 1.00 0.00 H +ATOM 703 HD2 LYS A 43 41.582 28.545 27.429 1.00 0.00 H +ATOM 704 HD3 LYS A 43 41.256 29.339 26.039 1.00 0.00 H +ATOM 705 HE2 LYS A 43 43.243 28.978 25.229 1.00 0.00 H +ATOM 706 HE3 LYS A 43 43.294 27.448 25.797 1.00 0.00 H +ATOM 707 HZ1 LYS A 43 44.967 28.736 26.766 1.00 0.00 H +ATOM 708 HZ2 LYS A 43 43.845 29.779 27.332 1.00 0.00 H +ATOM 709 HZ3 LYS A 43 43.897 28.249 27.900 1.00 0.00 H +ATOM 710 N SER A 44 36.163 26.603 26.693 1.00 0.00 N +ATOM 711 CA SER A 44 35.063 26.203 27.552 1.00 0.00 C +ATOM 712 C SER A 44 34.475 24.822 27.226 1.00 0.00 C +ATOM 713 O SER A 44 34.172 24.035 28.100 1.00 0.00 O +ATOM 714 CB SER A 44 33.998 27.276 27.444 1.00 0.00 C +ATOM 715 OG SER A 44 33.557 27.589 28.714 1.00 0.00 O +ATOM 716 H SER A 44 36.059 27.412 26.114 1.00 0.00 H +ATOM 717 HA SER A 44 35.394 26.186 28.495 1.00 0.00 H +ATOM 718 HB2 SER A 44 33.233 26.937 26.896 1.00 0.00 H +ATOM 719 HB3 SER A 44 34.384 28.091 27.011 1.00 0.00 H +ATOM 720 HG SER A 44 33.265 28.545 28.739 1.00 0.00 H +ATOM 721 N GLU A 45 34.278 24.584 25.943 1.00 0.00 N +ATOM 722 CA GLU A 45 33.755 23.327 25.434 1.00 0.00 C +ATOM 723 C GLU A 45 34.737 22.223 25.746 1.00 0.00 C +ATOM 724 O GLU A 45 34.355 21.116 26.142 1.00 0.00 O +ATOM 725 CB GLU A 45 33.604 23.393 23.907 1.00 0.00 C +ATOM 726 CG GLU A 45 32.424 24.272 23.476 1.00 0.00 C +ATOM 727 CD GLU A 45 31.092 23.657 23.840 1.00 0.00 C +ATOM 728 OE1 GLU A 45 30.867 22.464 23.729 1.00 0.00 O +ATOM 729 OE2 GLU A 45 30.224 24.520 24.274 1.00 0.00 O1- +ATOM 730 H GLU A 45 34.500 25.306 25.287 1.00 0.00 H +ATOM 731 HA GLU A 45 32.871 23.128 25.857 1.00 0.00 H +ATOM 732 HB2 GLU A 45 33.460 22.467 23.558 1.00 0.00 H +ATOM 733 HB3 GLU A 45 34.444 23.769 23.517 1.00 0.00 H +ATOM 734 HG2 GLU A 45 32.461 24.397 22.485 1.00 0.00 H +ATOM 735 HG3 GLU A 45 32.503 25.161 23.927 1.00 0.00 H +ATOM 736 N LEU A 46 36.018 22.529 25.574 1.00 0.00 N +ATOM 737 CA LEU A 46 37.036 21.550 25.864 1.00 0.00 C +ATOM 738 C LEU A 46 36.981 21.055 27.318 1.00 0.00 C +ATOM 739 O LEU A 46 37.055 19.863 27.615 1.00 0.00 O +ATOM 740 CB LEU A 46 38.451 22.068 25.538 1.00 0.00 C +ATOM 741 CG LEU A 46 39.517 20.991 25.786 1.00 0.00 C +ATOM 742 CD1 LEU A 46 39.161 19.712 25.014 1.00 0.00 C +ATOM 743 CD2 LEU A 46 40.906 21.484 25.371 1.00 0.00 C +ATOM 744 H LEU A 46 36.276 23.437 25.244 1.00 0.00 H +ATOM 745 HA LEU A 46 36.865 20.760 25.275 1.00 0.00 H +ATOM 746 HB2 LEU A 46 38.648 22.859 26.116 1.00 0.00 H +ATOM 747 HB3 LEU A 46 38.483 22.341 24.577 1.00 0.00 H +ATOM 748 HG LEU A 46 39.534 20.779 26.763 1.00 0.00 H +ATOM 749 HD11 LEU A 46 39.860 19.016 25.181 1.00 0.00 H +ATOM 750 HD12 LEU A 46 38.272 19.373 25.323 1.00 0.00 H +ATOM 751 HD13 LEU A 46 39.119 19.914 24.036 1.00 0.00 H +ATOM 752 HD21 LEU A 46 41.580 20.765 25.543 1.00 0.00 H +ATOM 753 HD22 LEU A 46 40.902 21.711 24.397 1.00 0.00 H +ATOM 754 HD23 LEU A 46 41.144 22.297 25.902 1.00 0.00 H +ATOM 755 N ASP A 47 36.861 21.973 28.258 1.00 0.00 N +ATOM 756 CA ASP A 47 36.819 21.608 29.667 1.00 0.00 C +ATOM 757 C ASP A 47 35.600 20.821 30.014 1.00 0.00 C +ATOM 758 O ASP A 47 35.657 19.924 30.858 1.00 0.00 O +ATOM 759 CB ASP A 47 36.926 22.822 30.591 1.00 0.00 C +ATOM 760 CG ASP A 47 38.251 23.546 30.538 1.00 0.00 C +ATOM 761 OD1 ASP A 47 39.359 23.052 30.230 1.00 0.00 O +ATOM 762 OD2 ASP A 47 38.097 24.782 30.905 1.00 0.00 O1- +ATOM 763 H ASP A 47 36.798 22.937 27.998 1.00 0.00 H +ATOM 764 HA ASP A 47 37.611 21.025 29.848 1.00 0.00 H +ATOM 765 HB2 ASP A 47 36.779 22.512 31.530 1.00 0.00 H +ATOM 766 HB3 ASP A 47 36.208 23.470 30.338 1.00 0.00 H +ATOM 767 N LYS A 48 34.517 21.222 29.376 1.00 0.00 N +ATOM 768 CA LYS A 48 33.249 20.552 29.520 1.00 0.00 C +ATOM 769 C LYS A 48 33.356 19.110 28.969 1.00 0.00 C +ATOM 770 O LYS A 48 32.906 18.166 29.573 1.00 0.00 O +ATOM 771 CB LYS A 48 32.220 21.367 28.758 1.00 0.00 C +ATOM 772 CG LYS A 48 30.913 20.647 28.555 1.00 0.00 C +ATOM 773 CD LYS A 48 29.749 21.599 28.365 1.00 0.00 C +ATOM 774 CE LYS A 48 29.717 22.317 27.017 1.00 0.00 C +ATOM 775 NZ LYS A 48 29.282 21.456 25.920 1.00 0.00 N1+ +ATOM 776 H LYS A 48 34.578 22.017 28.773 1.00 0.00 H +ATOM 777 HA LYS A 48 32.998 20.520 30.487 1.00 0.00 H +ATOM 778 HB2 LYS A 48 32.598 21.595 27.861 1.00 0.00 H +ATOM 779 HB3 LYS A 48 32.042 22.208 29.268 1.00 0.00 H +ATOM 780 HG2 LYS A 48 30.733 20.077 29.357 1.00 0.00 H +ATOM 781 HG3 LYS A 48 30.989 20.067 27.744 1.00 0.00 H +ATOM 782 HD2 LYS A 48 29.794 22.292 29.085 1.00 0.00 H +ATOM 783 HD3 LYS A 48 28.902 21.076 28.458 1.00 0.00 H +ATOM 784 HE2 LYS A 48 30.637 22.652 26.813 1.00 0.00 H +ATOM 785 HE3 LYS A 48 29.087 23.091 27.083 1.00 0.00 H +ATOM 786 HZ1 LYS A 48 28.288 21.513 25.826 1.00 0.00 H +ATOM 787 HZ2 LYS A 48 29.715 21.755 25.070 1.00 0.00 H +ATOM 788 HZ3 LYS A 48 29.545 20.511 26.114 1.00 0.00 H +ATOM 789 N ALA A 49 34.021 18.934 27.842 1.00 0.00 N +ATOM 790 CA ALA A 49 34.185 17.611 27.280 1.00 0.00 C +ATOM 791 C ALA A 49 35.084 16.672 28.119 1.00 0.00 C +ATOM 792 O ALA A 49 34.792 15.495 28.269 1.00 0.00 O +ATOM 793 CB ALA A 49 34.617 17.695 25.816 1.00 0.00 C +ATOM 794 H ALA A 49 34.415 19.724 27.372 1.00 0.00 H +ATOM 795 HA ALA A 49 33.275 17.196 27.278 1.00 0.00 H +ATOM 796 HB1 ALA A 49 34.725 16.772 25.447 1.00 0.00 H +ATOM 797 HB2 ALA A 49 33.921 18.185 25.291 1.00 0.00 H +ATOM 798 HB3 ALA A 49 35.488 18.183 25.753 1.00 0.00 H +ATOM 799 N ILE A 50 36.187 17.188 28.678 1.00 0.00 N +ATOM 800 CA ILE A 50 37.166 16.428 29.480 1.00 0.00 C +ATOM 801 C ILE A 50 36.823 16.297 30.961 1.00 0.00 C +ATOM 802 O ILE A 50 37.251 15.383 31.677 1.00 0.00 O +ATOM 803 CB ILE A 50 38.524 17.125 29.371 1.00 0.00 C +ATOM 804 CG1 ILE A 50 38.894 17.231 27.907 1.00 0.00 C +ATOM 805 CG2 ILE A 50 39.657 16.415 30.144 1.00 0.00 C +ATOM 806 CD1 ILE A 50 38.734 15.901 27.193 1.00 0.00 C +ATOM 807 H ILE A 50 36.360 18.163 28.541 1.00 0.00 H +ATOM 808 HA ILE A 50 37.249 15.510 29.092 1.00 0.00 H +ATOM 809 HB ILE A 50 38.430 18.051 29.737 1.00 0.00 H +ATOM 810 HG12 ILE A 50 39.847 17.526 27.833 1.00 0.00 H +ATOM 811 HG13 ILE A 50 38.301 17.907 27.470 1.00 0.00 H +ATOM 812 HG21 ILE A 50 40.510 16.924 30.028 1.00 0.00 H +ATOM 813 HG22 ILE A 50 39.423 16.374 31.115 1.00 0.00 H +ATOM 814 HG23 ILE A 50 39.772 15.487 29.789 1.00 0.00 H +ATOM 815 HD11 ILE A 50 38.986 16.007 26.231 1.00 0.00 H +ATOM 816 HD12 ILE A 50 39.328 15.220 27.620 1.00 0.00 H +ATOM 817 HD13 ILE A 50 37.782 15.601 27.257 1.00 0.00 H +ATOM 818 N GLY A 51 36.112 17.276 31.452 1.00 0.00 N +ATOM 819 CA GLY A 51 35.726 17.183 32.843 1.00 0.00 C +ATOM 820 C GLY A 51 36.804 17.762 33.737 1.00 0.00 C +ATOM 821 O GLY A 51 36.950 17.412 34.897 1.00 0.00 O +ATOM 822 H GLY A 51 35.845 18.058 30.889 1.00 0.00 H +ATOM 823 HA2 GLY A 51 35.583 16.222 33.081 1.00 0.00 H +ATOM 824 HA3 GLY A 51 34.876 17.691 32.983 1.00 0.00 H +ATOM 825 N ARG A 52 37.572 18.696 33.205 1.00 0.00 N +ATOM 826 CA ARG A 52 38.575 19.327 34.025 1.00 0.00 C +ATOM 827 C ARG A 52 39.012 20.601 33.366 1.00 0.00 C +ATOM 828 O ARG A 52 38.645 20.860 32.224 1.00 0.00 O +ATOM 829 CB ARG A 52 39.757 18.413 34.330 1.00 0.00 C +ATOM 830 CG ARG A 52 40.768 18.362 33.222 1.00 0.00 C +ATOM 831 CD ARG A 52 41.697 17.184 33.392 1.00 0.00 C +ATOM 832 NE ARG A 52 42.597 17.029 32.286 1.00 0.00 N +ATOM 833 CZ ARG A 52 43.419 17.972 31.899 1.00 0.00 C +ATOM 834 NH1 ARG A 52 43.470 19.140 32.518 1.00 0.00 N1+ +ATOM 835 NH2 ARG A 52 44.233 17.726 30.875 1.00 0.00 N +ATOM 836 H ARG A 52 37.459 18.961 32.247 1.00 0.00 H +ATOM 837 HA ARG A 52 38.146 19.568 34.896 1.00 0.00 H +ATOM 838 HB2 ARG A 52 39.411 17.488 34.487 1.00 0.00 H +ATOM 839 HB3 ARG A 52 40.210 18.745 35.158 1.00 0.00 H +ATOM 840 HG2 ARG A 52 41.305 19.206 33.230 1.00 0.00 H +ATOM 841 HG3 ARG A 52 40.291 18.279 32.347 1.00 0.00 H +ATOM 842 HD2 ARG A 52 41.148 16.353 33.477 1.00 0.00 H +ATOM 843 HD3 ARG A 52 42.233 17.316 34.226 1.00 0.00 H +ATOM 844 HE ARG A 52 42.597 16.162 31.788 1.00 0.00 H +ATOM 845 HH11 ARG A 52 44.106 19.845 32.204 1.00 0.00 H +ATOM 846 HH12 ARG A 52 42.872 19.318 33.300 1.00 0.00 H +ATOM 847 HH21 ARG A 52 44.869 18.431 30.562 1.00 0.00 H +ATOM 848 HH22 ARG A 52 44.208 16.836 30.419 1.00 0.00 H +ATOM 849 N ASN A 53 39.775 21.390 34.113 1.00 0.00 N +ATOM 850 CA ASN A 53 40.307 22.645 33.635 1.00 0.00 C +ATOM 851 C ASN A 53 41.545 22.324 32.816 1.00 0.00 C +ATOM 852 O ASN A 53 42.573 21.935 33.353 1.00 0.00 O +ATOM 853 CB ASN A 53 40.599 23.577 34.821 1.00 0.00 C +ATOM 854 CG ASN A 53 39.794 24.842 34.684 1.00 0.00 C +ATOM 855 ND2 ASN A 53 40.385 25.824 33.982 1.00 0.00 N +ATOM 856 OD1 ASN A 53 38.635 24.910 35.129 1.00 0.00 O +ATOM 857 H ASN A 53 39.991 21.103 35.046 1.00 0.00 H +ATOM 858 HA ASN A 53 39.629 23.079 33.041 1.00 0.00 H +ATOM 859 HB2 ASN A 53 41.573 23.803 34.834 1.00 0.00 H +ATOM 860 HB3 ASN A 53 40.352 23.117 35.674 1.00 0.00 H +ATOM 861 HD21 ASN A 53 41.321 25.708 33.651 1.00 0.00 H +ATOM 862 HD22 ASN A 53 39.888 26.671 33.791 1.00 0.00 H +ATOM 863 N THR A 54 41.458 22.410 31.496 1.00 0.00 N +ATOM 864 CA THR A 54 42.603 21.947 30.723 1.00 0.00 C +ATOM 865 C THR A 54 43.513 23.006 30.188 1.00 0.00 C +ATOM 866 O THR A 54 44.547 22.670 29.631 1.00 0.00 O +ATOM 867 CB THR A 54 42.138 21.173 29.497 1.00 0.00 C +ATOM 868 CG2 THR A 54 41.219 20.020 29.908 1.00 0.00 C +ATOM 869 OG1 THR A 54 41.480 22.098 28.677 1.00 0.00 O +ATOM 870 H THR A 54 40.642 22.777 31.050 1.00 0.00 H +ATOM 871 HA THR A 54 43.142 21.331 31.298 1.00 0.00 H +ATOM 872 HB THR A 54 42.933 20.808 29.014 1.00 0.00 H +ATOM 873 HG1 THR A 54 40.509 22.122 28.914 1.00 0.00 H +ATOM 874 HG21 THR A 54 40.923 19.523 29.092 1.00 0.00 H +ATOM 875 HG22 THR A 54 41.714 19.399 30.516 1.00 0.00 H +ATOM 876 HG23 THR A 54 40.419 20.385 30.385 1.00 0.00 H +ATOM 877 N ASN A 55 43.121 24.268 30.259 1.00 0.00 N +ATOM 878 CA ASN A 55 43.967 25.280 29.665 1.00 0.00 C +ATOM 879 C ASN A 55 44.281 25.044 28.171 1.00 0.00 C +ATOM 880 O ASN A 55 45.285 25.528 27.671 1.00 0.00 O +ATOM 881 CB ASN A 55 45.231 25.605 30.501 1.00 0.00 C +ATOM 882 CG ASN A 55 45.745 27.027 30.277 1.00 0.00 C +ATOM 883 ND2 ASN A 55 47.051 27.208 30.471 1.00 0.00 N +ATOM 884 OD1 ASN A 55 44.994 27.949 29.910 1.00 0.00 O +ATOM 885 H ASN A 55 42.264 24.515 30.711 1.00 0.00 H +ATOM 886 HA ASN A 55 43.421 26.118 29.685 1.00 0.00 H +ATOM 887 HB2 ASN A 55 45.954 24.961 30.249 1.00 0.00 H +ATOM 888 HB3 ASN A 55 45.009 25.495 31.470 1.00 0.00 H +ATOM 889 HD21 ASN A 55 47.623 26.443 30.766 1.00 0.00 H +ATOM 890 HD22 ASN A 55 47.459 28.109 30.321 1.00 0.00 H +ATOM 891 N GLY A 56 43.422 24.320 27.445 1.00 0.00 N +ATOM 892 CA GLY A 56 43.640 24.118 26.006 1.00 0.00 C +ATOM 893 C GLY A 56 44.567 22.973 25.623 1.00 0.00 C +ATOM 894 O GLY A 56 44.943 22.790 24.462 1.00 0.00 O +ATOM 895 H GLY A 56 42.623 23.912 27.886 1.00 0.00 H +ATOM 896 HA2 GLY A 56 44.027 24.962 25.634 1.00 0.00 H +ATOM 897 HA3 GLY A 56 42.750 23.945 25.584 1.00 0.00 H +ATOM 898 N VAL A 57 44.913 22.179 26.604 1.00 0.00 N +ATOM 899 CA VAL A 57 45.782 21.053 26.337 1.00 0.00 C +ATOM 900 C VAL A 57 45.317 19.754 27.016 1.00 0.00 C +ATOM 901 O VAL A 57 44.950 19.795 28.179 1.00 0.00 O +ATOM 902 CB VAL A 57 47.107 21.435 26.889 1.00 0.00 C +ATOM 903 CG1 VAL A 57 48.133 20.335 26.617 1.00 0.00 C +ATOM 904 CG2 VAL A 57 47.516 22.756 26.247 1.00 0.00 C +ATOM 905 H VAL A 57 44.579 22.349 27.531 1.00 0.00 H +ATOM 906 HA VAL A 57 45.856 20.910 25.350 1.00 0.00 H +ATOM 907 HB VAL A 57 47.023 21.565 27.877 1.00 0.00 H +ATOM 908 HG11 VAL A 57 49.019 20.605 26.994 1.00 0.00 H +ATOM 909 HG12 VAL A 57 47.833 19.485 27.049 1.00 0.00 H +ATOM 910 HG13 VAL A 57 48.219 20.196 25.630 1.00 0.00 H +ATOM 911 HG21 VAL A 57 48.408 23.037 26.602 1.00 0.00 H +ATOM 912 HG22 VAL A 57 47.573 22.641 25.255 1.00 0.00 H +ATOM 913 HG23 VAL A 57 46.835 23.456 26.463 1.00 0.00 H +ATOM 914 N ILE A 58 45.378 18.623 26.314 1.00 0.00 N +ATOM 915 CA ILE A 58 44.929 17.345 26.879 1.00 0.00 C +ATOM 916 C ILE A 58 46.022 16.310 26.697 1.00 0.00 C +ATOM 917 O ILE A 58 47.003 16.531 25.975 1.00 0.00 O +ATOM 918 CB ILE A 58 43.665 16.858 26.159 1.00 0.00 C +ATOM 919 CG1 ILE A 58 43.971 16.657 24.676 1.00 0.00 C +ATOM 920 CG2 ILE A 58 42.521 17.874 26.309 1.00 0.00 C +ATOM 921 CD1 ILE A 58 42.859 15.900 23.936 1.00 0.00 C +ATOM 922 H ILE A 58 45.738 18.646 25.381 1.00 0.00 H +ATOM 923 HA ILE A 58 44.736 17.460 27.853 1.00 0.00 H +ATOM 924 HB ILE A 58 43.380 15.985 26.555 1.00 0.00 H +ATOM 925 HG12 ILE A 58 44.821 16.137 24.593 1.00 0.00 H +ATOM 926 HG13 ILE A 58 44.086 17.554 24.249 1.00 0.00 H +ATOM 927 HG21 ILE A 58 41.710 17.535 25.832 1.00 0.00 H +ATOM 928 HG22 ILE A 58 42.310 17.998 27.279 1.00 0.00 H +ATOM 929 HG23 ILE A 58 42.799 18.749 25.913 1.00 0.00 H +ATOM 930 HD11 ILE A 58 43.110 15.797 22.973 1.00 0.00 H +ATOM 931 HD12 ILE A 58 42.739 14.997 24.348 1.00 0.00 H +ATOM 932 HD13 ILE A 58 42.004 16.414 24.004 1.00 0.00 H +ATOM 933 N THR A 59 45.879 15.176 27.340 1.00 0.00 N +ATOM 934 CA THR A 59 46.854 14.133 27.174 1.00 0.00 C +ATOM 935 C THR A 59 46.371 13.210 26.062 1.00 0.00 C +ATOM 936 O THR A 59 45.215 13.244 25.690 1.00 0.00 O +ATOM 937 CB THR A 59 46.889 13.283 28.452 1.00 0.00 C +ATOM 938 CG2 THR A 59 47.054 14.138 29.685 1.00 0.00 C +ATOM 939 OG1 THR A 59 45.657 12.617 28.518 1.00 0.00 O +ATOM 940 H THR A 59 45.094 15.037 27.944 1.00 0.00 H +ATOM 941 HA THR A 59 47.756 14.510 26.965 1.00 0.00 H +ATOM 942 HB THR A 59 47.633 12.617 28.398 1.00 0.00 H +ATOM 943 HG1 THR A 59 45.001 13.179 29.022 1.00 0.00 H +ATOM 944 HG21 THR A 59 47.073 13.553 30.496 1.00 0.00 H +ATOM 945 HG22 THR A 59 47.911 14.650 29.623 1.00 0.00 H +ATOM 946 HG23 THR A 59 46.288 14.777 29.752 1.00 0.00 H +ATOM 947 N LYS A 60 47.268 12.336 25.616 1.00 0.00 N +ATOM 948 CA LYS A 60 46.997 11.329 24.613 1.00 0.00 C +ATOM 949 C LYS A 60 45.808 10.442 24.982 1.00 0.00 C +ATOM 950 O LYS A 60 44.963 10.148 24.146 1.00 0.00 O +ATOM 951 CB LYS A 60 48.250 10.465 24.416 1.00 0.00 C +ATOM 952 CG LYS A 60 48.158 9.440 23.270 1.00 0.00 C +ATOM 953 CD LYS A 60 49.323 9.516 22.301 1.00 0.00 C +ATOM 954 CE LYS A 60 49.466 8.302 21.372 1.00 0.00 C +ATOM 955 NZ LYS A 60 50.318 8.537 20.191 1.00 0.00 N1+ +ATOM 956 H LYS A 60 48.191 12.377 25.999 1.00 0.00 H +ATOM 957 HA LYS A 60 46.792 11.790 23.750 1.00 0.00 H +ATOM 958 HB2 LYS A 60 48.420 9.966 25.266 1.00 0.00 H +ATOM 959 HB3 LYS A 60 49.020 11.074 24.227 1.00 0.00 H +ATOM 960 HG2 LYS A 60 47.312 9.606 22.763 1.00 0.00 H +ATOM 961 HG3 LYS A 60 48.134 8.522 23.666 1.00 0.00 H +ATOM 962 HD2 LYS A 60 50.165 9.602 22.833 1.00 0.00 H +ATOM 963 HD3 LYS A 60 49.203 10.330 21.733 1.00 0.00 H +ATOM 964 HE2 LYS A 60 48.554 8.042 21.054 1.00 0.00 H +ATOM 965 HE3 LYS A 60 49.862 7.550 21.899 1.00 0.00 H +ATOM 966 HZ1 LYS A 60 50.360 7.704 19.640 1.00 0.00 H +ATOM 967 HZ2 LYS A 60 49.932 9.280 19.644 1.00 0.00 H +ATOM 968 HZ3 LYS A 60 51.239 8.787 20.489 1.00 0.00 H +ATOM 969 N ASP A 61 45.757 9.997 26.252 1.00 0.00 N +ATOM 970 CA ASP A 61 44.645 9.157 26.706 1.00 0.00 C +ATOM 971 C ASP A 61 43.295 9.857 26.540 1.00 0.00 C +ATOM 972 O ASP A 61 42.304 9.250 26.128 1.00 0.00 O +ATOM 973 CB ASP A 61 44.812 8.758 28.186 1.00 0.00 C +ATOM 974 CG ASP A 61 45.950 7.832 28.509 1.00 0.00 C +ATOM 975 OD1 ASP A 61 46.514 7.293 27.457 1.00 0.00 O +ATOM 976 OD2 ASP A 61 46.322 7.621 29.650 1.00 0.00 O1- +ATOM 977 H ASP A 61 46.485 10.242 26.892 1.00 0.00 H +ATOM 978 HA ASP A 61 44.636 8.323 26.155 1.00 0.00 H +ATOM 979 HB2 ASP A 61 43.966 8.312 28.477 1.00 0.00 H +ATOM 980 HB3 ASP A 61 44.945 9.597 28.713 1.00 0.00 H +ATOM 981 N GLU A 62 43.290 11.151 26.933 1.00 0.00 N +ATOM 982 CA GLU A 62 42.108 12.003 26.835 1.00 0.00 C +ATOM 983 C GLU A 62 41.696 12.122 25.392 1.00 0.00 C +ATOM 984 O GLU A 62 40.546 12.045 25.046 1.00 0.00 O +ATOM 985 CB GLU A 62 42.424 13.367 27.387 1.00 0.00 C +ATOM 986 CG GLU A 62 42.394 13.311 28.914 1.00 0.00 C +ATOM 987 CD GLU A 62 42.842 14.606 29.568 1.00 0.00 C +ATOM 988 OE1 GLU A 62 43.549 15.434 29.026 1.00 0.00 O +ATOM 989 OE2 GLU A 62 42.429 14.715 30.798 1.00 0.00 O1- +ATOM 990 H GLU A 62 44.132 11.541 27.307 1.00 0.00 H +ATOM 991 HA GLU A 62 41.361 11.597 27.361 1.00 0.00 H +ATOM 992 HB2 GLU A 62 41.744 14.025 27.063 1.00 0.00 H +ATOM 993 HB3 GLU A 62 43.333 13.649 27.081 1.00 0.00 H +ATOM 994 HG2 GLU A 62 43.000 12.575 29.217 1.00 0.00 H +ATOM 995 HG3 GLU A 62 41.458 13.114 29.207 1.00 0.00 H +ATOM 996 N ALA A 63 42.722 12.253 24.535 1.00 0.00 N +ATOM 997 CA ALA A 63 42.472 12.330 23.116 1.00 0.00 C +ATOM 998 C ALA A 63 41.800 11.058 22.596 1.00 0.00 C +ATOM 999 O ALA A 63 40.819 11.101 21.825 1.00 0.00 O +ATOM 1000 CB ALA A 63 43.777 12.593 22.398 1.00 0.00 C +ATOM 1001 H ALA A 63 43.659 12.297 24.881 1.00 0.00 H +ATOM 1002 HA ALA A 63 41.859 13.101 22.946 1.00 0.00 H +ATOM 1003 HB1 ALA A 63 43.611 12.648 21.413 1.00 0.00 H +ATOM 1004 HB2 ALA A 63 44.166 13.457 22.719 1.00 0.00 H +ATOM 1005 HB3 ALA A 63 44.417 11.849 22.587 1.00 0.00 H +ATOM 1006 N GLU A 64 42.357 9.916 23.032 1.00 0.00 N +ATOM 1007 CA GLU A 64 41.816 8.649 22.623 1.00 0.00 C +ATOM 1008 C GLU A 64 40.449 8.412 23.123 1.00 0.00 C +ATOM 1009 O GLU A 64 39.634 7.772 22.449 1.00 0.00 O +ATOM 1010 CB GLU A 64 42.756 7.515 22.965 1.00 0.00 C +ATOM 1011 CG GLU A 64 43.843 7.541 21.887 1.00 0.00 C +ATOM 1012 CD GLU A 64 45.125 6.857 22.263 1.00 0.00 C +ATOM 1013 OE1 GLU A 64 45.287 6.316 23.332 1.00 0.00 O +ATOM 1014 OE2 GLU A 64 46.009 6.905 21.307 1.00 0.00 O1- +ATOM 1015 H GLU A 64 43.149 9.948 23.642 1.00 0.00 H +ATOM 1016 HA GLU A 64 41.753 8.675 21.625 1.00 0.00 H +ATOM 1017 HB2 GLU A 64 42.269 6.642 22.949 1.00 0.00 H +ATOM 1018 HB3 GLU A 64 43.158 7.656 23.870 1.00 0.00 H +ATOM 1019 HG2 GLU A 64 44.051 8.497 21.679 1.00 0.00 H +ATOM 1020 HG3 GLU A 64 43.480 7.093 21.070 1.00 0.00 H +ATOM 1021 N LYS A 65 40.230 8.925 24.310 1.00 0.00 N +ATOM 1022 CA LYS A 65 38.906 8.767 24.863 1.00 0.00 C +ATOM 1023 C LYS A 65 37.874 9.503 24.035 1.00 0.00 C +ATOM 1024 O LYS A 65 36.835 8.941 23.666 1.00 0.00 O +ATOM 1025 CB LYS A 65 38.840 9.153 26.296 1.00 0.00 C +ATOM 1026 CG LYS A 65 37.478 8.774 26.841 1.00 0.00 C +ATOM 1027 CD LYS A 65 37.386 8.862 28.327 1.00 0.00 C +ATOM 1028 CE LYS A 65 35.950 8.577 28.767 1.00 0.00 C +ATOM 1029 NZ LYS A 65 35.883 8.324 30.208 1.00 0.00 N1+ +ATOM 1030 H LYS A 65 40.950 9.405 24.811 1.00 0.00 H +ATOM 1031 HA LYS A 65 38.682 7.794 24.812 1.00 0.00 H +ATOM 1032 HB2 LYS A 65 38.975 10.140 26.385 1.00 0.00 H +ATOM 1033 HB3 LYS A 65 39.552 8.672 26.807 1.00 0.00 H +ATOM 1034 HG2 LYS A 65 37.278 7.833 26.567 1.00 0.00 H +ATOM 1035 HG3 LYS A 65 36.796 9.389 26.445 1.00 0.00 H +ATOM 1036 HD2 LYS A 65 37.649 9.780 28.623 1.00 0.00 H +ATOM 1037 HD3 LYS A 65 38.001 8.189 28.739 1.00 0.00 H +ATOM 1038 HE2 LYS A 65 35.612 7.773 28.278 1.00 0.00 H +ATOM 1039 HE3 LYS A 65 35.378 9.367 28.547 1.00 0.00 H +ATOM 1040 HZ1 LYS A 65 34.936 8.141 30.471 1.00 0.00 H +ATOM 1041 HZ2 LYS A 65 36.451 7.532 30.434 1.00 0.00 H +ATOM 1042 HZ3 LYS A 65 36.217 9.126 30.703 1.00 0.00 H +ATOM 1043 N LEU A 66 38.183 10.776 23.687 1.00 0.00 N +ATOM 1044 CA LEU A 66 37.285 11.549 22.842 1.00 0.00 C +ATOM 1045 C LEU A 66 37.046 10.806 21.525 1.00 0.00 C +ATOM 1046 O LEU A 66 35.921 10.670 21.057 1.00 0.00 O +ATOM 1047 CB LEU A 66 37.779 12.999 22.499 1.00 0.00 C +ATOM 1048 CG LEU A 66 37.863 13.950 23.689 1.00 0.00 C +ATOM 1049 CD1 LEU A 66 38.517 15.274 23.269 1.00 0.00 C +ATOM 1050 CD2 LEU A 66 36.479 14.213 24.266 1.00 0.00 C +ATOM 1051 H LEU A 66 39.034 11.187 24.013 1.00 0.00 H +ATOM 1052 HA LEU A 66 36.408 11.627 23.315 1.00 0.00 H +ATOM 1053 HB2 LEU A 66 37.147 13.392 21.832 1.00 0.00 H +ATOM 1054 HB3 LEU A 66 38.690 12.928 22.093 1.00 0.00 H +ATOM 1055 HG LEU A 66 38.428 13.526 24.397 1.00 0.00 H +ATOM 1056 HD11 LEU A 66 38.565 15.887 24.058 1.00 0.00 H +ATOM 1057 HD12 LEU A 66 39.440 15.096 22.928 1.00 0.00 H +ATOM 1058 HD13 LEU A 66 37.972 15.701 22.548 1.00 0.00 H +ATOM 1059 HD21 LEU A 66 36.555 14.837 25.043 1.00 0.00 H +ATOM 1060 HD22 LEU A 66 35.898 14.624 23.564 1.00 0.00 H +ATOM 1061 HD23 LEU A 66 36.075 13.350 24.570 1.00 0.00 H +ATOM 1062 N PHE A 67 38.148 10.304 20.974 1.00 0.00 N +ATOM 1063 CA PHE A 67 38.106 9.567 19.732 1.00 0.00 C +ATOM 1064 C PHE A 67 37.169 8.373 19.809 1.00 0.00 C +ATOM 1065 O PHE A 67 36.345 8.205 18.924 1.00 0.00 O +ATOM 1066 CB PHE A 67 39.516 9.144 19.348 1.00 0.00 C +ATOM 1067 CG PHE A 67 39.687 8.521 17.982 1.00 0.00 C +ATOM 1068 CD1 PHE A 67 38.952 8.989 16.899 1.00 0.00 C +ATOM 1069 CD2 PHE A 67 40.637 7.512 17.788 1.00 0.00 C +ATOM 1070 CE1 PHE A 67 39.120 8.467 15.620 1.00 0.00 C +ATOM 1071 CE2 PHE A 67 40.846 6.999 16.512 1.00 0.00 C +ATOM 1072 CZ PHE A 67 40.066 7.462 15.444 1.00 0.00 C +ATOM 1073 H PHE A 67 39.027 10.440 21.431 1.00 0.00 H +ATOM 1074 HA PHE A 67 37.764 10.181 19.021 1.00 0.00 H +ATOM 1075 HB2 PHE A 67 39.828 8.479 20.026 1.00 0.00 H +ATOM 1076 HB3 PHE A 67 40.097 9.957 19.386 1.00 0.00 H +ATOM 1077 HD1 PHE A 67 38.285 9.720 17.043 1.00 0.00 H +ATOM 1078 HD2 PHE A 67 41.163 7.161 18.563 1.00 0.00 H +ATOM 1079 HE1 PHE A 67 38.577 8.804 14.851 1.00 0.00 H +ATOM 1080 HE2 PHE A 67 41.548 6.304 16.358 1.00 0.00 H +ATOM 1081 HZ PHE A 67 40.192 7.062 14.536 1.00 0.00 H +ATOM 1082 N ASN A 68 37.296 7.555 20.876 1.00 0.00 N +ATOM 1083 CA ASN A 68 36.410 6.396 21.037 1.00 0.00 C +ATOM 1084 C ASN A 68 34.940 6.809 21.075 1.00 0.00 C +ATOM 1085 O ASN A 68 34.054 6.196 20.495 1.00 0.00 O +ATOM 1086 CB ASN A 68 36.756 5.640 22.329 1.00 0.00 C +ATOM 1087 CG ASN A 68 37.952 4.726 22.174 1.00 0.00 C +ATOM 1088 ND2 ASN A 68 38.848 4.727 23.160 1.00 0.00 N +ATOM 1089 OD1 ASN A 68 38.097 4.038 21.176 1.00 0.00 O +ATOM 1090 H ASN A 68 38.000 7.740 21.562 1.00 0.00 H +ATOM 1091 HA ASN A 68 36.548 5.780 20.261 1.00 0.00 H +ATOM 1092 HB2 ASN A 68 35.966 5.089 22.598 1.00 0.00 H +ATOM 1093 HB3 ASN A 68 36.956 6.308 23.046 1.00 0.00 H +ATOM 1094 HD21 ASN A 68 38.704 5.301 23.966 1.00 0.00 H +ATOM 1095 HD22 ASN A 68 39.665 4.154 23.094 1.00 0.00 H +ATOM 1096 N GLN A 69 34.691 7.876 21.798 1.00 0.00 N +ATOM 1097 CA GLN A 69 33.329 8.359 21.869 1.00 0.00 C +ATOM 1098 C GLN A 69 32.817 8.820 20.517 1.00 0.00 C +ATOM 1099 O GLN A 69 31.678 8.576 20.163 1.00 0.00 O +ATOM 1100 CB GLN A 69 33.245 9.544 22.832 1.00 0.00 C +ATOM 1101 CG GLN A 69 33.502 9.100 24.269 1.00 0.00 C +ATOM 1102 CD GLN A 69 33.592 10.287 25.226 1.00 0.00 C +ATOM 1103 NE2 GLN A 69 33.476 11.520 24.721 1.00 0.00 N +ATOM 1104 OE1 GLN A 69 33.800 10.099 26.422 1.00 0.00 O +ATOM 1105 H GLN A 69 35.426 8.344 22.289 1.00 0.00 H +ATOM 1106 HA GLN A 69 32.741 7.624 22.206 1.00 0.00 H +ATOM 1107 HB2 GLN A 69 32.333 9.949 22.773 1.00 0.00 H +ATOM 1108 HB3 GLN A 69 33.930 10.225 22.573 1.00 0.00 H +ATOM 1109 HG2 GLN A 69 34.363 8.593 24.301 1.00 0.00 H +ATOM 1110 HG3 GLN A 69 32.754 8.505 24.562 1.00 0.00 H +ATOM 1111 HE21 GLN A 69 33.307 11.646 23.744 1.00 0.00 H +ATOM 1112 HE22 GLN A 69 33.559 12.316 25.321 1.00 0.00 H +ATOM 1113 N ASP A 70 33.657 9.538 19.764 1.00 0.00 N +ATOM 1114 CA ASP A 70 33.229 10.056 18.473 1.00 0.00 C +ATOM 1115 C ASP A 70 32.962 9.001 17.424 1.00 0.00 C +ATOM 1116 O ASP A 70 32.086 9.172 16.590 1.00 0.00 O +ATOM 1117 CB ASP A 70 34.173 11.126 17.918 1.00 0.00 C +ATOM 1118 CG ASP A 70 34.193 12.370 18.775 1.00 0.00 C +ATOM 1119 OD1 ASP A 70 33.326 12.709 19.561 1.00 0.00 O +ATOM 1120 OD2 ASP A 70 35.280 13.049 18.595 1.00 0.00 O1- +ATOM 1121 H ASP A 70 34.585 9.720 20.090 1.00 0.00 H +ATOM 1122 HA ASP A 70 32.355 10.514 18.634 1.00 0.00 H +ATOM 1123 HB2 ASP A 70 33.872 11.374 16.997 1.00 0.00 H +ATOM 1124 HB3 ASP A 70 35.098 10.749 17.876 1.00 0.00 H +ATOM 1125 N VAL A 71 33.736 7.915 17.452 1.00 0.00 N +ATOM 1126 CA VAL A 71 33.519 6.851 16.474 1.00 0.00 C +ATOM 1127 C VAL A 71 32.201 6.191 16.787 1.00 0.00 C +ATOM 1128 O VAL A 71 31.346 6.023 15.931 1.00 0.00 O +ATOM 1129 CB VAL A 71 34.656 5.835 16.407 1.00 0.00 C +ATOM 1130 CG1 VAL A 71 34.233 4.621 15.555 1.00 0.00 C +ATOM 1131 CG2 VAL A 71 35.915 6.446 15.808 1.00 0.00 C +ATOM 1132 H VAL A 71 34.459 7.830 18.137 1.00 0.00 H +ATOM 1133 HA VAL A 71 33.439 7.278 15.573 1.00 0.00 H +ATOM 1134 HB VAL A 71 34.861 5.521 17.334 1.00 0.00 H +ATOM 1135 HG11 VAL A 71 34.984 3.962 15.518 1.00 0.00 H +ATOM 1136 HG12 VAL A 71 33.431 4.189 15.966 1.00 0.00 H +ATOM 1137 HG13 VAL A 71 34.010 4.925 14.629 1.00 0.00 H +ATOM 1138 HG21 VAL A 71 36.639 5.756 15.778 1.00 0.00 H +ATOM 1139 HG22 VAL A 71 35.721 6.766 14.881 1.00 0.00 H +ATOM 1140 HG23 VAL A 71 36.212 7.217 16.372 1.00 0.00 H +ATOM 1141 N ASP A 72 32.023 5.893 18.066 1.00 0.00 N +ATOM 1142 CA ASP A 72 30.773 5.310 18.553 1.00 0.00 C +ATOM 1143 C ASP A 72 29.529 6.126 18.147 1.00 0.00 C +ATOM 1144 O ASP A 72 28.552 5.653 17.567 1.00 0.00 O +ATOM 1145 CB ASP A 72 30.887 5.194 20.076 1.00 0.00 C +ATOM 1146 CG ASP A 72 29.903 4.193 20.586 1.00 0.00 C +ATOM 1147 OD1 ASP A 72 29.802 3.163 19.802 1.00 0.00 O +ATOM 1148 OD2 ASP A 72 29.271 4.333 21.579 1.00 0.00 O1- +ATOM 1149 H ASP A 72 32.763 6.071 18.715 1.00 0.00 H +ATOM 1150 HA ASP A 72 30.685 4.390 18.172 1.00 0.00 H +ATOM 1151 HB2 ASP A 72 30.699 6.084 20.491 1.00 0.00 H +ATOM 1152 HB3 ASP A 72 31.812 4.902 20.318 1.00 0.00 H +ATOM 1153 N ALA A 73 29.595 7.405 18.438 1.00 0.00 N +ATOM 1154 CA ALA A 73 28.513 8.306 18.102 1.00 0.00 C +ATOM 1155 C ALA A 73 28.276 8.293 16.615 1.00 0.00 C +ATOM 1156 O ALA A 73 27.140 8.356 16.147 1.00 0.00 O +ATOM 1157 CB ALA A 73 28.856 9.722 18.535 1.00 0.00 C +ATOM 1158 H ALA A 73 30.407 7.763 18.900 1.00 0.00 H +ATOM 1159 HA ALA A 73 27.681 8.011 18.571 1.00 0.00 H +ATOM 1160 HB1 ALA A 73 28.102 10.335 18.298 1.00 0.00 H +ATOM 1161 HB2 ALA A 73 29.003 9.742 19.524 1.00 0.00 H +ATOM 1162 HB3 ALA A 73 29.688 10.021 18.068 1.00 0.00 H +ATOM 1163 N ALA A 74 29.350 8.251 15.844 1.00 0.00 N +ATOM 1164 CA ALA A 74 29.180 8.225 14.389 1.00 0.00 C +ATOM 1165 C ALA A 74 28.394 7.004 13.916 1.00 0.00 C +ATOM 1166 O ALA A 74 27.474 7.094 13.132 1.00 0.00 O +ATOM 1167 CB ALA A 74 30.509 8.324 13.658 1.00 0.00 C +ATOM 1168 H ALA A 74 30.265 8.237 16.248 1.00 0.00 H +ATOM 1169 HA ALA A 74 28.646 9.033 14.140 1.00 0.00 H +ATOM 1170 HB1 ALA A 74 30.349 8.303 12.671 1.00 0.00 H +ATOM 1171 HB2 ALA A 74 30.962 9.181 13.904 1.00 0.00 H +ATOM 1172 HB3 ALA A 74 31.091 7.553 13.918 1.00 0.00 H +ATOM 1173 N VAL A 75 28.790 5.855 14.401 1.00 0.00 N +ATOM 1174 CA VAL A 75 28.100 4.652 14.015 1.00 0.00 C +ATOM 1175 C VAL A 75 26.611 4.734 14.383 1.00 0.00 C +ATOM 1176 O VAL A 75 25.715 4.486 13.565 1.00 0.00 O +ATOM 1177 CB VAL A 75 28.790 3.443 14.638 1.00 0.00 C +ATOM 1178 CG1 VAL A 75 27.998 2.160 14.260 1.00 0.00 C +ATOM 1179 CG2 VAL A 75 30.207 3.361 14.098 1.00 0.00 C +ATOM 1180 H VAL A 75 29.564 5.813 15.033 1.00 0.00 H +ATOM 1181 HA VAL A 75 28.166 4.565 13.021 1.00 0.00 H +ATOM 1182 HB VAL A 75 28.814 3.544 15.633 1.00 0.00 H +ATOM 1183 HG11 VAL A 75 28.444 1.362 14.665 1.00 0.00 H +ATOM 1184 HG12 VAL A 75 27.063 2.231 14.607 1.00 0.00 H +ATOM 1185 HG13 VAL A 75 27.978 2.062 13.265 1.00 0.00 H +ATOM 1186 HG21 VAL A 75 30.671 2.571 14.499 1.00 0.00 H +ATOM 1187 HG22 VAL A 75 30.179 3.262 13.103 1.00 0.00 H +ATOM 1188 HG23 VAL A 75 30.703 4.196 14.336 1.00 0.00 H +ATOM 1189 N ARG A 76 26.372 5.115 15.626 1.00 0.00 N +ATOM 1190 CA ARG A 76 25.018 5.225 16.120 1.00 0.00 C +ATOM 1191 C ARG A 76 24.201 6.235 15.310 1.00 0.00 C +ATOM 1192 O ARG A 76 23.037 6.031 14.956 1.00 0.00 O +ATOM 1193 CB ARG A 76 25.004 5.366 17.653 1.00 0.00 C +ATOM 1194 CG ARG A 76 25.300 4.049 18.373 1.00 0.00 C +ATOM 1195 CD ARG A 76 25.378 4.121 19.911 1.00 0.00 C +ATOM 1196 NE ARG A 76 26.567 4.844 20.334 1.00 0.00 N +ATOM 1197 CZ ARG A 76 26.544 6.092 20.811 1.00 0.00 C +ATOM 1198 NH1 ARG A 76 25.407 6.768 20.917 1.00 0.00 N1+ +ATOM 1199 NH2 ARG A 76 27.699 6.674 21.144 1.00 0.00 N +ATOM 1200 H ARG A 76 27.138 5.330 16.232 1.00 0.00 H +ATOM 1201 HA ARG A 76 24.597 4.337 15.934 1.00 0.00 H +ATOM 1202 HB2 ARG A 76 24.101 5.689 17.936 1.00 0.00 H +ATOM 1203 HB3 ARG A 76 25.696 6.038 17.918 1.00 0.00 H +ATOM 1204 HG2 ARG A 76 26.178 3.708 18.038 1.00 0.00 H +ATOM 1205 HG3 ARG A 76 24.577 3.401 18.134 1.00 0.00 H +ATOM 1206 HD2 ARG A 76 25.409 3.193 20.282 1.00 0.00 H +ATOM 1207 HD3 ARG A 76 24.567 4.591 20.259 1.00 0.00 H +ATOM 1208 HE ARG A 76 27.451 4.381 20.264 1.00 0.00 H +ATOM 1209 HH11 ARG A 76 25.412 7.701 21.277 1.00 0.00 H +ATOM 1210 HH12 ARG A 76 24.545 6.344 20.637 1.00 0.00 H +ATOM 1211 HH21 ARG A 76 27.703 7.607 21.503 1.00 0.00 H +ATOM 1212 HH22 ARG A 76 28.559 6.176 21.035 1.00 0.00 H +ATOM 1213 N GLY A 77 24.834 7.332 14.912 1.00 0.00 N +ATOM 1214 CA GLY A 77 24.148 8.292 14.079 1.00 0.00 C +ATOM 1215 C GLY A 77 23.733 7.639 12.756 1.00 0.00 C +ATOM 1216 O GLY A 77 22.661 7.830 12.260 1.00 0.00 O +ATOM 1217 H GLY A 77 25.782 7.493 15.188 1.00 0.00 H +ATOM 1218 HA2 GLY A 77 24.758 9.062 13.891 1.00 0.00 H +ATOM 1219 HA3 GLY A 77 23.333 8.621 14.556 1.00 0.00 H +ATOM 1220 N ILE A 78 24.619 6.871 12.173 1.00 0.00 N +ATOM 1221 CA ILE A 78 24.243 6.205 10.963 1.00 0.00 C +ATOM 1222 C ILE A 78 23.086 5.251 11.260 1.00 0.00 C +ATOM 1223 O ILE A 78 22.086 5.170 10.559 1.00 0.00 O +ATOM 1224 CB ILE A 78 25.422 5.396 10.409 1.00 0.00 C +ATOM 1225 CG1 ILE A 78 26.403 6.295 9.670 1.00 0.00 C +ATOM 1226 CG2 ILE A 78 24.911 4.330 9.448 1.00 0.00 C +ATOM 1227 CD1 ILE A 78 27.766 5.597 9.537 1.00 0.00 C +ATOM 1228 H ILE A 78 25.533 6.753 12.562 1.00 0.00 H +ATOM 1229 HA ILE A 78 23.953 6.881 10.285 1.00 0.00 H +ATOM 1230 HB ILE A 78 25.897 4.950 11.168 1.00 0.00 H +ATOM 1231 HG12 ILE A 78 26.517 7.148 10.179 1.00 0.00 H +ATOM 1232 HG13 ILE A 78 26.045 6.496 8.758 1.00 0.00 H +ATOM 1233 HG21 ILE A 78 25.684 3.806 9.090 1.00 0.00 H +ATOM 1234 HG22 ILE A 78 24.287 3.716 9.932 1.00 0.00 H +ATOM 1235 HG23 ILE A 78 24.426 4.768 8.691 1.00 0.00 H +ATOM 1236 HD11 ILE A 78 28.401 6.197 9.050 1.00 0.00 H +ATOM 1237 HD12 ILE A 78 28.128 5.396 10.447 1.00 0.00 H +ATOM 1238 HD13 ILE A 78 27.655 4.744 9.027 1.00 0.00 H +ATOM 1239 N LEU A 79 23.222 4.474 12.316 1.00 0.00 N +ATOM 1240 CA LEU A 79 22.158 3.516 12.548 1.00 0.00 C +ATOM 1241 C LEU A 79 20.793 4.077 12.862 1.00 0.00 C +ATOM 1242 O LEU A 79 19.804 3.384 12.701 1.00 0.00 O +ATOM 1243 CB LEU A 79 22.526 2.412 13.523 1.00 0.00 C +ATOM 1244 CG LEU A 79 23.747 1.648 13.072 1.00 0.00 C +ATOM 1245 CD1 LEU A 79 24.160 0.762 14.221 1.00 0.00 C +ATOM 1246 CD2 LEU A 79 23.459 0.816 11.844 1.00 0.00 C +ATOM 1247 H LEU A 79 24.014 4.541 12.923 1.00 0.00 H +ATOM 1248 HA LEU A 79 22.043 3.050 11.671 1.00 0.00 H +ATOM 1249 HB2 LEU A 79 21.757 1.777 13.598 1.00 0.00 H +ATOM 1250 HB3 LEU A 79 22.711 2.819 14.417 1.00 0.00 H +ATOM 1251 HG LEU A 79 24.484 2.292 12.870 1.00 0.00 H +ATOM 1252 HD11 LEU A 79 24.970 0.236 13.962 1.00 0.00 H +ATOM 1253 HD12 LEU A 79 24.371 1.327 15.019 1.00 0.00 H +ATOM 1254 HD13 LEU A 79 23.413 0.136 14.444 1.00 0.00 H +ATOM 1255 HD21 LEU A 79 24.287 0.324 11.573 1.00 0.00 H +ATOM 1256 HD22 LEU A 79 22.733 0.159 12.049 1.00 0.00 H +ATOM 1257 HD23 LEU A 79 23.167 1.414 11.097 1.00 0.00 H +ATOM 1258 N ARG A 80 20.745 5.317 13.330 1.00 0.00 N +ATOM 1259 CA ARG A 80 19.497 5.981 13.675 1.00 0.00 C +ATOM 1260 C ARG A 80 18.899 6.743 12.524 1.00 0.00 C +ATOM 1261 O ARG A 80 17.784 7.251 12.628 1.00 0.00 O +ATOM 1262 CB ARG A 80 19.766 7.079 14.676 1.00 0.00 C +ATOM 1263 CG ARG A 80 20.030 6.596 16.069 1.00 0.00 C +ATOM 1264 CD ARG A 80 19.764 7.710 17.071 1.00 0.00 C +ATOM 1265 NE ARG A 80 20.990 8.148 17.721 1.00 0.00 N +ATOM 1266 CZ ARG A 80 21.697 9.227 17.382 1.00 0.00 C +ATOM 1267 NH1 ARG A 80 21.356 10.062 16.387 1.00 0.00 N1+ +ATOM 1268 NH2 ARG A 80 22.803 9.467 18.073 1.00 0.00 N +ATOM 1269 H ARG A 80 21.603 5.817 13.451 1.00 0.00 H +ATOM 1270 HA ARG A 80 18.839 5.324 14.042 1.00 0.00 H +ATOM 1271 HB2 ARG A 80 18.969 7.682 14.700 1.00 0.00 H +ATOM 1272 HB3 ARG A 80 20.565 7.595 14.367 1.00 0.00 H +ATOM 1273 HG2 ARG A 80 20.984 6.306 16.143 1.00 0.00 H +ATOM 1274 HG3 ARG A 80 19.430 5.821 16.269 1.00 0.00 H +ATOM 1275 HD2 ARG A 80 19.129 7.376 17.767 1.00 0.00 H +ATOM 1276 HD3 ARG A 80 19.355 8.487 16.592 1.00 0.00 H +ATOM 1277 HE ARG A 80 21.330 7.596 18.483 1.00 0.00 H +ATOM 1278 HH11 ARG A 80 21.929 10.855 16.182 1.00 0.00 H +ATOM 1279 HH12 ARG A 80 20.529 9.890 15.852 1.00 0.00 H +ATOM 1280 HH21 ARG A 80 23.366 10.264 17.855 1.00 0.00 H +ATOM 1281 HH22 ARG A 80 23.074 8.851 18.812 1.00 0.00 H +ATOM 1282 N ASN A 81 19.698 6.931 11.476 1.00 0.00 N +ATOM 1283 CA ASN A 81 19.260 7.702 10.333 1.00 0.00 C +ATOM 1284 C ASN A 81 18.530 6.886 9.268 1.00 0.00 C +ATOM 1285 O ASN A 81 19.080 5.955 8.676 1.00 0.00 O +ATOM 1286 CB ASN A 81 20.422 8.512 9.781 1.00 0.00 C +ATOM 1287 CG ASN A 81 19.957 9.514 8.759 1.00 0.00 C +ATOM 1288 ND2 ASN A 81 20.267 10.784 8.999 1.00 0.00 N +ATOM 1289 OD1 ASN A 81 19.309 9.151 7.780 1.00 0.00 O +ATOM 1290 H ASN A 81 20.615 6.533 11.479 1.00 0.00 H +ATOM 1291 HA ASN A 81 18.597 8.365 10.680 1.00 0.00 H +ATOM 1292 HB2 ASN A 81 21.077 7.890 9.352 1.00 0.00 H +ATOM 1293 HB3 ASN A 81 20.867 8.998 10.534 1.00 0.00 H +ATOM 1294 HD21 ASN A 81 20.797 11.024 9.812 1.00 0.00 H +ATOM 1295 HD22 ASN A 81 19.970 11.499 8.367 1.00 0.00 H +ATOM 1296 N ALA A 82 17.274 7.233 9.025 1.00 0.00 N +ATOM 1297 CA ALA A 82 16.458 6.498 8.070 1.00 0.00 C +ATOM 1298 C ALA A 82 17.021 6.456 6.670 1.00 0.00 C +ATOM 1299 O ALA A 82 16.827 5.518 5.938 1.00 0.00 O +ATOM 1300 CB ALA A 82 15.011 6.921 8.079 1.00 0.00 C +ATOM 1301 H ALA A 82 16.879 8.015 9.507 1.00 0.00 H +ATOM 1302 HA ALA A 82 16.462 5.550 8.389 1.00 0.00 H +ATOM 1303 HB1 ALA A 82 14.503 6.384 7.406 1.00 0.00 H +ATOM 1304 HB2 ALA A 82 14.625 6.768 8.988 1.00 0.00 H +ATOM 1305 HB3 ALA A 82 14.946 7.892 7.849 1.00 0.00 H +ATOM 1306 N LYS A 83 17.738 7.489 6.290 1.00 0.00 N +ATOM 1307 CA LYS A 83 18.320 7.493 4.965 1.00 0.00 C +ATOM 1308 C LYS A 83 19.654 6.777 4.919 1.00 0.00 C +ATOM 1309 O LYS A 83 20.050 6.300 3.871 1.00 0.00 O +ATOM 1310 CB LYS A 83 18.564 8.897 4.458 1.00 0.00 C +ATOM 1311 CG LYS A 83 17.391 9.470 3.729 1.00 0.00 C +ATOM 1312 CD LYS A 83 16.458 10.210 4.666 1.00 0.00 C +ATOM 1313 CE LYS A 83 15.426 11.045 3.916 1.00 0.00 C +ATOM 1314 NZ LYS A 83 15.470 10.816 2.459 1.00 0.00 N1+ +ATOM 1315 H LYS A 83 17.880 8.262 6.908 1.00 0.00 H +ATOM 1316 HA LYS A 83 17.690 7.033 4.339 1.00 0.00 H +ATOM 1317 HB2 LYS A 83 19.347 8.879 3.836 1.00 0.00 H +ATOM 1318 HB3 LYS A 83 18.772 9.486 5.239 1.00 0.00 H +ATOM 1319 HG2 LYS A 83 16.887 8.726 3.290 1.00 0.00 H +ATOM 1320 HG3 LYS A 83 17.722 10.106 3.032 1.00 0.00 H +ATOM 1321 HD2 LYS A 83 17.001 10.816 5.248 1.00 0.00 H +ATOM 1322 HD3 LYS A 83 15.979 9.542 5.236 1.00 0.00 H +ATOM 1323 HE2 LYS A 83 15.604 12.013 4.095 1.00 0.00 H +ATOM 1324 HE3 LYS A 83 14.515 10.807 4.251 1.00 0.00 H +ATOM 1325 HZ1 LYS A 83 14.558 10.952 2.073 1.00 0.00 H +ATOM 1326 HZ2 LYS A 83 16.109 11.461 2.039 1.00 0.00 H +ATOM 1327 HZ3 LYS A 83 15.773 9.880 2.278 1.00 0.00 H +ATOM 1328 N LEU A 84 20.374 6.760 6.031 1.00 0.00 N +ATOM 1329 CA LEU A 84 21.698 6.156 6.019 1.00 0.00 C +ATOM 1330 C LEU A 84 21.747 4.662 6.317 1.00 0.00 C +ATOM 1331 O LEU A 84 22.497 3.905 5.714 1.00 0.00 O +ATOM 1332 CB LEU A 84 22.683 6.918 6.954 1.00 0.00 C +ATOM 1333 CG LEU A 84 22.894 8.379 6.605 1.00 0.00 C +ATOM 1334 CD1 LEU A 84 23.843 8.996 7.637 1.00 0.00 C +ATOM 1335 CD2 LEU A 84 23.525 8.524 5.219 1.00 0.00 C +ATOM 1336 H LEU A 84 20.010 7.159 6.873 1.00 0.00 H +ATOM 1337 HA LEU A 84 22.049 6.269 5.090 1.00 0.00 H +ATOM 1338 HB2 LEU A 84 23.570 6.458 6.912 1.00 0.00 H +ATOM 1339 HB3 LEU A 84 22.326 6.870 7.887 1.00 0.00 H +ATOM 1340 HG LEU A 84 22.017 8.859 6.626 1.00 0.00 H +ATOM 1341 HD11 LEU A 84 23.991 9.961 7.419 1.00 0.00 H +ATOM 1342 HD12 LEU A 84 23.440 8.919 8.549 1.00 0.00 H +ATOM 1343 HD13 LEU A 84 24.718 8.512 7.617 1.00 0.00 H +ATOM 1344 HD21 LEU A 84 23.654 9.494 5.011 1.00 0.00 H +ATOM 1345 HD22 LEU A 84 24.410 8.059 5.206 1.00 0.00 H +ATOM 1346 HD23 LEU A 84 22.923 8.114 4.534 1.00 0.00 H +ATOM 1347 N LYS A 85 20.976 4.264 7.293 1.00 0.00 N +ATOM 1348 CA LYS A 85 20.954 2.909 7.729 1.00 0.00 C +ATOM 1349 C LYS A 85 20.865 1.834 6.661 1.00 0.00 C +ATOM 1350 O LYS A 85 21.599 0.838 6.663 1.00 0.00 O +ATOM 1351 CB LYS A 85 19.905 2.733 8.781 1.00 0.00 C +ATOM 1352 CG LYS A 85 19.974 1.318 9.304 1.00 0.00 C +ATOM 1353 CD LYS A 85 19.238 1.131 10.595 1.00 0.00 C +ATOM 1354 CE LYS A 85 19.144 -0.344 10.958 1.00 0.00 C +ATOM 1355 NZ LYS A 85 18.287 -1.083 10.047 1.00 0.00 N1+ +ATOM 1356 H LYS A 85 20.384 4.930 7.747 1.00 0.00 H +ATOM 1357 HA LYS A 85 21.828 2.759 8.191 1.00 0.00 H +ATOM 1358 HB2 LYS A 85 19.002 2.902 8.387 1.00 0.00 H +ATOM 1359 HB3 LYS A 85 20.068 3.376 9.529 1.00 0.00 H +ATOM 1360 HG2 LYS A 85 20.934 1.079 9.448 1.00 0.00 H +ATOM 1361 HG3 LYS A 85 19.577 0.706 8.620 1.00 0.00 H +ATOM 1362 HD2 LYS A 85 18.315 1.505 10.503 1.00 0.00 H +ATOM 1363 HD3 LYS A 85 19.723 1.617 11.322 1.00 0.00 H +ATOM 1364 HE2 LYS A 85 18.774 -0.424 11.884 1.00 0.00 H +ATOM 1365 HE3 LYS A 85 20.061 -0.741 10.930 1.00 0.00 H +ATOM 1366 HZ1 LYS A 85 18.833 -1.435 9.287 1.00 0.00 H +ATOM 1367 HZ2 LYS A 85 17.862 -1.846 10.534 1.00 0.00 H +ATOM 1368 HZ3 LYS A 85 17.576 -0.476 9.693 1.00 0.00 H +ATOM 1369 N PRO A 86 19.923 1.989 5.784 1.00 0.00 N +ATOM 1370 CA PRO A 86 19.718 1.012 4.751 1.00 0.00 C +ATOM 1371 C PRO A 86 20.931 0.894 3.863 1.00 0.00 C +ATOM 1372 O PRO A 86 21.327 -0.193 3.490 1.00 0.00 O +ATOM 1373 CB PRO A 86 18.506 1.471 3.952 1.00 0.00 C +ATOM 1374 CG PRO A 86 17.901 2.641 4.721 1.00 0.00 C +ATOM 1375 CD PRO A 86 18.921 3.062 5.769 1.00 0.00 C +ATOM 1376 HA PRO A 86 19.524 0.124 5.168 1.00 0.00 H +ATOM 1377 HB2 PRO A 86 18.786 1.765 3.038 1.00 0.00 H +ATOM 1378 HB3 PRO A 86 17.841 0.728 3.874 1.00 0.00 H +ATOM 1379 HG2 PRO A 86 17.715 3.401 4.099 1.00 0.00 H +ATOM 1380 HG3 PRO A 86 17.051 2.357 5.164 1.00 0.00 H +ATOM 1381 HD2 PRO A 86 19.343 3.933 5.517 1.00 0.00 H +ATOM 1382 HD3 PRO A 86 18.487 3.149 6.666 1.00 0.00 H +ATOM 1383 N VAL A 87 21.556 2.019 3.540 1.00 0.00 N +ATOM 1384 CA VAL A 87 22.743 1.963 2.703 1.00 0.00 C +ATOM 1385 C VAL A 87 23.885 1.251 3.432 1.00 0.00 C +ATOM 1386 O VAL A 87 24.555 0.336 2.950 1.00 0.00 O +ATOM 1387 CB VAL A 87 23.208 3.358 2.277 1.00 0.00 C +ATOM 1388 CG1 VAL A 87 24.315 3.235 1.225 1.00 0.00 C +ATOM 1389 CG2 VAL A 87 22.026 4.173 1.750 1.00 0.00 C +ATOM 1390 H VAL A 87 21.213 2.899 3.870 1.00 0.00 H +ATOM 1391 HA VAL A 87 22.522 1.441 1.879 1.00 0.00 H +ATOM 1392 HB VAL A 87 23.583 3.825 3.078 1.00 0.00 H +ATOM 1393 HG11 VAL A 87 24.616 4.148 0.949 1.00 0.00 H +ATOM 1394 HG12 VAL A 87 25.088 2.732 1.612 1.00 0.00 H +ATOM 1395 HG13 VAL A 87 23.964 2.745 0.427 1.00 0.00 H +ATOM 1396 HG21 VAL A 87 22.343 5.081 1.476 1.00 0.00 H +ATOM 1397 HG22 VAL A 87 21.625 3.707 0.961 1.00 0.00 H +ATOM 1398 HG23 VAL A 87 21.337 4.264 2.469 1.00 0.00 H +ATOM 1399 N TYR A 88 24.101 1.688 4.642 1.00 0.00 N +ATOM 1400 CA TYR A 88 25.107 1.129 5.505 1.00 0.00 C +ATOM 1401 C TYR A 88 24.960 -0.392 5.686 1.00 0.00 C +ATOM 1402 O TYR A 88 25.964 -1.131 5.691 1.00 0.00 O +ATOM 1403 CB TYR A 88 25.006 1.855 6.871 1.00 0.00 C +ATOM 1404 CG TYR A 88 26.080 1.445 7.826 1.00 0.00 C +ATOM 1405 CD1 TYR A 88 27.346 2.030 7.761 1.00 0.00 C +ATOM 1406 CD2 TYR A 88 25.851 0.462 8.788 1.00 0.00 C +ATOM 1407 CE1 TYR A 88 28.359 1.661 8.638 1.00 0.00 C +ATOM 1408 CE2 TYR A 88 26.851 0.090 9.683 1.00 0.00 C +ATOM 1409 CZ TYR A 88 28.101 0.707 9.623 1.00 0.00 C +ATOM 1410 OH TYR A 88 29.091 0.303 10.491 1.00 0.00 O +ATOM 1411 H TYR A 88 23.543 2.444 4.984 1.00 0.00 H +ATOM 1412 HA TYR A 88 26.006 1.317 5.110 1.00 0.00 H +ATOM 1413 HB2 TYR A 88 24.118 1.645 7.280 1.00 0.00 H +ATOM 1414 HB3 TYR A 88 25.076 2.840 6.715 1.00 0.00 H +ATOM 1415 HD1 TYR A 88 27.528 2.729 7.069 1.00 0.00 H +ATOM 1416 HD2 TYR A 88 24.956 0.018 8.836 1.00 0.00 H +ATOM 1417 HE1 TYR A 88 29.266 2.076 8.564 1.00 0.00 H +ATOM 1418 HE2 TYR A 88 26.674 -0.618 10.367 1.00 0.00 H +ATOM 1419 HH TYR A 88 28.892 -0.382 11.192 1.00 0.00 H +ATOM 1420 N ASP A 89 23.709 -0.854 5.846 1.00 0.00 N +ATOM 1421 CA ASP A 89 23.437 -2.279 6.057 1.00 0.00 C +ATOM 1422 C ASP A 89 23.760 -3.036 4.832 1.00 0.00 C +ATOM 1423 O ASP A 89 24.152 -4.193 4.899 1.00 0.00 O +ATOM 1424 CB ASP A 89 21.977 -2.531 6.393 1.00 0.00 C +ATOM 1425 CG ASP A 89 21.731 -2.288 7.841 1.00 0.00 C +ATOM 1426 OD1 ASP A 89 22.848 -2.091 8.515 1.00 0.00 O +ATOM 1427 OD2 ASP A 89 20.642 -2.285 8.325 1.00 0.00 O1- +ATOM 1428 H ASP A 89 22.944 -0.210 5.821 1.00 0.00 H +ATOM 1429 HA ASP A 89 24.007 -2.613 6.807 1.00 0.00 H +ATOM 1430 HB2 ASP A 89 21.747 -3.479 6.174 1.00 0.00 H +ATOM 1431 HB3 ASP A 89 21.403 -1.915 5.853 1.00 0.00 H +ATOM 1432 N SER A 90 23.593 -2.401 3.704 1.00 0.00 N +ATOM 1433 CA SER A 90 23.868 -3.125 2.490 1.00 0.00 C +ATOM 1434 C SER A 90 25.341 -3.313 2.229 1.00 0.00 C +ATOM 1435 O SER A 90 25.735 -4.064 1.316 1.00 0.00 O +ATOM 1436 CB SER A 90 23.269 -2.434 1.271 1.00 0.00 C +ATOM 1437 OG SER A 90 24.054 -1.304 0.884 1.00 0.00 O +ATOM 1438 H SER A 90 23.286 -1.449 3.684 1.00 0.00 H +ATOM 1439 HA SER A 90 23.450 -4.030 2.569 1.00 0.00 H +ATOM 1440 HB2 SER A 90 22.343 -2.128 1.491 1.00 0.00 H +ATOM 1441 HB3 SER A 90 23.234 -3.083 0.511 1.00 0.00 H +ATOM 1442 HG SER A 90 24.089 -0.649 1.638 1.00 0.00 H +ATOM 1443 N LEU A 91 26.200 -2.568 2.905 1.00 0.00 N +ATOM 1444 CA LEU A 91 27.633 -2.616 2.575 1.00 0.00 C +ATOM 1445 C LEU A 91 28.443 -3.694 3.251 1.00 0.00 C +ATOM 1446 O LEU A 91 28.092 -4.179 4.339 1.00 0.00 O +ATOM 1447 CB LEU A 91 28.328 -1.299 2.979 1.00 0.00 C +ATOM 1448 CG LEU A 91 27.746 -0.042 2.334 1.00 0.00 C +ATOM 1449 CD1 LEU A 91 28.312 1.192 3.010 1.00 0.00 C +ATOM 1450 CD2 LEU A 91 28.207 -0.025 0.874 1.00 0.00 C +ATOM 1451 H LEU A 91 25.876 -1.973 3.640 1.00 0.00 H +ATOM 1452 HA LEU A 91 27.724 -2.729 1.586 1.00 0.00 H +ATOM 1453 HB2 LEU A 91 29.292 -1.364 2.720 1.00 0.00 H +ATOM 1454 HB3 LEU A 91 28.256 -1.201 3.972 1.00 0.00 H +ATOM 1455 HG LEU A 91 26.748 -0.047 2.389 1.00 0.00 H +ATOM 1456 HD11 LEU A 91 27.928 2.011 2.584 1.00 0.00 H +ATOM 1457 HD12 LEU A 91 28.074 1.179 3.981 1.00 0.00 H +ATOM 1458 HD13 LEU A 91 29.307 1.200 2.910 1.00 0.00 H +ATOM 1459 HD21 LEU A 91 27.843 0.788 0.419 1.00 0.00 H +ATOM 1460 HD22 LEU A 91 29.206 -0.007 0.840 1.00 0.00 H +ATOM 1461 HD23 LEU A 91 27.873 -0.845 0.409 1.00 0.00 H +ATOM 1462 N ASP A 92 29.609 -3.991 2.651 1.00 0.00 N +ATOM 1463 CA ASP A 92 30.556 -4.919 3.274 1.00 0.00 C +ATOM 1464 C ASP A 92 31.351 -4.198 4.373 1.00 0.00 C +ATOM 1465 O ASP A 92 31.275 -2.970 4.520 1.00 0.00 O +ATOM 1466 CB ASP A 92 31.557 -5.480 2.295 1.00 0.00 C +ATOM 1467 CG ASP A 92 32.327 -4.396 1.620 1.00 0.00 C +ATOM 1468 OD1 ASP A 92 31.679 -3.885 0.599 1.00 0.00 O +ATOM 1469 OD2 ASP A 92 33.439 -4.033 1.978 1.00 0.00 O1- +ATOM 1470 H ASP A 92 29.832 -3.574 1.770 1.00 0.00 H +ATOM 1471 HA ASP A 92 30.046 -5.675 3.685 1.00 0.00 H +ATOM 1472 HB2 ASP A 92 31.071 -6.013 1.603 1.00 0.00 H +ATOM 1473 HB3 ASP A 92 32.194 -6.074 2.786 1.00 0.00 H +ATOM 1474 N ALA A 93 32.146 -4.938 5.143 1.00 0.00 N +ATOM 1475 CA ALA A 93 32.892 -4.363 6.239 1.00 0.00 C +ATOM 1476 C ALA A 93 33.897 -3.256 5.913 1.00 0.00 C +ATOM 1477 O ALA A 93 34.018 -2.306 6.663 1.00 0.00 O +ATOM 1478 CB ALA A 93 33.335 -5.369 7.301 1.00 0.00 C +ATOM 1479 H ALA A 93 32.229 -5.917 4.958 1.00 0.00 H +ATOM 1480 HA ALA A 93 32.181 -3.855 6.725 1.00 0.00 H +ATOM 1481 HB1 ALA A 93 33.842 -4.893 8.020 1.00 0.00 H +ATOM 1482 HB2 ALA A 93 32.530 -5.811 7.697 1.00 0.00 H +ATOM 1483 HB3 ALA A 93 33.922 -6.061 6.881 1.00 0.00 H +ATOM 1484 N VAL A 94 34.634 -3.342 4.810 1.00 0.00 N +ATOM 1485 CA VAL A 94 35.558 -2.281 4.462 1.00 0.00 C +ATOM 1486 C VAL A 94 34.796 -1.000 4.093 1.00 0.00 C +ATOM 1487 O VAL A 94 35.042 0.080 4.646 1.00 0.00 O +ATOM 1488 CB VAL A 94 36.480 -2.760 3.345 1.00 0.00 C +ATOM 1489 CG1 VAL A 94 37.476 -1.685 2.896 1.00 0.00 C +ATOM 1490 CG2 VAL A 94 37.314 -3.892 3.922 1.00 0.00 C +ATOM 1491 H VAL A 94 34.550 -4.143 4.217 1.00 0.00 H +ATOM 1492 HA VAL A 94 36.121 -2.085 5.265 1.00 0.00 H +ATOM 1493 HB VAL A 94 35.944 -3.085 2.566 1.00 0.00 H +ATOM 1494 HG11 VAL A 94 38.053 -2.050 2.166 1.00 0.00 H +ATOM 1495 HG12 VAL A 94 36.976 -0.887 2.559 1.00 0.00 H +ATOM 1496 HG13 VAL A 94 38.048 -1.416 3.671 1.00 0.00 H +ATOM 1497 HG21 VAL A 94 37.937 -4.239 3.220 1.00 0.00 H +ATOM 1498 HG22 VAL A 94 37.844 -3.553 4.700 1.00 0.00 H +ATOM 1499 HG23 VAL A 94 36.711 -4.629 4.226 1.00 0.00 H +ATOM 1500 N ARG A 95 33.870 -1.134 3.167 1.00 0.00 N +ATOM 1501 CA ARG A 95 33.057 -0.019 2.743 1.00 0.00 C +ATOM 1502 C ARG A 95 32.334 0.614 3.908 1.00 0.00 C +ATOM 1503 O ARG A 95 32.121 1.828 3.947 1.00 0.00 O +ATOM 1504 CB ARG A 95 32.101 -0.382 1.624 1.00 0.00 C +ATOM 1505 CG ARG A 95 32.874 -0.733 0.361 1.00 0.00 C +ATOM 1506 CD ARG A 95 31.890 -1.043 -0.753 1.00 0.00 C +ATOM 1507 NE ARG A 95 32.574 -1.154 -2.019 1.00 0.00 N +ATOM 1508 CZ ARG A 95 33.052 -2.302 -2.503 1.00 0.00 C +ATOM 1509 NH1 ARG A 95 32.971 -3.466 -1.840 1.00 0.00 N1+ +ATOM 1510 NH2 ARG A 95 33.661 -2.292 -3.685 1.00 0.00 N +ATOM 1511 H ARG A 95 33.726 -2.030 2.747 1.00 0.00 H +ATOM 1512 HA ARG A 95 33.681 0.673 2.379 1.00 0.00 H +ATOM 1513 HB2 ARG A 95 31.501 0.396 1.438 1.00 0.00 H +ATOM 1514 HB3 ARG A 95 31.550 -1.169 1.903 1.00 0.00 H +ATOM 1515 HG2 ARG A 95 33.449 -1.533 0.532 1.00 0.00 H +ATOM 1516 HG3 ARG A 95 33.449 0.040 0.094 1.00 0.00 H +ATOM 1517 HD2 ARG A 95 31.214 -0.308 -0.808 1.00 0.00 H +ATOM 1518 HD3 ARG A 95 31.428 -1.907 -0.552 1.00 0.00 H +ATOM 1519 HE ARG A 95 32.697 -0.324 -2.564 1.00 0.00 H +ATOM 1520 HH11 ARG A 95 33.345 -4.300 -2.246 1.00 0.00 H +ATOM 1521 HH12 ARG A 95 32.537 -3.500 -0.940 1.00 0.00 H +ATOM 1522 HH21 ARG A 95 34.027 -3.141 -4.066 1.00 0.00 H +ATOM 1523 HH22 ARG A 95 33.753 -1.435 -4.193 1.00 0.00 H +ATOM 1524 N ARG A 96 31.944 -0.189 4.883 1.00 0.00 N +ATOM 1525 CA ARG A 96 31.280 0.424 6.031 1.00 0.00 C +ATOM 1526 C ARG A 96 32.229 1.411 6.754 1.00 0.00 C +ATOM 1527 O ARG A 96 31.819 2.429 7.300 1.00 0.00 O +ATOM 1528 CB ARG A 96 30.768 -0.580 7.054 1.00 0.00 C +ATOM 1529 CG ARG A 96 29.588 -1.374 6.556 1.00 0.00 C +ATOM 1530 CD ARG A 96 29.031 -2.355 7.625 1.00 0.00 C +ATOM 1531 NE ARG A 96 27.903 -3.105 7.057 1.00 0.00 N +ATOM 1532 CZ ARG A 96 27.227 -4.079 7.656 1.00 0.00 C +ATOM 1533 NH1 ARG A 96 27.505 -4.424 8.876 1.00 0.00 N1+ +ATOM 1534 NH2 ARG A 96 26.228 -4.672 6.973 1.00 0.00 N +ATOM 1535 H ARG A 96 32.097 -1.176 4.837 1.00 0.00 H +ATOM 1536 HA ARG A 96 30.496 0.944 5.691 1.00 0.00 H +ATOM 1537 HB2 ARG A 96 30.494 -0.084 7.878 1.00 0.00 H +ATOM 1538 HB3 ARG A 96 31.508 -1.214 7.277 1.00 0.00 H +ATOM 1539 HG2 ARG A 96 29.872 -1.901 5.755 1.00 0.00 H +ATOM 1540 HG3 ARG A 96 28.861 -0.738 6.296 1.00 0.00 H +ATOM 1541 HD2 ARG A 96 28.720 -1.838 8.423 1.00 0.00 H +ATOM 1542 HD3 ARG A 96 29.751 -2.992 7.900 1.00 0.00 H +ATOM 1543 HE ARG A 96 27.617 -2.859 6.131 1.00 0.00 H +ATOM 1544 HH11 ARG A 96 26.990 -5.159 9.318 1.00 0.00 H +ATOM 1545 HH12 ARG A 96 28.234 -3.955 9.374 1.00 0.00 H +ATOM 1546 HH21 ARG A 96 25.701 -5.408 7.397 1.00 0.00 H +ATOM 1547 HH22 ARG A 96 26.014 -4.376 6.042 1.00 0.00 H +ATOM 1548 N ALA A 97 33.511 1.070 6.773 1.00 0.00 N +ATOM 1549 CA ALA A 97 34.462 1.942 7.411 1.00 0.00 C +ATOM 1550 C ALA A 97 34.522 3.252 6.622 1.00 0.00 C +ATOM 1551 O ALA A 97 34.629 4.324 7.202 1.00 0.00 O +ATOM 1552 CB ALA A 97 35.849 1.293 7.483 1.00 0.00 C +ATOM 1553 H ALA A 97 33.813 0.216 6.349 1.00 0.00 H +ATOM 1554 HA ALA A 97 34.148 2.138 8.340 1.00 0.00 H +ATOM 1555 HB1 ALA A 97 36.487 1.920 7.930 1.00 0.00 H +ATOM 1556 HB2 ALA A 97 35.793 0.444 8.008 1.00 0.00 H +ATOM 1557 HB3 ALA A 97 36.171 1.092 6.558 1.00 0.00 H +ATOM 1558 N ALA A 98 34.439 3.173 5.283 1.00 0.00 N +ATOM 1559 CA ALA A 98 34.443 4.405 4.506 1.00 0.00 C +ATOM 1560 C ALA A 98 33.222 5.261 4.844 1.00 0.00 C +ATOM 1561 O ALA A 98 33.282 6.486 4.843 1.00 0.00 O +ATOM 1562 CB ALA A 98 34.534 4.178 2.999 1.00 0.00 C +ATOM 1563 H ALA A 98 34.376 2.285 4.828 1.00 0.00 H +ATOM 1564 HA ALA A 98 35.253 4.924 4.777 1.00 0.00 H +ATOM 1565 HB1 ALA A 98 34.532 5.060 2.528 1.00 0.00 H +ATOM 1566 HB2 ALA A 98 35.380 3.688 2.786 1.00 0.00 H +ATOM 1567 HB3 ALA A 98 33.750 3.637 2.696 1.00 0.00 H +ATOM 1568 N ALA A 99 32.101 4.608 5.100 1.00 0.00 N +ATOM 1569 CA ALA A 99 30.898 5.353 5.415 1.00 0.00 C +ATOM 1570 C ALA A 99 31.052 6.053 6.740 1.00 0.00 C +ATOM 1571 O ALA A 99 30.592 7.176 6.901 1.00 0.00 O +ATOM 1572 CB ALA A 99 29.640 4.458 5.457 1.00 0.00 C +ATOM 1573 H ALA A 99 32.083 3.608 5.076 1.00 0.00 H +ATOM 1574 HA ALA A 99 30.765 6.047 4.708 1.00 0.00 H +ATOM 1575 HB1 ALA A 99 28.841 5.017 5.677 1.00 0.00 H +ATOM 1576 HB2 ALA A 99 29.509 4.025 4.565 1.00 0.00 H +ATOM 1577 HB3 ALA A 99 29.756 3.752 6.156 1.00 0.00 H +ATOM 1578 N ILE A 100 31.672 5.376 7.707 1.00 0.00 N +ATOM 1579 CA ILE A 100 31.840 5.934 9.034 1.00 0.00 C +ATOM 1580 C ILE A 100 32.738 7.167 8.951 1.00 0.00 C +ATOM 1581 O ILE A 100 32.552 8.234 9.585 1.00 0.00 O +ATOM 1582 CB ILE A 100 32.367 4.895 10.034 1.00 0.00 C +ATOM 1583 CG1 ILE A 100 31.313 3.805 10.296 1.00 0.00 C +ATOM 1584 CG2 ILE A 100 32.741 5.583 11.328 1.00 0.00 C +ATOM 1585 CD1 ILE A 100 31.874 2.553 11.013 1.00 0.00 C +ATOM 1586 H ILE A 100 32.029 4.463 7.512 1.00 0.00 H +ATOM 1587 HA ILE A 100 30.941 6.234 9.353 1.00 0.00 H +ATOM 1588 HB ILE A 100 33.185 4.466 9.650 1.00 0.00 H +ATOM 1589 HG12 ILE A 100 30.929 3.520 9.418 1.00 0.00 H +ATOM 1590 HG13 ILE A 100 30.589 4.196 10.865 1.00 0.00 H +ATOM 1591 HG21 ILE A 100 33.084 4.906 11.979 1.00 0.00 H +ATOM 1592 HG22 ILE A 100 33.451 6.264 11.150 1.00 0.00 H +ATOM 1593 HG23 ILE A 100 31.935 6.034 11.711 1.00 0.00 H +ATOM 1594 HD11 ILE A 100 31.138 1.890 11.150 1.00 0.00 H +ATOM 1595 HD12 ILE A 100 32.593 2.142 10.452 1.00 0.00 H +ATOM 1596 HD13 ILE A 100 32.253 2.818 11.899 1.00 0.00 H +ATOM 1597 N ASN A 101 33.743 7.045 8.112 1.00 0.00 N +ATOM 1598 CA ASN A 101 34.706 8.119 7.921 1.00 0.00 C +ATOM 1599 C ASN A 101 34.010 9.384 7.430 1.00 0.00 C +ATOM 1600 O ASN A 101 34.209 10.460 7.965 1.00 0.00 O +ATOM 1601 CB ASN A 101 35.764 7.638 6.932 1.00 0.00 C +ATOM 1602 CG ASN A 101 36.971 8.530 6.884 1.00 0.00 C +ATOM 1603 ND2 ASN A 101 38.165 7.941 6.872 1.00 0.00 N +ATOM 1604 OD1 ASN A 101 36.847 9.751 6.798 1.00 0.00 O +ATOM 1605 H ASN A 101 33.848 6.196 7.594 1.00 0.00 H +ATOM 1606 HA ASN A 101 35.149 8.314 8.796 1.00 0.00 H +ATOM 1607 HB2 ASN A 101 35.356 7.605 6.020 1.00 0.00 H +ATOM 1608 HB3 ASN A 101 36.057 6.720 7.200 1.00 0.00 H +ATOM 1609 HD21 ASN A 101 38.232 6.946 6.944 1.00 0.00 H +ATOM 1610 HD22 ASN A 101 38.994 8.494 6.791 1.00 0.00 H +ATOM 1611 N MET A 102 33.190 9.257 6.420 1.00 0.00 N +ATOM 1612 CA MET A 102 32.474 10.415 5.916 1.00 0.00 C +ATOM 1613 C MET A 102 31.633 11.070 7.011 1.00 0.00 C +ATOM 1614 O MET A 102 31.610 12.293 7.155 1.00 0.00 O +ATOM 1615 CB MET A 102 31.501 10.039 4.768 1.00 0.00 C +ATOM 1616 CG MET A 102 32.183 9.785 3.444 1.00 0.00 C +ATOM 1617 SD MET A 102 30.998 9.529 2.120 1.00 0.00 S +ATOM 1618 CE MET A 102 30.629 11.259 1.758 1.00 0.00 C +ATOM 1619 H MET A 102 33.056 8.362 5.994 1.00 0.00 H +ATOM 1620 HA MET A 102 33.136 11.082 5.574 1.00 0.00 H +ATOM 1621 HB2 MET A 102 30.851 10.789 4.648 1.00 0.00 H +ATOM 1622 HB3 MET A 102 31.008 9.210 5.032 1.00 0.00 H +ATOM 1623 HG2 MET A 102 32.757 8.970 3.527 1.00 0.00 H +ATOM 1624 HG3 MET A 102 32.755 10.574 3.218 1.00 0.00 H +ATOM 1625 HE1 MET A 102 29.960 11.309 1.016 1.00 0.00 H +ATOM 1626 HE2 MET A 102 30.254 11.698 2.575 1.00 0.00 H +ATOM 1627 HE3 MET A 102 31.468 11.728 1.483 1.00 0.00 H +ATOM 1628 N VAL A 103 30.900 10.255 7.762 1.00 0.00 N +ATOM 1629 CA VAL A 103 30.038 10.804 8.794 1.00 0.00 C +ATOM 1630 C VAL A 103 30.869 11.459 9.874 1.00 0.00 C +ATOM 1631 O VAL A 103 30.513 12.510 10.349 1.00 0.00 O +ATOM 1632 CB VAL A 103 29.055 9.794 9.385 1.00 0.00 C +ATOM 1633 CG1 VAL A 103 28.318 10.422 10.550 1.00 0.00 C +ATOM 1634 CG2 VAL A 103 28.030 9.391 8.338 1.00 0.00 C +ATOM 1635 H VAL A 103 30.942 9.266 7.617 1.00 0.00 H +ATOM 1636 HA VAL A 103 29.494 11.526 8.366 1.00 0.00 H +ATOM 1637 HB VAL A 103 29.552 8.985 9.698 1.00 0.00 H +ATOM 1638 HG11 VAL A 103 27.676 9.759 10.935 1.00 0.00 H +ATOM 1639 HG12 VAL A 103 28.976 10.695 11.252 1.00 0.00 H +ATOM 1640 HG13 VAL A 103 27.816 11.227 10.232 1.00 0.00 H +ATOM 1641 HG21 VAL A 103 27.392 8.731 8.733 1.00 0.00 H +ATOM 1642 HG22 VAL A 103 27.527 10.200 8.035 1.00 0.00 H +ATOM 1643 HG23 VAL A 103 28.497 8.977 7.557 1.00 0.00 H +ATOM 1644 N PHE A 104 31.986 10.848 10.262 1.00 0.00 N +ATOM 1645 CA PHE A 104 32.827 11.414 11.298 1.00 0.00 C +ATOM 1646 C PHE A 104 33.308 12.812 10.903 1.00 0.00 C +ATOM 1647 O PHE A 104 33.453 13.709 11.707 1.00 0.00 O +ATOM 1648 CB PHE A 104 34.059 10.524 11.469 1.00 0.00 C +ATOM 1649 CG PHE A 104 34.990 10.953 12.576 1.00 0.00 C +ATOM 1650 CD1 PHE A 104 35.940 11.947 12.361 1.00 0.00 C +ATOM 1651 CD2 PHE A 104 34.971 10.306 13.811 1.00 0.00 C +ATOM 1652 CE1 PHE A 104 36.815 12.302 13.390 1.00 0.00 C +ATOM 1653 CE2 PHE A 104 35.857 10.623 14.838 1.00 0.00 C +ATOM 1654 CZ PHE A 104 36.786 11.639 14.619 1.00 0.00 C +ATOM 1655 H PHE A 104 32.249 9.985 9.832 1.00 0.00 H +ATOM 1656 HA PHE A 104 32.320 11.460 12.159 1.00 0.00 H +ATOM 1657 HB2 PHE A 104 34.571 10.530 10.610 1.00 0.00 H +ATOM 1658 HB3 PHE A 104 33.748 9.594 11.665 1.00 0.00 H +ATOM 1659 HD1 PHE A 104 35.996 12.405 11.474 1.00 0.00 H +ATOM 1660 HD2 PHE A 104 34.295 9.586 13.966 1.00 0.00 H +ATOM 1661 HE1 PHE A 104 37.472 13.042 13.245 1.00 0.00 H +ATOM 1662 HE2 PHE A 104 35.827 10.134 15.710 1.00 0.00 H +ATOM 1663 HZ PHE A 104 37.430 11.893 15.340 1.00 0.00 H +ATOM 1664 N GLN A 105 33.591 12.977 9.619 1.00 0.00 N +ATOM 1665 CA GLN A 105 34.097 14.217 9.046 1.00 0.00 C +ATOM 1666 C GLN A 105 33.034 15.250 8.790 1.00 0.00 C +ATOM 1667 O GLN A 105 33.246 16.420 9.049 1.00 0.00 O +ATOM 1668 CB GLN A 105 34.902 14.018 7.685 1.00 0.00 C +ATOM 1669 CG GLN A 105 35.545 15.311 7.084 1.00 0.00 C +ATOM 1670 CD GLN A 105 36.150 15.199 5.669 1.00 0.00 C +ATOM 1671 NE2 GLN A 105 36.785 16.268 5.142 1.00 0.00 N +ATOM 1672 OE1 GLN A 105 36.100 14.154 5.055 1.00 0.00 O +ATOM 1673 H GLN A 105 33.448 12.201 9.004 1.00 0.00 H +ATOM 1674 HA GLN A 105 34.734 14.609 9.710 1.00 0.00 H +ATOM 1675 HB2 GLN A 105 34.270 13.644 7.006 1.00 0.00 H +ATOM 1676 HB3 GLN A 105 35.636 13.360 7.855 1.00 0.00 H +ATOM 1677 HG2 GLN A 105 36.276 15.600 7.703 1.00 0.00 H +ATOM 1678 HG3 GLN A 105 34.835 16.015 7.054 1.00 0.00 H +ATOM 1679 HE21 GLN A 105 36.824 17.128 5.651 1.00 0.00 H +ATOM 1680 HE22 GLN A 105 37.216 16.200 4.242 1.00 0.00 H +ATOM 1681 N MET A 106 31.938 14.835 8.201 1.00 0.00 N +ATOM 1682 CA MET A 106 30.974 15.806 7.799 1.00 0.00 C +ATOM 1683 C MET A 106 29.629 15.797 8.444 1.00 0.00 C +ATOM 1684 O MET A 106 28.803 16.625 8.138 1.00 0.00 O +ATOM 1685 CB MET A 106 30.965 15.956 6.253 1.00 0.00 C +ATOM 1686 CG MET A 106 30.249 14.948 5.414 1.00 0.00 C +ATOM 1687 SD MET A 106 30.720 15.242 3.680 1.00 0.00 S +ATOM 1688 CE MET A 106 32.208 14.282 3.569 1.00 0.00 C +ATOM 1689 H MET A 106 31.782 13.861 8.038 1.00 0.00 H +ATOM 1690 HA MET A 106 31.373 16.668 8.111 1.00 0.00 H +ATOM 1691 HB2 MET A 106 31.920 15.954 5.956 1.00 0.00 H +ATOM 1692 HB3 MET A 106 30.555 16.845 6.051 1.00 0.00 H +ATOM 1693 HG2 MET A 106 29.261 15.055 5.522 1.00 0.00 H +ATOM 1694 HG3 MET A 106 30.516 14.024 5.688 1.00 0.00 H +ATOM 1695 HE1 MET A 106 32.584 14.355 2.645 1.00 0.00 H +ATOM 1696 HE2 MET A 106 32.876 14.626 4.229 1.00 0.00 H +ATOM 1697 HE3 MET A 106 32.003 13.324 3.771 1.00 0.00 H +ATOM 1698 N GLY A 107 29.426 14.898 9.360 1.00 0.00 N +ATOM 1699 CA GLY A 107 28.171 14.908 10.002 1.00 0.00 C +ATOM 1700 C GLY A 107 27.167 14.191 9.173 1.00 0.00 C +ATOM 1701 O GLY A 107 27.213 14.077 7.947 1.00 0.00 O +ATOM 1702 H GLY A 107 30.129 14.228 9.599 1.00 0.00 H +ATOM 1703 HA2 GLY A 107 27.875 15.854 10.135 1.00 0.00 H +ATOM 1704 HA3 GLY A 107 28.250 14.455 10.890 1.00 0.00 H +ATOM 1705 N GLU A 108 26.229 13.752 9.922 1.00 0.00 N +ATOM 1706 CA GLU A 108 25.194 12.972 9.395 1.00 0.00 C +ATOM 1707 C GLU A 108 24.294 13.728 8.464 1.00 0.00 C +ATOM 1708 O GLU A 108 23.773 13.176 7.517 1.00 0.00 O +ATOM 1709 CB GLU A 108 24.504 12.291 10.559 1.00 0.00 C +ATOM 1710 CG GLU A 108 23.014 12.550 10.613 1.00 0.00 C +ATOM 1711 CD GLU A 108 22.389 11.387 11.297 1.00 0.00 C +ATOM 1712 OE1 GLU A 108 23.273 10.455 11.551 1.00 0.00 O +ATOM 1713 OE2 GLU A 108 21.211 11.320 11.559 1.00 0.00 O1- +ATOM 1714 H GLU A 108 26.235 13.969 10.898 1.00 0.00 H +ATOM 1715 HA GLU A 108 25.625 12.250 8.854 1.00 0.00 H +ATOM 1716 HB2 GLU A 108 24.914 12.623 11.408 1.00 0.00 H +ATOM 1717 HB3 GLU A 108 24.651 11.305 10.481 1.00 0.00 H +ATOM 1718 HG2 GLU A 108 22.648 12.640 9.687 1.00 0.00 H +ATOM 1719 HG3 GLU A 108 22.831 13.388 11.126 1.00 0.00 H +ATOM 1720 N THR A 109 24.136 15.006 8.712 1.00 0.00 N +ATOM 1721 CA THR A 109 23.311 15.770 7.809 1.00 0.00 C +ATOM 1722 C THR A 109 24.041 15.885 6.502 1.00 0.00 C +ATOM 1723 O THR A 109 23.473 15.600 5.441 1.00 0.00 O +ATOM 1724 CB THR A 109 22.983 17.158 8.357 1.00 0.00 C +ATOM 1725 CG2 THR A 109 22.191 17.949 7.329 1.00 0.00 C +ATOM 1726 OG1 THR A 109 22.213 17.003 9.511 1.00 0.00 O +ATOM 1727 H THR A 109 24.573 15.437 9.501 1.00 0.00 H +ATOM 1728 HA THR A 109 22.456 15.274 7.657 1.00 0.00 H +ATOM 1729 HB THR A 109 23.829 17.643 8.578 1.00 0.00 H +ATOM 1730 HG1 THR A 109 21.988 17.903 9.885 1.00 0.00 H +ATOM 1731 HG21 THR A 109 21.981 18.855 7.696 1.00 0.00 H +ATOM 1732 HG22 THR A 109 22.732 18.045 6.493 1.00 0.00 H +ATOM 1733 HG23 THR A 109 21.339 17.467 7.122 1.00 0.00 H +ATOM 1734 N GLY A 110 25.303 16.316 6.628 1.00 0.00 N +ATOM 1735 CA GLY A 110 26.186 16.471 5.507 1.00 0.00 C +ATOM 1736 C GLY A 110 26.097 15.287 4.577 1.00 0.00 C +ATOM 1737 O GLY A 110 25.734 15.440 3.423 1.00 0.00 O +ATOM 1738 H GLY A 110 25.644 16.539 7.541 1.00 0.00 H +ATOM 1739 HA2 GLY A 110 27.125 16.555 5.840 1.00 0.00 H +ATOM 1740 HA3 GLY A 110 25.935 17.299 5.006 1.00 0.00 H +ATOM 1741 N VAL A 111 26.357 14.096 5.097 1.00 0.00 N +ATOM 1742 CA VAL A 111 26.308 12.899 4.265 1.00 0.00 C +ATOM 1743 C VAL A 111 24.964 12.621 3.636 1.00 0.00 C +ATOM 1744 O VAL A 111 24.859 12.272 2.446 1.00 0.00 O +ATOM 1745 CB VAL A 111 26.728 11.717 5.092 1.00 0.00 C +ATOM 1746 CG1 VAL A 111 26.831 10.501 4.171 1.00 0.00 C +ATOM 1747 CG2 VAL A 111 28.094 12.024 5.661 1.00 0.00 C +ATOM 1748 H VAL A 111 26.588 14.017 6.067 1.00 0.00 H +ATOM 1749 HA VAL A 111 26.975 13.010 3.528 1.00 0.00 H +ATOM 1750 HB VAL A 111 26.070 11.549 5.826 1.00 0.00 H +ATOM 1751 HG11 VAL A 111 27.110 9.702 4.704 1.00 0.00 H +ATOM 1752 HG12 VAL A 111 25.941 10.326 3.749 1.00 0.00 H +ATOM 1753 HG13 VAL A 111 27.509 10.679 3.458 1.00 0.00 H +ATOM 1754 HG21 VAL A 111 28.403 11.254 6.219 1.00 0.00 H +ATOM 1755 HG22 VAL A 111 28.740 12.175 4.913 1.00 0.00 H +ATOM 1756 HG23 VAL A 111 28.042 12.846 6.228 1.00 0.00 H +ATOM 1757 N ALA A 112 23.963 12.764 4.509 1.00 0.00 N +ATOM 1758 CA ALA A 112 22.585 12.549 4.177 1.00 0.00 C +ATOM 1759 C ALA A 112 22.174 13.272 2.886 1.00 0.00 C +ATOM 1760 O ALA A 112 21.330 12.788 2.133 1.00 0.00 O +ATOM 1761 CB ALA A 112 21.684 12.704 5.383 1.00 0.00 C +ATOM 1762 H ALA A 112 24.187 13.036 5.445 1.00 0.00 H +ATOM 1763 HA ALA A 112 22.531 11.577 3.948 1.00 0.00 H +ATOM 1764 HB1 ALA A 112 20.734 12.547 5.112 1.00 0.00 H +ATOM 1765 HB2 ALA A 112 21.945 12.039 6.082 1.00 0.00 H +ATOM 1766 HB3 ALA A 112 21.777 13.629 5.752 1.00 0.00 H +ATOM 1767 N GLY A 113 22.817 14.414 2.584 1.00 0.00 N +ATOM 1768 CA GLY A 113 22.562 15.168 1.337 1.00 0.00 C +ATOM 1769 C GLY A 113 23.180 14.581 0.055 1.00 0.00 C +ATOM 1770 O GLY A 113 23.081 15.143 -1.047 1.00 0.00 O +ATOM 1771 H GLY A 113 23.495 14.768 3.228 1.00 0.00 H +ATOM 1772 HA2 GLY A 113 22.927 16.091 1.458 1.00 0.00 H +ATOM 1773 HA3 GLY A 113 21.572 15.216 1.205 1.00 0.00 H +ATOM 1774 N PHE A 114 23.995 13.532 0.164 1.00 0.00 N +ATOM 1775 CA PHE A 114 24.597 12.897 -0.987 1.00 0.00 C +ATOM 1776 C PHE A 114 23.680 11.810 -1.523 1.00 0.00 C +ATOM 1777 O PHE A 114 24.096 10.705 -1.810 1.00 0.00 O +ATOM 1778 CB PHE A 114 25.859 12.201 -0.532 1.00 0.00 C +ATOM 1779 CG PHE A 114 27.048 13.118 -0.410 1.00 0.00 C +ATOM 1780 CD1 PHE A 114 27.038 14.220 0.450 1.00 0.00 C +ATOM 1781 CD2 PHE A 114 28.190 12.875 -1.169 1.00 0.00 C +ATOM 1782 CE1 PHE A 114 28.143 15.066 0.554 1.00 0.00 C +ATOM 1783 CE2 PHE A 114 29.297 13.718 -1.090 1.00 0.00 C +ATOM 1784 CZ PHE A 114 29.279 14.807 -0.210 1.00 0.00 C +ATOM 1785 H PHE A 114 24.197 13.171 1.074 1.00 0.00 H +ATOM 1786 HA PHE A 114 24.801 13.571 -1.697 1.00 0.00 H +ATOM 1787 HB2 PHE A 114 26.080 11.484 -1.193 1.00 0.00 H +ATOM 1788 HB3 PHE A 114 25.686 11.788 0.362 1.00 0.00 H +ATOM 1789 HD1 PHE A 114 26.224 14.406 1.001 1.00 0.00 H +ATOM 1790 HD2 PHE A 114 28.216 12.084 -1.780 1.00 0.00 H +ATOM 1791 HE1 PHE A 114 28.120 15.852 1.172 1.00 0.00 H +ATOM 1792 HE2 PHE A 114 30.101 13.546 -1.659 1.00 0.00 H +ATOM 1793 HZ PHE A 114 30.081 15.399 -0.130 1.00 0.00 H +ATOM 1794 N THR A 115 22.425 12.135 -1.608 1.00 0.00 N +ATOM 1795 CA THR A 115 21.377 11.253 -2.029 1.00 0.00 C +ATOM 1796 C THR A 115 21.708 10.398 -3.199 1.00 0.00 C +ATOM 1797 O THR A 115 21.553 9.198 -3.138 1.00 0.00 O +ATOM 1798 CB THR A 115 20.161 12.081 -2.431 1.00 0.00 C +ATOM 1799 CG2 THR A 115 19.008 11.149 -2.788 1.00 0.00 C +ATOM 1800 OG1 THR A 115 19.804 12.910 -1.382 1.00 0.00 O +ATOM 1801 H THR A 115 22.171 13.070 -1.361 1.00 0.00 H +ATOM 1802 HA THR A 115 21.125 10.664 -1.261 1.00 0.00 H +ATOM 1803 HB THR A 115 20.392 12.639 -3.228 1.00 0.00 H +ATOM 1804 HG1 THR A 115 19.581 12.356 -0.580 1.00 0.00 H +ATOM 1805 HG21 THR A 115 18.210 11.691 -3.052 1.00 0.00 H +ATOM 1806 HG22 THR A 115 19.278 10.561 -3.551 1.00 0.00 H +ATOM 1807 HG23 THR A 115 18.779 10.583 -1.996 1.00 0.00 H +ATOM 1808 N ASN A 116 22.097 11.033 -4.290 1.00 0.00 N +ATOM 1809 CA ASN A 116 22.437 10.262 -5.487 1.00 0.00 C +ATOM 1810 C ASN A 116 23.567 9.243 -5.317 1.00 0.00 C +ATOM 1811 O ASN A 116 23.509 8.116 -5.796 1.00 0.00 O +ATOM 1812 CB ASN A 116 22.662 11.135 -6.745 1.00 0.00 C +ATOM 1813 CG ASN A 116 21.484 12.062 -6.992 1.00 0.00 C +ATOM 1814 ND2 ASN A 116 21.771 13.310 -7.345 1.00 0.00 N +ATOM 1815 OD1 ASN A 116 20.321 11.676 -6.853 1.00 0.00 O +ATOM 1816 H ASN A 116 22.159 12.031 -4.298 1.00 0.00 H +ATOM 1817 HA ASN A 116 21.622 9.718 -5.688 1.00 0.00 H +ATOM 1818 HB2 ASN A 116 22.779 10.538 -7.539 1.00 0.00 H +ATOM 1819 HB3 ASN A 116 23.488 11.685 -6.617 1.00 0.00 H +ATOM 1820 HD21 ASN A 116 22.724 13.593 -7.450 1.00 0.00 H +ATOM 1821 HD22 ASN A 116 21.034 13.966 -7.506 1.00 0.00 H +ATOM 1822 N SER A 117 24.651 9.648 -4.641 1.00 0.00 N +ATOM 1823 CA SER A 117 25.762 8.725 -4.415 1.00 0.00 C +ATOM 1824 C SER A 117 25.289 7.572 -3.536 1.00 0.00 C +ATOM 1825 O SER A 117 25.709 6.442 -3.723 1.00 0.00 O +ATOM 1826 CB SER A 117 26.918 9.386 -3.675 1.00 0.00 C +ATOM 1827 OG SER A 117 27.319 10.605 -4.289 1.00 0.00 O +ATOM 1828 H SER A 117 24.700 10.583 -4.291 1.00 0.00 H +ATOM 1829 HA SER A 117 26.085 8.368 -5.291 1.00 0.00 H +ATOM 1830 HB2 SER A 117 27.696 8.758 -3.666 1.00 0.00 H +ATOM 1831 HB3 SER A 117 26.633 9.577 -2.736 1.00 0.00 H +ATOM 1832 HG SER A 117 26.749 10.777 -5.092 1.00 0.00 H +ATOM 1833 N LEU A 118 24.455 7.904 -2.537 1.00 0.00 N +ATOM 1834 CA LEU A 118 23.915 6.932 -1.603 1.00 0.00 C +ATOM 1835 C LEU A 118 23.157 5.816 -2.353 1.00 0.00 C +ATOM 1836 O LEU A 118 23.346 4.623 -2.123 1.00 0.00 O +ATOM 1837 CB LEU A 118 23.055 7.570 -0.462 1.00 0.00 C +ATOM 1838 CG LEU A 118 23.805 8.477 0.545 1.00 0.00 C +ATOM 1839 CD1 LEU A 118 22.820 9.096 1.552 1.00 0.00 C +ATOM 1840 CD2 LEU A 118 24.871 7.716 1.305 1.00 0.00 C +ATOM 1841 H LEU A 118 24.194 8.864 -2.432 1.00 0.00 H +ATOM 1842 HA LEU A 118 24.699 6.496 -1.160 1.00 0.00 H +ATOM 1843 HB2 LEU A 118 22.635 6.824 0.055 1.00 0.00 H +ATOM 1844 HB3 LEU A 118 22.340 8.121 -0.892 1.00 0.00 H +ATOM 1845 HG LEU A 118 24.246 9.217 0.037 1.00 0.00 H +ATOM 1846 HD11 LEU A 118 23.320 9.677 2.193 1.00 0.00 H +ATOM 1847 HD12 LEU A 118 22.144 9.646 1.062 1.00 0.00 H +ATOM 1848 HD13 LEU A 118 22.356 8.367 2.055 1.00 0.00 H +ATOM 1849 HD21 LEU A 118 25.331 8.334 1.943 1.00 0.00 H +ATOM 1850 HD22 LEU A 118 24.447 6.967 1.814 1.00 0.00 H +ATOM 1851 HD23 LEU A 118 25.539 7.345 0.660 1.00 0.00 H +ATOM 1852 N ARG A 119 22.328 6.218 -3.268 1.00 0.00 N +ATOM 1853 CA ARG A 119 21.559 5.277 -4.064 1.00 0.00 C +ATOM 1854 C ARG A 119 22.499 4.404 -4.862 1.00 0.00 C +ATOM 1855 O ARG A 119 22.321 3.185 -4.994 1.00 0.00 O +ATOM 1856 CB ARG A 119 20.652 6.054 -5.001 1.00 0.00 C +ATOM 1857 CG ARG A 119 19.692 5.215 -5.805 1.00 0.00 C +ATOM 1858 CD ARG A 119 18.812 6.103 -6.691 1.00 0.00 C +ATOM 1859 NE ARG A 119 19.436 6.395 -7.989 1.00 0.00 N +ATOM 1860 CZ ARG A 119 20.063 7.534 -8.323 1.00 0.00 C +ATOM 1861 NH1 ARG A 119 20.176 8.571 -7.491 1.00 0.00 N1+ +ATOM 1862 NH2 ARG A 119 20.590 7.621 -9.552 1.00 0.00 N +ATOM 1863 H ARG A 119 22.216 7.199 -3.429 1.00 0.00 H +ATOM 1864 HA ARG A 119 21.004 4.705 -3.460 1.00 0.00 H +ATOM 1865 HB2 ARG A 119 21.229 6.562 -5.640 1.00 0.00 H +ATOM 1866 HB3 ARG A 119 20.117 6.696 -4.452 1.00 0.00 H +ATOM 1867 HG2 ARG A 119 19.110 4.693 -5.182 1.00 0.00 H +ATOM 1868 HG3 ARG A 119 20.211 4.585 -6.383 1.00 0.00 H +ATOM 1869 HD2 ARG A 119 18.644 6.966 -6.214 1.00 0.00 H +ATOM 1870 HD3 ARG A 119 17.942 5.636 -6.851 1.00 0.00 H +ATOM 1871 HE ARG A 119 19.389 5.680 -8.687 1.00 0.00 H +ATOM 1872 HH11 ARG A 119 20.653 9.399 -7.786 1.00 0.00 H +ATOM 1873 HH12 ARG A 119 19.784 8.520 -6.573 1.00 0.00 H +ATOM 1874 HH21 ARG A 119 21.064 8.455 -9.835 1.00 0.00 H +ATOM 1875 HH22 ARG A 119 20.509 6.852 -10.186 1.00 0.00 H +ATOM 1876 N MET A 120 23.540 5.042 -5.402 1.00 0.00 N +ATOM 1877 CA MET A 120 24.487 4.278 -6.166 1.00 0.00 C +ATOM 1878 C MET A 120 25.257 3.292 -5.298 1.00 0.00 C +ATOM 1879 O MET A 120 25.527 2.163 -5.684 1.00 0.00 O +ATOM 1880 CB MET A 120 25.459 5.106 -7.024 1.00 0.00 C +ATOM 1881 CG MET A 120 24.814 5.829 -8.186 1.00 0.00 C +ATOM 1882 SD MET A 120 25.972 7.091 -8.810 1.00 0.00 S +ATOM 1883 CE MET A 120 24.874 8.392 -9.376 1.00 0.00 C +ATOM 1884 H MET A 120 23.658 6.027 -5.278 1.00 0.00 H +ATOM 1885 HA MET A 120 23.950 3.727 -6.805 1.00 0.00 H +ATOM 1886 HB2 MET A 120 26.156 4.489 -7.389 1.00 0.00 H +ATOM 1887 HB3 MET A 120 25.893 5.788 -6.434 1.00 0.00 H +ATOM 1888 HG2 MET A 120 23.970 6.269 -7.881 1.00 0.00 H +ATOM 1889 HG3 MET A 120 24.605 5.176 -8.914 1.00 0.00 H +ATOM 1890 HE1 MET A 120 25.415 9.148 -9.745 1.00 0.00 H +ATOM 1891 HE2 MET A 120 24.272 8.033 -10.090 1.00 0.00 H +ATOM 1892 HE3 MET A 120 24.322 8.720 -8.609 1.00 0.00 H +ATOM 1893 N LEU A 121 25.609 3.678 -4.115 1.00 0.00 N +ATOM 1894 CA LEU A 121 26.303 2.724 -3.301 1.00 0.00 C +ATOM 1895 C LEU A 121 25.384 1.542 -2.982 1.00 0.00 C +ATOM 1896 O LEU A 121 25.783 0.380 -3.045 1.00 0.00 O +ATOM 1897 CB LEU A 121 26.813 3.389 -2.014 1.00 0.00 C +ATOM 1898 CG LEU A 121 27.977 4.377 -2.250 1.00 0.00 C +ATOM 1899 CD1 LEU A 121 28.199 5.235 -0.997 1.00 0.00 C +ATOM 1900 CD2 LEU A 121 29.275 3.619 -2.520 1.00 0.00 C +ATOM 1901 H LEU A 121 25.406 4.599 -3.783 1.00 0.00 H +ATOM 1902 HA LEU A 121 27.090 2.383 -3.815 1.00 0.00 H +ATOM 1903 HB2 LEU A 121 27.127 2.673 -1.391 1.00 0.00 H +ATOM 1904 HB3 LEU A 121 26.055 3.888 -1.594 1.00 0.00 H +ATOM 1905 HG LEU A 121 27.764 4.967 -3.029 1.00 0.00 H +ATOM 1906 HD11 LEU A 121 28.953 5.871 -1.158 1.00 0.00 H +ATOM 1907 HD12 LEU A 121 27.366 5.750 -0.794 1.00 0.00 H +ATOM 1908 HD13 LEU A 121 28.422 4.643 -0.223 1.00 0.00 H +ATOM 1909 HD21 LEU A 121 30.017 4.272 -2.670 1.00 0.00 H +ATOM 1910 HD22 LEU A 121 29.493 3.041 -1.733 1.00 0.00 H +ATOM 1911 HD23 LEU A 121 29.164 3.047 -3.333 1.00 0.00 H +ATOM 1912 N GLN A 122 24.141 1.872 -2.662 1.00 0.00 N +ATOM 1913 CA GLN A 122 23.218 0.843 -2.309 1.00 0.00 C +ATOM 1914 C GLN A 122 23.031 -0.161 -3.436 1.00 0.00 C +ATOM 1915 O GLN A 122 22.839 -1.359 -3.222 1.00 0.00 O +ATOM 1916 CB GLN A 122 21.906 1.412 -1.823 1.00 0.00 C +ATOM 1917 CG GLN A 122 20.878 0.291 -1.655 1.00 0.00 C +ATOM 1918 CD GLN A 122 19.752 0.635 -0.715 1.00 0.00 C +ATOM 1919 NE2 GLN A 122 19.106 -0.400 -0.165 1.00 0.00 N +ATOM 1920 OE1 GLN A 122 19.462 1.817 -0.494 1.00 0.00 O +ATOM 1921 H GLN A 122 23.854 2.830 -2.668 1.00 0.00 H +ATOM 1922 HA GLN A 122 23.620 0.345 -1.541 1.00 0.00 H +ATOM 1923 HB2 GLN A 122 21.566 2.076 -2.489 1.00 0.00 H +ATOM 1924 HB3 GLN A 122 22.048 1.866 -0.943 1.00 0.00 H +ATOM 1925 HG2 GLN A 122 21.348 -0.518 -1.301 1.00 0.00 H +ATOM 1926 HG3 GLN A 122 20.488 0.084 -2.552 1.00 0.00 H +ATOM 1927 HE21 GLN A 122 19.385 -1.336 -0.381 1.00 0.00 H +ATOM 1928 HE22 GLN A 122 18.344 -0.238 0.462 1.00 0.00 H +ATOM 1929 N GLN A 123 23.122 0.323 -4.655 1.00 0.00 N +ATOM 1930 CA GLN A 123 22.950 -0.563 -5.767 1.00 0.00 C +ATOM 1931 C GLN A 123 24.230 -1.222 -6.136 1.00 0.00 C +ATOM 1932 O GLN A 123 24.231 -1.960 -7.102 1.00 0.00 O +ATOM 1933 CB GLN A 123 22.496 0.186 -7.011 1.00 0.00 C +ATOM 1934 CG GLN A 123 21.113 0.864 -6.802 1.00 0.00 C +ATOM 1935 CD GLN A 123 20.695 1.603 -8.065 1.00 0.00 C +ATOM 1936 NE2 GLN A 123 20.435 0.846 -9.129 1.00 0.00 N +ATOM 1937 OE1 GLN A 123 20.631 2.827 -8.105 1.00 0.00 O +ATOM 1938 H GLN A 123 23.308 1.294 -4.803 1.00 0.00 H +ATOM 1939 HA GLN A 123 22.273 -1.261 -5.534 1.00 0.00 H +ATOM 1940 HB2 GLN A 123 22.429 -0.460 -7.771 1.00 0.00 H +ATOM 1941 HB3 GLN A 123 23.172 0.890 -7.230 1.00 0.00 H +ATOM 1942 HG2 GLN A 123 21.174 1.513 -6.044 1.00 0.00 H +ATOM 1943 HG3 GLN A 123 20.431 0.165 -6.587 1.00 0.00 H +ATOM 1944 HE21 GLN A 123 20.497 -0.150 -9.062 1.00 0.00 H +ATOM 1945 HE22 GLN A 123 20.179 1.273 -9.996 1.00 0.00 H +ATOM 1946 N LYS A 124 25.333 -0.904 -5.432 1.00 0.00 N +ATOM 1947 CA LYS A 124 26.642 -1.497 -5.741 1.00 0.00 C +ATOM 1948 C LYS A 124 27.236 -1.136 -7.086 1.00 0.00 C +ATOM 1949 O LYS A 124 28.038 -1.891 -7.662 1.00 0.00 O +ATOM 1950 CB LYS A 124 26.785 -3.007 -5.499 1.00 0.00 C +ATOM 1951 CG LYS A 124 26.150 -3.432 -4.194 1.00 0.00 C +ATOM 1952 CD LYS A 124 26.628 -4.764 -3.630 1.00 0.00 C +ATOM 1953 CE LYS A 124 26.056 -5.005 -2.249 1.00 0.00 C +ATOM 1954 NZ LYS A 124 26.723 -4.240 -1.184 1.00 0.00 N1+ +ATOM 1955 H LYS A 124 25.260 -0.248 -4.681 1.00 0.00 H +ATOM 1956 HA LYS A 124 27.264 -1.081 -5.077 1.00 0.00 H +ATOM 1957 HB2 LYS A 124 27.757 -3.240 -5.476 1.00 0.00 H +ATOM 1958 HB3 LYS A 124 26.342 -3.498 -6.249 1.00 0.00 H +ATOM 1959 HG2 LYS A 124 25.163 -3.496 -4.339 1.00 0.00 H +ATOM 1960 HG3 LYS A 124 26.341 -2.724 -3.514 1.00 0.00 H +ATOM 1961 HD2 LYS A 124 27.626 -4.756 -3.574 1.00 0.00 H +ATOM 1962 HD3 LYS A 124 26.335 -5.501 -4.239 1.00 0.00 H +ATOM 1963 HE2 LYS A 124 26.142 -5.979 -2.038 1.00 0.00 H +ATOM 1964 HE3 LYS A 124 25.089 -4.751 -2.260 1.00 0.00 H +ATOM 1965 HZ1 LYS A 124 26.294 -4.449 -0.305 1.00 0.00 H +ATOM 1966 HZ2 LYS A 124 27.691 -4.489 -1.150 1.00 0.00 H +ATOM 1967 HZ3 LYS A 124 26.637 -3.262 -1.373 1.00 0.00 H +ATOM 1968 N ARG A 125 26.931 0.051 -7.551 1.00 0.00 N +ATOM 1969 CA ARG A 125 27.493 0.559 -8.783 1.00 0.00 C +ATOM 1970 C ARG A 125 28.727 1.370 -8.364 1.00 0.00 C +ATOM 1971 O ARG A 125 28.698 2.603 -8.244 1.00 0.00 O +ATOM 1972 CB ARG A 125 26.447 1.436 -9.447 1.00 0.00 C +ATOM 1973 CG ARG A 125 25.331 0.591 -10.060 1.00 0.00 C +ATOM 1974 CD ARG A 125 24.077 1.407 -10.257 1.00 0.00 C +ATOM 1975 NE ARG A 125 23.389 1.151 -11.525 1.00 0.00 N +ATOM 1976 CZ ARG A 125 22.437 0.236 -11.710 1.00 0.00 C +ATOM 1977 NH1 ARG A 125 22.050 -0.621 -10.737 1.00 0.00 N1+ +ATOM 1978 NH2 ARG A 125 21.903 0.089 -12.914 1.00 0.00 N +ATOM 1979 H ARG A 125 26.290 0.623 -7.038 1.00 0.00 H +ATOM 1980 HA ARG A 125 27.755 -0.194 -9.387 1.00 0.00 H +ATOM 1981 HB2 ARG A 125 26.882 1.975 -10.168 1.00 0.00 H +ATOM 1982 HB3 ARG A 125 26.054 2.050 -8.763 1.00 0.00 H +ATOM 1983 HG2 ARG A 125 25.129 -0.176 -9.450 1.00 0.00 H +ATOM 1984 HG3 ARG A 125 25.635 0.241 -10.946 1.00 0.00 H +ATOM 1985 HD2 ARG A 125 24.324 2.375 -10.224 1.00 0.00 H +ATOM 1986 HD3 ARG A 125 23.446 1.198 -9.510 1.00 0.00 H +ATOM 1987 HE ARG A 125 23.654 1.706 -12.313 1.00 0.00 H +ATOM 1988 HH11 ARG A 125 21.331 -1.292 -10.919 1.00 0.00 H +ATOM 1989 HH12 ARG A 125 22.483 -0.583 -9.836 1.00 0.00 H +ATOM 1990 HH21 ARG A 125 21.188 -0.594 -13.064 1.00 0.00 H +ATOM 1991 HH22 ARG A 125 22.215 0.661 -13.672 1.00 0.00 H +ATOM 1992 N TRP A 126 29.811 0.656 -8.115 1.00 0.00 N +ATOM 1993 CA TRP A 126 31.006 1.287 -7.578 1.00 0.00 C +ATOM 1994 C TRP A 126 31.698 2.391 -8.338 1.00 0.00 C +ATOM 1995 O TRP A 126 31.997 3.452 -7.791 1.00 0.00 O +ATOM 1996 CB TRP A 126 31.972 0.365 -6.884 1.00 0.00 C +ATOM 1997 CG TRP A 126 31.312 -0.804 -6.170 1.00 0.00 C +ATOM 1998 CD1 TRP A 126 31.459 -2.091 -6.537 1.00 0.00 C +ATOM 1999 CD2 TRP A 126 30.547 -0.799 -4.953 1.00 0.00 C +ATOM 2000 CE2 TRP A 126 30.272 -2.151 -4.640 1.00 0.00 C +ATOM 2001 CE3 TRP A 126 30.093 0.186 -4.059 1.00 0.00 C +ATOM 2002 NE1 TRP A 126 30.849 -2.899 -5.641 1.00 0.00 N +ATOM 2003 CZ2 TRP A 126 29.592 -2.521 -3.488 1.00 0.00 C +ATOM 2004 CZ3 TRP A 126 29.371 -0.185 -2.949 1.00 0.00 C +ATOM 2005 CH2 TRP A 126 29.121 -1.538 -2.661 1.00 0.00 C +ATOM 2006 H TRP A 126 29.809 -0.327 -8.298 1.00 0.00 H +ATOM 2007 HA TRP A 126 30.628 1.792 -6.802 1.00 0.00 H +ATOM 2008 HB2 TRP A 126 32.484 0.897 -6.209 1.00 0.00 H +ATOM 2009 HB3 TRP A 126 32.603 -0.001 -7.568 1.00 0.00 H +ATOM 2010 HD1 TRP A 126 31.947 -2.403 -7.352 1.00 0.00 H +ATOM 2011 HE1 TRP A 126 30.821 -3.897 -5.697 1.00 0.00 H +ATOM 2012 HE3 TRP A 126 30.294 1.151 -4.229 1.00 0.00 H +ATOM 2013 HZ2 TRP A 126 29.449 -3.486 -3.267 1.00 0.00 H +ATOM 2014 HZ3 TRP A 126 29.017 0.521 -2.335 1.00 0.00 H +ATOM 2015 HH2 TRP A 126 28.596 -1.784 -1.846 1.00 0.00 H +ATOM 2016 N ASP A 127 32.033 2.125 -9.566 1.00 0.00 N +ATOM 2017 CA ASP A 127 32.673 3.158 -10.326 1.00 0.00 C +ATOM 2018 C ASP A 127 31.775 4.365 -10.441 1.00 0.00 C +ATOM 2019 O ASP A 127 32.223 5.481 -10.293 1.00 0.00 O +ATOM 2020 CB ASP A 127 33.022 2.647 -11.709 1.00 0.00 C +ATOM 2021 CG ASP A 127 34.252 1.767 -11.655 1.00 0.00 C +ATOM 2022 OD1 ASP A 127 34.591 1.122 -10.684 1.00 0.00 O +ATOM 2023 OD2 ASP A 127 34.975 1.827 -12.747 1.00 0.00 O1- +ATOM 2024 H ASP A 127 31.850 1.228 -9.968 1.00 0.00 H +ATOM 2025 HA ASP A 127 33.516 3.426 -9.859 1.00 0.00 H +ATOM 2026 HB2 ASP A 127 33.200 3.425 -12.312 1.00 0.00 H +ATOM 2027 HB3 ASP A 127 32.254 2.117 -12.067 1.00 0.00 H +ATOM 2028 N GLU A 128 30.485 4.147 -10.667 1.00 0.00 N +ATOM 2029 CA GLU A 128 29.597 5.285 -10.773 1.00 0.00 C +ATOM 2030 C GLU A 128 29.506 6.124 -9.527 1.00 0.00 C +ATOM 2031 O GLU A 128 29.475 7.348 -9.579 1.00 0.00 O +ATOM 2032 CB GLU A 128 28.218 4.853 -11.254 1.00 0.00 C +ATOM 2033 CG GLU A 128 28.393 4.177 -12.624 1.00 0.00 C +ATOM 2034 CD GLU A 128 27.200 3.402 -13.093 1.00 0.00 C +ATOM 2035 OE1 GLU A 128 26.112 4.134 -13.170 1.00 0.00 O +ATOM 2036 OE2 GLU A 128 27.257 2.230 -13.425 1.00 0.00 O1- +ATOM 2037 H GLU A 128 30.134 3.215 -10.762 1.00 0.00 H +ATOM 2038 HA GLU A 128 29.975 5.875 -11.486 1.00 0.00 H +ATOM 2039 HB2 GLU A 128 27.622 5.651 -11.341 1.00 0.00 H +ATOM 2040 HB3 GLU A 128 27.817 4.207 -10.604 1.00 0.00 H +ATOM 2041 HG2 GLU A 128 29.169 3.550 -12.565 1.00 0.00 H +ATOM 2042 HG3 GLU A 128 28.589 4.888 -13.300 1.00 0.00 H +ATOM 2043 N ALA A 129 29.447 5.458 -8.406 1.00 0.00 N +ATOM 2044 CA ALA A 129 29.333 6.189 -7.175 1.00 0.00 C +ATOM 2045 C ALA A 129 30.585 7.018 -6.962 1.00 0.00 C +ATOM 2046 O ALA A 129 30.532 8.158 -6.530 1.00 0.00 O +ATOM 2047 CB ALA A 129 29.154 5.214 -6.016 1.00 0.00 C +ATOM 2048 H ALA A 129 29.481 4.459 -8.404 1.00 0.00 H +ATOM 2049 HA ALA A 129 28.539 6.795 -7.223 1.00 0.00 H +ATOM 2050 HB1 ALA A 129 29.075 5.725 -5.160 1.00 0.00 H +ATOM 2051 HB2 ALA A 129 28.325 4.674 -6.160 1.00 0.00 H +ATOM 2052 HB3 ALA A 129 29.945 4.604 -5.968 1.00 0.00 H +ATOM 2053 N ALA A 130 31.719 6.422 -7.307 1.00 0.00 N +ATOM 2054 CA ALA A 130 33.001 7.077 -7.118 1.00 0.00 C +ATOM 2055 C ALA A 130 33.049 8.379 -7.884 1.00 0.00 C +ATOM 2056 O ALA A 130 33.534 9.400 -7.396 1.00 0.00 O +ATOM 2057 CB ALA A 130 34.177 6.172 -7.526 1.00 0.00 C +ATOM 2058 H ALA A 130 31.690 5.505 -7.704 1.00 0.00 H +ATOM 2059 HA ALA A 130 33.098 7.288 -6.145 1.00 0.00 H +ATOM 2060 HB1 ALA A 130 35.038 6.659 -7.381 1.00 0.00 H +ATOM 2061 HB2 ALA A 130 34.166 5.341 -6.970 1.00 0.00 H +ATOM 2062 HB3 ALA A 130 34.091 5.928 -8.492 1.00 0.00 H +ATOM 2063 N VAL A 131 32.547 8.324 -9.108 1.00 0.00 N +ATOM 2064 CA VAL A 131 32.512 9.491 -9.950 1.00 0.00 C +ATOM 2065 C VAL A 131 31.571 10.535 -9.338 1.00 0.00 C +ATOM 2066 O VAL A 131 31.939 11.694 -9.199 1.00 0.00 O +ATOM 2067 CB VAL A 131 32.140 9.126 -11.415 1.00 0.00 C +ATOM 2068 CG1 VAL A 131 31.731 10.329 -12.214 1.00 0.00 C +ATOM 2069 CG2 VAL A 131 33.328 8.465 -12.117 1.00 0.00 C +ATOM 2070 H VAL A 131 32.186 7.458 -9.453 1.00 0.00 H +ATOM 2071 HA VAL A 131 33.432 9.883 -9.961 1.00 0.00 H +ATOM 2072 HB VAL A 131 31.378 8.479 -11.399 1.00 0.00 H +ATOM 2073 HG11 VAL A 131 31.502 10.048 -13.146 1.00 0.00 H +ATOM 2074 HG12 VAL A 131 30.933 10.756 -11.789 1.00 0.00 H +ATOM 2075 HG13 VAL A 131 32.486 10.984 -12.240 1.00 0.00 H +ATOM 2076 HG21 VAL A 131 33.075 8.236 -13.057 1.00 0.00 H +ATOM 2077 HG22 VAL A 131 34.104 9.096 -12.125 1.00 0.00 H +ATOM 2078 HG23 VAL A 131 33.582 7.631 -11.628 1.00 0.00 H +ATOM 2079 N ASN A 132 30.381 10.120 -8.922 1.00 0.00 N +ATOM 2080 CA ASN A 132 29.429 11.043 -8.347 1.00 0.00 C +ATOM 2081 C ASN A 132 29.941 11.631 -7.031 1.00 0.00 C +ATOM 2082 O ASN A 132 29.747 12.793 -6.695 1.00 0.00 O +ATOM 2083 CB ASN A 132 28.077 10.372 -8.139 1.00 0.00 C +ATOM 2084 CG ASN A 132 26.999 11.333 -7.676 1.00 0.00 C +ATOM 2085 ND2 ASN A 132 26.390 11.964 -8.650 1.00 0.00 N +ATOM 2086 OD1 ASN A 132 26.783 11.565 -6.470 1.00 0.00 O +ATOM 2087 H ASN A 132 30.139 9.153 -9.008 1.00 0.00 H +ATOM 2088 HA ASN A 132 29.303 11.796 -8.992 1.00 0.00 H +ATOM 2089 HB2 ASN A 132 28.181 9.655 -7.450 1.00 0.00 H +ATOM 2090 HB3 ASN A 132 27.788 9.963 -9.005 1.00 0.00 H +ATOM 2091 HD21 ASN A 132 26.601 11.738 -9.601 1.00 0.00 H +ATOM 2092 HD22 ASN A 132 25.714 12.671 -8.442 1.00 0.00 H +ATOM 2093 N LEU A 133 30.619 10.839 -6.241 1.00 0.00 N +ATOM 2094 CA LEU A 133 31.072 11.360 -4.966 1.00 0.00 C +ATOM 2095 C LEU A 133 32.052 12.534 -5.152 1.00 0.00 C +ATOM 2096 O LEU A 133 32.141 13.426 -4.319 1.00 0.00 O +ATOM 2097 CB LEU A 133 31.765 10.268 -4.071 1.00 0.00 C +ATOM 2098 CG LEU A 133 30.822 9.280 -3.348 1.00 0.00 C +ATOM 2099 CD1 LEU A 133 31.637 8.091 -2.819 1.00 0.00 C +ATOM 2100 CD2 LEU A 133 30.133 9.963 -2.183 1.00 0.00 C +ATOM 2101 H LEU A 133 30.820 9.897 -6.510 1.00 0.00 H +ATOM 2102 HA LEU A 133 30.273 11.702 -4.471 1.00 0.00 H +ATOM 2103 HB2 LEU A 133 32.303 10.741 -3.374 1.00 0.00 H +ATOM 2104 HB3 LEU A 133 32.374 9.734 -4.658 1.00 0.00 H +ATOM 2105 HG LEU A 133 30.133 8.949 -3.992 1.00 0.00 H +ATOM 2106 HD11 LEU A 133 31.028 7.451 -2.351 1.00 0.00 H +ATOM 2107 HD12 LEU A 133 32.084 7.627 -3.584 1.00 0.00 H +ATOM 2108 HD13 LEU A 133 32.330 8.421 -2.178 1.00 0.00 H +ATOM 2109 HD21 LEU A 133 29.527 9.312 -1.726 1.00 0.00 H +ATOM 2110 HD22 LEU A 133 30.820 10.291 -1.535 1.00 0.00 H +ATOM 2111 HD23 LEU A 133 29.597 10.737 -2.520 1.00 0.00 H +ATOM 2112 N ALA A 134 32.835 12.481 -6.229 1.00 0.00 N +ATOM 2113 CA ALA A 134 33.864 13.477 -6.512 1.00 0.00 C +ATOM 2114 C ALA A 134 33.310 14.861 -6.863 1.00 0.00 C +ATOM 2115 O ALA A 134 33.984 15.895 -6.728 1.00 0.00 O +ATOM 2116 CB ALA A 134 34.896 12.944 -7.534 1.00 0.00 C +ATOM 2117 H ALA A 134 32.712 11.725 -6.872 1.00 0.00 H +ATOM 2118 HA ALA A 134 34.368 13.596 -5.656 1.00 0.00 H +ATOM 2119 HB1 ALA A 134 35.586 13.646 -7.708 1.00 0.00 H +ATOM 2120 HB2 ALA A 134 35.338 12.126 -7.166 1.00 0.00 H +ATOM 2121 HB3 ALA A 134 34.431 12.715 -8.389 1.00 0.00 H +ATOM 2122 N LYS A 135 32.059 14.900 -7.291 1.00 0.00 N +ATOM 2123 CA LYS A 135 31.394 16.158 -7.631 1.00 0.00 C +ATOM 2124 C LYS A 135 30.821 16.786 -6.414 1.00 0.00 C +ATOM 2125 O LYS A 135 29.636 16.840 -6.241 1.00 0.00 O +ATOM 2126 CB LYS A 135 30.232 15.925 -8.550 1.00 0.00 C +ATOM 2127 CG LYS A 135 30.729 15.180 -9.767 1.00 0.00 C +ATOM 2128 CD LYS A 135 29.707 15.250 -10.878 1.00 0.00 C +ATOM 2129 CE LYS A 135 30.268 14.629 -12.133 1.00 0.00 C +ATOM 2130 NZ LYS A 135 29.221 13.906 -12.876 1.00 0.00 N1+ +ATOM 2131 H LYS A 135 31.552 14.043 -7.385 1.00 0.00 H +ATOM 2132 HA LYS A 135 32.047 16.782 -8.060 1.00 0.00 H +ATOM 2133 HB2 LYS A 135 29.840 16.802 -8.828 1.00 0.00 H +ATOM 2134 HB3 LYS A 135 29.535 15.381 -8.082 1.00 0.00 H +ATOM 2135 HG2 LYS A 135 30.889 14.223 -9.525 1.00 0.00 H +ATOM 2136 HG3 LYS A 135 31.585 15.592 -10.079 1.00 0.00 H +ATOM 2137 HD2 LYS A 135 29.476 16.207 -11.056 1.00 0.00 H +ATOM 2138 HD3 LYS A 135 28.883 14.754 -10.602 1.00 0.00 H +ATOM 2139 HE2 LYS A 135 30.995 13.988 -11.885 1.00 0.00 H +ATOM 2140 HE3 LYS A 135 30.644 15.350 -12.715 1.00 0.00 H +ATOM 2141 HZ1 LYS A 135 29.616 13.504 -13.702 1.00 0.00 H +ATOM 2142 HZ2 LYS A 135 28.844 13.181 -12.300 1.00 0.00 H +ATOM 2143 HZ3 LYS A 135 28.493 14.543 -13.130 1.00 0.00 H +ATOM 2144 N SER A 136 31.706 17.232 -5.565 1.00 0.00 N +ATOM 2145 CA SER A 136 31.249 17.745 -4.320 1.00 0.00 C +ATOM 2146 C SER A 136 32.250 18.739 -3.748 1.00 0.00 C +ATOM 2147 O SER A 136 33.467 18.734 -4.007 1.00 0.00 O +ATOM 2148 CB SER A 136 31.089 16.565 -3.359 1.00 0.00 C +ATOM 2149 OG SER A 136 32.387 15.944 -3.189 1.00 0.00 O +ATOM 2150 H SER A 136 32.681 17.213 -5.785 1.00 0.00 H +ATOM 2151 HA SER A 136 30.365 18.195 -4.447 1.00 0.00 H +ATOM 2152 HB2 SER A 136 30.444 15.903 -3.740 1.00 0.00 H +ATOM 2153 HB3 SER A 136 30.751 16.890 -2.476 1.00 0.00 H +ATOM 2154 HG SER A 136 32.342 14.991 -3.488 1.00 0.00 H +ATOM 2155 N ARG A 137 31.716 19.611 -2.929 1.00 0.00 N +ATOM 2156 CA ARG A 137 32.553 20.556 -2.228 1.00 0.00 C +ATOM 2157 C ARG A 137 33.602 19.794 -1.424 1.00 0.00 C +ATOM 2158 O ARG A 137 34.759 20.185 -1.380 1.00 0.00 O +ATOM 2159 CB ARG A 137 31.707 21.412 -1.270 1.00 0.00 C +ATOM 2160 CG ARG A 137 32.595 22.160 -0.276 1.00 0.00 C +ATOM 2161 CD ARG A 137 31.900 23.308 0.450 1.00 0.00 C +ATOM 2162 NE ARG A 137 32.838 24.218 1.141 1.00 0.00 N +ATOM 2163 CZ ARG A 137 33.555 23.938 2.247 1.00 0.00 C +ATOM 2164 NH1 ARG A 137 33.510 22.756 2.860 1.00 0.00 N1+ +ATOM 2165 NH2 ARG A 137 34.361 24.872 2.747 1.00 0.00 N +ATOM 2166 H ARG A 137 30.726 19.622 -2.789 1.00 0.00 H +ATOM 2167 HA ARG A 137 33.009 21.151 -2.890 1.00 0.00 H +ATOM 2168 HB2 ARG A 137 31.081 20.817 -0.766 1.00 0.00 H +ATOM 2169 HB3 ARG A 137 31.181 22.075 -1.802 1.00 0.00 H +ATOM 2170 HG2 ARG A 137 33.377 22.533 -0.775 1.00 0.00 H +ATOM 2171 HG3 ARG A 137 32.917 21.506 0.409 1.00 0.00 H +ATOM 2172 HD2 ARG A 137 31.275 22.922 1.128 1.00 0.00 H +ATOM 2173 HD3 ARG A 137 31.379 23.838 -0.220 1.00 0.00 H +ATOM 2174 HE ARG A 137 32.952 25.131 0.749 1.00 0.00 H +ATOM 2175 HH11 ARG A 137 34.061 22.596 3.679 1.00 0.00 H +ATOM 2176 HH12 ARG A 137 32.925 22.029 2.501 1.00 0.00 H +ATOM 2177 HH21 ARG A 137 34.900 24.680 3.567 1.00 0.00 H +ATOM 2178 HH22 ARG A 137 34.427 25.765 2.302 1.00 0.00 H +ATOM 2179 N TRP A 138 33.156 18.686 -0.754 1.00 0.00 N +ATOM 2180 CA TRP A 138 33.983 17.803 0.061 1.00 0.00 C +ATOM 2181 C TRP A 138 35.270 17.410 -0.666 1.00 0.00 C +ATOM 2182 O TRP A 138 36.380 17.568 -0.169 1.00 0.00 O +ATOM 2183 CB TRP A 138 33.179 16.513 0.353 1.00 0.00 C +ATOM 2184 CG TRP A 138 33.953 15.389 0.968 1.00 0.00 C +ATOM 2185 CD1 TRP A 138 34.652 15.431 2.133 1.00 0.00 C +ATOM 2186 CD2 TRP A 138 33.952 14.006 0.530 1.00 0.00 C +ATOM 2187 CE2 TRP A 138 34.739 13.288 1.457 1.00 0.00 C +ATOM 2188 CE3 TRP A 138 33.421 13.362 -0.556 1.00 0.00 C +ATOM 2189 NE1 TRP A 138 35.172 14.178 2.412 1.00 0.00 N +ATOM 2190 CZ2 TRP A 138 34.936 11.905 1.333 1.00 0.00 C +ATOM 2191 CZ3 TRP A 138 33.622 11.998 -0.696 1.00 0.00 C +ATOM 2192 CH2 TRP A 138 34.375 11.286 0.238 1.00 0.00 C +ATOM 2193 H TRP A 138 32.184 18.464 -0.830 1.00 0.00 H +ATOM 2194 HA TRP A 138 34.210 18.258 0.922 1.00 0.00 H +ATOM 2195 HB2 TRP A 138 32.798 16.186 -0.512 1.00 0.00 H +ATOM 2196 HB3 TRP A 138 32.434 16.750 0.977 1.00 0.00 H +ATOM 2197 HD1 TRP A 138 34.773 16.244 2.703 1.00 0.00 H +ATOM 2198 HE1 TRP A 138 35.767 13.956 3.184 1.00 0.00 H +ATOM 2199 HE3 TRP A 138 32.895 13.869 -1.239 1.00 0.00 H +ATOM 2200 HZ2 TRP A 138 35.461 11.390 2.011 1.00 0.00 H +ATOM 2201 HZ3 TRP A 138 33.222 11.518 -1.477 1.00 0.00 H +ATOM 2202 HH2 TRP A 138 34.511 10.304 0.109 1.00 0.00 H +ATOM 2203 N TYR A 139 35.099 16.946 -1.898 1.00 0.00 N +ATOM 2204 CA TYR A 139 36.191 16.538 -2.715 1.00 0.00 C +ATOM 2205 C TYR A 139 37.040 17.700 -3.080 1.00 0.00 C +ATOM 2206 O TYR A 139 38.249 17.600 -3.104 1.00 0.00 O +ATOM 2207 CB TYR A 139 35.680 15.974 -4.024 1.00 0.00 C +ATOM 2208 CG TYR A 139 36.783 15.454 -4.903 1.00 0.00 C +ATOM 2209 CD1 TYR A 139 37.310 14.184 -4.675 1.00 0.00 C +ATOM 2210 CD2 TYR A 139 37.220 16.182 -6.006 1.00 0.00 C +ATOM 2211 CE1 TYR A 139 38.266 13.637 -5.521 1.00 0.00 C +ATOM 2212 CE2 TYR A 139 38.183 15.655 -6.868 1.00 0.00 C +ATOM 2213 CZ TYR A 139 38.692 14.382 -6.619 1.00 0.00 C +ATOM 2214 OH TYR A 139 39.652 13.867 -7.440 1.00 0.00 O +ATOM 2215 H TYR A 139 34.171 16.881 -2.265 1.00 0.00 H +ATOM 2216 HA TYR A 139 36.738 15.851 -2.237 1.00 0.00 H +ATOM 2217 HB2 TYR A 139 35.193 16.697 -4.515 1.00 0.00 H +ATOM 2218 HB3 TYR A 139 35.050 15.224 -3.824 1.00 0.00 H +ATOM 2219 HD1 TYR A 139 36.994 13.656 -3.887 1.00 0.00 H +ATOM 2220 HD2 TYR A 139 36.841 17.090 -6.182 1.00 0.00 H +ATOM 2221 HE1 TYR A 139 38.641 12.727 -5.346 1.00 0.00 H +ATOM 2222 HE2 TYR A 139 38.503 16.184 -7.654 1.00 0.00 H +ATOM 2223 HH TYR A 139 39.967 14.391 -8.231 1.00 0.00 H +ATOM 2224 N ASN A 140 36.417 18.806 -3.437 1.00 0.00 N +ATOM 2225 CA ASN A 140 37.201 19.967 -3.824 1.00 0.00 C +ATOM 2226 C ASN A 140 38.025 20.578 -2.692 1.00 0.00 C +ATOM 2227 O ASN A 140 39.125 21.021 -2.934 1.00 0.00 O +ATOM 2228 CB ASN A 140 36.354 21.017 -4.559 1.00 0.00 C +ATOM 2229 CG ASN A 140 36.042 20.485 -5.925 1.00 0.00 C +ATOM 2230 ND2 ASN A 140 34.839 19.934 -6.036 1.00 0.00 N +ATOM 2231 OD1 ASN A 140 36.885 20.446 -6.835 1.00 0.00 O +ATOM 2232 H ASN A 140 35.418 18.845 -3.441 1.00 0.00 H +ATOM 2233 HA ASN A 140 37.865 19.635 -4.495 1.00 0.00 H +ATOM 2234 HB2 ASN A 140 36.866 21.873 -4.637 1.00 0.00 H +ATOM 2235 HB3 ASN A 140 35.505 21.181 -4.056 1.00 0.00 H +ATOM 2236 HD21 ASN A 140 34.192 19.990 -5.276 1.00 0.00 H +ATOM 2237 HD22 ASN A 140 34.581 19.463 -6.879 1.00 0.00 H +ATOM 2238 N GLN A 141 37.516 20.570 -1.452 1.00 0.00 N +ATOM 2239 CA GLN A 141 38.203 21.102 -0.286 1.00 0.00 C +ATOM 2240 C GLN A 141 39.253 20.216 0.305 1.00 0.00 C +ATOM 2241 O GLN A 141 40.294 20.718 0.733 1.00 0.00 O +ATOM 2242 CB GLN A 141 37.273 21.534 0.843 1.00 0.00 C +ATOM 2243 CG GLN A 141 36.270 22.605 0.363 1.00 0.00 C +ATOM 2244 CD GLN A 141 36.919 23.835 -0.246 1.00 0.00 C +ATOM 2245 NE2 GLN A 141 36.422 24.233 -1.416 1.00 0.00 N +ATOM 2246 OE1 GLN A 141 37.821 24.493 0.328 1.00 0.00 O +ATOM 2247 H GLN A 141 36.607 20.174 -1.321 1.00 0.00 H +ATOM 2248 HA GLN A 141 38.675 21.929 -0.592 1.00 0.00 H +ATOM 2249 HB2 GLN A 141 37.820 21.912 1.590 1.00 0.00 H +ATOM 2250 HB3 GLN A 141 36.766 20.737 1.171 1.00 0.00 H +ATOM 2251 HG2 GLN A 141 35.722 22.895 1.147 1.00 0.00 H +ATOM 2252 HG3 GLN A 141 35.674 22.191 -0.325 1.00 0.00 H +ATOM 2253 HE21 GLN A 141 35.703 23.699 -1.861 1.00 0.00 H +ATOM 2254 HE22 GLN A 141 36.767 25.066 -1.849 1.00 0.00 H +ATOM 2255 N THR A 142 38.962 18.920 0.414 1.00 0.00 N +ATOM 2256 CA THR A 142 39.915 17.982 0.970 1.00 0.00 C +ATOM 2257 C THR A 142 40.082 16.866 -0.006 1.00 0.00 C +ATOM 2258 O THR A 142 39.735 15.731 0.268 1.00 0.00 O +ATOM 2259 CB THR A 142 39.450 17.417 2.314 1.00 0.00 C +ATOM 2260 CG2 THR A 142 39.581 18.539 3.361 1.00 0.00 C +ATOM 2261 OG1 THR A 142 38.108 16.952 2.212 1.00 0.00 O +ATOM 2262 H THR A 142 38.070 18.589 0.106 1.00 0.00 H +ATOM 2263 HA THR A 142 40.794 18.443 1.095 1.00 0.00 H +ATOM 2264 HB THR A 142 40.043 16.655 2.573 1.00 0.00 H +ATOM 2265 HG1 THR A 142 38.056 16.233 1.519 1.00 0.00 H +ATOM 2266 HG21 THR A 142 39.283 18.199 4.253 1.00 0.00 H +ATOM 2267 HG22 THR A 142 40.535 18.832 3.418 1.00 0.00 H +ATOM 2268 HG23 THR A 142 39.009 19.314 3.092 1.00 0.00 H +ATOM 2269 N PRO A 143 40.673 17.176 -1.132 1.00 0.00 N +ATOM 2270 CA PRO A 143 40.849 16.180 -2.176 1.00 0.00 C +ATOM 2271 C PRO A 143 41.654 14.900 -1.835 1.00 0.00 C +ATOM 2272 O PRO A 143 41.303 13.811 -2.251 1.00 0.00 O +ATOM 2273 CB PRO A 143 41.511 16.906 -3.343 1.00 0.00 C +ATOM 2274 CG PRO A 143 42.209 18.111 -2.727 1.00 0.00 C +ATOM 2275 CD PRO A 143 41.437 18.425 -1.462 1.00 0.00 C +ATOM 2276 HA PRO A 143 39.939 15.893 -2.476 1.00 0.00 H +ATOM 2277 HB2 PRO A 143 42.175 16.310 -3.794 1.00 0.00 H +ATOM 2278 HB3 PRO A 143 40.824 17.201 -4.006 1.00 0.00 H +ATOM 2279 HG2 PRO A 143 43.160 17.891 -2.510 1.00 0.00 H +ATOM 2280 HG3 PRO A 143 42.182 18.889 -3.355 1.00 0.00 H +ATOM 2281 HD2 PRO A 143 42.065 18.656 -0.719 1.00 0.00 H +ATOM 2282 HD3 PRO A 143 40.809 19.187 -1.617 1.00 0.00 H +ATOM 2283 N ASN A 144 42.799 15.005 -1.150 1.00 0.00 N +ATOM 2284 CA ASN A 144 43.556 13.795 -0.855 1.00 0.00 C +ATOM 2285 C ASN A 144 42.808 12.837 0.071 1.00 0.00 C +ATOM 2286 O ASN A 144 42.831 11.641 -0.107 1.00 0.00 O +ATOM 2287 CB ASN A 144 44.967 14.078 -0.267 1.00 0.00 C +ATOM 2288 CG ASN A 144 45.926 14.771 -1.247 1.00 0.00 C +ATOM 2289 ND2 ASN A 144 46.778 15.613 -0.724 1.00 0.00 N +ATOM 2290 OD1 ASN A 144 45.945 14.546 -2.466 1.00 0.00 O +ATOM 2291 H ASN A 144 43.129 15.898 -0.846 1.00 0.00 H +ATOM 2292 HA ASN A 144 43.692 13.316 -1.723 1.00 0.00 H +ATOM 2293 HB2 ASN A 144 45.374 13.207 0.007 1.00 0.00 H +ATOM 2294 HB3 ASN A 144 44.861 14.664 0.536 1.00 0.00 H +ATOM 2295 HD21 ASN A 144 46.762 15.794 0.259 1.00 0.00 H +ATOM 2296 HD22 ASN A 144 47.445 16.076 -1.307 1.00 0.00 H +ATOM 2297 N ARG A 145 42.186 13.392 1.093 1.00 0.00 N +ATOM 2298 CA ARG A 145 41.428 12.546 1.974 1.00 0.00 C +ATOM 2299 C ARG A 145 40.192 11.985 1.244 1.00 0.00 C +ATOM 2300 O ARG A 145 39.849 10.821 1.353 1.00 0.00 O +ATOM 2301 CB ARG A 145 40.979 13.333 3.175 1.00 0.00 C +ATOM 2302 CG ARG A 145 39.990 12.467 3.950 1.00 0.00 C +ATOM 2303 CD ARG A 145 39.503 13.164 5.172 1.00 0.00 C +ATOM 2304 NE ARG A 145 38.826 12.261 6.058 1.00 0.00 N +ATOM 2305 CZ ARG A 145 38.629 12.673 7.282 1.00 0.00 C +ATOM 2306 NH1 ARG A 145 39.095 13.860 7.620 1.00 0.00 N1+ +ATOM 2307 NH2 ARG A 145 38.012 11.926 8.174 1.00 0.00 N +ATOM 2308 H ARG A 145 42.240 14.378 1.251 1.00 0.00 H +ATOM 2309 HA ARG A 145 42.004 11.786 2.276 1.00 0.00 H +ATOM 2310 HB2 ARG A 145 40.534 14.179 2.881 1.00 0.00 H +ATOM 2311 HB3 ARG A 145 41.765 13.553 3.752 1.00 0.00 H +ATOM 2312 HG2 ARG A 145 40.442 11.617 4.218 1.00 0.00 H +ATOM 2313 HG3 ARG A 145 39.209 12.258 3.361 1.00 0.00 H +ATOM 2314 HD2 ARG A 145 38.870 13.890 4.902 1.00 0.00 H +ATOM 2315 HD3 ARG A 145 40.284 13.564 5.651 1.00 0.00 H +ATOM 2316 HE ARG A 145 38.520 11.359 5.753 1.00 0.00 H +ATOM 2317 HH11 ARG A 145 38.960 14.204 8.549 1.00 0.00 H +ATOM 2318 HH12 ARG A 145 39.583 14.416 6.947 1.00 0.00 H +ATOM 2319 HH21 ARG A 145 37.875 12.268 9.104 1.00 0.00 H +ATOM 2320 HH22 ARG A 145 37.680 11.017 7.922 1.00 0.00 H +ATOM 2321 N ALA A 146 39.499 12.858 0.516 1.00 0.00 N +ATOM 2322 CA ALA A 146 38.337 12.409 -0.243 1.00 0.00 C +ATOM 2323 C ALA A 146 38.711 11.249 -1.164 1.00 0.00 C +ATOM 2324 O ALA A 146 38.004 10.253 -1.233 1.00 0.00 O +ATOM 2325 CB ALA A 146 37.757 13.567 -1.063 1.00 0.00 C +ATOM 2326 H ALA A 146 39.774 13.819 0.490 1.00 0.00 H +ATOM 2327 HA ALA A 146 37.639 12.093 0.400 1.00 0.00 H +ATOM 2328 HB1 ALA A 146 36.962 13.246 -1.578 1.00 0.00 H +ATOM 2329 HB2 ALA A 146 37.480 14.305 -0.448 1.00 0.00 H +ATOM 2330 HB3 ALA A 146 38.451 13.906 -1.698 1.00 0.00 H +ATOM 2331 N LYS A 147 39.833 11.397 -1.895 1.00 0.00 N +ATOM 2332 CA LYS A 147 40.311 10.381 -2.802 1.00 0.00 C +ATOM 2333 C LYS A 147 40.505 9.058 -2.106 1.00 0.00 C +ATOM 2334 O LYS A 147 40.250 7.993 -2.676 1.00 0.00 O +ATOM 2335 CB LYS A 147 41.649 10.731 -3.384 1.00 0.00 C +ATOM 2336 CG LYS A 147 41.498 11.406 -4.714 1.00 0.00 C +ATOM 2337 CD LYS A 147 42.645 12.334 -5.052 1.00 0.00 C +ATOM 2338 CE LYS A 147 42.130 13.565 -5.758 1.00 0.00 C +ATOM 2339 NZ LYS A 147 43.173 14.548 -6.053 1.00 0.00 N1+ +ATOM 2340 H LYS A 147 40.356 12.245 -1.806 1.00 0.00 H +ATOM 2341 HA LYS A 147 39.650 10.267 -3.544 1.00 0.00 H +ATOM 2342 HB2 LYS A 147 42.183 9.894 -3.501 1.00 0.00 H +ATOM 2343 HB3 LYS A 147 42.127 11.347 -2.757 1.00 0.00 H +ATOM 2344 HG2 LYS A 147 40.652 11.939 -4.705 1.00 0.00 H +ATOM 2345 HG3 LYS A 147 41.441 10.702 -5.422 1.00 0.00 H +ATOM 2346 HD2 LYS A 147 43.291 11.857 -5.648 1.00 0.00 H +ATOM 2347 HD3 LYS A 147 43.109 12.607 -4.209 1.00 0.00 H +ATOM 2348 HE2 LYS A 147 41.442 13.999 -5.177 1.00 0.00 H +ATOM 2349 HE3 LYS A 147 41.708 13.283 -6.620 1.00 0.00 H +ATOM 2350 HZ1 LYS A 147 42.768 15.335 -6.518 1.00 0.00 H +ATOM 2351 HZ2 LYS A 147 43.599 14.849 -5.200 1.00 0.00 H +ATOM 2352 HZ3 LYS A 147 43.865 14.132 -6.643 1.00 0.00 H +ATOM 2353 N ARG A 148 41.020 9.142 -0.888 1.00 0.00 N +ATOM 2354 CA ARG A 148 41.256 7.910 -0.098 1.00 0.00 C +ATOM 2355 C ARG A 148 39.972 7.156 0.231 1.00 0.00 C +ATOM 2356 O ARG A 148 39.879 5.947 0.022 1.00 0.00 O +ATOM 2357 CB ARG A 148 42.067 8.179 1.172 1.00 0.00 C +ATOM 2358 CG ARG A 148 43.579 8.274 0.901 1.00 0.00 C +ATOM 2359 CD ARG A 148 44.356 8.219 2.187 1.00 0.00 C +ATOM 2360 NE ARG A 148 43.993 9.279 3.111 1.00 0.00 N +ATOM 2361 CZ ARG A 148 44.576 10.492 3.105 1.00 0.00 C +ATOM 2362 NH1 ARG A 148 45.526 10.790 2.217 1.00 0.00 N1+ +ATOM 2363 NH2 ARG A 148 44.267 11.453 3.956 1.00 0.00 N +ATOM 2364 H ARG A 148 41.249 10.036 -0.502 1.00 0.00 H +ATOM 2365 HA ARG A 148 41.808 7.303 -0.669 1.00 0.00 H +ATOM 2366 HB2 ARG A 148 41.904 7.435 1.820 1.00 0.00 H +ATOM 2367 HB3 ARG A 148 41.759 9.042 1.572 1.00 0.00 H +ATOM 2368 HG2 ARG A 148 43.775 9.137 0.436 1.00 0.00 H +ATOM 2369 HG3 ARG A 148 43.856 7.511 0.318 1.00 0.00 H +ATOM 2370 HD2 ARG A 148 45.330 8.300 1.975 1.00 0.00 H +ATOM 2371 HD3 ARG A 148 44.182 7.338 2.627 1.00 0.00 H +ATOM 2372 HE ARG A 148 43.276 9.099 3.784 1.00 0.00 H +ATOM 2373 HH11 ARG A 148 45.951 11.695 2.224 1.00 0.00 H +ATOM 2374 HH12 ARG A 148 45.813 10.108 1.544 1.00 0.00 H +ATOM 2375 HH21 ARG A 148 44.734 12.336 3.904 1.00 0.00 H +ATOM 2376 HH22 ARG A 148 43.566 11.298 4.652 1.00 0.00 H +ATOM 2377 N VAL A 149 39.006 7.916 0.726 1.00 0.00 N +ATOM 2378 CA VAL A 149 37.687 7.382 1.085 1.00 0.00 C +ATOM 2379 C VAL A 149 36.948 6.824 -0.118 1.00 0.00 C +ATOM 2380 O VAL A 149 36.341 5.749 -0.033 1.00 0.00 O +ATOM 2381 CB VAL A 149 36.847 8.463 1.753 1.00 0.00 C +ATOM 2382 CG1 VAL A 149 35.424 7.960 1.980 1.00 0.00 C +ATOM 2383 CG2 VAL A 149 37.504 8.786 3.098 1.00 0.00 C +ATOM 2384 H VAL A 149 39.183 8.891 0.860 1.00 0.00 H +ATOM 2385 HA VAL A 149 37.819 6.640 1.742 1.00 0.00 H +ATOM 2386 HB VAL A 149 36.830 9.282 1.179 1.00 0.00 H +ATOM 2387 HG11 VAL A 149 34.883 8.678 2.419 1.00 0.00 H +ATOM 2388 HG12 VAL A 149 35.011 7.721 1.101 1.00 0.00 H +ATOM 2389 HG13 VAL A 149 35.446 7.152 2.569 1.00 0.00 H +ATOM 2390 HG21 VAL A 149 36.976 9.495 3.565 1.00 0.00 H +ATOM 2391 HG22 VAL A 149 37.528 7.962 3.664 1.00 0.00 H +ATOM 2392 HG23 VAL A 149 38.437 9.112 2.944 1.00 0.00 H +ATOM 2393 N ILE A 150 36.998 7.593 -1.217 1.00 0.00 N +ATOM 2394 CA ILE A 150 36.363 7.232 -2.481 1.00 0.00 C +ATOM 2395 C ILE A 150 36.956 5.957 -3.081 1.00 0.00 C +ATOM 2396 O ILE A 150 36.265 5.136 -3.657 1.00 0.00 O +ATOM 2397 CB ILE A 150 36.376 8.373 -3.523 1.00 0.00 C +ATOM 2398 CG1 ILE A 150 35.440 9.507 -3.098 1.00 0.00 C +ATOM 2399 CG2 ILE A 150 35.955 7.838 -4.912 1.00 0.00 C +ATOM 2400 CD1 ILE A 150 35.583 10.748 -3.955 1.00 0.00 C +ATOM 2401 H ILE A 150 37.496 8.459 -1.167 1.00 0.00 H +ATOM 2402 HA ILE A 150 35.404 7.037 -2.277 1.00 0.00 H +ATOM 2403 HB ILE A 150 37.306 8.735 -3.589 1.00 0.00 H +ATOM 2404 HG12 ILE A 150 35.644 9.750 -2.150 1.00 0.00 H +ATOM 2405 HG13 ILE A 150 34.496 9.182 -3.163 1.00 0.00 H +ATOM 2406 HG21 ILE A 150 35.968 8.586 -5.575 1.00 0.00 H +ATOM 2407 HG22 ILE A 150 36.593 7.125 -5.202 1.00 0.00 H +ATOM 2408 HG23 ILE A 150 35.032 7.457 -4.857 1.00 0.00 H +ATOM 2409 HD11 ILE A 150 34.950 11.451 -3.632 1.00 0.00 H +ATOM 2410 HD12 ILE A 150 36.521 11.090 -3.893 1.00 0.00 H +ATOM 2411 HD13 ILE A 150 35.373 10.522 -4.906 1.00 0.00 H +ATOM 2412 N THR A 151 38.285 5.807 -2.947 1.00 0.00 N +ATOM 2413 CA THR A 151 38.929 4.612 -3.475 1.00 0.00 C +ATOM 2414 C THR A 151 38.485 3.410 -2.696 1.00 0.00 C +ATOM 2415 O THR A 151 38.340 2.316 -3.234 1.00 0.00 O +ATOM 2416 CB THR A 151 40.462 4.709 -3.403 1.00 0.00 C +ATOM 2417 CG2 THR A 151 41.101 3.322 -3.569 1.00 0.00 C +ATOM 2418 OG1 THR A 151 40.912 5.546 -4.438 1.00 0.00 O +ATOM 2419 H THR A 151 38.828 6.511 -2.488 1.00 0.00 H +ATOM 2420 HA THR A 151 38.658 4.495 -4.430 1.00 0.00 H +ATOM 2421 HB THR A 151 40.730 5.096 -2.521 1.00 0.00 H +ATOM 2422 HG1 THR A 151 41.909 5.616 -4.400 1.00 0.00 H +ATOM 2423 HG21 THR A 151 42.096 3.405 -3.519 1.00 0.00 H +ATOM 2424 HG22 THR A 151 40.780 2.718 -2.839 1.00 0.00 H +ATOM 2425 HG23 THR A 151 40.842 2.940 -4.456 1.00 0.00 H +ATOM 2426 N THR A 152 38.288 3.651 -1.405 1.00 0.00 N +ATOM 2427 CA THR A 152 37.808 2.598 -0.543 1.00 0.00 C +ATOM 2428 C THR A 152 36.403 2.148 -0.958 1.00 0.00 C +ATOM 2429 O THR A 152 36.084 0.971 -0.905 1.00 0.00 O +ATOM 2430 CB THR A 152 37.837 3.101 0.909 1.00 0.00 C +ATOM 2431 CG2 THR A 152 37.421 1.998 1.833 1.00 0.00 C +ATOM 2432 OG1 THR A 152 39.170 3.468 1.218 1.00 0.00 O +ATOM 2433 H THR A 152 38.472 4.560 -1.031 1.00 0.00 H +ATOM 2434 HA THR A 152 38.427 1.817 -0.621 1.00 0.00 H +ATOM 2435 HB THR A 152 37.229 3.888 1.014 1.00 0.00 H +ATOM 2436 HG1 THR A 152 39.312 4.431 0.990 1.00 0.00 H +ATOM 2437 HG21 THR A 152 37.441 2.328 2.777 1.00 0.00 H +ATOM 2438 HG22 THR A 152 36.494 1.702 1.603 1.00 0.00 H +ATOM 2439 HG23 THR A 152 38.050 1.227 1.736 1.00 0.00 H +ATOM 2440 N PHE A 153 35.561 3.099 -1.354 1.00 0.00 N +ATOM 2441 CA PHE A 153 34.211 2.735 -1.737 1.00 0.00 C +ATOM 2442 C PHE A 153 34.265 2.021 -3.080 1.00 0.00 C +ATOM 2443 O PHE A 153 33.509 1.088 -3.357 1.00 0.00 O +ATOM 2444 CB PHE A 153 33.301 3.984 -1.834 1.00 0.00 C +ATOM 2445 CG PHE A 153 32.587 4.438 -0.575 1.00 0.00 C +ATOM 2446 CD1 PHE A 153 31.723 3.604 0.135 1.00 0.00 C +ATOM 2447 CD2 PHE A 153 32.726 5.755 -0.118 1.00 0.00 C +ATOM 2448 CE1 PHE A 153 31.067 4.048 1.289 1.00 0.00 C +ATOM 2449 CE2 PHE A 153 32.056 6.221 1.014 1.00 0.00 C +ATOM 2450 CZ PHE A 153 31.230 5.357 1.739 1.00 0.00 C +ATOM 2451 H PHE A 153 35.856 4.054 -1.387 1.00 0.00 H +ATOM 2452 HA PHE A 153 33.835 2.111 -1.052 1.00 0.00 H +ATOM 2453 HB2 PHE A 153 32.600 3.790 -2.521 1.00 0.00 H +ATOM 2454 HB3 PHE A 153 33.871 4.745 -2.145 1.00 0.00 H +ATOM 2455 HD1 PHE A 153 31.569 2.670 -0.187 1.00 0.00 H +ATOM 2456 HD2 PHE A 153 33.324 6.381 -0.619 1.00 0.00 H +ATOM 2457 HE1 PHE A 153 30.476 3.420 1.795 1.00 0.00 H +ATOM 2458 HE2 PHE A 153 32.167 7.171 1.306 1.00 0.00 H +ATOM 2459 HZ PHE A 153 30.764 5.673 2.566 1.00 0.00 H +ATOM 2460 N ARG A 154 35.175 2.493 -3.923 1.00 0.00 N +ATOM 2461 CA ARG A 154 35.316 1.938 -5.264 1.00 0.00 C +ATOM 2462 C ARG A 154 35.841 0.525 -5.288 1.00 0.00 C +ATOM 2463 O ARG A 154 35.346 -0.291 -6.046 1.00 0.00 O +ATOM 2464 CB ARG A 154 36.171 2.777 -6.208 1.00 0.00 C +ATOM 2465 CG ARG A 154 35.875 2.497 -7.685 1.00 0.00 C +ATOM 2466 CD ARG A 154 36.773 3.294 -8.644 1.00 0.00 C +ATOM 2467 NE ARG A 154 38.150 3.369 -8.173 1.00 0.00 N +ATOM 2468 CZ ARG A 154 39.087 2.432 -8.340 1.00 0.00 C +ATOM 2469 NH1 ARG A 154 38.849 1.282 -8.972 1.00 0.00 N1+ +ATOM 2470 NH2 ARG A 154 40.308 2.659 -7.859 1.00 0.00 N +ATOM 2471 H ARG A 154 35.773 3.241 -3.634 1.00 0.00 H +ATOM 2472 HA ARG A 154 34.398 1.909 -5.659 1.00 0.00 H +ATOM 2473 HB2 ARG A 154 37.134 2.575 -6.031 1.00 0.00 H +ATOM 2474 HB3 ARG A 154 35.994 3.744 -6.025 1.00 0.00 H +ATOM 2475 HG2 ARG A 154 34.922 2.737 -7.869 1.00 0.00 H +ATOM 2476 HG3 ARG A 154 36.013 1.522 -7.857 1.00 0.00 H +ATOM 2477 HD2 ARG A 154 36.410 4.222 -8.728 1.00 0.00 H +ATOM 2478 HD3 ARG A 154 36.763 2.849 -9.540 1.00 0.00 H +ATOM 2479 HE ARG A 154 38.418 4.197 -7.680 1.00 0.00 H +ATOM 2480 HH11 ARG A 154 39.580 0.607 -9.075 1.00 0.00 H +ATOM 2481 HH12 ARG A 154 37.940 1.094 -9.343 1.00 0.00 H +ATOM 2482 HH21 ARG A 154 41.026 1.972 -7.972 1.00 0.00 H +ATOM 2483 HH22 ARG A 154 40.507 3.517 -7.385 1.00 0.00 H +ATOM 2484 N THR A 155 36.868 0.249 -4.474 1.00 0.00 N +ATOM 2485 CA THR A 155 37.514 -1.057 -4.507 1.00 0.00 C +ATOM 2486 C THR A 155 37.109 -1.998 -3.451 1.00 0.00 C +ATOM 2487 O THR A 155 37.295 -3.180 -3.598 1.00 0.00 O +ATOM 2488 CB THR A 155 39.032 -0.961 -4.347 1.00 0.00 C +ATOM 2489 CG2 THR A 155 39.573 -0.071 -5.439 1.00 0.00 C +ATOM 2490 OG1 THR A 155 39.358 -0.446 -3.069 1.00 0.00 O +ATOM 2491 H THR A 155 37.195 0.947 -3.837 1.00 0.00 H +ATOM 2492 HA THR A 155 37.320 -1.479 -5.392 1.00 0.00 H +ATOM 2493 HB THR A 155 39.429 -1.874 -4.443 1.00 0.00 H +ATOM 2494 HG1 THR A 155 38.960 0.465 -2.965 1.00 0.00 H +ATOM 2495 HG21 THR A 155 40.566 0.002 -5.348 1.00 0.00 H +ATOM 2496 HG22 THR A 155 39.348 -0.463 -6.331 1.00 0.00 H +ATOM 2497 HG23 THR A 155 39.163 0.838 -5.362 1.00 0.00 H +ATOM 2498 N GLY A 156 36.709 -1.480 -2.340 1.00 0.00 N +ATOM 2499 CA GLY A 156 36.367 -2.395 -1.287 1.00 0.00 C +ATOM 2500 C GLY A 156 37.593 -2.959 -0.568 1.00 0.00 C +ATOM 2501 O GLY A 156 37.469 -3.915 0.180 1.00 0.00 O +ATOM 2502 H GLY A 156 36.640 -0.490 -2.218 1.00 0.00 H +ATOM 2503 HA2 GLY A 156 35.850 -3.155 -1.680 1.00 0.00 H +ATOM 2504 HA3 GLY A 156 35.798 -1.915 -0.619 1.00 0.00 H +ATOM 2505 N THR A 157 38.775 -2.357 -0.740 1.00 0.00 N +ATOM 2506 CA THR A 157 40.024 -2.765 -0.073 1.00 0.00 C +ATOM 2507 C THR A 157 40.621 -1.575 0.664 1.00 0.00 C +ATOM 2508 O THR A 157 40.224 -0.442 0.457 1.00 0.00 O +ATOM 2509 CB THR A 157 41.070 -3.045 -1.157 1.00 0.00 C +ATOM 2510 CG2 THR A 157 40.476 -3.995 -2.198 1.00 0.00 C +ATOM 2511 OG1 THR A 157 41.373 -1.781 -1.765 1.00 0.00 O +ATOM 2512 H THR A 157 38.814 -1.577 -1.364 1.00 0.00 H +ATOM 2513 HA THR A 157 39.888 -3.551 0.530 1.00 0.00 H +ATOM 2514 HB THR A 157 41.893 -3.443 -0.752 1.00 0.00 H +ATOM 2515 HG1 THR A 157 40.541 -1.394 -2.162 1.00 0.00 H +ATOM 2516 HG21 THR A 157 41.156 -4.180 -2.907 1.00 0.00 H +ATOM 2517 HG22 THR A 157 40.214 -4.853 -1.756 1.00 0.00 H +ATOM 2518 HG23 THR A 157 39.669 -3.574 -2.612 1.00 0.00 H +ATOM 2519 N TRP A 158 41.661 -1.801 1.418 1.00 0.00 N +ATOM 2520 CA TRP A 158 42.283 -0.731 2.135 1.00 0.00 C +ATOM 2521 C TRP A 158 43.479 -0.236 1.389 1.00 0.00 C +ATOM 2522 O TRP A 158 44.382 0.363 1.962 1.00 0.00 O +ATOM 2523 CB TRP A 158 42.833 -1.262 3.462 1.00 0.00 C +ATOM 2524 CG TRP A 158 41.789 -1.694 4.431 1.00 0.00 C +ATOM 2525 CD1 TRP A 158 41.561 -2.966 4.825 1.00 0.00 C +ATOM 2526 CD2 TRP A 158 40.905 -0.874 5.208 1.00 0.00 C +ATOM 2527 CE2 TRP A 158 40.166 -1.732 6.038 1.00 0.00 C +ATOM 2528 CE3 TRP A 158 40.703 0.493 5.285 1.00 0.00 C +ATOM 2529 NE1 TRP A 158 40.584 -3.000 5.776 1.00 0.00 N +ATOM 2530 CZ2 TRP A 158 39.195 -1.264 6.923 1.00 0.00 C +ATOM 2531 CZ3 TRP A 158 39.771 0.948 6.186 1.00 0.00 C +ATOM 2532 CH2 TRP A 158 38.999 0.082 6.984 1.00 0.00 C +ATOM 2533 H TRP A 158 42.026 -2.729 1.495 1.00 0.00 H +ATOM 2534 HA TRP A 158 41.633 0.012 2.294 1.00 0.00 H +ATOM 2535 HB2 TRP A 158 43.375 -0.538 3.888 1.00 0.00 H +ATOM 2536 HB3 TRP A 158 43.421 -2.047 3.265 1.00 0.00 H +ATOM 2537 HD1 TRP A 158 42.040 -3.769 4.470 1.00 0.00 H +ATOM 2538 HE1 TRP A 158 40.230 -3.827 6.212 1.00 0.00 H +ATOM 2539 HE3 TRP A 158 41.217 1.126 4.706 1.00 0.00 H +ATOM 2540 HZ2 TRP A 158 38.663 -1.893 7.491 1.00 0.00 H +ATOM 2541 HZ3 TRP A 158 39.635 1.934 6.279 1.00 0.00 H +ATOM 2542 HH2 TRP A 158 38.304 0.457 7.598 1.00 0.00 H +ATOM 2543 N ASP A 159 43.506 -0.457 0.122 1.00 0.00 N +ATOM 2544 CA ASP A 159 44.676 -0.042 -0.592 1.00 0.00 C +ATOM 2545 C ASP A 159 45.090 1.421 -0.490 1.00 0.00 C +ATOM 2546 O ASP A 159 46.279 1.716 -0.581 1.00 0.00 O +ATOM 2547 CB ASP A 159 44.603 -0.446 -2.041 1.00 0.00 C +ATOM 2548 CG ASP A 159 44.547 -1.928 -2.276 1.00 0.00 C +ATOM 2549 OD1 ASP A 159 45.074 -2.648 -1.312 1.00 0.00 O +ATOM 2550 OD2 ASP A 159 44.111 -2.414 -3.292 1.00 0.00 O1- +ATOM 2551 H ASP A 159 42.741 -0.901 -0.345 1.00 0.00 H +ATOM 2552 HA ASP A 159 45.433 -0.566 -0.202 1.00 0.00 H +ATOM 2553 HB2 ASP A 159 45.412 -0.087 -2.506 1.00 0.00 H +ATOM 2554 HB3 ASP A 159 43.782 -0.036 -2.438 1.00 0.00 H +ATOM 2555 N ALA A 160 44.156 2.338 -0.362 1.00 0.00 N +ATOM 2556 CA ALA A 160 44.485 3.754 -0.334 1.00 0.00 C +ATOM 2557 C ALA A 160 45.196 4.114 0.933 1.00 0.00 C +ATOM 2558 O ALA A 160 45.815 5.163 1.079 1.00 0.00 O +ATOM 2559 CB ALA A 160 43.212 4.602 -0.431 1.00 0.00 C +ATOM 2560 H ALA A 160 43.200 2.056 -0.282 1.00 0.00 H +ATOM 2561 HA ALA A 160 45.077 3.966 -1.111 1.00 0.00 H +ATOM 2562 HB1 ALA A 160 43.455 5.572 -0.410 1.00 0.00 H +ATOM 2563 HB2 ALA A 160 42.738 4.395 -1.287 1.00 0.00 H +ATOM 2564 HB3 ALA A 160 42.612 4.392 0.341 1.00 0.00 H +ATOM 2565 N TYR A 161 45.061 3.229 1.885 1.00 0.00 N +ATOM 2566 CA TYR A 161 45.621 3.490 3.172 1.00 0.00 C +ATOM 2567 C TYR A 161 46.856 2.700 3.386 1.00 0.00 C +ATOM 2568 O TYR A 161 47.417 2.722 4.476 1.00 0.00 O +ATOM 2569 CB TYR A 161 44.647 3.185 4.314 1.00 0.00 C +ATOM 2570 CG TYR A 161 43.587 4.231 4.362 1.00 0.00 C +ATOM 2571 CD1 TYR A 161 42.506 4.142 3.488 1.00 0.00 C +ATOM 2572 CD2 TYR A 161 43.718 5.329 5.208 1.00 0.00 C +ATOM 2573 CE1 TYR A 161 41.511 5.113 3.486 1.00 0.00 C +ATOM 2574 CE2 TYR A 161 42.733 6.318 5.208 1.00 0.00 C +ATOM 2575 CZ TYR A 161 41.642 6.198 4.343 1.00 0.00 C +ATOM 2576 OH TYR A 161 40.686 7.175 4.344 1.00 0.00 O +ATOM 2577 H TYR A 161 44.569 2.375 1.713 1.00 0.00 H +ATOM 2578 HA TYR A 161 45.860 4.460 3.217 1.00 0.00 H +ATOM 2579 HB2 TYR A 161 45.144 3.175 5.182 1.00 0.00 H +ATOM 2580 HB3 TYR A 161 44.225 2.291 4.162 1.00 0.00 H +ATOM 2581 HD1 TYR A 161 42.445 3.371 2.855 1.00 0.00 H +ATOM 2582 HD2 TYR A 161 44.512 5.408 5.811 1.00 0.00 H +ATOM 2583 HE1 TYR A 161 40.719 5.032 2.881 1.00 0.00 H +ATOM 2584 HE2 TYR A 161 42.807 7.105 5.821 1.00 0.00 H +ATOM 2585 HH TYR A 161 40.773 7.959 4.958 1.00 0.00 H +ATOM 2586 N LYS A 162 47.298 1.997 2.362 1.00 0.00 N +ATOM 2587 CA LYS A 162 48.508 1.230 2.531 1.00 0.00 C +ATOM 2588 C LYS A 162 49.647 1.863 1.769 1.00 0.00 C +ATOM 2589 O LYS A 162 50.757 2.016 2.340 1.00 0.00 O +ATOM 2590 CB LYS A 162 48.368 -0.254 2.273 1.00 0.00 C +ATOM 2591 CG LYS A 162 47.496 -0.917 3.341 1.00 0.00 C +ATOM 2592 CD LYS A 162 46.720 -2.138 2.861 1.00 0.00 C +ATOM 2593 CE LYS A 162 46.717 -2.350 1.344 1.00 0.00 C +ATOM 2594 NZ LYS A 162 45.641 -3.237 0.865 1.00 0.00 N1+ +ATOM 2595 H LYS A 162 46.807 1.996 1.491 1.00 0.00 H +ATOM 2596 HA LYS A 162 48.749 1.315 3.498 1.00 0.00 H +ATOM 2597 HB2 LYS A 162 49.275 -0.675 2.284 1.00 0.00 H +ATOM 2598 HB3 LYS A 162 47.948 -0.392 1.376 1.00 0.00 H +ATOM 2599 HG2 LYS A 162 46.838 -0.240 3.671 1.00 0.00 H +ATOM 2600 HG3 LYS A 162 48.089 -1.201 4.095 1.00 0.00 H +ATOM 2601 HD2 LYS A 162 45.771 -2.040 3.162 1.00 0.00 H +ATOM 2602 HD3 LYS A 162 47.123 -2.948 3.286 1.00 0.00 H +ATOM 2603 HE2 LYS A 162 47.595 -2.750 1.081 1.00 0.00 H +ATOM 2604 HE3 LYS A 162 46.610 -1.459 0.902 1.00 0.00 H +ATOM 2605 HZ1 LYS A 162 45.377 -2.970 -0.062 1.00 0.00 H +ATOM 2606 HZ2 LYS A 162 45.966 -4.183 0.860 1.00 0.00 H +ATOM 2607 HZ3 LYS A 162 44.850 -3.160 1.472 1.00 0.00 H +ATOM 2608 N NME A 163 49.484 2.242 0.547 1.00 0.00 N +ATOM 2609 CH3 NME A 163 50.586 2.850 -0.178 1.00 0.00 C +ATOM 2610 H NME A 163 48.590 2.116 0.094 1.00 0.00 H +ATOM 2611 1HH3 NME A 163 50.650 3.901 0.060 1.00 0.00 H +ATOM 2612 2HH3 NME A 163 51.517 2.373 0.095 1.00 0.00 H +ATOM 2613 3HH3 NME A 163 50.434 2.740 -1.242 1.00 0.00 H +END diff --git a/src/pontibus/tests/data/CN.sdf b/src/pontibus/tests/data/CN.sdf new file mode 100644 index 0000000..0aedfeb --- /dev/null +++ b/src/pontibus/tests/data/CN.sdf @@ -0,0 +1,19 @@ + + RDKit 3D + + 7 6 0 0 0 0 0 0 0 0999 V2000 + -0.5449 0.0217 -0.1813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8594 -0.2905 0.0155 N 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7263 0.3463 -1.2100 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1601 -0.8593 0.0223 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8528 0.8211 0.4984 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9508 -1.2559 0.3287 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2332 0.2879 0.7669 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 + 1 3 1 0 + 1 4 1 0 + 1 5 1 0 + 2 6 1 0 + 2 7 1 0 +M END +$$$$ diff --git a/src/pontibus/tests/data/__init__.py b/src/pontibus/tests/data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/pontibus/tests/data/benzene_modifications.sdf b/src/pontibus/tests/data/benzene_modifications.sdf new file mode 100644 index 0000000..548ad29 --- /dev/null +++ b/src/pontibus/tests/data/benzene_modifications.sdf @@ -0,0 +1,240 @@ +benzene + PyMOL2.5 3D 0 + + 12 12 0 0 0 0 0 0 0 0999 V2000 + 25.9780 5.3270 4.7790 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.3950 5.0740 3.4990 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.3400 5.8600 2.9020 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.8370 6.9210 3.5690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.4200 7.1960 4.8560 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.4980 6.3790 5.4690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.2298 4.6859 5.2451 H 0 0 0 0 0 0 0 0 0 0 0 0 + 25.9676 4.2351 2.9497 H 0 0 0 0 0 0 0 0 0 0 0 0 + 27.6890 5.6311 1.8951 H 0 0 0 0 0 0 0 0 0 0 0 0 + 28.5730 7.5660 3.0889 H 0 0 0 0 0 0 0 0 0 0 0 0 + 27.8209 8.0598 5.3863 H 0 0 0 0 0 0 0 0 0 0 0 0 + 26.1874 6.5720 6.4958 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 4 0 0 0 0 + 1 6 4 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 4 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 4 0 0 0 0 + 3 9 1 0 0 0 0 + 4 5 4 0 0 0 0 + 4 10 1 0 0 0 0 + 5 6 4 0 0 0 0 + 5 11 1 0 0 0 0 + 6 12 1 0 0 0 0 +M END +$$$$ +toluene + PyMOL2.5 3D 0 + + 15 15 0 0 0 0 0 0 0 0999 V2000 + 28.9072 8.7434 5.1220 H 0 0 0 0 0 0 0 0 0 0 0 0 + 28.1966 8.1433 6.6393 H 0 0 0 0 0 0 0 0 0 0 0 0 + 27.9864 8.4164 5.6052 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.2579 9.2269 5.5838 H 0 0 0 0 0 0 0 0 0 0 0 0 + 25.9780 5.3270 4.7790 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.3950 5.0740 3.4990 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.3400 5.8600 2.9020 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.8370 6.9210 3.5690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.4200 7.1960 4.8560 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.4980 6.3790 5.4690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.2298 4.6859 5.2451 H 0 0 0 0 0 0 0 0 0 0 0 0 + 25.9676 4.2351 2.9497 H 0 0 0 0 0 0 0 0 0 0 0 0 + 27.6890 5.6311 1.8951 H 0 0 0 0 0 0 0 0 0 0 0 0 + 28.5730 7.5660 3.0889 H 0 0 0 0 0 0 0 0 0 0 0 0 + 26.1874 6.5720 6.4958 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 3 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 5 6 4 0 0 0 0 + 5 10 4 0 0 0 0 + 5 11 1 0 0 0 0 + 6 7 4 0 0 0 0 + 6 12 1 0 0 0 0 + 7 8 4 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 4 0 0 0 0 + 8 14 1 0 0 0 0 + 3 9 1 0 0 0 0 + 9 10 4 0 0 0 0 + 10 15 1 0 0 0 0 +M END +$$$$ +phenol + PyMOL2.5 3D 0 + + 13 13 0 0 0 0 0 0 0 0999 V2000 + 25.9780 5.3270 4.7790 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.3950 5.0740 3.4990 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.3400 5.8600 2.9020 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.8370 6.9210 3.5690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.4200 7.1960 4.8560 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.4980 6.3790 5.4690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.2298 4.6859 5.2451 H 0 0 0 0 0 0 0 0 0 0 0 0 + 25.9676 4.2351 2.9497 H 0 0 0 0 0 0 0 0 0 0 0 0 + 27.6890 5.6311 1.8951 H 0 0 0 0 0 0 0 0 0 0 0 0 + 28.5730 7.5660 3.0889 H 0 0 0 0 0 0 0 0 0 0 0 0 + 28.1311 8.0887 6.4624 H 0 0 0 0 0 0 0 0 0 0 0 0 + 26.1874 6.5720 6.4958 H 0 0 0 0 0 0 0 0 0 0 0 0 + 27.9460 8.3293 5.5517 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 4 0 0 0 0 + 1 6 4 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 4 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 4 0 0 0 0 + 3 9 1 0 0 0 0 + 4 5 4 0 0 0 0 + 4 10 1 0 0 0 0 + 5 6 4 0 0 0 0 + 5 13 1 0 0 0 0 + 6 12 1 0 0 0 0 + 11 13 1 0 0 0 0 +M END +$$$$ +benzonitrile + PyMOL2.5 3D 0 + + 13 13 0 0 0 0 0 0 0 0999 V2000 + 28.5559 9.5700 6.2831 N 0 0 0 0 0 0 0 0 0 0 0 0 + 27.9981 8.4043 5.5824 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.9780 5.3270 4.7790 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.3950 5.0740 3.4990 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.3400 5.8600 2.9020 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.8370 6.9210 3.5690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.4200 7.1960 4.8560 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.4980 6.3790 5.4690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.2298 4.6859 5.2451 H 0 0 0 0 0 0 0 0 0 0 0 0 + 25.9676 4.2351 2.9497 H 0 0 0 0 0 0 0 0 0 0 0 0 + 27.6890 5.6311 1.8951 H 0 0 0 0 0 0 0 0 0 0 0 0 + 28.5730 7.5660 3.0889 H 0 0 0 0 0 0 0 0 0 0 0 0 + 26.1874 6.5720 6.4958 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 3 0 0 0 0 + 3 4 4 0 0 0 0 + 3 8 4 0 0 0 0 + 3 9 1 0 0 0 0 + 4 5 4 0 0 0 0 + 4 10 1 0 0 0 0 + 5 6 4 0 0 0 0 + 5 11 1 0 0 0 0 + 6 7 4 0 0 0 0 + 6 12 1 0 0 0 0 + 2 7 1 0 0 0 0 + 7 8 4 0 0 0 0 + 8 13 1 0 0 0 0 +M END +$$$$ +anisole + PyMOL2.5 3D 0 + + 16 16 0 0 0 0 0 0 0 0999 V2000 + 29.2873 8.8784 4.9226 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.5502 9.7990 5.4437 H 0 0 0 0 0 0 0 0 0 0 0 0 + 28.0548 8.3459 5.4720 O 0 0 0 0 0 0 0 0 0 0 0 0 + 30.0866 8.1484 5.0502 H 0 0 0 0 0 0 0 0 0 0 0 0 + 29.1525 9.0868 3.8612 H 0 0 0 0 0 0 0 0 0 0 0 0 + 25.9780 5.3270 4.7790 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.3950 5.0740 3.4990 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.3400 5.8600 2.9020 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.8370 6.9210 3.5690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.4200 7.1960 4.8560 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.4980 6.3790 5.4690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.2298 4.6859 5.2451 H 0 0 0 0 0 0 0 0 0 0 0 0 + 25.9676 4.2351 2.9497 H 0 0 0 0 0 0 0 0 0 0 0 0 + 27.6890 5.6311 1.8951 H 0 0 0 0 0 0 0 0 0 0 0 0 + 28.5730 7.5660 3.0889 H 0 0 0 0 0 0 0 0 0 0 0 0 + 26.1874 6.5720 6.4958 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 3 1 0 0 0 0 + 6 7 4 0 0 0 0 + 6 11 4 0 0 0 0 + 6 12 1 0 0 0 0 + 7 8 4 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 4 0 0 0 0 + 8 14 1 0 0 0 0 + 9 10 4 0 0 0 0 + 9 15 1 0 0 0 0 + 3 10 1 0 0 0 0 + 10 11 4 0 0 0 0 + 11 16 1 0 0 0 0 +M END +$$$$ +benzaldehyde + PyMOL2.5 3D 0 + + 14 14 0 0 0 0 0 0 0 0999 V2000 + 29.2079 8.8492 4.9632 O 0 0 0 0 0 0 0 0 0 0 0 0 + 27.5482 8.8691 6.4597 H 0 0 0 0 0 0 0 0 0 0 0 0 + 27.9981 8.4043 5.5824 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.9780 5.3270 4.7790 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.3950 5.0740 3.4990 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.3400 5.8600 2.9020 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.8370 6.9210 3.5690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.4200 7.1960 4.8560 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.4980 6.3790 5.4690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.2298 4.6859 5.2451 H 0 0 0 0 0 0 0 0 0 0 0 0 + 25.9676 4.2351 2.9497 H 0 0 0 0 0 0 0 0 0 0 0 0 + 27.6890 5.6311 1.8951 H 0 0 0 0 0 0 0 0 0 0 0 0 + 28.5730 7.5660 3.0889 H 0 0 0 0 0 0 0 0 0 0 0 0 + 26.1874 6.5720 6.4958 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 3 2 0 0 0 0 + 2 3 1 0 0 0 0 + 4 5 4 0 0 0 0 + 4 9 4 0 0 0 0 + 4 10 1 0 0 0 0 + 5 6 4 0 0 0 0 + 5 11 1 0 0 0 0 + 6 7 4 0 0 0 0 + 6 12 1 0 0 0 0 + 7 8 4 0 0 0 0 + 7 13 1 0 0 0 0 + 3 8 1 0 0 0 0 + 8 9 4 0 0 0 0 + 9 14 1 0 0 0 0 +M END +$$$$ +styrene + PyMOL2.5 3D 0 + + 16 16 0 0 0 0 0 0 0 0999 V2000 + 29.2873 8.8784 4.9226 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.6609 8.3486 4.0463 H 0 0 0 0 0 0 0 0 0 0 0 0 + 29.8344 9.7353 5.3157 H 0 0 0 0 0 0 0 0 0 0 0 0 + 27.5365 8.8812 6.4825 H 0 0 0 0 0 0 0 0 0 0 0 0 + 27.9864 8.4164 5.6052 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.9780 5.3270 4.7790 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.3950 5.0740 3.4990 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.3400 5.8600 2.9020 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.8370 6.9210 3.5690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.4200 7.1960 4.8560 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.4980 6.3790 5.4690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.2298 4.6859 5.2451 H 0 0 0 0 0 0 0 0 0 0 0 0 + 25.9676 4.2351 2.9497 H 0 0 0 0 0 0 0 0 0 0 0 0 + 27.6890 5.6311 1.8951 H 0 0 0 0 0 0 0 0 0 0 0 0 + 28.5730 7.5660 3.0889 H 0 0 0 0 0 0 0 0 0 0 0 0 + 26.1874 6.5720 6.4958 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 5 2 0 0 0 0 + 4 5 1 0 0 0 0 + 6 7 4 0 0 0 0 + 6 11 4 0 0 0 0 + 6 12 1 0 0 0 0 + 7 8 4 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 4 0 0 0 0 + 8 14 1 0 0 0 0 + 9 10 4 0 0 0 0 + 9 15 1 0 0 0 0 + 5 10 1 0 0 0 0 + 10 11 4 0 0 0 0 + 11 16 1 0 0 0 0 +M END +$$$$ diff --git a/src/pontibus/tests/data/solvation_protocol/ASFEProtocol_json_results.gz b/src/pontibus/tests/data/solvation_protocol/ASFEProtocol_json_results.gz new file mode 100644 index 0000000000000000000000000000000000000000..ed222e21db4e4e235ef837cf55b201b7095cbccf GIT binary patch literal 47299 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 str: + """ + ASFE results object as created by quickrun. + + generated with devtools/gent-serialized-results.py + """ + d = resources.files("pontibus.tests.data.solvation_protocol") + fname = "ASFEProtocol_json_results.gz" + + with gzip.open((d / fname).as_posix(), "r") as f: + return f.read().decode() diff --git a/src/pontibus/tests/protocols/solvation/test_dry_run.py b/src/pontibus/tests/protocols/solvation/test_dry_run.py new file mode 100644 index 0000000..2a947f3 --- /dev/null +++ b/src/pontibus/tests/protocols/solvation/test_dry_run.py @@ -0,0 +1,202 @@ +# This code is part of OpenFE and is licensed under the MIT license. +# For details, see https://github.com/OpenFreeEnergy/openfe +from unittest import mock + +import mdtraj as mdt +import pytest +from gufe import ChemicalSystem +from openff.units import unit + +from pontibus.components import ExtendedSolventComponent +from pontibus.protocols.solvation import ASFEProtocol, ASFESolventUnit, ASFEVacuumUnit + + +@pytest.mark.parametrize("method", ["repex", "sams", "independent", "InDePeNdENT"]) +def test_dry_run_vacuum_benzene(benzene_modifications, method, tmpdir): + s = ASFEProtocol.default_settings() + s.protocol_repeats = 1 + s.vacuum_simulation_settings.sampler_method = method + + protocol = ASFEProtocol( + settings=s, + ) + + stateA = ChemicalSystem( + { + "benzene": benzene_modifications["benzene"], + "solvent": ExtendedSolventComponent(), + } + ) + + stateB = ChemicalSystem( + { + "solvent": ExtendedSolventComponent(), + } + ) + + # Create DAG from protocol, get the vacuum and solvent units + # and eventually dry run the first vacuum unit + dag = protocol.create( + stateA=stateA, + stateB=stateB, + mapping=None, + ) + prot_units = list(dag.protocol_units) + + assert len(prot_units) == 2 + + vac_unit = [u for u in prot_units if isinstance(u, ASFEVacuumUnit)] + sol_unit = [u for u in prot_units if isinstance(u, ASFESolventUnit)] + + assert len(vac_unit) == 1 + assert len(sol_unit) == 1 + + with tmpdir.as_cwd(): + vac_sampler = vac_unit[0].run(dry=True)["debug"]["sampler"] + assert not vac_sampler.is_periodic + + +def test_dry_run_solv_benzene(benzene_modifications, tmpdir): + s = ASFEProtocol.default_settings() + s.protocol_repeats = 1 + s.solvent_output_settings.output_indices = "resname AAA" + + protocol = ASFEProtocol( + settings=s, + ) + + stateA = ChemicalSystem( + { + "benzene": benzene_modifications["benzene"], + "solvent": ExtendedSolventComponent(), + } + ) + + stateB = ChemicalSystem( + { + "solvent": ExtendedSolventComponent(), + } + ) + + # Create DAG from protocol, get the vacuum and solvent units + # and eventually dry run the first solvent unit + dag = protocol.create( + stateA=stateA, + stateB=stateB, + mapping=None, + ) + prot_units = list(dag.protocol_units) + + assert len(prot_units) == 2 + + vac_unit = [u for u in prot_units if isinstance(u, ASFEVacuumUnit)] + sol_unit = [u for u in prot_units if isinstance(u, ASFESolventUnit)] + + assert len(vac_unit) == 1 + assert len(sol_unit) == 1 + + with tmpdir.as_cwd(): + sol_sampler = sol_unit[0].run(dry=True)["debug"]["sampler"] + assert sol_sampler.is_periodic + + pdb = mdt.load_pdb("hybrid_system.pdb") + assert pdb.n_atoms == 12 + + +def test_dry_run_solv_benzene_opc(benzene_modifications, tmpdir): + # TODO: validation tests + # - hmass + # - timestep + s = ASFEProtocol.default_settings() + s.protocol_repeats = 1 + s.vacuum_forcefield_settings.forcefields = ["openff-2.0.0.offxml", "opc.offxml"] + s.vacuum_forcefield_settings.hydrogen_mass = 1.0 + s.solvent_forcefield_settings.forcefields = ["openff-2.0.0.offxml", "opc.offxml"] + s.solvent_forcefield_settings.hydrogen_mass = 1.007947 + s.integrator_settings.reassign_velocities = True + s.integrator_settings.timestep = 2 * unit.femtosecond + + protocol = ASFEProtocol( + settings=s, + ) + + stateA = ChemicalSystem( + { + "benzene": benzene_modifications["benzene"], + "solvent": ExtendedSolventComponent(), + } + ) + + stateB = ChemicalSystem( + { + "solvent": ExtendedSolventComponent(), + } + ) + + # Create DAG from protocol, get the vacuum and solvent units + # and eventually dry run the first solvent unit + dag = protocol.create( + stateA=stateA, + stateB=stateB, + mapping=None, + ) + prot_units = list(dag.protocol_units) + + sol_unit = [u for u in prot_units if isinstance(u, ASFESolventUnit)] + + with tmpdir.as_cwd(): + sol_sampler = sol_unit[0].run(dry=True)["debug"]["sampler"] + assert sol_sampler.is_periodic + + pdb = mdt.load_pdb("hybrid_system.pdb") + assert pdb.n_atoms == 12 + + +def test_confgen_fail_AFE(benzene_modifications, tmpdir): + # check system parametrisation works even if confgen fails + s = ASFEProtocol.default_settings() + s.protocol_repeats = 1 + + protocol = ASFEProtocol( + settings=s, + ) + + stateA = ChemicalSystem( + { + "benzene": benzene_modifications["benzene"], + "solvent": ExtendedSolventComponent(), + } + ) + + stateB = ChemicalSystem( + { + "solvent": ExtendedSolventComponent(), + } + ) + + # Create DAG from protocol, get the vacuum and solvent units + # and eventually dry run the first vacuum unit + dag = protocol.create( + stateA=stateA, + stateB=stateB, + mapping=None, + ) + prot_units = list(dag.protocol_units) + vac_unit = [u for u in prot_units if isinstance(u, ASFEVacuumUnit)] + + with tmpdir.as_cwd(): + with mock.patch("rdkit.Chem.AllChem.EmbedMultipleConfs", return_value=0): + vac_sampler = vac_unit[0].run(dry=True)["debug"]["sampler"] + + assert vac_sampler + + +""" +Different solvents + - Implicit + - Explicit + - Virtual sites +Partial Charges + - Implicit + - Explicit +""" diff --git a/src/pontibus/tests/protocols/solvation/test_results.py b/src/pontibus/tests/protocols/solvation/test_results.py new file mode 100644 index 0000000..875dd3e --- /dev/null +++ b/src/pontibus/tests/protocols/solvation/test_results.py @@ -0,0 +1,145 @@ +# This code is part of OpenFE and is licensed under the MIT license. +# For details, see https://github.com/OpenFreeEnergy/openfe +import itertools +import json + +import gufe +import numpy as np +import openfe +import pytest +from openff.units import unit as offunit + +from pontibus.protocols.solvation import ASFEProtocolResult + + +class TestProtocolResult: + @pytest.fixture() + def protocolresult(self, afe_solv_transformation_json): + d = json.loads( + afe_solv_transformation_json, cls=gufe.tokenization.JSON_HANDLER.decoder + ) + + pr = openfe.ProtocolResult.from_dict(d["protocol_result"]) + + return pr + + def test_reload_protocol_result(self, afe_solv_transformation_json): + d = json.loads( + afe_solv_transformation_json, cls=gufe.tokenization.JSON_HANDLER.decoder + ) + + pr = ASFEProtocolResult.from_dict(d["protocol_result"]) + + assert pr + + def test_get_estimate(self, protocolresult): + est = protocolresult.get_estimate() + + assert est + assert est.m == pytest.approx(-2.47, abs=0.5) + assert isinstance(est, offunit.Quantity) + assert est.is_compatible_with(offunit.kilojoule_per_mole) + + def test_get_uncertainty(self, protocolresult): + est = protocolresult.get_uncertainty() + + assert est + assert est.m == pytest.approx(0.2, abs=0.2) + assert isinstance(est, offunit.Quantity) + assert est.is_compatible_with(offunit.kilojoule_per_mole) + + def test_get_individual(self, protocolresult): + inds = protocolresult.get_individual_estimates() + + assert isinstance(inds, dict) + assert isinstance(inds["solvent"], list) + assert isinstance(inds["vacuum"], list) + assert len(inds["solvent"]) == len(inds["vacuum"]) == 3 + for e, u in itertools.chain(inds["solvent"], inds["vacuum"]): + assert e.is_compatible_with(offunit.kilojoule_per_mole) + assert u.is_compatible_with(offunit.kilojoule_per_mole) + + @pytest.mark.parametrize("key", ["solvent", "vacuum"]) + def test_get_forwards_etc(self, key, protocolresult): + far = protocolresult.get_forward_and_reverse_energy_analysis() + + assert isinstance(far, dict) + assert isinstance(far[key], list) + far1 = far[key][0] + assert isinstance(far1, dict) + + for k in [ + "fractions", + "forward_DGs", + "forward_dDGs", + "reverse_DGs", + "reverse_dDGs", + ]: + assert k in far1 + + if k == "fractions": + assert isinstance(far1[k], np.ndarray) + + @pytest.mark.parametrize("key", ["solvent", "vacuum"]) + def test_get_frwd_reverse_none_return(self, key, protocolresult): + # fetch the first result of type key + data = [i for i in protocolresult.data[key].values()][0][0] + # set the output to None + data.outputs["forward_and_reverse_energies"] = None + + # now fetch the analysis results and expect a warning + wmsg = ( + "were found in the forward and reverse dictionaries " + f"of the repeats of the {key}" + ) + with pytest.warns(UserWarning, match=wmsg): + protocolresult.get_forward_and_reverse_energy_analysis() + + @pytest.mark.parametrize("key", ["solvent", "vacuum"]) + def test_get_overlap_matrices(self, key, protocolresult): + ovp = protocolresult.get_overlap_matrices() + + assert isinstance(ovp, dict) + assert isinstance(ovp[key], list) + assert len(ovp[key]) == 3 + + ovp1 = ovp[key][0] + assert isinstance(ovp1["matrix"], np.ndarray) + assert ovp1["matrix"].shape == (14, 14) + + @pytest.mark.parametrize("key", ["solvent", "vacuum"]) + def test_get_replica_transition_statistics(self, key, protocolresult): + rpx = protocolresult.get_replica_transition_statistics() + + assert isinstance(rpx, dict) + assert isinstance(rpx[key], list) + assert len(rpx[key]) == 3 + rpx1 = rpx[key][0] + assert "eigenvalues" in rpx1 + assert "matrix" in rpx1 + assert rpx1["eigenvalues"].shape == (14,) + assert rpx1["matrix"].shape == (14, 14) + + @pytest.mark.parametrize("key", ["solvent", "vacuum"]) + def test_equilibration_iterations(self, key, protocolresult): + eq = protocolresult.equilibration_iterations() + + assert isinstance(eq, dict) + assert isinstance(eq[key], list) + assert len(eq[key]) == 3 + assert all(isinstance(v, float) for v in eq[key]) + + @pytest.mark.parametrize("key", ["solvent", "vacuum"]) + def test_production_iterations(self, key, protocolresult): + prod = protocolresult.production_iterations() + + assert isinstance(prod, dict) + assert isinstance(prod[key], list) + assert len(prod[key]) == 3 + assert all(isinstance(v, float) for v in prod[key]) + + def test_filenotfound_replica_states(self, protocolresult): + errmsg = "File could not be found" + + with pytest.raises(ValueError, match=errmsg): + protocolresult.get_replica_states() diff --git a/src/pontibus/tests/protocols/solvation/test_tokenization.py b/src/pontibus/tests/protocols/solvation/test_tokenization.py new file mode 100644 index 0000000..d99a3cc --- /dev/null +++ b/src/pontibus/tests/protocols/solvation/test_tokenization.py @@ -0,0 +1,107 @@ +# This code is part of OpenFE and is licensed under the MIT license. +# For details, see https://github.com/OpenFreeEnergy/openfe +import json + +import gufe +import openfe +import pytest +from gufe.tests.test_tokenization import GufeTokenizableTestsMixin + +from pontibus.components import ExtendedSolventComponent +from pontibus.protocols.solvation import ( + ASFEProtocol, + ASFEProtocolResult, + ASFESolventUnit, + ASFEVacuumUnit, +) + + +@pytest.fixture +def protocol(): + return ASFEProtocol(ASFEProtocol.default_settings()) + + +@pytest.fixture +def protocol_units(protocol, benzene_modifications): + pus = protocol.create( + stateA=openfe.ChemicalSystem( + { + "solute": benzene_modifications["benzene"], + "solvent": ExtendedSolventComponent(), + } + ), + stateB=openfe.ChemicalSystem({"solvent": ExtendedSolventComponent()}), + mapping=None, + ) + return list(pus.protocol_units) + + +@pytest.fixture +def solvent_protocol_unit(protocol_units): + for pu in protocol_units: + if isinstance(pu, ASFESolventUnit): + return pu + + +@pytest.fixture +def vacuum_protocol_unit(protocol_units): + for pu in protocol_units: + if isinstance(pu, ASFEVacuumUnit): + return pu + + +@pytest.fixture +def protocol_result(afe_solv_transformation_json): + d = json.loads( + afe_solv_transformation_json, cls=gufe.tokenization.JSON_HANDLER.decoder + ) + pr = ASFEProtocolResult.from_dict(d["protocol_result"]) + return pr + + +class TestProtocol(GufeTokenizableTestsMixin): + cls = ASFEProtocol + key = "ASFEProtocol-798d96f939ae6898c385e31e48caae6d" + repr = f"<{key}>" + + @pytest.fixture() + def instance(self, protocol): + return protocol + + +class TestSolventUnit(GufeTokenizableTestsMixin): + cls = ASFESolventUnit + repr = "ASFESolventUnit(Absolute Solvation, benzene solvent leg: repeat 2 generation 0)" + key = None + + @pytest.fixture() + def instance(self, solvent_protocol_unit): + return solvent_protocol_unit + + def test_key_stable(self): + pytest.skip() + + +class TestVacuumUnit(GufeTokenizableTestsMixin): + cls = ASFEVacuumUnit + repr = ( + "ASFEVacuumUnit(Absolute Solvation, benzene vacuum leg: repeat 2 generation 0)" + ) + key = None + + @pytest.fixture() + def instance(self, vacuum_protocol_unit): + return vacuum_protocol_unit + + def test_key_stable(self): + pytest.skip() + + +class TestProtocolResult(GufeTokenizableTestsMixin): + cls = ASFEProtocolResult + key = "ASFEProtocolResult-f1172ed96a55d778bdfcc8d9ce0299f2" + repr = f"<{key}>" + + @pytest.fixture() + def instance(self, protocol_result): + return protocol_result diff --git a/src/pontibus/tests/utils/__init__.py b/src/pontibus/tests/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/pontibus/tests/utils/test_interchange_packmol.py b/src/pontibus/tests/utils/test_interchange_packmol.py new file mode 100644 index 0000000..36b31ed --- /dev/null +++ b/src/pontibus/tests/utils/test_interchange_packmol.py @@ -0,0 +1,713 @@ +# This code is part of OpenFE and is licensed under the MIT license. +# For details, see https://github.com/OpenFreeEnergy/openfe + +import logging + +import pytest +from gufe import SmallMoleculeComponent, SolventComponent +from numpy.testing import assert_allclose, assert_equal +from openff.interchange.interop.openmm import to_openmm_positions +from openff.toolkit import ForceField, Molecule +from openff.units import unit +from openff.units.openmm import from_openmm, to_openmm +from openmm import ( + HarmonicAngleForce, + HarmonicBondForce, + NonbondedForce, + PeriodicTorsionForce, +) + +from pontibus.components.extended_solvent_component import ExtendedSolventComponent +from pontibus.protocols.solvation.settings import ( + InterchangeFFSettings, + PackmolSolvationSettings, +) +from pontibus.utils.molecules import WATER +from pontibus.utils.system_creation import ( + _check_charged_mols, + _check_library_charges, + _get_offmol_resname, + _set_offmol_resname, + interchange_packmol_creation, +) + + +@pytest.fixture(scope="module") +def smc_components_benzene_unnamed(benzene_modifications): + benzene_off = benzene_modifications["benzene"].to_openff() + benzene_off.assign_partial_charges(partial_charge_method="gasteiger") + return {benzene_modifications["benzene"]: benzene_off} + + +@pytest.fixture(scope="module") +def smc_components_benzene_named(benzene_modifications): + benzene_off = benzene_modifications["benzene"].to_openff() + _set_offmol_resname(benzene_off, "BNZ") + benzene_off.assign_partial_charges(partial_charge_method="gasteiger") + return {benzene_modifications["benzene"]: benzene_off} + + +@pytest.fixture() +def methanol(): + m = Molecule.from_smiles("CO") + m.generate_conformers() + m.assign_partial_charges(partial_charge_method="gasteiger") + return m + + +@pytest.fixture(scope="module") +def water_off(): + return WATER.to_openff() + + +@pytest.fixture(scope="module") +def water_off_named_charged(): + water = WATER.to_openff() + _set_offmol_resname(water, "HOH") + water.assign_partial_charges(partial_charge_method="gasteiger") + return water + + +@pytest.fixture(scope="module") +def water_off_am1bcc(): + water = WATER.to_openff() + water.assign_partial_charges(partial_charge_method="am1bcc") + return water + + +def test_get_and_set_offmol_resname(CN_molecule, caplog): + CN_off = CN_molecule.to_openff() + + # No residue name to begin with + assert _get_offmol_resname(CN_off) is None + + # Boop the floof + _set_offmol_resname(CN_off, "BOOP") + + # Does the floof accept the boop? + assert "BOOP" == _get_offmol_resname(CN_off) + + # Oh no, one of the atoms didn't like the boop! + atom3 = list(CN_off.atoms)[2] + atom3.metadata["residue_name"] = "NOBOOP" + + with caplog.at_level(logging.WARNING): + assert _get_offmol_resname(CN_off) is None + assert "Inconsistent residue name" in caplog.text + + +def test_check_library_charges_pass(water_off): + ff = ForceField("opc.offxml") + _check_library_charges(ff, water_off) + + +def test_check_library_charges_fail(methanol): + ff = ForceField("openff-2.0.0.offxml") + with pytest.raises(ValueError, match="No library charges"): + _check_library_charges(ff, methanol) + + +def test_check_charged_mols_pass(methanol): + _check_charged_mols([methanol]) + + +def test_check_charged_mols_nocharge(water_off, methanol): + with pytest.raises(ValueError, match="One or more"): + _check_charged_mols([water_off, methanol]) + + +def test_check_charged_mols(water_off_am1bcc, water_off_named_charged): + with pytest.raises(ValueError, match="different charges"): + _check_charged_mols([water_off_am1bcc, water_off_named_charged]) + + +def test_protein_component_fail(smc_components_benzene_named, T4_protein_component): + errmsg = "ProteinComponents is not currently supported" + with pytest.raises(ValueError, match=errmsg): + interchange_packmol_creation( + ffsettings=InterchangeFFSettings(), + solvation_settings=PackmolSolvationSettings(), + smc_components=smc_components_benzene_named, + protein_component=T4_protein_component, + solvent_component=None, + solvent_offmol=None, + ) + + +@pytest.mark.parametrize( + "neutralize, ion_conc", + [ + [True, 0.0 * unit.molar], + [False, 0.1 * unit.molar], + [True, 0.1 * unit.molar], + ], +) +def test_wrong_solventcomp_settings(neutralize, ion_conc, smc_components_benzene_named): + with pytest.raises(ValueError, match="Adding counterions"): + interchange_packmol_creation( + ffsettings=InterchangeFFSettings(), + solvation_settings=PackmolSolvationSettings(), + smc_components=smc_components_benzene_named, + protein_component=None, + solvent_component=ExtendedSolventComponent( + neutralize=neutralize, + ion_concentration=ion_conc, + ), + solvent_offmol=None, + ) + + +def test_solv_but_no_solv_offmol( + smc_components_benzene_named, +): + with pytest.raises(ValueError, match="A solvent offmol"): + interchange_packmol_creation( + ffsettings=InterchangeFFSettings(), + solvation_settings=PackmolSolvationSettings(), + smc_components=smc_components_benzene_named, + protein_component=None, + solvent_component=ExtendedSolventComponent(), + solvent_offmol=None, + ) + + +def test_solv_mismatch( + smc_components_benzene_named, + methanol, +): + assert ExtendedSolventComponent().smiles == "[H][O][H]" + with pytest.raises(ValueError, match="does not match"): + interchange_packmol_creation( + ffsettings=InterchangeFFSettings(), + solvation_settings=PackmolSolvationSettings(), + smc_components=smc_components_benzene_named, + protein_component=None, + solvent_component=ExtendedSolventComponent(), + solvent_offmol=methanol, + ) + + +@pytest.mark.parametrize( + "assign_charges, errmsg", + [ + (True, "do not have partial charges"), + (False, "No library charges"), + ], +) +def test_charge_assignment_errors(smc_components_benzene_named, assign_charges, errmsg): + """ + True case: passing a Molecule without partial charges to Interchange + and asking to get charges from it will fail. + False case: not having any partial charges will try to see if it's + in the LibraryCharges if not, it will fail (which it does here). + """ + solvent_offmol = Molecule.from_smiles("COC") + + with pytest.raises(ValueError, match=errmsg): + _, _ = interchange_packmol_creation( + ffsettings=InterchangeFFSettings( + forcefields=[ + "openff-2.0.0.offxml", + ] + ), + solvation_settings=PackmolSolvationSettings( + assign_solvent_charges=assign_charges, + ), + smc_components=smc_components_benzene_named, + protein_component=None, + solvent_component=SolventComponent( + smiles="COC", + neutralize=False, + ion_concentration=0 * unit.molar, + ), + solvent_offmol=solvent_offmol, + ) + + +def test_assign_duplicate_resnames(caplog): + """ + Pass two smcs named the same and expect one to be renamed + """ + a = Molecule.from_smiles("C") + b = Molecule.from_smiles("CCC") + a.generate_conformers() + b.generate_conformers() + a.assign_partial_charges(partial_charge_method="gasteiger") + b.assign_partial_charges(partial_charge_method="gasteiger") + _set_offmol_resname(a, "FOO") + _set_offmol_resname(b, "FOO") + smc_a = SmallMoleculeComponent.from_openff(a) + smc_b = SmallMoleculeComponent.from_openff(b) + + smcs = {smc_a: a, smc_b: b} + + with caplog.at_level(logging.WARNING): + _, smc_comps = interchange_packmol_creation( + ffsettings=InterchangeFFSettings( + forcefields=[ + "openff-2.0.0.offxml", + ] + ), + solvation_settings=None, + smc_components=smcs, + protein_component=None, + solvent_component=None, + solvent_offmol=None, + ) + for match in ["Duplicate", "residue name to AAA"]: + assert match in caplog.text + + assert len(smc_comps) == 2 + assert smc_comps[smc_a][0] == 0 + assert smc_comps[smc_b][0] == 1 + + +@pytest.mark.parametrize( + "smiles", + [ + "C1CCCCC1", + "C1CCOC1", + "CC(=O)N(C)C", + "CC(=O)c1ccccc1", + "CC(Br)Br", + "CC(C)CO", + "CC(C)O", + "CC(C)OC(C)C", + "CC(C)c1ccccc1", + "CC(Cl)Cl", + "CCBr", + "CCCCC", + "CCCCCC", + "CCCCCC(C)C", + "CCCCCCC", + "CCCCCCCC", + "CCCCCCCCBr", + "CCCCCCCl", + "CCCCCCO", + "CCCCCO", + "CCCCO", + "CCCCOCCCC", + "CCCCOP(=O)(OCCCC)OCCCC", + "CCCCc1ccccc1", + "CCCO", + "CCN(CC)CC", + "CCO", + "CCOCC", + "CCOc1ccccc1", + "CCc1ccccc1", + "CN(C)C=O", + "CNC=O", + "COc1ccccc1", + "Cc1ccccc1", + "Cc1ccccc1C", + "Cc1ccccc1C(C)C", + "Cc1ccccn1", + "Cc1cccnc1C", + "c1ccc2c(c1)CCCC2", + "c1ccccc1", + "c1ccncc1", + ], +) +def test_nonwater_solvent(smc_components_benzene_named, smiles): + solvent_offmol = Molecule.from_smiles(smiles) + solvent_offmol.assign_partial_charges(partial_charge_method="gasteiger") + + interchange, _ = interchange_packmol_creation( + ffsettings=InterchangeFFSettings( + forcefields=[ + "openff-2.0.0.offxml", + ] + ), + solvation_settings=PackmolSolvationSettings( + assign_solvent_charges=True, + ), + smc_components=smc_components_benzene_named, + protein_component=None, + solvent_component=SolventComponent( + smiles=smiles, + neutralize=False, + ion_concentration=0 * unit.molar, + ), + solvent_offmol=solvent_offmol, + ) + + if smiles == "c1ccccc1": + # solvent == ligand + assert solvent_offmol.is_isomorphic_with( + list(smc_components_benzene_named.values())[0] + ) + assert interchange.topology.n_unique_molecules == 1 + else: + assert interchange.topology.n_unique_molecules == 2 + assert solvent_offmol.is_isomorphic_with( + list(interchange.topology.unique_molecules)[1] + ) + + +class BaseSystemTests: + @pytest.fixture(scope="class") + def omm_system(self, interchange_system): + interchange, _ = interchange_system + + return interchange.to_openmm_system() + + @pytest.fixture(scope="class") + def omm_topology(self, interchange_system): + interchange, _ = interchange_system + + return interchange.to_openmm_topology() + + @pytest.fixture(scope="class") + def nonbonds(self, omm_system): + return [f for f in omm_system.getForces() if isinstance(f, NonbondedForce)] + + +class TestVacuumUnamedBenzene(BaseSystemTests): + smc_comps = "smc_components_benzene_unnamed" + resname = "AAA" + nonbond_index = 0 + + @pytest.fixture(scope="class") + def interchange_system(self, request): + smc_components = request.getfixturevalue(self.smc_comps) + interchange, comp_resids = interchange_packmol_creation( + ffsettings=InterchangeFFSettings(), + solvation_settings=PackmolSolvationSettings(), + smc_components=smc_components, + protein_component=None, + solvent_component=None, + solvent_offmol=None, + ) + + return interchange, comp_resids + + @pytest.fixture(scope="class") + def num_particles(self): + return 12 + + @pytest.fixture(scope="class") + def num_residues(self): + return 1 + + @pytest.fixture(scope="class") + def num_constraints(self): + return 6 + + @pytest.fixture(scope="class") + def num_bonds(self): + return 6 + + @pytest.fixture(scope="class") + def num_angles(self): + return 18 + + @pytest.fixture(scope="class") + def num_dih(self): + return 42 + + def test_comp_resids(self, interchange_system, request): + _, comp_resids = interchange_system + + assert len(comp_resids) == 1 + assert next(iter(comp_resids.values())) == 0 + assert next(iter(request.getfixturevalue(self.smc_comps))) in comp_resids + + def test_topology(self, omm_topology, num_residues, num_particles): + residues = list(omm_topology.residues()) + assert len(residues) == num_residues + assert len(list(omm_topology.atoms())) == num_particles + assert residues[0].name == self.resname # Expect auto-naming to AAA + assert residues[0].index == residues[0].id == 0 + + def test_system_basics(self, omm_system, num_particles, num_constraints): + # Expected number of atoms + assert omm_system.getNumParticles() == num_particles + + # 4 forces expected + assert omm_system.getNumForces() == 4 + + # 6 constraints, one for each hydrogen + assert omm_system.getNumConstraints() == num_constraints + + def test_positions(self, interchange_system, num_particles): + inter, _ = interchange_system + assert len((to_openmm_positions(inter))) == num_particles + + def test_system_nonbonded(self, nonbonds): + # One nonbonded force + assert len(nonbonds) == 1 + + # Gas phase should be nonbonded + assert nonbonds[0].getNonbondedMethod() == self.nonbond_index + assert nonbonds[0].getCutoffDistance() == to_openmm(0.9 * unit.nanometer) + assert nonbonds[0].getSwitchingDistance() == to_openmm(0.8 * unit.nanometer) + + def test_system_bonds(self, omm_system, num_bonds): + bond = [f for f in omm_system.getForces() if isinstance(f, HarmonicBondForce)] + + # One bond forces + assert len(bond) == 1 + + # 6 bonds + assert bond[0].getNumBonds() == num_bonds + + def test_system_angles(self, omm_system, num_angles): + angle = [f for f in omm_system.getForces() if isinstance(f, HarmonicAngleForce)] + + # One bond forces + assert len(angle) == 1 + + # 18 angles + assert angle[0].getNumAngles() == num_angles + + def test_system_dihedrals(self, omm_system, num_dih): + dih = [f for f in omm_system.getForces() if isinstance(f, PeriodicTorsionForce)] + + # One bond forces + assert len(dih) == 1 + + # 42 angles + assert dih[0].getNumTorsions() == num_dih + + +class TestVacuumNamedBenzene(TestVacuumUnamedBenzene): + smc_comps = "smc_components_benzene_named" + resname = "BNZ" + + +class TestSolventOPC3UnamedBenzene(TestVacuumUnamedBenzene): + smc_comps = "smc_components_benzene_unnamed" + resname = "AAA" + nonbond_index = 4 + solvent_resname = "SOL" + + @pytest.fixture(scope="class") + def interchange_system(self, water_off, request): + smc_components = request.getfixturevalue(self.smc_comps) + interchange, comp_resids = interchange_packmol_creation( + ffsettings=InterchangeFFSettings( + forcefields=["openff-2.0.0.offxml", "opc3.offxml"], + ), + solvation_settings=PackmolSolvationSettings(), + smc_components=smc_components, + protein_component=None, + solvent_component=ExtendedSolventComponent(), + solvent_offmol=water_off, + ) + + return interchange, comp_resids + + @pytest.fixture(scope="class") + def num_residues(self, omm_topology): + return omm_topology.getNumResidues() + + @pytest.fixture(scope="class") + def num_waters(self, num_residues): + return num_residues - 1 + + @pytest.fixture(scope="class") + def num_particles(self, num_waters): + return 12 + (3 * num_waters) + + @pytest.fixture(scope="class") + def num_constraints(self, num_waters): + return 6 + (3 * num_waters) + + def test_comp_resids(self, interchange_system, request, num_residues): + _, comp_resids = interchange_system + + assert len(comp_resids) == 2 + assert list(comp_resids)[0] == ExtendedSolventComponent() + assert list(comp_resids)[1] == next( + iter(request.getfixturevalue(self.smc_comps)) + ) + assert_equal(list(comp_resids.values())[0], [i for i in range(1, num_residues)]) + assert_equal(list(comp_resids.values())[1], [0]) + + def test_solvent_resnames(self, omm_topology): + for i, res in enumerate(list(omm_topology.residues())[1:]): + assert res.index == res.id == i + 1 + assert res.name == self.solvent_resname + + def test_solvent_nonbond_parameters(self, nonbonds, num_particles, num_waters): + for index in range(12, num_particles - num_waters, 3): + # oxygen + c, s, e = nonbonds[0].getParticleParameters(index) + assert from_openmm(c) == -0.89517 * unit.elementary_charge + assert from_openmm(e).m == pytest.approx(0.683690704) + assert from_openmm(s).m_as(unit.angstrom) == pytest.approx( + 3.1742703509365926 + ) + + # hydrogens + c1, s1, e1 = nonbonds[0].getParticleParameters(index + 1) + c2, s2, e2 = nonbonds[0].getParticleParameters(index + 2) + assert from_openmm(c1) == 0.447585 * unit.elementary_charge + assert from_openmm(e1) == 0 * unit.kilocalorie_per_mole + assert from_openmm(s1).m == pytest.approx(0.17817974) + assert c1 == c2 + assert s1 == s2 + assert e2 == e2 + + +class TestSolventOPC3NamedChargedButUnAssignedBenzene(TestSolventOPC3UnamedBenzene): + """ + OPC3 model + Charged water offmol + Charges not assigned + """ + + solvent_resname = "HOH" + + @pytest.fixture(scope="class") + def interchange_system(self, water_off_named_charged, request): + smc_components = request.getfixturevalue(self.smc_comps) + interchange, comp_resids = interchange_packmol_creation( + ffsettings=InterchangeFFSettings( + forcefields=["openff-2.0.0.offxml", "opc3.offxml"], + ), + solvation_settings=PackmolSolvationSettings(), + smc_components=smc_components, + protein_component=None, + solvent_component=ExtendedSolventComponent(), + solvent_offmol=water_off_named_charged, + ) + + return interchange, comp_resids + + +class TestSolventOPC3NamedChargedAssignedBenzene(TestSolventOPC3UnamedBenzene): + """ + OPC3 model + Charged water offmol + Charges assigned + """ + + solvent_resname = "HOH" + + @pytest.fixture(scope="class") + def interchange_system(self, water_off_named_charged, request): + smc_components = request.getfixturevalue(self.smc_comps) + interchange, comp_resids = interchange_packmol_creation( + ffsettings=InterchangeFFSettings( + forcefields=["openff-2.0.0.offxml", "opc3.offxml"], + ), + solvation_settings=PackmolSolvationSettings( + assign_solvent_charges=True, + ), + smc_components=smc_components, + protein_component=None, + solvent_component=ExtendedSolventComponent(), + solvent_offmol=water_off_named_charged, + ) + + return interchange, comp_resids + + def test_solvent_nonbond_parameters( + self, nonbonds, num_particles, num_waters, water_off_named_charged + ): + for index in range(12, num_particles - num_waters, 3): + # oxygen + c, s, e = nonbonds[0].getParticleParameters(index) + assert from_openmm(c) == water_off_named_charged.partial_charges[0] + assert from_openmm(e).m == pytest.approx(0.683690704) + assert from_openmm(s).m_as(unit.angstrom) == pytest.approx( + 3.1742703509365926 + ) + + # hydrogens + c1, s1, e1 = nonbonds[0].getParticleParameters(index + 1) + c2, s2, e2 = nonbonds[0].getParticleParameters(index + 2) + assert from_openmm(c1) == water_off_named_charged.partial_charges[1] + assert from_openmm(e1) == 0 * unit.kilocalorie_per_mole + assert from_openmm(s1).m == pytest.approx(0.17817974) + assert c1 == c2 + assert s1 == s2 + assert e2 == e2 + + +class TestSolventOPCNamedBenzene(TestSolventOPC3UnamedBenzene): + smc_comps = "smc_components_benzene_named" + resname = "BNZ" + nonbond_index = 4 + + @pytest.fixture(scope="class") + def interchange_system(self, water_off, request): + smc_components = request.getfixturevalue(self.smc_comps) + interchange, comp_resids = interchange_packmol_creation( + ffsettings=InterchangeFFSettings( + forcefields=["openff-2.0.0.offxml", "opc.offxml"], + ), + solvation_settings=PackmolSolvationSettings(), + smc_components=smc_components, + protein_component=None, + solvent_component=ExtendedSolventComponent(), + solvent_offmol=water_off, + ) + + return interchange, comp_resids + + @pytest.fixture(scope="class") + def num_particles(self, num_waters): + return 12 + (4 * num_waters) + + def test_solvent_nonbond_parameters(self, nonbonds, num_particles, num_waters): + for index in range(12, num_particles - num_waters, 3): + # oxygen + c, s, e = nonbonds[0].getParticleParameters(index) + assert from_openmm(c) == 0 * unit.elementary_charge + assert from_openmm(e).m == pytest.approx(0.890358601) + assert from_openmm(s).m_as(unit.angstrom) == pytest.approx(3.16655208) + + # hydrogens + c1, s1, e1 = nonbonds[0].getParticleParameters(index + 1) + c2, s2, e2 = nonbonds[0].getParticleParameters(index + 2) + assert from_openmm(c1) == 0.679142 * unit.elementary_charge + assert from_openmm(e1) == 0 * unit.kilocalorie_per_mole + assert from_openmm(s1).m == pytest.approx(0.17817974) + assert c1 == c2 + assert s1 == s2 + assert e2 == e2 + + def test_virtual_sites(self, omm_system, num_waters, num_particles, nonbonds): + for index in range(num_particles, num_particles - num_waters, -1): + assert omm_system.isVirtualSite(index - 1) + c, s, e = nonbonds[0].getParticleParameters(index - 1) + assert from_openmm(c) == -0.679142 * 2 * unit.elementary_charge + assert from_openmm(e) == 0 * unit.kilocalorie_per_mole + assert from_openmm(s) * 2 ** (1 / 6) / 2.0 == 1 * unit.angstrom + + +# def test_setcharge_coc_solvent(smc_components_benzene): +# ... +# +# def test_inconsistent_solvent_name(smc_components_benzene): +# ... +# +# +# def test_duplicate_named_smcs(smc_components_benzene): +# ... +# +# +# def test_box_setting_cube(smc_components_benzene): +# ... +# +# +# def test_box_setting_dodecahedron(smc_components_benzene): +# ... + + +""" +5. Unamed solvent + - Check we get warned about renaming +6. Named solvent with inconsistent name +7. Duplicate named smcs +10. Cube +11. Dodecahedron +12. Check we get the right residues +13. Check we get the right number of atoms + - with a solvent w/ virtual sites + - check omm topology indices match virtual sites (it doesn't!) +14. Check nonbonded cutoffs set via ffsettings +15. Check charged mols tests. +""" diff --git a/src/pontibus/utils/__init__.py b/src/pontibus/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/pontibus/utils/molecules.py b/src/pontibus/utils/molecules.py new file mode 100644 index 0000000..211222e --- /dev/null +++ b/src/pontibus/utils/molecules.py @@ -0,0 +1,62 @@ +from gufe import SmallMoleculeComponent +from openff.toolkit import Molecule + +offmol_water = Molecule.from_dict( + { + "name": "", + "atoms": [ + { + "atomic_number": 8, + "formal_charge": 0, + "is_aromatic": False, + "stereochemistry": None, + "name": "", + "metadata": {}, + }, + { + "atomic_number": 1, + "formal_charge": 0, + "is_aromatic": False, + "stereochemistry": None, + "name": "", + "metadata": {}, + }, + { + "atomic_number": 1, + "formal_charge": 0, + "is_aromatic": False, + "stereochemistry": None, + "name": "", + "metadata": {}, + }, + ], + "bonds": [ + { + "atom1": 0, + "atom2": 1, + "bond_order": 1, + "is_aromatic": False, + "stereochemistry": None, + "fractional_bond_order": None, + }, + { + "atom1": 0, + "atom2": 2, + "bond_order": 1, + "is_aromatic": False, + "stereochemistry": None, + "fractional_bond_order": None, + }, + ], + "properties": {}, + "conformers_unit": "angstrom", + "conformers": [ + b"\xbfJ\xbeq\xa5\xd2;\xc6?\xd7r\xbe\x82\x10\xac\xb0\x80\x00\x00\x00\x00\x00\x00\x00\xbf\xe9\xfe~\x8bsg\xa8\xbf\xc7|WzS\x8e:\x80\x00\x00\x00\x00\x00\x00\x00?\xea\x05.'\xdc\xdc6\xbf\xc7i%\x89\xcd\xcb\x18\x00\x00\x00\x00\x00\x00\x00\x00" + ], + "partial_charges": None, + "partial_charge_unit": None, + "hierarchy_schemes": {}, + } +) + +WATER = SmallMoleculeComponent.from_openff(offmol_water) diff --git a/src/pontibus/utils/system_creation.py b/src/pontibus/utils/system_creation.py new file mode 100644 index 0000000..50f639a --- /dev/null +++ b/src/pontibus/utils/system_creation.py @@ -0,0 +1,332 @@ +# This code is part of OpenFE and is licensed under the MIT license. +# For details, see https://github.com/OpenFreeEnergy/openfe +import logging +from itertools import product +from string import ascii_uppercase +from typing import Any, Optional + +import numpy as np +import numpy.typing as npt +from gufe import Component, ProteinComponent, SmallMoleculeComponent, SolventComponent +from openff.interchange import Interchange +from openff.interchange.components._packmol import ( + RHOMBIC_DODECAHEDRON, + UNIT_CUBE, + solvate_topology_nonwater, +) +from openff.toolkit import ForceField +from openff.toolkit import Molecule as OFFMolecule +from openff.toolkit import Topology +from openff.units import unit as offunit + +from pontibus.protocols.solvation.settings import ( + InterchangeFFSettings, + PackmolSolvationSettings, +) + +logger = logging.getLogger(__name__) + + +def _set_offmol_resname( + offmol: OFFMolecule, + resname: str, +) -> None: + """ + Helper method to set offmol residue names + + Parameters + ---------- + offmol : openff.toolkit.Molecule + Molecule to assign a residue name to. + resname : str + Residue name to be set. + + Returns + ------- + None + """ + for a in offmol.atoms: + a.metadata["residue_name"] = resname + + +def _get_offmol_resname(offmol: OFFMolecule) -> Optional[str]: + """ + Helper method to get an offmol's residue name and make sure it is + consistent across all atoms in the Molecule. + + Parameters + ---------- + offmol : openff.toolkit.Molecule + Molecule to get the residue name from. + + Returns + ------- + resname : Optional[str] + Residue name of the molecule. ``None`` if the Molecule + does not have a residue name, or if the residue name is + inconsistent across all the atoms. + """ + resname: Optional[str] = None + for a in offmol.atoms: + if resname is None: + try: + resname = a.metadata["residue_name"] + except KeyError: + return None + + if resname != a.metadata["residue_name"]: + wmsg = f"Inconsistent residue name in OFFMol: {offmol} " + logger.warning(wmsg) + return None + + return resname + + +def _check_library_charges( + force_field: ForceField, + offmol: OFFMolecule, +) -> None: + """ + Check that library charges exists for an input molecule. + + force_field : openff.toolkit.ForceField + Force Field object with library charges. + offmol : openff.toolkit.Molecule + Molecule to check for matching library charges. + + Raises + ------ + ValueError + If no library charges are found for the molecule. + """ + handler = force_field.get_parameter_handler("LibraryCharges") + matches = handler.find_matches(offmol.to_topology()) + + if len(matches) == 0: + errmsg = f"No library charges found for {offmol}" + raise ValueError(errmsg) + + +def _check_charged_mols(molecules: list[OFFMolecule]) -> None: + """ + Checks list of molecules passed to Interchange for partial charge + assignment. + + Parameters + ---------- + molecules : list[openff.toolkit.Molecule] + + Raises + ------ + ValueError + If any molecules in the list are isomorphic. + If any molecules in the last have no charges. + """ + if any(m.partial_charges is None for m in molecules): + errmsg = ( + "One or more molecules have been explicitly passed " + "for partial charge assignment but do not have " + "partial charges" + ) + raise ValueError(errmsg) + + for i, moli in enumerate(molecules): + for j, molj in enumerate(molecules): + if i == j: + continue + if moli.is_isomorphic_with(molj) and not all( + moli.partial_charges == molj.partial_charges + ): + errmsg = ( + f"Isomorphic molecules {moli} and {molj}" + "have been passed for partial charge " + "assignment with different charges. " + "This is not currently allowed." + ) + raise ValueError(errmsg) + + +def interchange_packmol_creation( + ffsettings: InterchangeFFSettings, + solvation_settings: PackmolSolvationSettings, + smc_components: dict[SmallMoleculeComponent, OFFMolecule], + protein_component: Optional[ProteinComponent], + solvent_component: Optional[SolventComponent], + solvent_offmol: Optional[OFFMolecule], +) -> tuple[Interchange, dict[str, npt.NDArray]]: + """ + Create an Interchange object for a given system, solvating with + packmol where necessary. + + Parameters + ---------- + ffsettings : InterchangeFFSettings + Settings defining how the force field is applied. + solvation_settings : PackmolSolvationSettings + Settings defining how the system will be solvated. + smc_components : dict[SmallMoleculeComponent, openff.toolkit.Molecule]` + Solute SmallMoleculeComponents. + protein_component : Optional[ProteinComponent] + Protein component of the system, if any. + solvent_component : Optional[SolventComponent] + Solvent component of the system, if any. + solvent_offmol : Optional[openff.toolkit.Molecule] + OpenFF Molecule defining the solvent, if necessary + + Returns + ------- + Interchange : openff.interchange.Interchange + Interchange object for the created system. + comp_resids : dict[str, npt.NDArray] + A dictionary defining the residue indices matching + various components in the system. + """ + + # 1. Component validations + # Adding protein components is not currently supported + if protein_component is not None: + errmsg = ( + "Creation of systems solely with Interchange " + "using ProteinComponents is not currently supported" + ) + raise ValueError(errmsg) + + # TODO: work out ways to deal with the addition of counterions + if solvent_component is not None: + if ( + solvent_component.neutralize + or solvent_component.ion_concentration > 0 * offunit.molar + ): + errmsg = ( + "Adding counterions using packmol solvation " + "is currently not supported" + ) + raise ValueError(errmsg) + + if solvent_offmol is None: + errmsg = "A solvent offmol must be passed to solvate a system!" + raise ValueError(errmsg) + + # Check that the component matches the offmol + if not solvent_offmol.is_isomorphic_with( + OFFMolecule.from_smiles(solvent_component.smiles) + ): + errmsg = ( + f"Passed molecule: {solvent_offmol} does not match the " + f"the solvent component: {solvent_component.smiles}" + ) + raise ValueError(errmsg) + + # 2. Get the force field object + # forcefields is a list so we unpack it + force_field = ForceField(*ffsettings.forcefields) + + # Cautiously deregister the AM1BCC handler, we shouldn't need it. + # See: https://github.com/openforcefield/openff-interchange/issues/1048 + force_field.deregister_parameter_handler("ToolkitAM1BCC") + + # We also set nonbonded cutoffs whilst we are here + # TODO: double check what this means for nocutoff simulations + force_field["Electrostatics"].cutoff = ffsettings.nonbonded_cutoff + force_field["vdW"].cutoff = ffsettings.nonbonded_cutoff + force_field["vdW"].switch_width = ffsettings.switch_width + + # 3. Assign residue names so we can track our components in the generated + # topology. + + # Note: comp_resnames is dict[str, tuple[Component, list]] where the final + # list is to append residues later on + # TODO: we should be able to rely on offmol equality in the same way that + # intechange does + comp_resnames: dict[str, tuple[Component, list[Any]]] = {} + + # If we have solvent, we set its residue name + if solvent_component is not None: + offmol_resname = _get_offmol_resname(solvent_offmol) + if offmol_resname is None: + offmol_resname = "SOL" + _set_offmol_resname(solvent_offmol, offmol_resname) + comp_resnames[offmol_resname] = (solvent_component, []) + + # A store of residue names to replace residue names if they aren't unique + resnames_store = ["".join(i) for i in product(ascii_uppercase, repeat=3)] + + for comp, offmol in smc_components.items(): + off_resname = _get_offmol_resname(offmol) + if off_resname is None or off_resname in comp_resnames: + # warn that we are overriding clashing molecule resnames + if off_resname in comp_resnames: + wmsg = ( + f"Duplicate residue name {off_resname}, " + "duplicate will be renamed" + ) + logger.warning(wmsg) + + # just loop through and pick up a name that doesn't exist + while (off_resname in comp_resnames) or (off_resname is None): + off_resname = resnames_store.pop(0) + + wmsg = f"Setting component {comp} residue name to {off_resname}" + logger.warning(wmsg) + _set_offmol_resname(offmol, off_resname) + comp_resnames[off_resname] = [comp, []] + + # 4. Create an OFF Topology from the smcs + # Note: this is the base no solvent case! + topology = Topology.from_molecules([*smc_components.values()]) + + # Also create a list of charged molecules for later use + charged_mols = [*smc_components.values()] + + # 5. Solvent case + if solvent_component is not None: + + # Append to charged molcule to charged_mols if we want to + # otherwise we rely on library charges + if solvation_settings.assign_solvent_charges: + charged_mols.append(solvent_offmol) + else: + # Make sure we have library charges for the molecule + _check_library_charges(force_field, solvent_offmol) + + # Pick up the user selected box shape + box_shape = { + "cube": UNIT_CUBE, + "dodecahedron": RHOMBIC_DODECAHEDRON, + }[solvation_settings.box_shape.lower()] + + # TODO: switch back to normal pack_box and allow n_solvent + # Create the topology + topology = solvate_topology_nonwater( + topology=topology, + solvent=solvent_offmol, + padding=solvation_settings.solvent_padding, + box_shape=box_shape, + tolerance=solvation_settings.packing_tolerance, + ) + + # Assign residue indices to each entry in the OFF topology + for molecule_index, molecule in enumerate(topology.molecules): + for atom in molecule.atoms: + atom.metadata["residue_number"] = molecule_index + + # Get the residue name and store the index in comp resnames + resname = _get_offmol_resname(molecule) + comp_resnames[resname][1].append(molecule_index) + + # Now create the component_resids dictionary properly + comp_resids = {} + for entry in comp_resnames.values(): + comp = entry[0] + comp_resids[comp] = np.array(entry[1]) + + # Run validation checks on inputs to Interchange + # Examples: https://github.com/openforcefield/openff-interchange/issues/1058 + _check_charged_mols(charged_mols) + + interchange = force_field.create_interchange( + topology=topology, + charge_from_molecules=charged_mols, + ) + + return interchange, comp_resids